2626from docking .applets .base import Applet
2727from docking .applets .colorpicker import meta
2828from docking .applets .colorpicker .render import create_icon
29- from docking .applets .colorpicker .state import pick_pixel , rgb_to_hex
29+ from docking .applets .colorpicker .state import rgb_to_hex
3030from docking .applets .menu import menu_sections
3131from docking .applets .popup import (
3232 create_capture_overlay ,
3333 dismiss_capture_overlay ,
3434 draw_transparent_capture_overlay ,
3535)
36+ from docking .applets .services import AppletServices
3637from docking .i18n import _
3738from docking .log import get_logger , with_context
3839
3940if TYPE_CHECKING :
4041 from docking .core .config import Config
42+ from docking .platform .backends .base import ScreenCaptureService
4143
4244log = with_context (get_logger (name = "colorpicker" ), applet_id = meta .id )
4345
@@ -62,6 +64,7 @@ def __init__(self, icon_size: int, config: Config | None = None) -> None:
6264 self ._hex = ""
6365 self ._show_hex = True
6466 self ._overlay : Gtk .Window | None = None
67+ self ._screen_capture : ScreenCaptureService | None = None
6568
6669 if config :
6770 prefs = config .applet_prefs .get (meta .id , {})
@@ -75,6 +78,9 @@ def __init__(self, icon_size: int, config: Config | None = None) -> None:
7578 super ().__init__ (icon_size = icon_size , config = config )
7679 self .present ()
7780
81+ def set_services (self , services : AppletServices ) -> None :
82+ self ._screen_capture = services .screen_capture
83+
7884 def create_icon (self , size : int ) -> GdkPixbuf .Pixbuf | None :
7985 return create_icon (
8086 size = size ,
@@ -91,6 +97,10 @@ def on_clicked(self) -> None:
9197 """Enter pick mode - fullscreen transparent overlay captures click."""
9298 self ._start_pick ()
9399
100+ def stop (self ) -> None :
101+ self ._dismiss_overlay ()
102+ super ().stop ()
103+
94104 def get_menu_items (self ) -> list [Gtk .MenuItem ]:
95105 primary : list [Gtk .MenuItem ] = []
96106
@@ -112,7 +122,7 @@ def _on_toggle_hex(self, widget: Gtk.CheckMenuItem) -> None:
112122
113123 def _start_pick (self ) -> None :
114124 """Create fullscreen transparent overlay to capture a click."""
115- if self ._overlay :
125+ if self ._overlay or self . _screen_capture is None :
116126 return
117127
118128 self ._overlay = create_capture_overlay (
@@ -130,7 +140,11 @@ def _on_overlay_click(self, _widget: Gtk.Window, event: Gdk.EventButton) -> bool
130140 """Sample pixel at click position."""
131141 self ._dismiss_overlay ()
132142
133- pixel = pick_pixel (x = int (event .x_root ), y = int (event .y_root ))
143+ pixel = (
144+ self ._screen_capture .pick_color (x = int (event .x_root ), y = int (event .y_root ))
145+ if self ._screen_capture is not None
146+ else None
147+ )
134148 if pixel :
135149 r , g , b = pixel
136150 self ._r = r / 255.0
0 commit comments