Use common Switcher class for themes and commands

This commit is contained in:
Romain Vigier
2022-02-20 02:16:34 +01:00
parent 7b44f3d8e0
commit d920c7dcd7
9 changed files with 370 additions and 685 deletions
+27 -30
View File
@@ -11,21 +11,18 @@ const Me = extensionUtils.getCurrentExtension();
const utils = Me.imports.utils;
const { SwitcherCommands } = Me.imports.modules.SwitcherCommands;
const { SwitcherThemeCursor, SwitcherThemeGtk, SwitcherThemeIcon, SwitcherThemeShell } = Me.imports.modules.SwitcherTheme;
const { Timer } = Me.imports.modules.Timer;
const { GtkThemer } = Me.imports.modules.GtkThemer;
const { ShellThemer } = Me.imports.modules.ShellThemer;
const { IconThemer } = Me.imports.modules.IconThemer;
const { CursorThemer } = Me.imports.modules.CursorThemer;
const { Commander } = Me.imports.modules.Commander;
var enabled = false;
var timer = null;
var gtkThemer = null;
var shellThemer = null;
var iconThemer = null;
var cursorThemer = null;
var commander = null;
var switcherThemeGtk = null;
var switcherThemeShell = null;
var switcherThemeIcon = null;
var switcherThemeCursor = null;
var switcherCommands = null;
/**
@@ -52,18 +49,18 @@ function enable() {
function start() {
console.debug('Enabling extension...');
timer = new Timer();
gtkThemer = new GtkThemer();
shellThemer = new ShellThemer();
iconThemer = new IconThemer();
cursorThemer = new CursorThemer();
commander = new Commander();
switcherThemeGtk = new SwitcherThemeGtk({ timer });
switcherThemeIcon = new SwitcherThemeIcon({ timer });
switcherThemeShell = new SwitcherThemeShell({ timer });
switcherThemeCursor = new SwitcherThemeCursor({ timer });
switcherCommands = new SwitcherCommands({ timer });
timer.enable();
gtkThemer.enable();
shellThemer.enable();
iconThemer.enable();
cursorThemer.enable();
commander.enable();
switcherThemeGtk.enable();
switcherThemeShell.enable();
switcherThemeIcon.enable();
switcherThemeCursor.enable();
switcherCommands.enable();
enabled = true;
console.debug('Extension enabled.');
@@ -76,19 +73,19 @@ function disable() {
console.debug('Disabling extension...');
enabled = false;
gtkThemer.disable();
shellThemer.disable();
iconThemer.disable();
cursorThemer.disable();
commander.disable();
switcherThemeGtk.disable();
switcherThemeShell.disable();
switcherThemeIcon.disable();
switcherThemeCursor.disable();
switcherCommands.disable();
timer.disable();
timer = null;
gtkThemer = null;
shellThemer = null;
iconThemer = null;
cursorThemer = null;
commander = null;
switcherThemeGtk = null;
switcherThemeShell = null;
switcherThemeIcon = null;
switcherThemeCursor = null;
switcherCommands = null;
console.debug('Extension disabled.');
}
-88
View File
@@ -1,88 +0,0 @@
// SPDX-FileCopyrightText: 2020, 2021 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { GLib } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const e = Me.imports.extension;
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* The Commander is responsible for spawning commands according to the time.
*/
var Commander = class {
constructor() {
this._commandsSettings = extensionUtils.getSettings(utils.getSettingsSchema('commands'));
this._statusConnection = null;
this._timerConnection = null;
}
enable() {
console.debug('Enabling Commander...');
this._watchStatus();
if (this._commandsSettings.get_boolean('enabled')) {
this._connectTimer();
this._spawnCommand(e.timer.time);
}
console.debug('Commander enabled.');
}
disable() {
console.debug('Disabling Commander...');
this._disconnectTimer();
this._unwatchStatus();
console.debug('Commander disabled.');
}
_watchStatus() {
console.debug('Watching commands status...');
this._statusConnection = this._commandsSettings.connect('changed::enabled', this._onStatusChanged.bind(this));
}
_unwatchStatus() {
if (this._statusConnection) {
this._commandsSettings.disconnect(this._statusConnection);
this._statusConnection = null;
}
console.debug('Stopped watching commands status.');
}
_connectTimer() {
console.debug('Connecting Commander to Timer...');
this._timerConnection = e.timer.connect('time-changed', this._onTimeChanged.bind(this));
}
_disconnectTimer() {
if (this._timerConnection) {
e.timer.disconnect(this._timerConnection);
this._timerConnection = null;
}
console.debug('Disconnecting Commander from Timer.');
}
_onStatusChanged() {
console.debug(`Commands launching has been ${this._commandsSettings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
_onTimeChanged() {
this._spawnCommand();
}
_spawnCommand() {
if (e.timer.time === Time.UNKNOWN)
return;
const command = this._commandsSettings.get_string(e.timer.time === 'day' ? 'sunrise' : 'sunset');
GLib.spawn_async(null, ['sh', '-c', command], null, GLib.SpawnFlags.SEARCH_PATH, null);
console.debug(`Spawned ${e.timer.time} command.`);
}
};
-136
View File
@@ -1,136 +0,0 @@
// SPDX-FileCopyrightText: 2020, 2021 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const { main } = imports.ui;
const Me = extensionUtils.getCurrentExtension();
const e = Me.imports.extension;
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* The Cursor Themer is responsible for changing the cursor theme according to
* the time.
*/
var CursorThemer = class {
constructor() {
this._cursorVariantsSettings = extensionUtils.getSettings(utils.getSettingsSchema('cursor-variants'));
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._settingsConnections = [];
this._statusConnection = null;
this._timerConnection = null;
}
enable() {
console.debug('Enabling Cursor Themer...');
this._watchStatus();
if (this._cursorVariantsSettings.get_boolean('enabled')) {
this._connectSettings();
this._connectTimer();
this._updateSystemCursorTheme();
}
console.debug('Cursor Themer enabled.');
}
disable() {
console.debug('Disabling Cursor Themer...');
this._disconnectTimer();
this._disconnectSettings();
this._unwatchStatus();
console.debug('Cursor Themer disabled.');
}
_watchStatus() {
console.debug('Watching cursor variants status...');
this._statusConnection = this._cursorVariantsSettings.connect('changed::enabled', this._onStatusChanged.bind(this));
}
_unwatchStatus() {
if (this._statusConnection) {
this._cursorVariantsSettings.disconnect(this._statusConnection);
this._statusConnection = null;
}
console.debug('Stopped watching cursor variants status.');
}
_connectSettings() {
console.debug('Connecting Cursor Themer to settings...');
this._settingsConnections.push({
settings: this._cursorVariantsSettings,
id: this._cursorVariantsSettings.connect('changed::day', this._onDayVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._cursorVariantsSettings,
id: this._cursorVariantsSettings.connect('changed::night', this._onNightVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._interfaceSettings,
id: this._interfaceSettings.connect('changed::cursor-theme', this._onSystemCursorThemeChanged.bind(this)),
});
}
_disconnectSettings() {
this._settingsConnections.forEach(connection => connection.settings.disconnect(connection.id));
this._settingsConnections = [];
console.debug('Disconnected Cursor Themer from settings.');
}
_connectTimer() {
console.debug('Connecting Cursor Themer to Timer...');
this._timerConnection = e.timer.connect('time-changed', this._onTimeChanged.bind(this));
}
_disconnectTimer() {
if (this._timerConnection) {
e.timer.disconnect(this._timerConnection);
this._timerConnection = null;
}
console.debug('Disconnected Cursor Themer from Timer.');
}
_onStatusChanged() {
console.debug(`Cursor variants switching has been ${this._cursorVariantsSettings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
_onDayVariantChanged() {
console.debug(`Day cursor variant changed to '${this._cursorVariantsSettings.get_string('day')}'.`);
this._updateSystemCursorTheme();
}
_onNightVariantChanged() {
console.debug(`Night cursor variant changed to '${this._cursorVariantsSettings.get_string('night')}'.`);
this._updateSystemCursorTheme();
}
_onSystemCursorThemeChanged() {
console.debug(`System cursor theme changed to '${this._interfaceSettings.get_string('cursor-theme')}'.`);
this._updateCurrentVariant();
}
_onTimeChanged() {
this._updateSystemCursorTheme();
}
_updateCurrentVariant() {
if (e.timer.time === Time.UNKNOWN)
return;
this._cursorVariantsSettings.set_string(e.timer.time, this._interfaceSettings.get_string('cursor-theme'));
}
_updateSystemCursorTheme() {
if (e.timer.time === Time.UNKNOWN)
return;
console.debug(`Setting the ${e.timer.time} cursor variant...`);
this._interfaceSettings.set_string('cursor-theme', this._cursorVariantsSettings.get_string(e.timer.time));
}
};
-143
View File
@@ -1,143 +0,0 @@
// SPDX-FileCopyrightText: 2020, 2021 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const _ = extensionUtils.gettext;
const e = Me.imports.extension;
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* The GTK Themer is responsible for changing the GTK theme according to the
* time.
*
* When the user changes its GTK theme (for example via GNOME Tweaks), it will
* try to automatically guess the day and night variants for this theme. It
* will warn the user if it is unable to guess.
*
* In manual mode, it will not attempt to update the variants. The user can
* change the GTK variants in the extension's preferences.
*/
var GtkThemer = class {
constructor() {
this._gtkVariantsSettings = extensionUtils.getSettings(utils.getSettingsSchema('gtk-variants'));
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._settingsConnections = [];
this._statusConnection = null;
this._timerConnection = null;
}
enable() {
console.debug('Enabling GTK Themer...');
this._watchStatus();
if (this._gtkVariantsSettings.get_boolean('enabled')) {
this._connectSettings();
this._connectTimer();
this._updateSystemGtkTheme();
}
console.debug('GTK Themer enabled.');
}
disable() {
console.debug('Disabling GTK Themer...');
this._disconnectTimer();
this._disconnectSettings();
this._unwatchStatus();
console.debug('GTK Themer disabled.');
}
_watchStatus() {
console.debug('Watching GTK variants status...');
this._statusConnection = this._gtkVariantsSettings.connect('changed::enabled', this._onStatusChanged.bind(this));
}
_unwatchStatus() {
if (this._statusConnection) {
this._gtkVariantsSettings.disconnect(this._statusConnection);
this._statusConnection = null;
}
console.debug('Stopped watching GTK variants status.');
}
_connectSettings() {
console.debug('Connecting GTK Themer to settings...');
this._settingsConnections.push({
settings: this._gtkVariantsSettings,
id: this._gtkVariantsSettings.connect('changed::day', this._onDayVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._gtkVariantsSettings,
id: this._gtkVariantsSettings.connect('changed::night', this._onNightVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._interfaceSettings,
id: this._interfaceSettings.connect('changed::gtk-theme', this._onSystemGtkThemeChanged.bind(this)),
});
}
_disconnectSettings() {
this._settingsConnections.forEach(connection => connection.settings.disconnect(connection.id));
this._settingsConnections = [];
console.debug('Disconnected GTK Themer from settings.');
}
_connectTimer() {
console.debug('Connecting GTK Themer to Timer...');
this._timerConnection = e.timer.connect('time-changed', this._onTimeChanged.bind(this));
}
_disconnectTimer() {
if (this._timerConnection) {
e.timer.disconnect(this._timerConnection);
this._timerConnection = null;
}
console.debug('Disconnected GTK Themer from Timer.');
}
_onStatusChanged() {
console.debug(`GTK variants switching has been ${this._gtkVariantsSettings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
_onDayVariantChanged() {
console.debug(`Day GTK variant changed to '${this._gtkVariantsSettings.get_string('day')}'.`);
this._updateSystemGtkTheme();
}
_onNightVariantChanged() {
console.debug(`Night GTK variant changed to '${this._gtkVariantsSettings.get_string('night')}'.`);
this._updateSystemGtkTheme();
}
_onSystemGtkThemeChanged() {
console.debug(`System GTK theme changed to '${this._interfaceSettings.get_string('gtk-theme')}'.`);
this._updateCurrentVariant();
}
_onTimeChanged() {
this._updateSystemGtkTheme();
}
_updateCurrentVariant() {
if (e.timer.time === Time.UNKNOWN)
return;
this._gtkVariantsSettings.set_string(e.timer.time, this._interfaceSettings.get_string('gtk-theme'));
}
_updateSystemGtkTheme() {
if (e.timer.time === Time.UNKNOWN)
return;
console.debug(`Setting the ${e.timer.time} GTK variant...`);
this._interfaceSettings.set_string('gtk-theme', this._gtkVariantsSettings.get_string(e.timer.time));
}
};
-136
View File
@@ -1,136 +0,0 @@
// SPDX-FileCopyrightText: 2020, 2021 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const { main } = imports.ui;
const Me = extensionUtils.getCurrentExtension();
const e = Me.imports.extension;
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* The Icon Themer is responsible for changing the icon theme according to the
* time.
*/
var IconThemer = class {
constructor() {
this._iconVariantsSettings = extensionUtils.getSettings(utils.getSettingsSchema('icon-variants'));
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._settingsConnections = [];
this._statusConnection = null;
this._timerConnection = null;
}
enable() {
console.debug('Enabling Icon Themer...');
this._watchStatus();
if (this._iconVariantsSettings.get_boolean('enabled')) {
this._connectSettings();
this._connectTimer();
this._updateSystemIconTheme();
}
console.debug('Icon Themer enabled.');
}
disable() {
console.debug('Disabling Icon Themer...');
this._disconnectTimer();
this._disconnectSettings();
this._unwatchStatus();
console.debug('Icon Themer disabled.');
}
_watchStatus() {
console.debug('Watching icon variants status...');
this._statusConnection = this._iconVariantsSettings.connect('changed::enabled', this._onStatusChanged.bind(this));
}
_unwatchStatus() {
if (this._statusConnection) {
this._iconVariantsSettings.disconnect(this._statusConnection);
this._statusConnection = null;
}
console.debug('Stopped watching icon variants status.');
}
_connectSettings() {
console.debug('Connecting Icon Themer to settings...');
this._settingsConnections.push({
settings: this._iconVariantsSettings,
id: this._iconVariantsSettings.connect('changed::day', this._onDayVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._iconVariantsSettings,
id: this._iconVariantsSettings.connect('changed::night', this._onNightVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._interfaceSettings,
id: this._interfaceSettings.connect('changed::icon-theme', this._onSystemIconThemeChanged.bind(this)),
});
}
_disconnectSettings() {
this._settingsConnections.forEach(connection => connection.settings.disconnect(connection.id));
this._settingsConnections = [];
console.debug('Disconnected Icon Themer from settings.');
}
_connectTimer() {
console.debug('Connecting Icon Themer to Timer...');
this._timerConnection = e.timer.connect('time-changed', this._onTimeChanged.bind(this));
}
_disconnectTimer() {
if (this._timerConnection) {
e.timer.disconnect(this._timerConnection);
this._timerConnection = null;
}
console.debug('Disconnected Icon Themer from Timer.');
}
_onStatusChanged() {
console.debug(`Icon variants switching has been ${this._iconVariantsSettings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
_onDayVariantChanged() {
console.debug(`Day icon variant changed to '${this._iconVariantsSettings.get_string('day')}'.`);
this._updateSystemIconTheme();
}
_onNightVariantChanged() {
console.debug(`Night icon variant changed to '${this._iconVariantsSettings.get_string('night')}'.`);
this._updateSystemIconTheme();
}
_onSystemIconThemeChanged() {
console.debug(`System icon theme changed to '${this._interfaceSettings.get_string('icon-theme')}'.`);
this._updateCurrentVariant();
}
_onTimeChanged() {
this._updateSystemIconTheme();
}
_updateCurrentVariant() {
if (e.timer.time === Time.UNKNOWN)
return;
this._iconVariantsSettings.set_string(e.timer.time, this._interfaceSettings.get_string('icon-theme'));
}
_updateSystemIconTheme() {
if (e.timer.time === Time.UNKNOWN)
return;
console.debug(`Setting the ${e.timer.time} icon variant...`);
this._interfaceSettings.set_string('icon-theme', this._iconVariantsSettings.get_string(e.timer.time));
}
};
-152
View File
@@ -1,152 +0,0 @@
// SPDX-FileCopyrightText: 2020, 2021 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const _ = extensionUtils.gettext;
const e = Me.imports.extension;
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* The Shell Themer is responsible for changing the GTK theme according to the
* time. It will use the User Themes extension to do so if it is enabled.
*
* When the user changes its shell theme (for example via GNOME Tweaks), it will
* try to automatically guess the day and night variants for this theme. It
* will warn the user if it is unable to guess.
*
* In manual mode, it will not attempt to update the variants. The user can
* change the shell variants in the extension's preferences.
*/
var ShellThemer = class {
constructor() {
this._shellVariantsSettings = extensionUtils.getSettings(utils.getSettingsSchema('shell-variants'));
this._userthemesSettings = utils.getUserthemesSettings();
this._settingsConnections = [];
this._statusConnection = null;
this._timerConnection = null;
}
enable() {
console.debug('Enabling Shell Themer...');
this._watchStatus();
if (this._shellVariantsSettings.get_boolean('enabled')) {
this._connectSettings();
this._connectTimer();
this._updateSystemShellTheme();
}
console.debug('Shell Themer enabled.');
}
disable() {
console.debug('Disabling Shell Themer...');
this._disconnectTimer();
this._disconnectSettings();
this._unwatchStatus();
console.debug('Shell Themer disabled.');
}
_watchStatus() {
console.debug('Watching shell variants status...');
this._statusConnection = this._shellVariantsSettings.connect('changed::enabled', this._onStatusChanged.bind(this));
}
_unwatchStatus() {
if (this._statusConnection) {
this._shellVariantsSettings.disconnect(this._statusConnection);
this._statusConnection = null;
}
console.debug('Stopped watching shell variants status.');
}
_connectSettings() {
console.debug('Connecting Shell Themer to settings...');
this._settingsConnections.push({
settings: this._shellVariantsSettings,
id: this._shellVariantsSettings.connect('changed::day', this._onDayVariantChanged.bind(this)),
});
this._settingsConnections.push({
settings: this._shellVariantsSettings,
id: this._shellVariantsSettings.connect('changed::night', this._onNightVariantChanged.bind(this)),
});
if (this._userthemesSettings) {
this._settingsConnections.push({
settings: this._userthemesSettings,
id: this._userthemesSettings.connect('changed::name', this._onSystemShellThemeChanged.bind(this)),
});
}
}
_disconnectSettings() {
this._settingsConnections.forEach(connection => connection.settings.disconnect(connection.id));
this._settingsConnections = [];
console.debug('Disconnected Shell Themer from settings.');
}
_connectTimer() {
console.debug('Connecting Shell Themer to Timer...');
this._timerConnection = e.timer.connect('time-changed', this._onTimeChanged.bind(this));
}
_disconnectTimer() {
if (this._timerConnection) {
e.timer.disconnect(this._timerConnection);
this._timerConnection = null;
}
console.debug('Disconnected Shell Themer from Timer.');
}
_onStatusChanged() {
console.debug(`Shell variants switching has been ${this._shellVariantsSettings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
_onDayVariantChanged() {
console.debug(`Day Shell variant changed to '${this._shellVariantsSettings.get_string('day')}'.`);
this._updateSystemShellTheme();
}
_onNightVariantChanged() {
console.debug(`Night Shell variant changed to '${this._shellVariantsSettings.get_string('night')}'.`);
this._updateSystemShellTheme();
}
_onSystemShellThemeChanged(_settings, _newTheme) {
if (!this._userthemesSettings)
return;
console.debug(`System Shell theme changed to '${this._userthemesSettings.get_string('name')}'.`);
this._updateCurrentVariant();
}
_onTimeChanged() {
this._updateSystemShellTheme();
}
_updateCurrentVariant() {
if (e.timer.time === Time.UNKNOWN || !this._userthemesSettings)
return;
this._shellVariantsSettings.set_string(e.timer.time, this._userthemesSettings.get_string('name'));
}
_updateSystemShellTheme() {
if (e.timer.time === Time.UNKNOWN)
return;
console.debug(`Setting the ${e.timer.time} Shell variant...`);
const shellTheme = this._shellVariantsSettings.get_string(e.timer.time);
if (this._userthemesSettings) {
this._userthemesSettings.set_string('name', shellTheme);
} else {
const stylesheet = utils.getShellThemeStylesheet(shellTheme);
utils.applyShellStylesheet(stylesheet);
}
}
};
+101
View File
@@ -0,0 +1,101 @@
// SPDX-FileCopyrightText: 2020-2022 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const utils = Me.imports.utils;
const { Time } = Me.imports.enums.Time;
/**
* Function called when the time changes.
*
* @callback TimeChangedCallback
* @param {Time} time New time.
*/
/**
* The Switcher runs a callback function when the time changes.
*
* @param {Object} params Params object.
* @param {string} params.name Name of the switcher.
* @param {Timer} params.timer Timer to listen to.
* @param {Gio.Settings} params.settings Settings with the `enabled` key.
* @param {TimeChangedCallback} params.callback Callback function.
*/
var Switcher = class {
#name;
#timer;
#settings;
#callback;
#statusConnection = null;
#timerConnection = null;
constructor({ name, timer, settings, callback }) {
this.#name = name;
this.#timer = timer;
this.#settings = settings;
this.#callback = callback;
}
enable() {
console.debug(`Enabling ${this.#name} switcher...`);
this.#watchStatus();
if (this.#settings.get_boolean('enabled')) {
this.#connectTimer();
this.#onTimeChanged();
}
console.debug(`${this.#name} switcher enabled.`);
}
disable() {
console.debug(`Disabling ${this.#name} switcher...`);
this.#disconnectTimer();
this.#unwatchStatus();
console.debug(`${this.#name} switcher disabled.`);
}
#watchStatus() {
console.debug(`Watching ${this.#name} switching status...`);
this.#statusConnection = this.#settings.connect('changed::enabled', this.#onStatusChanged.bind(this));
}
#unwatchStatus() {
if (this.#statusConnection) {
this.#settings.disconnect(this.#statusConnection);
this.#statusConnection = null;
}
console.debug(`Stopped watching ${this.#name} switching status.`);
}
#connectTimer() {
console.debug(`Connecting ${this.#name} switcher to Timer...`);
this.#timerConnection = this.#timer.connect('time-changed', this.#onTimeChanged.bind(this));
}
#disconnectTimer() {
if (this.#timerConnection) {
this.#timer.disconnect(this.#timerConnection);
this.#timerConnection = null;
}
console.debug(`Disconnected ${this.#name} switcher from Timer.`);
}
#onStatusChanged() {
console.debug(`${this.#name} switching has been ${this.#settings.get_boolean('enabled') ? 'enabled' : 'disabled'}.`);
this.disable();
this.enable();
}
#onTimeChanged() {
this.#callback(this.#timer.time);
}
};
+45
View File
@@ -0,0 +1,45 @@
// SPDX-FileCopyrightText: 2022 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { GLib } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const utils = Me.imports.utils;
const { Switcher } = Me.imports.modules.Switcher;
const { Time } = Me.imports.enums.Time;
/**
* The Commands Switcher spawns commands according to the time.
*
* @param {Object} params Params object.
* @param {Timer} params.timer Timer to listen to.
*/
var SwitcherCommands = class extends Switcher {
#settings;
constructor({ timer }) {
const settings = extensionUtils.getSettings(utils.getSettingsSchema('commands'));
super({
name: 'Command',
timer,
settings,
callback: time => this.#onTimeChanged(time),
});
this.#settings = settings;
}
#onTimeChanged(time) {
if (time === Time.UNKNOWN)
return;
const command = this.#settings.get_string(time === Time.DAY ? 'sunrise' : 'sunset');
if (!command)
return;
GLib.spawn_async(null, ['sh', '-c', command], null, GLib.SpawnFlags.SEARCH_PATH, null);
console.debug(`Spawned ${time} command.`);
}
};
+197
View File
@@ -0,0 +1,197 @@
// SPDX-FileCopyrightText: 2020-2022 Romain Vigier <contact AT romainvigier.fr>
// SPDX-License-Identifier: GPL-3.0-or-later
const { Gio } = imports.gi;
const { extensionUtils } = imports.misc;
const Me = extensionUtils.getCurrentExtension();
const utils = Me.imports.utils;
const { Switcher } = Me.imports.modules.Switcher;
const { Time } = Me.imports.enums.Time;
/**
* Function called to update the system theme when no settings exist.
*
* @callback noSettingsUpdateSystemThemeCallback
* @param {Time} time New time.
*/
/**
* The Theme Switcher sets the system theme according to the time, either via
* provided settings or by running a callback function.
*
* It also listens to system theme changes to update the current variant setting.
*
* @param {Object} params Params object.
* @param {string} params.name Name of the switcher.
* @param {Timer} params.timer Timer to listen to.
* @param {Gio.Settings} params.settings Settings with the `enabled`, `day` and `night` keys.
* @param {Gio.Settings=} params.systemSettings System settings containing the theme name.
* @param {string} params.themeKey Settings key of the theme name.
* @param {noSettingsUpdateSystemThemeCallback} Callback function.
*/
var SwitcherTheme = class extends Switcher {
#name;
#timer;
#settings;
#systemSettings;
#themeKey;
#noSettingsUpdateSystemThemeCallback;
#settingsConnections = [];
constructor({ name, timer, settings, systemSettings = null, themeKey, noSettingsUpdateSystemThemeCallback = null }) {
super({
name,
timer,
settings,
callback: time => this.#onTimeChanged(time),
});
this.#name = name;
this.#timer = timer;
this.#settings = settings;
this.#systemSettings = systemSettings;
this.#themeKey = themeKey;
this.#noSettingsUpdateSystemThemeCallback = noSettingsUpdateSystemThemeCallback;
}
enable() {
if (this.#settings.get_boolean('enabled'))
this.#connectSettings();
super.enable();
}
disable() {
this.#disconnectSettings();
super.disable();
}
#connectSettings() {
console.debug(`Connecting ${this.#name} switcher to settings...`);
this.#settingsConnections.push({
settings: this.#settings,
id: this.#settings.connect('changed::day', this.#onDayVariantChanged.bind(this)),
});
this.#settingsConnections.push({
settings: this.#settings,
id: this.#settings.connect('changed::night', this.#onNightVariantChanged.bind(this)),
});
if (!this.#systemSettings)
return;
this.#settingsConnections.push({
settings: this.#systemSettings,
id: this.#systemSettings.connect(`changed::${this.#themeKey}`, this.#onSystemThemeChanged.bind(this)),
});
}
#disconnectSettings() {
this.#settingsConnections.forEach(connection => connection.settings.disconnect(connection.id));
this.#settingsConnections = [];
console.debug(`Disconnected ${this.#name} switcher from settings.`);
}
#onDayVariantChanged() {
console.debug(`Day ${this.#name} variant changed to '${this.#settings.get_string('day')}'.`);
this.#updateSystemTheme();
}
#onNightVariantChanged() {
console.debug(`Night ${this.#name} variant changed to '${this.#settings.get_string('night')}'.`);
this.#updateSystemTheme();
}
#onSystemThemeChanged() {
console.debug(`System ${this.#name} changed to '${this.#systemSettings.get_string(this.#themeKey)}'.`);
this.#updateCurrentVariant();
}
#onTimeChanged(_time) {
this.#updateSystemTheme();
}
#updateCurrentVariant() {
if (this.#timer.time === Time.UNKNOWN || !this.#systemSettings)
return;
this.#settings.set_string(this.#timer.time, this.#systemSettings.get_string(this.#themeKey));
}
#updateSystemTheme() {
if (this.#timer.time === Time.UNKNOWN)
return;
console.debug(`Setting the ${this.#timer.time} ${this.#name} variant...`);
if (this.#systemSettings)
this.#systemSettings.set_string(this.#themeKey, this.#settings.get_string(this.#timer.time));
else if (this.#noSettingsUpdateSystemThemeCallback)
this.#noSettingsUpdateSystemThemeCallback(this.#timer.time);
}
};
var SwitcherThemeCursor = class extends SwitcherTheme {
constructor({ timer }) {
super({
name: 'Cursor theme',
timer,
settings: extensionUtils.getSettings(utils.getSettingsSchema('cursor-variants')),
systemSettings: new Gio.Settings({ schema: 'org.gnome.desktop.interface' }),
themeKey: 'cursor-theme',
});
}
};
var SwitcherThemeGtk = class extends SwitcherTheme {
constructor({ timer }) {
super({
name: 'GTK theme',
timer,
settings: extensionUtils.getSettings(utils.getSettingsSchema('gtk-variants')),
systemSettings: new Gio.Settings({ schema: 'org.gnome.desktop.interface' }),
themeKey: 'gtk-theme',
});
}
};
var SwitcherThemeIcon = class extends SwitcherTheme {
constructor({ timer }) {
super({
name: 'Icon theme',
timer,
settings: extensionUtils.getSettings(utils.getSettingsSchema('icon-variants')),
systemSettings: new Gio.Settings({ schema: 'org.gnome.desktop.interface' }),
themeKey: 'icon-theme',
});
}
};
var SwitcherThemeShell = class extends SwitcherTheme {
#settings;
constructor({ timer }) {
const settings = extensionUtils.getSettings(utils.getSettingsSchema('shell-variants'));
super({
name: 'Shell theme',
timer,
settings,
systemSettings: utils.getUserthemesSettings(),
themeKey: 'name',
noSettingsUpdateSystemThemeCallback: time => this.#noSettingsUpdateSystemThemeCallback(time),
});
this.#settings = settings;
}
#noSettingsUpdateSystemThemeCallback(time) {
const shellTheme = this.#settings.get_string(time);
const stylesheet = utils.getShellThemeStylesheet(shellTheme);
utils.applyShellStylesheet(stylesheet);
}
};