diff --git a/ui/build-aux/start-breezy-desktop.sh b/ui/build-aux/start-breezy-desktop.sh index ba65e8a..b4f60b1 100644 --- a/ui/build-aux/start-breezy-desktop.sh +++ b/ui/build-aux/start-breezy-desktop.sh @@ -5,6 +5,8 @@ IFS=: read -ra host_data_dirs < <(flatpak-spawn --host sh -c 'echo "$XDG_DATA_DIRS"') IFS=: read -ra HOST_XDG_STATE_HOME < <(flatpak-spawn --host sh -c 'echo "$XDG_STATE_HOME"') +IFS=: read -ra HOST_XDG_BIN_HOME < <(flatpak-spawn --host sh -c 'echo "$XDG_BIN_HOME"') +IFS=: read -ra HOST_XDG_DATA_HOME < <(flatpak-spawn --host sh -c 'echo "$XDG_DATA_HOME"') # To avoid potentially muddying up $XDG_DATA_DIRS too much, we link the schema paths # into a temporary directory. @@ -34,12 +36,26 @@ if [[ ! -z "${HOST_XDG_DATA_DIRS}" ]]; then XDG_DATA_DIRS="${HOST_XDG_DATA_DIRS:1}:${XDG_DATA_DIRS}" fi +if [[ ! -z "${HOST_XDG_BIN_HOME}" ]]; then + XDG_BIN_HOME="${HOST_XDG_BIN_HOME}" +else + XDG_BIN_HOME="$(realpath ~)/.local/bin" +fi + if [[ ! -z "${HOST_XDG_STATE_HOME}" ]]; then XDG_STATE_HOME="${HOST_XDG_STATE_HOME}" else - XDG_STATE_HOME="${USER_HOME}/.local/state" + XDG_STATE_HOME="$(realpath ~)/.local/state" +fi + +if [[ ! -z "${HOST_XDG_DATA_HOME}" ]]; then + XDG_DATA_HOME="${HOST_XDG_DATA_HOME}" +else + XDG_DATA_HOME="$(realpath ~)/.local/share" fi export XDG_DATA_DIRS +export XDG_BIN_HOME export XDG_STATE_HOME +export XDG_DATA_HOME exec breezydesktop "$@" \ No newline at end of file diff --git a/ui/modules/PyXRLinuxDriverIPC b/ui/modules/PyXRLinuxDriverIPC index 0f80226..b98e0ec 160000 --- a/ui/modules/PyXRLinuxDriverIPC +++ b/ui/modules/PyXRLinuxDriverIPC @@ -1 +1 @@ -Subproject commit 0f8022681bc5a3beb5ce0468e348e5f84658662f +Subproject commit b98e0ec9a12f2ec37ebbb06e6b2226246da11107 diff --git a/ui/src/breezydesktop.gresource.xml b/ui/src/breezydesktop.gresource.xml index 016c262..b20a15c 100644 --- a/ui/src/breezydesktop.gresource.xml +++ b/ui/src/breezydesktop.gresource.xml @@ -2,6 +2,7 @@ gtk/connected-device.ui + gtk/failed-verification.ui gtk/license-dialog.ui gtk/no-device.ui gtk/no-extension.ui diff --git a/ui/src/failedverification.py b/ui/src/failedverification.py new file mode 100644 index 0000000..15e44f5 --- /dev/null +++ b/ui/src/failedverification.py @@ -0,0 +1,5 @@ +from gi.repository import Adw, Gtk + +@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/failed-verification.ui') +class FailedVerification(Gtk.Box): + __gtype_name__ = "FailedVerification" diff --git a/ui/src/gtk/failed-verification.ui b/ui/src/gtk/failed-verification.ui new file mode 100644 index 0000000..2fdb862 --- /dev/null +++ b/ui/src/gtk/failed-verification.ui @@ -0,0 +1,19 @@ + + + + + diff --git a/ui/src/main.py b/ui/src/main.py index 0d02168..f77a4dc 100644 --- a/ui/src/main.py +++ b/ui/src/main.py @@ -17,10 +17,10 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +import gi import logging import os import sys -import gi from logging.handlers import TimedRotatingFileHandler @@ -29,7 +29,7 @@ gi.require_version('Adw', '1') gi.require_version('Gio', '2.0') gi.require_version('GLib', '2.0') -from gi.repository import Adw, Gtk, Gio, GLib +from gi.repository import Adw, Gtk, Gio from .licensedialog import LicenseDialog from .statemanager import StateManager from .window import BreezydesktopWindow diff --git a/ui/src/meson.build b/ui/src/meson.build index 710cec1..55b0c5f 100644 --- a/ui/src/meson.build +++ b/ui/src/meson.build @@ -31,6 +31,7 @@ breezydesktop_sources = [ '__init__.py', 'connecteddevice.py', 'extensionsmanager.py', + 'failedverification.py', 'licensedialog.py', 'licensefeaturerow.py', 'licensetierrow.py', @@ -41,6 +42,7 @@ breezydesktop_sources = [ 'shortcutdialog.py', 'statemanager.py', 'time.py', + 'verify.py', 'window.py' ] diff --git a/ui/src/verify.py b/ui/src/verify.py new file mode 100644 index 0000000..3eb90cd --- /dev/null +++ b/ui/src/verify.py @@ -0,0 +1,35 @@ +import logging +import os +import subprocess + +logger = logging.getLogger('breezy_ui') +user_home = os.path.expanduser('~') + +def verify_installation(): + xdg_bin_home = os.environ.get('XDG_BIN_HOME') + if not xdg_bin_home or xdg_bin_home.startswith('/app') or xdg_bin_home.startswith(os.path.join(user_home, '.var/app')): + xdg_bin_home = os.path.join(user_home, '.local', 'bin') + verify_installation_path = os.path.join(xdg_bin_home, 'breezy_gnome_verify') + + if not os.path.exists(verify_installation_path): + logger.error(f"Could not verify your Breezy GNOME installation. Please ensure that Breezy GNOME is installed.") + exit(1) + + env_copy = os.environ.copy() + xdg_data_home = os.environ.get('XDG_DATA_HOME') + if not xdg_data_home or xdg_data_home.startswith('/app') or xdg_data_home.startswith(os.path.join(user_home, '.var/app')): + xdg_data_home = os.path.join(user_home, '.local', 'share') + env_copy["XDG_DATA_HOME"] = xdg_data_home + try: + verify_output = subprocess.check_output([verify_installation_path], stderr=subprocess.STDOUT, env=env_copy).strip() + success = verify_output == b"Verification succeeded" + if not success: + logger.error(f"Could not verify your Breezy GNOME installation. Please ensure that Breezy GNOME is installed.") + logger.error(verify_output) + + return success + except subprocess.CalledProcessError as e: + logger.error(f"Could not verify your Breezy GNOME installation. Please ensure that Breezy GNOME is installed.") + logger.error(e.output.decode().strip()) + + return False \ No newline at end of file diff --git a/ui/src/window.py b/ui/src/window.py index a96057c..59f5fda 100644 --- a/ui/src/window.py +++ b/ui/src/window.py @@ -22,8 +22,10 @@ from .extensionsmanager import ExtensionsManager from .licensedialog import LicenseDialog from .statemanager import StateManager from .connecteddevice import ConnectedDevice +from .failedverification import FailedVerification from .nodevice import NoDevice from .noextension import NoExtension +from .verify import verify_installation from .time import LICENSE_WARN_SECONDS @Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/window.ui') @@ -43,6 +45,7 @@ class BreezydesktopWindow(Gtk.ApplicationWindow): self.connected_device = ConnectedDevice() self.no_device = NoDevice() self.no_extension = NoExtension() + self.failed_verification = FailedVerification() self.license_action_needed_banner.connect('button-clicked', self._on_license_action_needed_button_clicked) @@ -61,7 +64,9 @@ class BreezydesktopWindow(Gtk.ApplicationWindow): for child in self.main_content: self.main_content.remove(child) - if not ExtensionsManager.get_instance().is_installed(): + if not verify_installation(): + self.main_content.append(self.failed_verification) + elif not ExtensionsManager.get_instance().is_installed(): self.main_content.append(self.no_extension) elif state_manager.connected_device_name: self.main_content.append(self.connected_device)