88import os
99import sys
1010import typing
11- from dataclasses import dataclass
1211from functools import cached_property
1312
1413import inject
15- from PySide6 .QtCore import QEvent , QObject , Signal
14+ from PySide6 .QtCore import QEvent , QObject , QRunnable , QThreadPool , Signal
1615
1716from mpvqc .services .main_window import MainWindowService
1817
19- logger = logging .getLogger (__name__ )
20-
18+ from .window_buttons import DEFAULT_WINDOW_BUTTON_PREFERENCE , WindowButtonPreference , read_window_button_preference
2119
22- @dataclass (frozen = True )
23- class WindowButtonPreference :
24- minimize : bool
25- maximize : bool
26- close : bool
20+ logger = logging .getLogger (__name__ )
2721
2822
2923class HostIntegrationService (QObject ):
3024 _main_window = inject .attr (MainWindowService )
3125
32- DEFAULT_WINDOW_BUTTON_PREFERENCE = WindowButtonPreference (minimize = True , maximize = True , close = True )
33-
3426 display_zoom_factor_changed = Signal (float )
27+ window_button_preference_changed = Signal (object )
3528
36- def __init__ (self ) -> None :
29+ def __init__ (self , detect_configuration : bool = True ) -> None :
3730 super ().__init__ ()
38- self ._zoom_factor = self ._main_window .display_zoom_factor
39- self ._window = self ._main_window .window
40- self ._window .installEventFilter (self )
31+ self ._zoom_factor = 1.0
32+ self ._window_button_preference = DEFAULT_WINDOW_BUTTON_PREFERENCE
33+
34+ if detect_configuration :
35+ self ._zoom_factor = self ._main_window .display_zoom_factor
36+ self ._window = self ._main_window .window
37+ self ._window .installEventFilter (self )
38+ self ._detect_window_button_preference_async ()
39+
40+ def _detect_window_button_preference_async (self ) -> None :
41+ def job () -> None :
42+ preference = read_window_button_preference ()
43+ if preference != self ._window_button_preference :
44+ self ._window_button_preference = preference
45+ self .window_button_preference_changed .emit (preference )
46+
47+ QThreadPool .globalInstance ().start (QRunnable .create (job ))
48+
49+ @property
50+ def window_button_preference (self ) -> WindowButtonPreference :
51+ return self ._window_button_preference
4152
4253 @typing .override
4354 def eventFilter (self , watched : QObject , event : QEvent ) -> bool :
@@ -60,11 +71,6 @@ def is_tiling_window_manager(self) -> bool:
6071 return False
6172 return is_tiling_window_manager ()
6273
63- def get_window_button_preference (self ) -> WindowButtonPreference :
64- if sys .platform == "linux" :
65- return read_linux_window_button_preference ()
66- return self .DEFAULT_WINDOW_BUTTON_PREFERENCE
67-
6874
6975def is_tiling_window_manager () -> bool :
7076 tiling_wms = {
@@ -90,20 +96,3 @@ def is_tiling_window_manager() -> bool:
9096 logger .debug ("Running on tiling window manager" )
9197
9298 return is_tiling_wm
93-
94-
95- def read_linux_window_button_preference () -> WindowButtonPreference :
96- from mpvqc .services .host_integration .portals import SettingsPortal
97-
98- with SettingsPortal () as portal :
99- layout = portal .read_one ("org.gnome.desktop.wm.preferences" , "button-layout" )
100-
101- if layout is None :
102- return WindowButtonPreference (minimize = True , maximize = True , close = True )
103-
104- buttons = layout .lower ()
105- return WindowButtonPreference (
106- minimize = "minimize" in buttons ,
107- maximize = "maximize" in buttons ,
108- close = "close" in buttons ,
109- )
0 commit comments