Skip to content

Commit 0993e5b

Browse files
committed
screensaver: De-clutter main.js of screensaver setup and functions,
make a controller class instead. I want it to be easy for code to get notified of locked states without resorting to a screensaver or session proxy, and there was already a lot of screensaver setup code in main.js. This class will be exported, but internals are locked down using js 'private elements'.
1 parent b0c6e1f commit 0993e5b

5 files changed

Lines changed: 121 additions & 82 deletions

File tree

js/ui/cinnamonDBus.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ var CinnamonDBus = class {
447447
}
448448

449449
ToggleKeyboard() {
450-
Main.toggleKeyboard();
450+
Main.screensaverController.toggleKeyboard();
451451
}
452452

453453
GetMonitors() {

js/ui/keybindings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ KeybindingManager.prototype = {
447447
// let csd-media-keys run cinnamon-screensaver-command instead.
448448
if (!this.screensaver_settings.get_string('custom-screensaver-command').trim()) {
449449
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
450-
Main.lockScreen(false);
450+
Main.screensaverController.lockScreen(false);
451451
return GLib.SOURCE_REMOVE;
452452
});
453453
return;

js/ui/main.js

Lines changed: 11 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ const NotificationDaemon = imports.ui.notificationDaemon;
117117
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
118118
const CinnamonDBus = imports.ui.cinnamonDBus;
119119
const Screenshot = imports.ui.screenshot;
120-
const ScreenShield = imports.ui.screensaver.screenShield;
121-
const AwayMessageDialog = imports.ui.screensaver.awayMessageDialog;
122-
const ScreenSaver = imports.misc.screenSaver;
120+
const ScreensaverController = imports.ui.screensaver.controller;
123121
const ThemeManager = imports.ui.themeManager;
124122
const Magnifier = imports.ui.magnifier;
125123
const LocatePointer = imports.ui.locatePointer;
@@ -152,9 +150,7 @@ var slideshowManager = null;
152150
var placesManager = null;
153151
var panelManager = null;
154152
var osdWindowManager = null;
155-
let _screenShield = null;
156-
let _screenSaverProxy = null;
157-
let _screensaverSettings = null;
153+
var screensaverController = null;
158154
var lockdownSettings = null;
159155
var overview = null;
160156
var expo = null;
@@ -539,43 +535,14 @@ function start() {
539535
}
540536
});
541537

542-
if (!global.session_running || Meta.is_wayland_compositor()) {
543-
// If the session is *not* already running, clear the internal locked
544-
// state. This is used in x11 sessions to restore the screensaver after
545-
// cinnamon restarts. Wayland doesn't support restarts (yet) so it should
546-
// always be false.
547-
global.settings.set_boolean("session-locked-state", false);
548-
}
549-
550-
_screensaverSettings = new Gio.Settings({ schema_id: 'org.cinnamon.desktop.screensaver' });
538+
screensaverController = new ScreensaverController.ScreensaverController();
551539

552-
// The internal screensaver is the only option for wayland sessions. X11 sessions can use either
553-
// the internal one or cinnamon-screensaver (>= 6.7).
554-
if (Meta.is_wayland_compositor() || global.settings.get_boolean('internal-screensaver-enabled')) {
555-
let screenShieldGroup = new St.Widget({
556-
name: 'screenShieldGroup',
557-
visible: false,
558-
clip_to_allocation: true,
559-
layout_manager: new Clutter.BinLayout()
560-
});
561-
screenShieldGroup.add_constraint(new Clutter.BindConstraint({
562-
source: global.stage,
563-
coordinate: Clutter.BindCoordinate.ALL
564-
}));
565-
global.stage.add_actor(screenShieldGroup);
566-
567-
_screenShield = new ScreenShield.ScreenShield(screenShieldGroup);
568-
new ScreenSaver.ScreenSaverService(_screenShield);
569-
}
570-
571-
// Protect security-critical exported functions from being replaced by extensions.
572-
for (let fnName of ['lockScreen', 'screenShieldHideKeyboard', 'toggleKeyboard']) {
573-
Object.defineProperty(imports.ui.main, fnName, {
574-
value: imports.ui.main[fnName],
575-
writable: false,
576-
configurable: false
577-
});
578-
}
540+
// Protect from being replaced by extensions.
541+
Object.defineProperty(imports.ui.main, 'screensaverController', {
542+
value: imports.ui.main.screensaverController,
543+
writable: false,
544+
configurable: false
545+
});
579546

