breezy-desktop/gnome/ui/breezygnomeruntimeenvironme...

107 lines
3.8 KiB
Python

"""GNOME Shell runtime environment for Breezy Desktop.
This is the reference RuntimeEnvironment implementation. It is packaged into the
UI's ``runtimes`` subpackage by the GNOME package script (see bin/package_gnome
-> ui/bin/package), so its imports are relative to the installed
``breezydesktop`` package.
"""
import logging
import os
import pydbus
from ..runtimeenvironment import RuntimeEnvironment
logger = logging.getLogger('breezy_ui')
BREEZY_DESKTOP_UUID = "breezydesktop@xronlinux.com"
EXTENSION_STATE_ENABLED = 1
class BreezyGNOMERuntimeEnvironment(RuntimeEnvironment):
"""Runs Breezy Desktop as a GNOME Shell extension.
Enablement is backed by the GNOME Shell extension state, verification runs
the breezy_gnome_verify binary, updates are checked against GitHub, and
virtual displays are created via the Mutter ScreenCast portal.
"""
APP_NAMESPACE = 'breezy_gnome'
def __init__(self):
super().__init__()
self.bus = pydbus.SessionBus()
self.gnome_shell_extensions = self.bus.get("org.gnome.Shell.Extensions")
self.gnome_shell_extensions.ExtensionStateChanged.connect(self._handle_extension_state_change)
self._breezy_enabled = self.is_enabled()
def _handle_extension_state_change(self, extension_uuid, state):
if extension_uuid == BREEZY_DESKTOP_UUID:
enabled = state.get('state') == EXTENSION_STATE_ENABLED
# update internal state first so do_set_property doesn't re-trigger
# an extension enable/disable; this just emits the notify
self._breezy_enabled = enabled
self.set_property('breezy-enabled', enabled)
# --- effect enablement ------------------------------------------------
def is_installed(self):
extensions_result = self.gnome_shell_extensions.ListExtensions()
for extension in extensions_result:
if extension == BREEZY_DESKTOP_UUID:
return True
return False
def is_enabled(self):
return self.gnome_shell_extensions.GetExtensionInfo(BREEZY_DESKTOP_UUID).get('state') == EXTENSION_STATE_ENABLED
def enable(self):
if not self.gnome_shell_extensions.UserExtensionsEnabled:
self.gnome_shell_extensions.UserExtensionsEnabled = True
self.gnome_shell_extensions.EnableExtension(BREEZY_DESKTOP_UUID)
self._breezy_enabled = True
def disable(self):
self.gnome_shell_extensions.DisableExtension(BREEZY_DESKTOP_UUID)
self._breezy_enabled = False
# --- verification / updates -------------------------------------------
def verify(self):
from .verify import verify_installation
return verify_installation()
def check_for_update(self, current_version, callback):
from .updatechecker import check_for_update
return check_for_update(current_version, callback)
# --- optional views ---------------------------------------------------
@property
def shows_no_device_view(self):
return True
# --- virtual displays -------------------------------------------------
def is_virtual_display_supported(self):
# wayland + the Mutter ScreenCast portal are required to create displays
from .virtualdisplay import is_screencast_available
return is_screencast_available() and "WAYLAND_DISPLAY" in os.environ
def _create_virtual_display_manager(self):
from .virtualdisplaymanager import VirtualDisplayManager
return VirtualDisplayManager.get_instance()
# --- GObject property plumbing ----------------------------------------
def do_set_property(self, prop, value):
if prop.name == 'breezy-enabled' and value != self._breezy_enabled:
self.enable() if value else self.disable()
def do_get_property(self, prop):
if prop.name == 'breezy-enabled':
return self._breezy_enabled