fix: tighten compositor adapter lifecycle
This commit is contained in:
@@ -33,12 +33,8 @@ class CompositorStateAdapter:
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
app: Optional[Any] = None,
|
||||
event_manager: Optional[Any] = None,
|
||||
workspace_backends: Optional[Iterable[Any]] = None,
|
||||
) -> None:
|
||||
self.app = app
|
||||
self.event_manager = event_manager
|
||||
self._workspaceBackends = list(workspace_backends or [])
|
||||
self._workspaceBackend: Optional[Any] = None
|
||||
self._listeners: list[Callable[[CompositorStateEvent], None]] = []
|
||||
@@ -59,7 +55,7 @@ class CompositorStateAdapter:
|
||||
return get_session_type()
|
||||
|
||||
def activate(self) -> None:
|
||||
self._workspaceBackend = None
|
||||
self._deactivate_current_backend()
|
||||
for backend in self._workspaceBackends:
|
||||
if not self._backend_is_available(backend):
|
||||
continue
|
||||
@@ -70,9 +66,7 @@ class CompositorStateAdapter:
|
||||
self.sync_accessible_context("activate")
|
||||
|
||||
def deactivate(self) -> None:
|
||||
if self._workspaceBackend is not None:
|
||||
self._backend_deactivate(self._workspaceBackend)
|
||||
self._workspaceBackend = None
|
||||
self._deactivate_current_backend()
|
||||
cthulhu_state.pauseAtspiChurn = False
|
||||
|
||||
def sync_accessible_context(self, reason: str) -> DesktopContextSnapshot:
|
||||
@@ -83,6 +77,7 @@ class CompositorStateAdapter:
|
||||
locus_of_focus_snapshot = self._build_object_snapshot(locus_of_focus)
|
||||
snapshot = DesktopContextSnapshot(
|
||||
session_type=self.get_session_type(),
|
||||
backend_name=self._backend_name(),
|
||||
active_window_token=active_window_snapshot["token"],
|
||||
locus_of_focus_token=locus_of_focus_snapshot["token"],
|
||||
active_window_pid=active_window_snapshot["pid"],
|
||||
@@ -175,3 +170,20 @@ class CompositorStateAdapter:
|
||||
backend.deactivate(self)
|
||||
except TypeError:
|
||||
backend.deactivate()
|
||||
|
||||
def _deactivate_current_backend(self) -> None:
|
||||
if self._workspaceBackend is None:
|
||||
return
|
||||
|
||||
self._backend_deactivate(self._workspaceBackend)
|
||||
self._workspaceBackend = None
|
||||
|
||||
def _backend_name(self) -> str:
|
||||
if self._workspaceBackend is None:
|
||||
return ""
|
||||
|
||||
name = getattr(self._workspaceBackend, "name", "")
|
||||
if name:
|
||||
return str(name)
|
||||
|
||||
return self._workspaceBackend.__class__.__name__
|
||||
|
||||
@@ -26,6 +26,7 @@ class DesktopContextSnapshot:
|
||||
"""Immutable snapshot of the desktop context tracked by the adapter."""
|
||||
|
||||
session_type: str
|
||||
backend_name: str = ""
|
||||
active_window_token: str = ""
|
||||
locus_of_focus_token: str = ""
|
||||
active_window_pid: int = -1
|
||||
|
||||
@@ -957,10 +957,7 @@ class Cthulhu(GObject.Object):
|
||||
self.resourceManager: resource_manager.ResourceManager = resource_manager.ResourceManager(self)
|
||||
self.settingsManager: SettingsManager = settings_manager.SettingsManager(self) # Directly instantiate
|
||||
self.eventManager: EventManager = event_manager.EventManager(self) # Directly instantiate
|
||||
self.compositorStateAdapter: CompositorStateAdapter = compositor_state_adapter.CompositorStateAdapter(
|
||||
self,
|
||||
self.eventManager,
|
||||
)
|
||||
self.compositorStateAdapter: CompositorStateAdapter = compositor_state_adapter.CompositorStateAdapter()
|
||||
self.eventManager.set_compositor_state_adapter(self.compositorStateAdapter)
|
||||
self.scriptManager: ScriptManager = script_manager.ScriptManager(self) # Directly instantiate
|
||||
script_manager._manager = self.scriptManager
|
||||
|
||||
@@ -143,6 +143,9 @@ class EventManager:
|
||||
elif cthulhu_state.locusOfFocus is None:
|
||||
cthulhu.setLocusOfFocus(None, window, notifyScript=True, force=True)
|
||||
|
||||
if getattr(self, "_compositorStateAdapter", None) is not None:
|
||||
self._compositorStateAdapter.sync_accessible_context("event-manager-startup")
|
||||
|
||||
return False
|
||||
|
||||
def _activateKeyHandling(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user