580547
Promise.all([
581548
AppletManager.init(),
@@ -1281,7 +1248,7 @@ function _shouldFilterKeybinding(entry) {
12811248
if (allowed) {
12821249
let lockModes = Cinnamon.ActionMode.LOCK_SCREEN | Cinnamon.ActionMode.UNLOCK_SCREEN;
12831250
if ((actionMode & lockModes) !== 0 && (entry.allowedModes & lockModes) !== 0) {
1284-
if (_screenShield && !_screensaverSettings.get_boolean('allow-keyboard-shortcuts')) {
1251+
if (screensaverController?.locked && !screensaverController.allowKeyboardShortcuts) {
12851252
return true;
12861253
}
12871254
}
@@ -1864,42 +1831,7 @@ function closeEndSessionDialog() {
18641831
endSessionDialog = null;
18651832
}
18661833

1867-
function lockScreen(askForAwayMessage) {
1868-
if (lockdownSettings.get_boolean('disable-lock-screen')) {
1869-
return;
1870-
}
1871-
1872-
if (askForAwayMessage && _screensaverSettings.get_boolean('ask-for-away-message')) {
1873-
let dialog = new AwayMessageDialog.AwayMessageDialog((message) => {
1874-
_doLock(message);
1875-
});
1876-
dialog.open();
1877-
return;
1878-
}
1879-
1880-
_doLock(null);
1881-
}
1882-
1883-
function _doLock(awayMessage) {
1884-
if (_screenShield) {
1885-
_screenShield.lock(false, awayMessage);
1886-
return;
1887-
}
1888-
1889-
if (_screenSaverProxy === null) {
1890-
_screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
1891-
}
1892-
1893-
_screenSaverProxy.LockRemote(awayMessage || "");
1894-
}
1895-
1896-
function screenShieldHideKeyboard() {
1897-
_screenShield?._hideScreensaverKeyboard();
1898-
}
1899-
19001834
function toggleKeyboard() {
1901-
if (_screenShield?.visible)
1902-
_screenShield._toggleScreensaverKeyboard();
1903-
else
1835+
if (!screensaverController?.toggleScreensaverKeyboard())
19041836
virtualKeyboardManager.manualToggle();
19051837
}

js/ui/screensaver/controller.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2+
3+
const Clutter = imports.gi.Clutter;
4+
const Gio = imports.gi.Gio;
5+
const Meta = imports.gi.Meta;
6+
const Signals = imports.signals;
7+
const St = imports.gi.St;
8+
9+
const Main = imports.ui.main;
10+
const ScreenShield = imports.ui.screensaver.screenShield;
11+
const ScreenSaver = imports.misc.screenSaver;
12+
const AwayMessageDialog = imports.ui.screensaver.awayMessageDialog;
13+
14+
var ScreensaverController = class {
15+
#screenShield = null;
16+
#screenSaverProxy = null;
17+
#locked = false;
18+
#settings;
19+
20+
constructor() {
21+
this.#settings = new Gio.Settings({ schema_id: 'org.cinnamon.desktop.screensaver' });
22+
23+
if (!global.session_running || Meta.is_wayland_compositor()) {
24+
// If the session is *not* already running, clear the internal locked
25+
// state. This is used in x11 sessions to restore the screensaver after
26+
// cinnamon restarts. Wayland doesn't support restarts (yet) so it should
27+
// always be false.
28+
global.settings.set_boolean("session-locked-state", false);
29+
}
30+
31+
// The internal screensaver is the only option for wayland sessions. X11 sessions can use either
32+
// the internal one or cinnamon-screensaver (>= 6.7).
33+
if (Meta.is_wayland_compositor() || global.settings.get_boolean('internal-screensaver-enabled')) {
34+
let screenShieldGroup = new St.Widget({
35+
name: 'screenShieldGroup',
36+
visible: false,
37+
clip_to_allocation: true,
38+
layout_manager: new Clutter.BinLayout()
39+
});
40+
screenShieldGroup.add_constraint(new Clutter.BindConstraint({
41+
source: global.stage,
42+
coordinate: Clutter.BindCoordinate.ALL
43+
}));
44+
global.stage.add_actor(screenShieldGroup);
45+
46+
this.#screenShield = new ScreenShield.ScreenShield(screenShieldGroup);
47+
new ScreenSaver.ScreenSaverService(this.#screenShield);
48+
49+
this.#screenShield.connect('locked', () => {
50+
this.#locked = true;
51+
this.emit('locked-changed', true);
52+
});
53+
this.#screenShield.connect('unlocked', () => {
54+
this.#locked = false;
55+
this.emit('locked-changed', false);
56+
});
57+
}
58+
}
59+
60+
get locked() {
61+
return this.#locked;
62+
}
63+
64+
get allowKeyboardShortcuts() {
65+
return this.#settings.get_boolean('allow-keyboard-shortcuts');
66+
}
67+
68+
lockScreen(askForAwayMessage) {
69+
if (Main.lockdownSettings.get_boolean('disable-lock-screen'))
70+
return;
71+
72+
if (askForAwayMessage && this.#settings.get_boolean('ask-for-away-message')) {
73+
let dialog = new AwayMessageDialog.AwayMessageDialog((message) => {
74+
this.#doLock(message);
75+
});
76+
dialog.open();
77+
return;
78+
}
79+
80+
this.#doLock(null);
81+
}
82+
83+
#doLock(awayMessage) {
84+
if (this.#screenShield) {
85+
this.#screenShield.lock(false, awayMessage);
86+
return;
87+
}
88+
89+
if (this.#screenSaverProxy === null)
90+
this.#screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
91+
92+
this.#screenSaverProxy.LockRemote(awayMessage || "");
93+
}
94+
95+
hideKeyboard() {
96+
this.#screenShield?._hideScreensaverKeyboard();
97+
}
98+
99+
toggleScreensaverKeyboard() {
100+
if (this.#screenShield?.visible) {
101+
this.#screenShield._toggleScreensaverKeyboard();
102+
return true;
103+
}
104+
return false;
105+
}
106+
};
107+
Signals.addSignalMethods(ScreensaverController.prototype);

js/ui/virtualKeyboard.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1455,7 +1455,7 @@ class Keyboard extends St.BoxLayout {
14551455

14561456
close() {
14571457
if (this._screensaverMode) {
1458-
Main.screenShieldHideKeyboard();
1458+
Main.screensaverController.hideKeyboard();
14591459
return;
14601460
}
14611461

0 commit comments

Comments
 (0)