Add messaging if no running driver is detected
This commit is contained in:
parent
56a7d41ec6
commit
d1c5e9fc4d
|
|
@ -95,24 +95,30 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
var target_monitor = this._target_monitor;
|
var target_monitor = this._target_monitor;
|
||||||
var is_effect_running = this._is_effect_running;
|
var is_effect_running = this._is_effect_running;
|
||||||
this._running_poller_id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, (() => {
|
this._running_poller_id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, (() => {
|
||||||
if (is_effect_running) {
|
try {
|
||||||
this._running_poller_id = undefined;
|
if (is_effect_running) {
|
||||||
return GLib.SOURCE_REMOVE;
|
this._running_poller_id = undefined;
|
||||||
}
|
return GLib.SOURCE_REMOVE;
|
||||||
|
|
||||||
const is_driver_running = this._check_driver_running();
|
|
||||||
if (is_driver_running && target_monitor) {
|
|
||||||
// Don't enable the effect yet if monitor updates are needed.
|
|
||||||
// _setup will be triggered again since a !ready result means it will trigger monitor changes,
|
|
||||||
// so we can remove this timeout_add no matter what.
|
|
||||||
if (this._target_monitor_ready(target_monitor)) {
|
|
||||||
Globals.logger.log('Driver is running, supported monitor connected. Enabling XR effect.');
|
|
||||||
this._effect_enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const is_driver_running = this._check_driver_running();
|
||||||
|
if (is_driver_running && target_monitor) {
|
||||||
|
// Don't enable the effect yet if monitor updates are needed.
|
||||||
|
// _setup will be triggered again since a !ready result means it will trigger monitor changes,
|
||||||
|
// so we can remove this timeout_add no matter what.
|
||||||
|
if (this._target_monitor_ready(target_monitor)) {
|
||||||
|
Globals.logger.log('Driver is running, supported monitor connected. Enabling XR effect.');
|
||||||
|
this._effect_enable();
|
||||||
|
}
|
||||||
|
this._running_poller_id = undefined;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
} else {
|
||||||
|
return GLib.SOURCE_CONTINUE;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
Globals.logger.log(`ERROR: BreezyDesktopExtension _poll_for_ready ${e.message}\n${e.stack}`);
|
||||||
this._running_poller_id = undefined;
|
this._running_poller_id = undefined;
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
} else {
|
|
||||||
return GLib.SOURCE_CONTINUE;
|
|
||||||
}
|
}
|
||||||
}).bind(this));
|
}).bind(this));
|
||||||
}
|
}
|
||||||
|
|
@ -333,29 +339,37 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
}
|
}
|
||||||
|
|
||||||
_write_control(key, value) {
|
_write_control(key, value) {
|
||||||
const file = Gio.file_new_for_path('/dev/shm/xr_driver_control');
|
try {
|
||||||
const stream = file.replace(null, false, Gio.FileCreateFlags.NONE, null);
|
const file = Gio.file_new_for_path('/dev/shm/xr_driver_control');
|
||||||
stream.write(`${key}=${value}`, null);
|
const stream = file.replace(null, false, Gio.FileCreateFlags.NONE, null);
|
||||||
stream.close(null);
|
stream.write(`${key}=${value}`, null);
|
||||||
|
stream.close(null);
|
||||||
|
} catch (e) {
|
||||||
|
Globals.logger.log(`ERROR: BreezyDesktopExtension _write_control ${e.message}\n${e.stack}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_read_state(keys) {
|
_read_state(keys) {
|
||||||
const state = {};
|
const state = {};
|
||||||
const file = Gio.file_new_for_path('/dev/shm/xr_driver_state');
|
try {
|
||||||
if (file.query_exists(null)) {
|
const file = Gio.file_new_for_path('/dev/shm/xr_driver_state');
|
||||||
const data = file.load_contents(null);
|
if (file.query_exists(null)) {
|
||||||
|
const data = file.load_contents(null);
|
||||||
if (data[0]) {
|
|
||||||
const bytes = new Uint8Array(data[1]);
|
if (data[0]) {
|
||||||
const decoder = new TextDecoder();
|
const bytes = new Uint8Array(data[1]);
|
||||||
const contents = decoder.decode(bytes);
|
const decoder = new TextDecoder();
|
||||||
|
const contents = decoder.decode(bytes);
|
||||||
|
|
||||||
const lines = contents.split('\n');
|
const lines = contents.split('\n');
|
||||||
for (const line of lines) {
|
for (const line of lines) {
|
||||||
const [k, v] = line.split('=');
|
const [k, v] = line.split('=');
|
||||||
if (keys.includes(k)) state[k] = v;
|
if (keys.includes(k)) state[k] = v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
Globals.logger.log(`ERROR: BreezyDesktopExtension _read_state ${e.message}\n${e.stack}`);
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
@ -377,13 +391,14 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
this._write_control('sbs_mode', value ? 'enable' : 'disable');
|
this._write_control('sbs_mode', value ? 'enable' : 'disable');
|
||||||
if (!this._sbs_mode_update_timeout) {
|
if (!this._sbs_mode_update_timeout) {
|
||||||
var attempts = 0;
|
var attempts = 0;
|
||||||
this._sbs_mode_update_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 10000, (() => {
|
this._sbs_mode_update_timeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 3000, (() => {
|
||||||
if (attempts++ < 3) {
|
if (attempts++ < 3) {
|
||||||
this._write_control('sbs_mode', value ? 'enable' : 'disable');
|
this._write_control('sbs_mode', value ? 'enable' : 'disable');
|
||||||
return GLib.SOURCE_CONTINUE;
|
return GLib.SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the state never updated to reflect our request, revert the setting
|
// the state never updated to reflect our request, revert the setting
|
||||||
|
Globals.logger.log('Failed to update sbs_mode state, reverting setting');
|
||||||
this.settings.set_boolean('widescreen-mode', !value);
|
this.settings.set_boolean('widescreen-mode', !value);
|
||||||
this._sbs_mode_update_timeout = undefined;
|
this._sbs_mode_update_timeout = undefined;
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
|
|
@ -403,6 +418,7 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
_update_widescreen_mode_from_state(effect, _pspec) {
|
_update_widescreen_mode_from_state(effect, _pspec) {
|
||||||
// kill our state checker if it's running
|
// kill our state checker if it's running
|
||||||
if (this._sbs_mode_update_timeout) {
|
if (this._sbs_mode_update_timeout) {
|
||||||
|
Globals.logger.log_debug('BreezyDesktopExtension _update_widescreen_mode_from_state - clearing timeout');
|
||||||
GLib.source_remove(this._sbs_mode_update_timeout);
|
GLib.source_remove(this._sbs_mode_update_timeout);
|
||||||
this._sbs_mode_update_timeout = undefined;
|
this._sbs_mode_update_timeout = undefined;
|
||||||
}
|
}
|
||||||
|
|
@ -448,8 +464,9 @@ export default class BreezyDesktopExtension extends Extension {
|
||||||
this._is_effect_running = false;
|
this._is_effect_running = false;
|
||||||
|
|
||||||
if (this._running_poller_id) {
|
if (this._running_poller_id) {
|
||||||
GLib.source_remove(this._running_poller_id);
|
const poller_id = this._running_poller_id;
|
||||||
this._running_poller_id = undefined;
|
this._running_poller_id = undefined;
|
||||||
|
GLib.source_remove(poller_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
Main.wm.removeKeybinding('recenter-display-shortcut');
|
Main.wm.removeKeybinding('recenter-display-shortcut');
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit a96fdeb1557d8cd24e73cb8e9e2559adfa46e3aa
|
Subproject commit 3f23409b6be154c9c9a7035c6213558a7ef6c84e
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
<file preprocess="xml-stripblanks">gtk/failed-verification.ui</file>
|
<file preprocess="xml-stripblanks">gtk/failed-verification.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/license-dialog.ui</file>
|
<file preprocess="xml-stripblanks">gtk/license-dialog.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/no-device.ui</file>
|
<file preprocess="xml-stripblanks">gtk/no-device.ui</file>
|
||||||
|
<file preprocess="xml-stripblanks">gtk/no-driver.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/no-extension.ui</file>
|
<file preprocess="xml-stripblanks">gtk/no-extension.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/no-license.ui</file>
|
<file preprocess="xml-stripblanks">gtk/no-license.ui</file>
|
||||||
<file preprocess="xml-stripblanks">gtk/shortcut-dialog.ui</file>
|
<file preprocess="xml-stripblanks">gtk/shortcut-dialog.ui</file>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk" version="4.0"/>
|
||||||
|
<template class="NoDriver" parent="GtkBox">
|
||||||
|
<property name="orientation">1</property>
|
||||||
|
<property name="margin-top">20</property>
|
||||||
|
<property name="margin-bottom">20</property>
|
||||||
|
<property name="margin-start">20</property>
|
||||||
|
<property name="margin-end">20</property>
|
||||||
|
<property name="spacing">20</property>
|
||||||
|
<child>
|
||||||
|
<object class="AdwStatusPage">
|
||||||
|
<property name="title" translatable="true">No driver running</property>
|
||||||
|
<property name="description" translatable="true">
|
||||||
|
If you installed via AUR, make sure you ran the recommended post-install command:
|
||||||
|
systemctl --user enable --now xr-driver.service
|
||||||
|
|
||||||
|
Otherwise, please file an issue on GitHub, or create a new thread in the #troubleshooting channel on Discord.
|
||||||
|
</property>
|
||||||
|
<property name="width-request">650</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</template>
|
||||||
|
</interface>
|
||||||
|
|
@ -38,6 +38,7 @@ breezydesktop_sources = [
|
||||||
'licensetierrow.py',
|
'licensetierrow.py',
|
||||||
'main.py',
|
'main.py',
|
||||||
'nodevice.py',
|
'nodevice.py',
|
||||||
|
'nodriver.py',
|
||||||
'noextension.py',
|
'noextension.py',
|
||||||
'nolicense.py',
|
'nolicense.py',
|
||||||
'settingsmanager.py',
|
'settingsmanager.py',
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/no-driver.ui')
|
||||||
|
class NoDriver(Gtk.Box):
|
||||||
|
__gtype_name__ = "NoDriver"
|
||||||
|
|
@ -20,6 +20,7 @@ class StateManager(GObject.GObject):
|
||||||
}
|
}
|
||||||
|
|
||||||
__gproperties__ = {
|
__gproperties__ = {
|
||||||
|
'driver-running': (bool, 'Driver Running', 'Whether the driver is running', False, GObject.ParamFlags.READWRITE),
|
||||||
'follow-mode': (bool, 'Follow Mode', 'Whether the follow mode is enabled', False, GObject.ParamFlags.READWRITE),
|
'follow-mode': (bool, 'Follow Mode', 'Whether the follow mode is enabled', False, GObject.ParamFlags.READWRITE),
|
||||||
'follow-threshold': (float, 'Follow Threshold', 'The follow threshold', 1.0, 45.0, 15.0, GObject.ParamFlags.READWRITE),
|
'follow-threshold': (float, 'Follow Threshold', 'The follow threshold', 1.0, 45.0, 15.0, GObject.ParamFlags.READWRITE),
|
||||||
'widescreen-mode': (bool, 'Widescreen Mode', 'Whether widescreen mode is enabled', False, GObject.ParamFlags.READWRITE),
|
'widescreen-mode': (bool, 'Widescreen Mode', 'Whether widescreen mode is enabled', False, GObject.ParamFlags.READWRITE),
|
||||||
|
|
@ -53,6 +54,7 @@ class StateManager(GObject.GObject):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
GObject.GObject.__init__(self)
|
GObject.GObject.__init__(self)
|
||||||
self.ipc = XRDriverIPC.get_instance()
|
self.ipc = XRDriverIPC.get_instance()
|
||||||
|
self.driver_running = False
|
||||||
self.connected_device_name = None
|
self.connected_device_name = None
|
||||||
self.license_action_needed = False
|
self.license_action_needed = False
|
||||||
self.license_action_needed_seconds = 0
|
self.license_action_needed_seconds = 0
|
||||||
|
|
@ -71,6 +73,8 @@ class StateManager(GObject.GObject):
|
||||||
|
|
||||||
def _refresh_state(self):
|
def _refresh_state(self):
|
||||||
self.state = self.ipc.retrieve_driver_state()
|
self.state = self.ipc.retrieve_driver_state()
|
||||||
|
self.set_property('driver-running', self.state['ui_view'].get('driver_running'))
|
||||||
|
|
||||||
new_device_name = StateManager.device_name(self.state)
|
new_device_name = StateManager.device_name(self.state)
|
||||||
if self.connected_device_name != new_device_name:
|
if self.connected_device_name != new_device_name:
|
||||||
self.connected_device_name = new_device_name
|
self.connected_device_name = new_device_name
|
||||||
|
|
@ -94,12 +98,14 @@ class StateManager(GObject.GObject):
|
||||||
elif self.license_present:
|
elif self.license_present:
|
||||||
self.set_property('license-present', False)
|
self.set_property('license-present', False)
|
||||||
|
|
||||||
self.set_property('follow-mode', self.state.get('breezy_desktop_smooth_follow_enabled'))
|
self.set_property('follow-mode', self.state.get('breezy_desktop_smooth_follow_enabled', False))
|
||||||
self.set_property('widescreen-mode', self.state.get('sbs_mode_enabled'))
|
self.set_property('widescreen-mode', self.state.get('sbs_mode_enabled', False))
|
||||||
|
|
||||||
if self.running: threading.Timer(1.0, self._refresh_state).start()
|
if self.running: threading.Timer(1.0, self._refresh_state).start()
|
||||||
|
|
||||||
def do_set_property(self, prop, value):
|
def do_set_property(self, prop, value):
|
||||||
|
if prop.name == 'driver-running':
|
||||||
|
self.driver_running = value
|
||||||
if prop.name == 'follow-mode':
|
if prop.name == 'follow-mode':
|
||||||
self.follow_mode = value
|
self.follow_mode = value
|
||||||
if prop.name == 'widescreen-mode':
|
if prop.name == 'widescreen-mode':
|
||||||
|
|
@ -112,6 +118,8 @@ class StateManager(GObject.GObject):
|
||||||
self.enabled_features = value
|
self.enabled_features = value
|
||||||
|
|
||||||
def do_get_property(self, prop):
|
def do_get_property(self, prop):
|
||||||
|
if prop.name == 'driver-running':
|
||||||
|
return self.driver_running
|
||||||
if prop.name == 'follow-mode':
|
if prop.name == 'follow-mode':
|
||||||
return self.follow_mode
|
return self.follow_mode
|
||||||
if prop.name == 'widescreen-mode':
|
if prop.name == 'widescreen-mode':
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ from .statemanager import StateManager
|
||||||
from .connecteddevice import ConnectedDevice
|
from .connecteddevice import ConnectedDevice
|
||||||
from .failedverification import FailedVerification
|
from .failedverification import FailedVerification
|
||||||
from .nodevice import NoDevice
|
from .nodevice import NoDevice
|
||||||
|
from .nodriver import NoDriver
|
||||||
from .noextension import NoExtension
|
from .noextension import NoExtension
|
||||||
from .nolicense import NoLicense
|
from .nolicense import NoLicense
|
||||||
from .verify import verify_installation
|
from .verify import verify_installation
|
||||||
|
|
@ -49,6 +50,7 @@ class BreezydesktopWindow(Gtk.ApplicationWindow):
|
||||||
self.connected_device = ConnectedDevice()
|
self.connected_device = ConnectedDevice()
|
||||||
self.failed_verification = FailedVerification()
|
self.failed_verification = FailedVerification()
|
||||||
self.no_device = NoDevice()
|
self.no_device = NoDevice()
|
||||||
|
self.no_driver = NoDriver()
|
||||||
self.no_extension = NoExtension()
|
self.no_extension = NoExtension()
|
||||||
self.no_license = NoLicense()
|
self.no_license = NoLicense()
|
||||||
|
|
||||||
|
|
@ -77,15 +79,17 @@ class BreezydesktopWindow(Gtk.ApplicationWindow):
|
||||||
if not verify_installation():
|
if not verify_installation():
|
||||||
self.main_content.append(self.failed_verification)
|
self.main_content.append(self.failed_verification)
|
||||||
|
|
||||||
if not self.state_manager.get_property('license-present'):
|
if not self.state_manager.driver_running:
|
||||||
|
self.main_content.append(self.no_driver)
|
||||||
|
elif not state_manager.connected_device_name:
|
||||||
|
self.main_content.append(self.no_device)
|
||||||
|
elif not self.state_manager.license_present:
|
||||||
self.main_content.append(self.no_license)
|
self.main_content.append(self.no_license)
|
||||||
elif not ExtensionsManager.get_instance().is_installed():
|
elif not ExtensionsManager.get_instance().is_installed():
|
||||||
self.main_content.append(self.no_extension)
|
self.main_content.append(self.no_extension)
|
||||||
elif state_manager.connected_device_name:
|
else:
|
||||||
self.main_content.append(self.connected_device)
|
self.main_content.append(self.connected_device)
|
||||||
self.connected_device.set_device_name(state_manager.connected_device_name)
|
self.connected_device.set_device_name(state_manager.connected_device_name)
|
||||||
else:
|
|
||||||
self.main_content.append(self.no_device)
|
|
||||||
|
|
||||||
def _on_license_button_clicked(self, widget):
|
def _on_license_button_clicked(self, widget):
|
||||||
dialog = LicenseDialog()
|
dialog = LicenseDialog()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue