Skip to content

Commit 64bb747

Browse files
committed
screensaver: Move custom-screensaver check to the controller, so
it can be activated by other sources. Make Main.dismissInternalModals accessible over dbus so our cinnamon-screensaver-command can call it before activating cinnamon-screensaver or a custom screensaver command.
1 parent ed81d01 commit 64bb747

5 files changed

Lines changed: 55 additions & 16 deletions

File tree

files/usr/share/cinnamon/cinnamon-screensaver-command/cinnamon-screensaver-command.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,14 @@ def __init__(self, mainloop):
8484

8585
ss_settings = Gio.Settings.new("org.cinnamon.desktop.screensaver")
8686
custom_saver = ss_settings.get_string("custom-screensaver-command").strip()
87+
internal_enabled = Gio.Settings.new("org.cinnamon").get_boolean("internal-screensaver-enabled")
88+
89+
# Cinnamon dismisses its own modals inside the internal shield path.
90+
# Only call it here when the lock is being handled by a custom command
91+
# or cinnamon-screensaver.
92+
if self.action_id in (Action.LOCK, Action.ACTIVATE) and (custom_saver or not internal_enabled):
93+
self._dismiss_cinnamon_modals()
94+
8795
if custom_saver:
8896
self._handle_custom_saver(custom_saver)
8997
quit()
@@ -100,6 +108,22 @@ def __init__(self, mainloop):
100108
self._on_proxy_ready
101109
)
102110

111+
def _dismiss_cinnamon_modals(self):
112+
return
113+
try:
114+
bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
115+
bus.call_sync("org.Cinnamon",
116+
"/org/Cinnamon",
117+
"org.Cinnamon",
118+
"DismissInternalModals",
119+
None,
120+
None,
121+
Gio.DBusCallFlags.NONE,
122+
2000,
123+
None)
124+
except GLib.Error as e:
125+
print("Error dismissing Cinnamon modals: %s" % e.message)
126+
103127
def _handle_custom_saver(self, custom_saver):
104128
if self.action_id in (Action.LOCK, Action.ACTIVATE):
105129
try:

js/misc/screenSaver.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ var ScreenSaverService = class ScreenSaverService {
5353
this._screenShield.connect('locked', this._onLocked.bind(this));
5454
this._screenShield.connect('unlocked', this._onUnlocked.bind(this));
5555
}
56-
57-
global.log('ScreenSaverService: providing org.cinnamon.ScreenSaver interface');
5856
}
5957

6058
_onLocked() {

js/ui/cinnamonDBus.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ const CinnamonIface =
124124
<arg type="b" direction="in" name="show_osd" /> \
125125
</method> \
126126
<method name="ReloadTheme"/> \
127+
<method name="DismissInternalModals"/> \
127128
<signal name="RunStateChanged"/> \
128129
<signal name="XletsLoadedComplete"/> \
129130
<property name="AnimationsEnabled" type="b" access="read" /> \
@@ -496,6 +497,10 @@ var CinnamonDBus = class {
496497
Main.themeManager._changeTheme()
497498
}
498499

500+
DismissInternalModals() {
501+
Main.dismissInternalModals();
502+
}
503+
499504
EmitRunStateChanged() {
500505
this._dbusImpl.emit_signal('RunStateChanged', null);
501506
}

js/ui/keybindings.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,6 @@ KeybindingManager.prototype = {
133133
this.media_key_settings = new Gio.Settings({ schema_id: MEDIA_KEYS_SCHEMA });
134134
this.media_key_settings.connect("changed", Lang.bind(this, this.setup_media_keys));
135135

136-
this.screensaver_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.screensaver" });
137-
138136
this.setup_media_keys();
139137
},
140138

@@ -441,20 +439,16 @@ KeybindingManager.prototype = {
441439
if (Main._shouldFilterKeybinding(entry))
442440
return;
443441

444-
// Check if this is the screensaver key and internal screensaver is enabled
445-
if (action === MK.SCREENSAVER && global.settings.get_boolean('internal-screensaver-enabled')) {
446-
// If a custom screensaver is configured, skip internal handling and
447-
// let csd-media-keys run cinnamon-screensaver-command instead.
448-
if (!this.screensaver_settings.get_string('custom-screensaver-command').trim()) {
449-
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
450-
Main.screensaverController.lockScreen(false);
451-
return GLib.SOURCE_REMOVE;
452-
});
453-
return;
454-
}
442+
// The screensaver key always goes through the controller - it resolves
443+
// custom-screensaver-command, internal shield, and external daemon modes.
444+
if (action === MK.SCREENSAVER) {
445+
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
446+
Main.screensaverController.lockScreen(false);
447+
return GLib.SOURCE_REMOVE;
448+
});
449+
return;
455450
}
456451

457-
// Otherwise, forward to csd-media-keys (or other handler)
458452
this._proxy.HandleKeybindingRemote(action);
459453
},
460454

js/ui/screensaver/controller.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const Main = imports.ui.main;
1010
const ScreenShield = imports.ui.screensaver.screenShield;
1111
const ScreenSaver = imports.misc.screenSaver;
1212
const AwayMessageDialog = imports.ui.screensaver.awayMessageDialog;
13+
const Util = imports.misc.util;
1314

1415
var ScreensaverController = class {
1516
#screenShield = null;
@@ -28,11 +29,19 @@ var ScreensaverController = class {
2829
global.settings.set_boolean("session-locked-state", false);
2930
}
3031

32+
// A custom screensaver command preempts both internal and cinnamon-screensaver modes.
33+
let customCommand = this.#settings.get_string('custom-screensaver-command').trim();
34+
if (customCommand) {
35+
global.log(`Screensaver: custom command.`);
36+
return;
37+
}
38+
3139
this.#screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
3240

3341
// The internal screensaver is the only option for wayland sessions. X11 sessions can use either
3442
// the internal one or cinnamon-screensaver (>= 6.7).
3543
if (Meta.is_wayland_compositor() || global.settings.get_boolean('internal-screensaver-enabled')) {
44+
global.log('Screensaver: internal');
3645
let screenShieldGroup = new St.Widget({
3746
name: 'screenShieldGroup',
3847
visible: false,
@@ -57,6 +66,7 @@ var ScreensaverController = class {
5766
this.emit('locked-changed', false);
5867
});
5968
} else {
69+
global.log('Screensaver: cinnamon-screensaver');
6070
this.#screenSaverProxy.connectSignal('ActiveChanged', (proxy, senderName, [isActive]) => {
6171
this.#locked = isActive;
6272
this.emit('locked-changed', isActive);
@@ -94,6 +104,14 @@ var ScreensaverController = class {
94104
return;
95105
}
96106

107+
let customCommand = this.#settings.get_string('custom-screensaver-command').trim();
108+
if (customCommand) {
109+
Util.spawn(['cinnamon-screensaver-command', '-l']);
110+
if (callback)
111+
callback(true);
112+
return;
113+
}
114+
97115
if (askForAwayMessage && this.#settings.get_boolean('ask-for-away-message')) {
98116
let dialog = new AwayMessageDialog.AwayMessageDialog((message) => {
99117
this.#doLock(message, callback);

0 commit comments

Comments
 (0)