diff --git a/src/extension.js b/src/extension.js
index 10d81b4..d8c834f 100644
--- a/src/extension.js
+++ b/src/extension.js
@@ -28,6 +28,7 @@ const { SettingsManager } = Me.imports.modules.SettingsManager;
const { Timer } = Me.imports.modules.Timer;
const { GtkThemer } = Me.imports.modules.GtkThemer;
const { ShellThemer } = Me.imports.modules.ShellThemer;
+const { CursorThemer } = Me.imports.modules.CursorThemer;
const { Backgrounder } = Me.imports.modules.Backgrounder;
const { Commander } = Me.imports.modules.Commander;
@@ -43,6 +44,7 @@ var settingsManager = null;
var timer = null;
var gtkThemer = null;
var shellThemer = null;
+var cursorThemer = null;
var backgrounder = null;
var commander = null;
@@ -60,6 +62,7 @@ function enable() {
timer = new Timer();
gtkThemer = new GtkThemer();
shellThemer = new ShellThemer();
+ cursorThemer = new CursorThemer();
backgrounder = new Backgrounder();
commander = new Commander();
@@ -67,6 +70,7 @@ function enable() {
timer.enable();
gtkThemer.enable();
shellThemer.enable();
+ cursorThemer.enable();
backgrounder.enable();
commander.enable();
@@ -81,6 +85,7 @@ function disable() {
gtkThemer.disable();
shellThemer.disable();
+ cursorThemer.disable();
backgrounder.disable();
commander.disable();
timer.disable();
@@ -90,6 +95,7 @@ function disable() {
timer = null;
gtkThemer = null;
shellThemer = null;
+ cursorThemer = null;
backgrounder = null;
commander = null;
log_debug('Extension disabled.');
diff --git a/src/modules/CursorThemer.js b/src/modules/CursorThemer.js
new file mode 100644
index 0000000..1ec2543
--- /dev/null
+++ b/src/modules/CursorThemer.js
@@ -0,0 +1,163 @@
+/*
+Night Theme Switcher Gnome Shell extension
+
+Copyright (C) 2020 Romain Vigier
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see .
+*/
+
+const { extensionUtils } = imports.misc;
+const { main } = imports.ui;
+
+const Me = extensionUtils.getCurrentExtension();
+
+const e = Me.imports.extension;
+const { log_debug } = Me.imports.utils;
+
+
+/**
+ * The Cursor Themer is responsible for changing the cursor theme according to
+ * the time.
+ */
+var CursorThemer = class {
+
+ enable() {
+ log_debug('Enabling Cursor Themer...');
+ this._watch_status();
+ this._save_original_theme();
+ if ( e.settingsManager.cursor_variants_enabled ) {
+ this._connect_settings();
+ this._connect_timer();
+ }
+ log_debug('Cursor Themer enabled.');
+ }
+
+ disable() {
+ log_debug('Disabling Cursor Themer...');
+ this._disconnect_timer();
+ this._disconnect_settings();
+ this._reset_original_theme();
+ this._unwatch_status();
+ log_debug('Cursor Themer disabled.');
+ }
+
+
+ _watch_status() {
+ log_debug('Watching cursor variants status...');
+ this._cursor_variants_status_changed_connect = e.settingsManager.connect('cursor-variants-status-changed', this._on_cursor_variants_status_changed.bind(this));
+ }
+
+ _unwatch_status() {
+ if ( this._cursor_variants_status_changed_connect ) {
+ e.settingsManager.disconnect(this._cursor_variants_status_changed_connect);
+ this._cursor_variants_status_changed_connect = null;
+ }
+ log_debug('Stopped watching cursor variants status.');
+ }
+
+ _connect_settings() {
+ log_debug('Connecting Cursor Themer to settings...');
+ this._cursor_variant_changed_connect = e.settingsManager.connect('cursor-variant-changed', this._on_cursor_variant_changed.bind(this));
+ this._cursor_theme_changed_connect = e.settingsManager.connect('cursor-theme-changed', this._on_cursor_theme_changed.bind(this));
+ }
+
+ _disconnect_settings() {
+ if ( this._cursor_variant_changed_connect ) {
+ e.settingsManager.disconnect(this._cursor_variant_changed_connect);
+ this._cursor_variant_changed_connect = null;
+ }
+ if ( this._cursor_theme_changed_connect ) {
+ e.settingsManager.disconnect(this._cursor_theme_changed_connect);
+ this._cursor_theme_changed_connect = null;
+ }
+ log_debug('Disconnected Cursor Themer from settings.');
+ }
+
+ _connect_timer() {
+ log_debug('Connecting Cursor Themer to Timer...');
+ this._time_changed_connect = e.timer.connect('time-changed', this._on_time_changed.bind(this));
+ }
+
+ _disconnect_timer() {
+ if ( this._time_changed_connect ) {
+ e.timer.disconnect(this._time_changed_connect);
+ this._time_changed_connect = null;
+ }
+ log_debug('Disconnected Cursor Themer from Timer.');
+ }
+
+
+ _on_cursor_variants_status_changed(settings, enabled) {
+ this.disable();
+ this.enable();
+ }
+
+ _on_cursor_variant_changed(settings, changed_variant_time) {
+ if ( changed_variant_time === e.timer.time ) {
+ this._set_variant(changed_variant_time);
+ }
+ }
+
+ _on_cursor_theme_changed(settings, new_theme) {
+ this._save_original_theme();
+ switch (e.timer.time) {
+ case 'day':
+ e.settingsManager.cursor_variant_day = new_theme;
+ break;
+ case 'night':
+ e.settingsManager.cursor_variant_night = new_theme;
+ }
+ this._set_variant(e.timer.time);
+ }
+
+ _on_time_changed(timer, new_time) {
+ this._set_variant(new_time);
+ }
+
+
+ _are_variants_up_to_date() {
+ return ( e.settingsManager.cursor_theme === e.settingsManager.cursor_variant_day || e.settingsManager.cursor_theme === e.settingsManager.cursor_variant_night );
+ }
+
+ _set_variant(time) {
+ log_debug(`Setting the cursor ${time} variant...`);
+ switch (time) {
+ case 'day':
+ e.settingsManager.cursor_theme = e.settingsManager.cursor_variant_day;
+ break;
+ case 'night':
+ e.settingsManager.cursor_theme = e.settingsManager.cursor_variant_night;
+ break;
+ case 'original':
+ e.settingsManager.cursor_theme = e.settingsManager.cursor_variant_original;
+ break;
+ }
+ }
+
+ _save_original_theme() {
+ if ( this._are_variants_up_to_date() ) {
+ return;
+ }
+ e.settingsManager.cursor_variant_original = e.settingsManager.cursor_theme;
+ }
+
+ _reset_original_theme() {
+ // We don't reset the theme when locking the session to prevent
+ // flicker on unlocking
+ if ( !main.screenShield.locked ) {
+ log_debug('Resetting to the user\'s original cursor theme...');
+ this._set_variant('original');
+ }
+ }
+
+}
diff --git a/src/modules/SettingsManager.js b/src/modules/SettingsManager.js
index 780095b..db96352 100644
--- a/src/modules/SettingsManager.js
+++ b/src/modules/SettingsManager.js
@@ -57,6 +57,10 @@ var SettingsManager = class {
this._shell_variant_day_changed_connect = this._extensionsSettings.connect('changed::shell-variant-day', this._on_shell_variant_day_changed.bind(this));
this._shell_variant_night_changed_connect = this._extensionsSettings.connect('changed::shell-variant-night', this._on_shell_variant_night_changed.bind(this));
this._shell_variant_original_changed_connect = this._extensionsSettings.connect('changed::shell-variant-original', this._on_shell_variant_original_changed.bind(this));
+ this._cursor_variants_status_connect = this._extensionsSettings.connect('changed::cursor-variants-enabled', this._on_cursor_variants_status_changed.bind(this));
+ this._cursor_variant_day_changed_connect = this._extensionsSettings.connect('changed::cursor-variant-day', this._on_cursor_variant_day_changed.bind(this));
+ this._cursor_variant_night_changed_connect = this._extensionsSettings.connect('changed::cursor-variant-night', this._on_cursor_variant_night_changed.bind(this));
+ this._cursor_variant_original_changed_connect = this._extensionsSettings.connect('changed::cursor-variant-original', this._on_cursor_variant_original_changed.bind(this));
this._time_source_changed_connect = this._extensionsSettings.connect('changed::time-source', this._on_time_source_changed.bind(this));
this._manual_time_source_changed_connect = this._extensionsSettings.connect('changed::manual-time-source', this._on_manual_time_source_changed.bind(this));
this._commands_status_connect = this._extensionsSettings.connect('changed::commands-enabled', this._on_commands_status_changed.bind(this));
@@ -66,6 +70,7 @@ var SettingsManager = class {
this._nightlight_status_connect = this._colorSettings.connect('changed::night-light-enabled', this._on_nightlight_status_changed.bind(this));
this._location_status_connect = this._locationSettings.connect('changed::enabled', this._on_location_status_changed.bind(this));
this._gtk_theme_changed_connect = this._interfaceSettings.connect('changed::gtk-theme', this._on_gtk_theme_changed.bind(this));
+ this._cursor_theme_changed_connect = this._interfaceSettings.connect('changed::cursor-theme', this._on_cursor_theme_changed.bind(this));
this._background_changed_connect = this._backgroundSettings.connect('changed::picture-uri', this._on_background_changed.bind(this));
if ( this._userthemesSettings ) {
this._shell_theme_changed_connect = this._userthemesSettings.connect('changed::name', this._on_shell_theme_changed.bind(this));
@@ -81,6 +86,10 @@ var SettingsManager = class {
this._extensionsSettings.disconnect(this._shell_variant_day_changed_connect);
this._extensionsSettings.disconnect(this._shell_variant_night_changed_connect);
this._extensionsSettings.disconnect(this._shell_variant_original_changed_connect);
+ this._extensionsSettings.disconnect(this._cursor_variants_status_connect);
+ this._extensionsSettings.disconnect(this._cursor_variant_day_changed_connect);
+ this._extensionsSettings.disconnect(this._cursor_variant_night_changed_connect);
+ this._extensionsSettings.disconnect(this._cursor_variant_original_changed_connect);
this._extensionsSettings.disconnect(this._time_source_changed_connect);
this._extensionsSettings.disconnect(this._manual_time_source_changed_connect);
this._extensionsSettings.disconnect(this._commands_status_connect);
@@ -180,6 +189,45 @@ var SettingsManager = class {
return this._extensionsSettings.get_boolean('manual-shell-variants');
}
+ /* Cursor variants settings */
+
+ get cursor_variants_enabled() {
+ return this._extensionsSettings.get_boolean('cursor-variants-enabled');
+ }
+
+ get cursor_variant_day() {
+ return this._extensionsSettings.get_string('cursor-variant-day') || this.cursor_theme;
+ }
+
+ set cursor_variant_day(value) {
+ if ( value !== this.cursor_variant_day ) {
+ this._extensionsSettings.set_string('cursor-variant-day', value);
+ log_debug(`The cursor day variant has been set to '${value}'.`);
+ }
+ }
+
+ get cursor_variant_night() {
+ return this._extensionsSettings.get_string('cursor-variant-night') || this.cursor_theme;
+ }
+
+ set cursor_variant_night(value) {
+ if ( value !== this.cursor_variant_night ) {
+ this._extensionsSettings.set_string('cursor-variant-night', value);
+ log_debug(`The cursor night variant has been set to '${value}'.`);
+ }
+ }
+
+ get cursor_variant_original() {
+ return this._extensionsSettings.get_string('cursor-variant-original');
+ }
+
+ set cursor_variant_original(value) {
+ if ( value !== this.cursor_variant_original ) {
+ this._extensionsSettings.set_string('cursor-variant-original', value);
+ log_debug(`The cursor original variant has been set to '${value}'.`);
+ }
+ }
+
/* Time source settings */
@@ -292,6 +340,20 @@ var SettingsManager = class {
}
+ /* Cursor theme settings */
+
+ get cursor_theme() {
+ return this._interfaceSettings.get_string('cursor-theme');
+ }
+
+ set cursor_theme(value) {
+ if ( value !== this.cursor_theme ) {
+ this._interfaceSettings.set_string('cursor-theme', value);
+ log_debug(`Cursor theme has been set to '${value}.'`);
+ }
+ }
+
+
/* Background settings */
get background() {
@@ -345,6 +407,29 @@ var SettingsManager = class {
}
+ /* Cursor variants */
+
+ _on_cursor_variants_status_changed(settings, changed_key) {
+ log_debug('Cursor variants have been ' + (this.cursor_variants_enabled ? 'ena' : 'disa') + 'bled.');
+ this.emit('cursor-variants-status-changed', this.curso_variants_enabled);
+ }
+
+ _on_cursor_variant_day_changed(settings, changed_key) {
+ log_debug(`Cursor day variant has changed to '${this.cursor_variant_day}'.`);
+ this.emit('cursor-variant-changed', 'day');
+ }
+
+ _on_cursor_variant_night_changed(settings, changed_key) {
+ log_debug(`Cursor night variant has changed to '${this.cursor_variant_night}'.`);
+ this.emit('cursor-variant-changed', 'night');
+ }
+
+ _on_cursor_variant_original_changed(settings, changed_key) {
+ log_debug(`Cursor original variant has changed to '${this.cursor_variant_original}'.`);
+ this.emit('cursor-variant-changed', 'original');
+ }
+
+
/* Time source */
_on_time_source_changed(settings, changed_key) {
@@ -408,6 +493,14 @@ var SettingsManager = class {
}
+ /* Cursor theme */
+
+ _on_cursor_theme_changed(settings, changed_key) {
+ log_debug(`Cursor theme has changed to '${this.cursor_theme}'.`);
+ this.emit('cursor-theme-changed', this.cursor_theme);
+ }
+
+
/* Background */
_on_background_changed(settings, changed_key) {
diff --git a/src/modules/ShellThemer.js b/src/modules/ShellThemer.js
index 20ef54c..7f800cb 100644
--- a/src/modules/ShellThemer.js
+++ b/src/modules/ShellThemer.js
@@ -23,7 +23,7 @@ const { main } = imports.ui;
const Me = extensionUtils.getCurrentExtension();
const e = Me.imports.extension;
-const { log_debug, log_error, get_theme_dirs_paths, get_installed_shell_themes, get_shell_theme_stylesheet, apply_shell_stylesheet } = Me.imports.utils;
+const { log_debug, log_error, get_installed_shell_themes, get_shell_theme_stylesheet, apply_shell_stylesheet } = Me.imports.utils;
const { ShellVariants } = Me.imports.modules.ShellVariants;
const Gettext = imports.gettext.domain(Me.metadata.uuid);
diff --git a/src/po/fr.po b/src/po/fr.po
index a579b6c..b5c0db9 100644
--- a/src/po/fr.po
+++ b/src/po/fr.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Night Theme Switcher 7\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 10:09+0200\n"
-"PO-Revision-Date: 2020-05-29 11:24+0200\n"
+"POT-Creation-Date: 2020-05-29 11:18+0200\n"
+"PO-Revision-Date: 2020-05-29 11:21+0200\n"
"Last-Translator: Romain Vigier \n"
"Language-Team: French - France \n"
"Language: fr_FR\n"
@@ -52,12 +52,12 @@ msgid "Switch backgrounds"
msgstr "Changer les arrière-plans"
#: src/preferences/Backgrounds.js:44
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:91
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:111
msgid "Day background"
msgstr "Arrière-plan diurne"
#: src/preferences/Backgrounds.js:45
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:96
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:116
msgid "Night background"
msgstr "Arrière-plan nocturne"
@@ -97,6 +97,30 @@ msgstr "Bonjour!"
msgid "Hello moonshine!"
msgstr "Bonsoir!"
+#: src/preferences/CursorTheme.js:40
+msgid "Cursor theme"
+msgstr "Thème de curseur"
+
+#: src/preferences/CursorTheme.js:41
+msgid "You can set different cursor themes for day and night."
+msgstr ""
+"Vous pouvez définir des thèmes de curseurs diurnes et nocturnes différents."
+
+#: src/preferences/CursorTheme.js:44
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:46
+msgid "Switch cursor variants"
+msgstr "Changer les variantes de curseur"
+
+#: src/preferences/CursorTheme.js:45 src/preferences/GtkTheme.js:45
+#: src/preferences/ShellTheme.js:45
+msgid "Day variant"
+msgstr "Variante diurne"
+
+#: src/preferences/CursorTheme.js:46 src/preferences/GtkTheme.js:46
+#: src/preferences/ShellTheme.js:46
+msgid "Night variant"
+msgstr "Variante nocturne"
+
#: src/preferences/GtkTheme.js:40
msgid "GTK theme"
msgstr "Thème GTK"
@@ -122,14 +146,6 @@ msgstr ""
msgid "Manual variants"
msgstr "Variantes manuelles"
-#: src/preferences/GtkTheme.js:45 src/preferences/ShellTheme.js:45
-msgid "Day variant"
-msgstr "Variante diurne"
-
-#: src/preferences/GtkTheme.js:46 src/preferences/ShellTheme.js:46
-msgid "Night variant"
-msgstr "Variante nocturne"
-
#: src/preferences/Schedule.js:39
msgid "Schedule"
msgstr "Horaires"
@@ -154,7 +170,7 @@ msgid "Manual time source"
msgstr "Source d’horaires manuelle"
#: src/preferences/Schedule.js:44
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:51
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:71
msgid "Time source"
msgstr "Source d’horaires"
@@ -259,71 +275,99 @@ msgstr "Utiliser des variantes shell manuelles"
msgid "Disable automatic shell theme variants detection"
msgstr "Désactiver la détection automatique des variantes du thème shell"
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:47
+msgid "Enable cursor variants switching"
+msgstr "Activer le changement de variantes de curseur"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:51
+msgid "Day cursor theme"
+msgstr "Thème de curseur diurne"
+
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:52
+msgid "The cursor theme to use during daytime"
+msgstr "Le thème de curseur à utiliser le jour"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:56
+msgid "Night cursor theme"
+msgstr "Thème de curseur nocturne"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:57
+msgid "The cursor theme to use during nighttime"
+msgstr "Le thème shell à utiliser la nuit"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:61
+msgid "Original cursor theme"
+msgstr "Thème de curseur original"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:62
+msgid "The cursor theme to restore when the extension is disabled"
+msgstr "Le thème de curseur à restaurer quand l’extension est désactivée"
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:72
msgid "The source used to check current time"
msgstr "Source utilisée pour vérifier les horaires"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:56
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:76
msgid "Use manual time source"
msgstr "Utiliser une source d’horaires manuelle"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:57
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:77
msgid "Disable automatic time source detection"
msgstr "Désactive la détection automatique de la source d’horaires"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:61
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:81
msgid "Sunrise time"
msgstr "Heure du lever"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:62
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:82
msgid "When the day starts"
msgstr "Quand le jour se lève"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:66
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:86
msgid "Sunset time"
msgstr "Heure du coucher"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:67
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:87
msgid "When the day ends"
msgstr "Quand le jour se couche"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:71
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:91
msgid "Enable commands"
msgstr "Activer les commandes"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:72
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:92
msgid "Commands will be spawned on time change"
msgstr "Les commandes seront lancées au changement d’horaire"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:76
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:96
msgid "Sunrise command"
msgstr "Commande du lever de soleil"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:77
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:97
msgid "The command to spawn at sunrise"
msgstr "La commande à lancer quand le soleil se lève"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:81
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:101
msgid "Sunset command"
msgstr "Commande du coucher de soleil"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:82
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:102
msgid "The command to spawn at sunset"
msgstr "La commande à lancer quand le soleil se couche"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:86
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:106
msgid "Enable backgrounds"
msgstr "Activer les arrière-plans"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:87
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:107
msgid "Background will be changed on time change"
msgstr "L’arrière-plan changera au changement d’horaire"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:92
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:112
msgid "Path to the day background"
msgstr "Chemin vers l’arrière-plan diurne"
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:97
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:117
msgid "Path to the night background"
msgstr "Chemin vers l’arrière-plan nocturne"
diff --git a/src/po/nightthemeswitcher@romainvigier.fr.pot b/src/po/nightthemeswitcher@romainvigier.fr.pot
index 6094625..68703f0 100644
--- a/src/po/nightthemeswitcher@romainvigier.fr.pot
+++ b/src/po/nightthemeswitcher@romainvigier.fr.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Night Theme Switcher 30\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-05-25 10:09+0200\n"
+"POT-Creation-Date: 2020-05-29 11:18+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -45,12 +45,12 @@ msgid "Switch backgrounds"
msgstr ""
#: src/preferences/Backgrounds.js:44
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:91
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:111
msgid "Day background"
msgstr ""
#: src/preferences/Backgrounds.js:45
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:96
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:116
msgid "Night background"
msgstr ""
@@ -88,6 +88,29 @@ msgstr ""
msgid "Hello moonshine!"
msgstr ""
+#: src/preferences/CursorTheme.js:40
+msgid "Cursor theme"
+msgstr ""
+
+#: src/preferences/CursorTheme.js:41
+msgid "You can set different cursor themes for day and night."
+msgstr ""
+
+#: src/preferences/CursorTheme.js:44
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:46
+msgid "Switch cursor variants"
+msgstr ""
+
+#: src/preferences/CursorTheme.js:45 src/preferences/GtkTheme.js:45
+#: src/preferences/ShellTheme.js:45
+msgid "Day variant"
+msgstr ""
+
+#: src/preferences/CursorTheme.js:46 src/preferences/GtkTheme.js:46
+#: src/preferences/ShellTheme.js:46
+msgid "Night variant"
+msgstr ""
+
#: src/preferences/GtkTheme.js:40
msgid "GTK theme"
msgstr ""
@@ -106,14 +129,6 @@ msgstr ""
msgid "Manual variants"
msgstr ""
-#: src/preferences/GtkTheme.js:45 src/preferences/ShellTheme.js:45
-msgid "Day variant"
-msgstr ""
-
-#: src/preferences/GtkTheme.js:46 src/preferences/ShellTheme.js:46
-msgid "Night variant"
-msgstr ""
-
#: src/preferences/Schedule.js:39
msgid "Schedule"
msgstr ""
@@ -132,7 +147,7 @@ msgid "Manual time source"
msgstr ""
#: src/preferences/Schedule.js:44
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:51
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:71
msgid "Time source"
msgstr ""
@@ -230,70 +245,98 @@ msgstr ""
msgid "Disable automatic shell theme variants detection"
msgstr ""
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:47
+msgid "Enable cursor variants switching"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:51
+msgid "Day cursor theme"
+msgstr ""
+
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:52
-msgid "The source used to check current time"
+msgid "The cursor theme to use during daytime"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:56
-msgid "Use manual time source"
+msgid "Night cursor theme"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:57
-msgid "Disable automatic time source detection"
+msgid "The cursor theme to use during nighttime"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:61
-msgid "Sunrise time"
+msgid "Original cursor theme"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:62
-msgid "When the day starts"
-msgstr ""
-
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:66
-msgid "Sunset time"
-msgstr ""
-
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:67
-msgid "When the day ends"
-msgstr ""
-
-#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:71
-msgid "Enable commands"
+msgid "The cursor theme to restore when the extension is disabled"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:72
-msgid "Commands will be spawned on time change"
+msgid "The source used to check current time"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:76
-msgid "Sunrise command"
+msgid "Use manual time source"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:77
-msgid "The command to spawn at sunrise"
+msgid "Disable automatic time source detection"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:81
-msgid "Sunset command"
+msgid "Sunrise time"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:82
-msgid "The command to spawn at sunset"
+msgid "When the day starts"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:86
-msgid "Enable backgrounds"
+msgid "Sunset time"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:87
-msgid "Background will be changed on time change"
+msgid "When the day ends"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:91
+msgid "Enable commands"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:92
-msgid "Path to the day background"
+msgid "Commands will be spawned on time change"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:96
+msgid "Sunrise command"
msgstr ""
#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:97
+msgid "The command to spawn at sunrise"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:101
+msgid "Sunset command"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:102
+msgid "The command to spawn at sunset"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:106
+msgid "Enable backgrounds"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:107
+msgid "Background will be changed on time change"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:112
+msgid "Path to the day background"
+msgstr ""
+
+#: src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml:117
msgid "Path to the night background"
msgstr ""
diff --git a/src/preferences/CursorTheme.js b/src/preferences/CursorTheme.js
new file mode 100644
index 0000000..5c361ad
--- /dev/null
+++ b/src/preferences/CursorTheme.js
@@ -0,0 +1,95 @@
+/*
+Night Theme Switcher Gnome Shell extension
+
+Copyright (C) 2020 Romain Vigier
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see .
+*/
+
+const { GdkPixbuf, Gio, Gtk } = imports.gi;
+const { extensionUtils } = imports.misc;
+
+const Me = extensionUtils.getCurrentExtension();
+
+const { SettingsPage, SettingsList, SettingsListRow } = Me.imports.preferences.bases;
+const { get_installed_cursor_themes } = Me.imports.utils;
+
+const Gettext = imports.gettext.domain(Me.metadata.uuid);
+const _ = Gettext.gettext;
+
+
+const shell_minor_version = parseInt(imports.misc.config.PACKAGE_VERSION.split('.')[1]);
+if ( shell_minor_version <= 30 ) {
+ extensionUtils.getSettings = Me.imports.convenience.getSettings;
+}
+
+
+var CursorThemePreferences = class {
+
+ constructor() {
+ const label = _('Cursor theme');
+ const description = _('You can set different cursor themes for day and night.');
+ const content = new SettingsList();
+
+ content.add_row(new SettingsListRow(_('Switch cursor variants'), new CursorVariantsEnabledControl()));
+ content.add_row(new SettingsListRow(_('Day variant'), new TimeCursorVariantControl('day')));
+ content.add_row(new SettingsListRow(_('Night variant'), new TimeCursorVariantControl('night')));
+
+ return new SettingsPage(label, description, content);
+ }
+
+}
+
+
+class CursorVariantsEnabledControl {
+
+ constructor() {
+ const settings = extensionUtils.getSettings();
+ const toggle = new Gtk.Switch({
+ active: settings.get_boolean('cursor-variants-enabled')
+ });
+ settings.bind(
+ 'cursor-variants-enabled',
+ toggle,
+ 'active',
+ Gio.SettingsBindFlags.DEFAULT
+ );
+ return toggle;
+ }
+
+}
+
+
+class TimeCursorVariantControl {
+
+ constructor(time) {
+ const settings = extensionUtils.getSettings();
+ const combo = new Gtk.ComboBoxText();
+ const themes = Array.from(get_installed_cursor_themes()).sort();
+ themes.forEach(theme => combo.append(theme, theme));
+ settings.bind(
+ `cursor-variant-${time}`,
+ combo,
+ 'active-id',
+ Gio.SettingsBindFlags.DEFAULT
+ );
+ settings.bind(
+ 'cursor-variants-enabled',
+ combo,
+ 'sensitive',
+ Gio.SettingsBindFlags.DEFAULT
+ );
+ return combo;
+ }
+
+}
diff --git a/src/prefs.js b/src/prefs.js
index 4015885..dbcf127 100644
--- a/src/prefs.js
+++ b/src/prefs.js
@@ -25,6 +25,7 @@ const Me = extensionUtils.getCurrentExtension();
const { BackgroundsPreferences } = Me.imports.preferences.Backgrounds;
const { CommandsPreferences } = Me.imports.preferences.Commands;
+const { CursorThemePreferences } = Me.imports.preferences.CursorTheme;
const { GtkThemePreferences } = Me.imports.preferences.GtkTheme;
const { SchedulePreferences } = Me.imports.preferences.Schedule;
const { ShellThemePreferences } = Me.imports.preferences.ShellTheme;
@@ -54,6 +55,9 @@ function buildPrefsWidget() {
const shellThemePreferences = new ShellThemePreferences();
prefs_widget.append_page(shellThemePreferences.page, shellThemePreferences.label);
+ const cursorThemePreferences = new CursorThemePreferences();
+ prefs_widget.append_page(cursorThemePreferences.page, cursorThemePreferences.label);
+
const backgroundsPreferences = new BackgroundsPreferences();
prefs_widget.append_page(backgroundsPreferences.page, backgroundsPreferences.label);
diff --git a/src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml b/src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml
index 148ddea..e9b49a4 100644
--- a/src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml
+++ b/src/schemas/org.gnome.shell.extensions.nightthemeswitcher.gschema.xml
@@ -41,6 +41,26 @@
Use manual shell variants
Disable automatic shell theme variants detection
+
+ false
+ Switch cursor variants
+ Enable cursor variants switching
+
+
+ ""
+ Day cursor theme
+ The cursor theme to use during daytime
+
+
+ ""
+ Night cursor theme
+ The cursor theme to use during nighttime
+
+
+ ""
+ Original cursor theme
+ The cursor theme to restore when the extension is disabled
+
diff --git a/src/utils.js b/src/utils.js
index ff91b47..7d2bd61 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -53,14 +53,15 @@ function log_error(error) {
}
/**
- * Get all the theme directories of the system.
+ * Get all the directories of the system for a resource.
+ * @param {string} resource The resource to get the directories.
* @returns {string[]} An array of paths.
*/
-function get_theme_dirs_paths() {
+function get_resources_dirs_paths(resource) {
return [
- GLib.build_filenamev([GLib.get_home_dir(), '.themes']),
- GLib.build_filenamev([GLib.get_user_data_dir(), 'themes']),
- ...GLib.get_system_data_dirs().map(path => GLib.build_filenamev([path, 'themes']))
+ GLib.build_filenamev([GLib.get_home_dir(), `.${resource}`]),
+ GLib.build_filenamev([GLib.get_user_data_dir(), resource]),
+ ...GLib.get_system_data_dirs().map(path => GLib.build_filenamev([path, resource]))
];
}
@@ -71,7 +72,7 @@ function get_theme_dirs_paths() {
function get_installed_gtk_themes() {
const themes = new Set(['Adwaita', 'HighContrast', 'HighContrastInverse']);
- get_theme_dirs_paths().forEach(themes_dir_path => {
+ get_resources_dirs_paths('themes').forEach(themes_dir_path => {
const themes_dir = Gio.File.new_for_path(themes_dir_path);
if (themes_dir.query_file_type(Gio.FileQueryInfoFlags.NONE, null) !== Gio.FileType.DIRECTORY) {
@@ -112,7 +113,7 @@ function get_installed_gtk_themes() {
function get_installed_shell_themes() {
const themes = new Set(['']);
- get_theme_dirs_paths().forEach(themes_dir_path => {
+ get_resources_dirs_paths('themes').forEach(themes_dir_path => {
const themes_dir = Gio.File.new_for_path(themes_dir_path);
if (themes_dir.query_file_type(Gio.FileQueryInfoFlags.NONE, null) !== Gio.FileType.DIRECTORY) {
@@ -140,6 +141,41 @@ function get_installed_shell_themes() {
return themes;
}
+/**
+ * Get all the installed cursor themes on the system.
+ * @returns {Set} A set containing all the installed cursor themes names.
+ */
+function get_installed_cursor_themes() {
+ const themes = new Set();
+
+ get_resources_dirs_paths('icons').forEach(themes_dir_path => {
+ const themes_dir = Gio.File.new_for_path(themes_dir_path);
+
+ if (themes_dir.query_file_type(Gio.FileQueryInfoFlags.NONE, null) !== Gio.FileType.DIRECTORY) {
+ return;
+ }
+
+ const theme_dirs_enumerator = themes_dir.enumerate_children('', Gio.FileQueryInfoFlags.NONE, null);
+
+ while (true) {
+ let theme_dir_info = theme_dirs_enumerator.next_file(null);
+
+ if (theme_dir_info === null) {
+ break;
+ }
+
+ const theme_dir = theme_dirs_enumerator.get_child(theme_dir_info);
+ const css_file = Gio.File.new_for_path(GLib.build_filenamev([theme_dir.get_path(), 'cursors']));
+ if (css_file.query_exists(null)) {
+ themes.add(theme_dir.get_basename());
+ }
+ }
+ theme_dirs_enumerator.close(null);
+ });
+
+ return themes;
+}
+
/**
* Get the User Themes extension.
* @returns {Object|undefined} The User Themes extension object or undefined if
@@ -188,7 +224,7 @@ function get_shell_theme_stylesheet(theme) {
log_debug('Getting the ' + (theme ? `'${theme}'` : 'default') + ' theme shell stylesheet...');
let stylesheet = null;
if ( theme ) {
- const stylesheet_paths = get_theme_dirs_paths().map(path => `${path}/${theme}/gnome-shell/gnome-shell.css`);
+ const stylesheet_paths = get_resources_dirs_paths('themes').map(path => `${path}/${theme}/gnome-shell/gnome-shell.css`);
stylesheet = stylesheet_paths.find(path => {
let file = Gio.file_new_for_path(path);
return file.query_exists(null);