From d15f89af82192770e434b2061b3051a1c1f3b2c7 Mon Sep 17 00:00:00 2001 From: Lucki Date: Sat, 16 Mar 2024 00:42:59 +0100 Subject: [PATCH 01/14] Remove description of legacy limitation --- src/ui/pageGeneral.blp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/pageGeneral.blp b/src/ui/pageGeneral.blp index 858a00bf..204d0e28 100644 --- a/src/ui/pageGeneral.blp +++ b/src/ui/pageGeneral.blp @@ -33,7 +33,7 @@ Adw.PreferencesPage page_general { Adw.ActionRow multiple_displays_row { title: _("Different Wallpapers on Multiple Displays"); - subtitle: _("Requires HydraPaper or Superpaper.\nFills from History."); + subtitle: _("Requires HydraPaper or Superpaper."); sensitive: false; Switch enable_multiple_displays { From f91377965980ac4820540d8e7204a9addf2a05d8 Mon Sep 17 00:00:00 2001 From: Lucki Date: Sun, 24 Mar 2024 14:34:34 +0100 Subject: [PATCH 02/14] Update shell-version support to include 46 --- src/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metadata.json b/src/metadata.json index 16dcac12..6aee2b76 100644 --- a/src/metadata.json +++ b/src/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": [ "45" ], + "shell-version": [ "45", "46" ], "uuid": "randomwallpaper@iflow.space", "settings-schema": "org.gnome.shell.extensions.space.iflow.randomwallpaper", "name": "Random Wallpaper", From 9822834532eac020ed0483d1867057d9f069e273 Mon Sep 17 00:00:00 2001 From: Lucki Date: Sun, 24 Mar 2024 14:37:14 +0100 Subject: [PATCH 03/14] Change `add_actor` to `add_child` https://gjs.guide/extensions/upgrading/gnome-shell-46.html#clutter-container --- src/historyMenuElements.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/historyMenuElements.ts b/src/historyMenuElements.ts index a17f6487..74dba777 100644 --- a/src/historyMenuElements.ts +++ b/src/historyMenuElements.ts @@ -595,7 +595,7 @@ class HistorySection extends PopupMenu.PopupMenuSection { overlay_scrollbars: true, }); - this.actor.add_actor(this.box); + this.actor.add_child(this.box); } /** From 422af64a1df29023f3e19d4d5fcefb93433cbe53 Mon Sep 17 00:00:00 2001 From: Lucki Date: Sun, 31 Mar 2024 13:47:43 +0200 Subject: [PATCH 04/14] Fix request error handling with explicit rejection --- src/soupBowl.ts | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/soupBowl.ts b/src/soupBowl.ts index 96ed2712..254d33a1 100644 --- a/src/soupBowl.ts +++ b/src/soupBowl.ts @@ -50,19 +50,24 @@ class SoupBowl { */ private _send_and_receive_soup24(soupMessage: Soup.Message): Promise { return new Promise((resolve, reject) => { - /* eslint-disable */ - // Incompatible version of Soup types. Ignoring type checks. - // @ts-ignore - this._session.queue_message(soupMessage, (_, msg) => { - if (!msg.response_body) { - reject(new Error('Message has no response body')); - return; - } + try { + /* eslint-disable */ + // Incompatible version of Soup types. Ignoring type checks. + // @ts-ignore + this._session.queue_message(soupMessage, (_, msg) => { + if (!msg.response_body) { + reject(new Error('Message has no response body')); + return; + } - const response_body_bytes = msg.response_body.flatten().get_data(); - resolve(response_body_bytes); - }); - /* eslint-enable */ + const response_body_bytes = msg.response_body.flatten().get_data(); + resolve(response_body_bytes); + }); + /* eslint-enable */ + } catch (error) { + Logger.error(error, this); + reject(new Error('Request failed')); + } }); } @@ -81,6 +86,7 @@ class SoupBowl { reject(new Error('Empty response')); }).catch(error => { Logger.error(error, this); + reject(new Error('Request failed')); }); }); } From 20135f24c43de2115f89e58643fc8ac837b79092 Mon Sep 17 00:00:00 2001 From: Lucki Date: Sat, 16 Mar 2024 10:30:09 +0100 Subject: [PATCH 05/14] Configurable zoom mode setting This adds a new helper function 'getZoomModeEnum()' to provide a list of valid zoom mode values from the new 'getEnumFromSettings()' which retrieves all possible enum values from a given gsettings schema. Fix #192 --- src/manager/defaultWallpaperManager.ts | 10 +++---- src/manager/wallpaperManager.ts | 27 ++++++++++++++++++- src/prefs.ts | 7 +++++ ...ns.space.iflow.randomwallpaper.gschema.xml | 6 +++++ src/ui/pageGeneral.blp | 5 ++++ src/utils.ts | 21 +++++++++++++++ 6 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/manager/defaultWallpaperManager.ts b/src/manager/defaultWallpaperManager.ts index c1153362..d7b916df 100644 --- a/src/manager/defaultWallpaperManager.ts +++ b/src/manager/defaultWallpaperManager.ts @@ -1,8 +1,8 @@ import * as Utils from '../utils.js'; -import {WallpaperManager} from './wallpaperManager.js'; +import {WallpaperManager, getZoomModeEnum} from './wallpaperManager.js'; import {Logger} from '../logger.js'; -import type {Settings} from '../settings.js'; +import {Settings} from '../settings.js'; /** * A general default wallpaper manager. @@ -54,8 +54,7 @@ class DefaultWallpaperManager extends WallpaperManager { // merged wallpapers need mode "spanned" backgroundSettings.setString('picture-options', 'spanned'); else - // single wallpapers need mode "zoom" - backgroundSettings.setString('picture-options', 'zoom'); + backgroundSettings.setString('picture-options', getZoomModeEnum()[new Settings().getInt('zoom-mode')]); Utils.setPictureUriOfSettingsObject(backgroundSettings, wallpaperURI); return Promise.resolve(); @@ -74,8 +73,7 @@ class DefaultWallpaperManager extends WallpaperManager { // merged wallpapers need mode "spanned" screensaverSettings.setString('picture-options', 'spanned'); else - // single wallpapers need mode "zoom" - screensaverSettings.setString('picture-options', 'zoom'); + screensaverSettings.setString('picture-options', getZoomModeEnum()[new Settings().getInt('zoom-mode')]); Utils.setPictureUriOfSettingsObject(screensaverSettings, wallpaperURI); return Promise.resolve(); diff --git a/src/manager/wallpaperManager.ts b/src/manager/wallpaperManager.ts index 52d83dbb..8760c309 100644 --- a/src/manager/wallpaperManager.ts +++ b/src/manager/wallpaperManager.ts @@ -1,4 +1,5 @@ import {Settings} from './../settings.js'; +import {getEnumFromSettings} from './../utils.js'; // Generated code produces a no-shadow rule error /* eslint-disable */ @@ -104,8 +105,32 @@ function getModeNameList(): string[] { return list; } +/** + * Get a list of all the valid enum entries and return them as an array of strings + * + * Note: The list gets pre-filtered of unwanted values. + * + * @returns {string[]} Array of string containing valid enum values + */ +function getZoomModeEnum(): string[] { + return getEnumFromSettings(new Settings('org.gnome.desktop.background'), 'picture-options').filter(s => { + const negatives = [ + 'none', // No wallpaper + 'wallpaper', // Tiled wallpapers, repeating pattern + 'stretched', // Ignoring aspect ratio + 'spanned', // Ignoring aspect ratio + ]; + + if (negatives.includes(s)) + return false; + + return true; + }); +} + export { WallpaperManager, Mode, - getModeNameList + getModeNameList, + getZoomModeEnum }; diff --git a/src/prefs.ts b/src/prefs.ts index 9f6722bd..fc984d34 100644 --- a/src/prefs.ts +++ b/src/prefs.ts @@ -71,6 +71,13 @@ class RandomWallpaperSettings extends ExtensionPreferences { 'selected', Gio.SettingsBindFlags.DEFAULT); + const comboZoomMode = this._getAs(builder, 'combo_zoom_mode'); + comboZoomMode.model = Gtk.StringList.new(WallpaperManager.getZoomModeEnum()); + settings.bind('zoom-mode', + comboZoomMode, + 'selected', + Gio.SettingsBindFlags.DEFAULT); + const comboLogLevel = this._getAs(builder, 'log_level'); comboLogLevel.model = Gtk.StringList.new(Logger.getLogLevelNameList()); settings.bind('log-level', diff --git a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml index 4a913002..d83e4c54 100644 --- a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml +++ b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml @@ -55,6 +55,12 @@ Allows to choose what backgrounds will be changed. + + 4 + Choose which zoom mode wallpapers get + Allows to choose what setting 'picture-options' will get. + + 2 Tier of logs diff --git a/src/ui/pageGeneral.blp b/src/ui/pageGeneral.blp index 204d0e28..8e771f37 100644 --- a/src/ui/pageGeneral.blp +++ b/src/ui/pageGeneral.blp @@ -31,6 +31,11 @@ Adw.PreferencesPage page_general { use-subtitle: true; } + Adw.ComboRow combo_zoom_mode { + title: _("Wallpaper Zoom Mode"); + use-subtitle: true; + } + Adw.ActionRow multiple_displays_row { title: _("Different Wallpapers on Multiple Displays"); subtitle: _("Requires HydraPaper or Superpaper."); diff --git a/src/utils.ts b/src/utils.ts index 8c0eb6fc..bc4f23da 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -271,8 +271,29 @@ function isImageMerged(filename: string): boolean { Superpaper.isImageMerged(filename); } +/** + * Get all possible enum values from a gsettings schema. + * + * @param {Settings} settings The gsettings containing the enum + * @param {string} key The key of the enum in the schema + * @returns {string[]} A list of strings with all possible values for a key + */ +function getEnumFromSettings(settings: Settings, key: string): string[] { + // Fill combo from settings enum + + const availableTypes = settings.getSchema().get_key(key).get_range(); // GLib.Variant (sv) + // (sv) = Tuple(%G_VARIANT_TYPE_STRING, %G_VARIANT_TYPE_VARIANT) + // s should be 'enum' + // v should be an array enumerating the possible values. Each item in the array is a possible valid value and no other values are valid. + // v is 'as' (array of strings) + const availableTypeNames = availableTypes.get_child_value(1).get_variant().get_strv(); + + return availableTypeNames; +} + export { SourceType, + getEnumFromSettings, getSourceTypeName, getWallpaperManager, isImageMerged, From 1143d67be3a9c4c9c8f187957992b01ad0d283a7 Mon Sep 17 00:00:00 2001 From: Lucki Date: Fri, 12 Apr 2024 17:43:46 +0200 Subject: [PATCH 06/14] Add error notification for failed wallpaper downloads --- src/notifications.ts | 14 ++++++++++++++ src/wallpaperController.ts | 2 ++ 2 files changed, 16 insertions(+) diff --git a/src/notifications.ts b/src/notifications.ts index c5f20458..526588f1 100644 --- a/src/notifications.ts +++ b/src/notifications.ts @@ -16,6 +16,20 @@ class Notification { const message = `A new wallpaper was set!\n${infoString}`; notify('New Wallpaper', message); } + + /** + * Show an error notification for failing to download the next wallpaper. + * + * @param {unknown} error The error that was thrown when fetching a new wallpaper + */ + static fetchWallpaperFailed(error: unknown): void { + let errorMessage = String(error); + + if (error instanceof Error) + errorMessage = error.message; + + notify('Download Failed!', errorMessage); + } } export {Notification}; diff --git a/src/wallpaperController.ts b/src/wallpaperController.ts index 27cbdcf3..29137019 100644 --- a/src/wallpaperController.ts +++ b/src/wallpaperController.ts @@ -562,6 +562,8 @@ class WallpaperController { Notification.newWallpaper(newImageEntries.reverse()); } catch (error) { Logger.error(error, this); + if (this._settings.getBoolean('show-notifications')) + Notification.fetchWallpaperFailed(error); } finally { this._stopLoadingHooks.forEach(element => element()); } From 1672c7731aa86e77ef0f73d90deec1444f68587f Mon Sep 17 00:00:00 2001 From: Lucki Date: Fri, 19 Apr 2024 22:15:28 +0200 Subject: [PATCH 07/14] Apply suggestions from code review Co-authored-by: Wolfgang Rumpler --- src/notifications.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/notifications.ts b/src/notifications.ts index 526588f1..82a4f256 100644 --- a/src/notifications.ts +++ b/src/notifications.ts @@ -18,7 +18,7 @@ class Notification { } /** - * Show an error notification for failing to download the next wallpaper. + * Show an error notification for failed wallpaper downloads. * * @param {unknown} error The error that was thrown when fetching a new wallpaper */ @@ -28,7 +28,7 @@ class Notification { if (error instanceof Error) errorMessage = error.message; - notify('Download Failed!', errorMessage); + notify('RandomWallpaperGnome3: Wallpaper Download Failed!', errorMessage); } } From 9490626b3edcbae18d98437b4dc0ba7f632bb599 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Fri, 5 Apr 2024 00:35:05 +0200 Subject: [PATCH 08/14] Set default zoom mode to 2 This change is necessary for updating wallpapers to work on clean installs. The number 2 now maps to zoom. Unfortunately, the number has no direct relation to the valid values and changing the filter on the available picture-options will cause a regression here. --- ...ome.shell.extensions.space.iflow.randomwallpaper.gschema.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml index d83e4c54..e1fc34ba 100644 --- a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml +++ b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml @@ -56,7 +56,7 @@ - 4 + 2 Choose which zoom mode wallpapers get Allows to choose what setting 'picture-options' will get. From ac23028ef2d5371c719b630840e3468866d32996 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Fri, 5 Apr 2024 00:45:40 +0200 Subject: [PATCH 09/14] Simplify getZoomModeEnum function --- src/manager/wallpaperManager.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/manager/wallpaperManager.ts b/src/manager/wallpaperManager.ts index 8760c309..9408d0cb 100644 --- a/src/manager/wallpaperManager.ts +++ b/src/manager/wallpaperManager.ts @@ -113,19 +113,15 @@ function getModeNameList(): string[] { * @returns {string[]} Array of string containing valid enum values */ function getZoomModeEnum(): string[] { - return getEnumFromSettings(new Settings('org.gnome.desktop.background'), 'picture-options').filter(s => { - const negatives = [ - 'none', // No wallpaper - 'wallpaper', // Tiled wallpapers, repeating pattern - 'stretched', // Ignoring aspect ratio - 'spanned', // Ignoring aspect ratio - ]; - - if (negatives.includes(s)) - return false; - - return true; - }); + const excludes = [ + 'none', // No wallpaper + 'wallpaper', // Tiled wallpapers, repeating pattern + 'stretched', // Ignoring aspect ratio + 'spanned', // Ignoring aspect ratio + ]; + + return getEnumFromSettings(new Settings('org.gnome.desktop.background'), 'picture-options') + .filter(s => !excludes.includes(s)); } export { From 6755c63644b12ca05f82218d96defa3b8b4a8ea5 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Fri, 5 Apr 2024 01:11:36 +0200 Subject: [PATCH 10/14] Update picture-options when changing zoom-mode This is solely done for user feedback when changing the value. --- src/prefs.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/prefs.ts b/src/prefs.ts index fc984d34..fd74ff45 100644 --- a/src/prefs.ts +++ b/src/prefs.ts @@ -77,6 +77,12 @@ class RandomWallpaperSettings extends ExtensionPreferences { comboZoomMode, 'selected', Gio.SettingsBindFlags.DEFAULT); + settings.observe('zoom-mode', () => { + new Settings.Settings('org.gnome.desktop.background') + .setString('picture-options', WallpaperManager.getZoomModeEnum()[settings.getInt('zoom-mode')]); + new Settings.Settings('org.gnome.desktop.screensaver') + .setString('picture-options', WallpaperManager.getZoomModeEnum()[settings.getInt('zoom-mode')]); + }); const comboLogLevel = this._getAs(builder, 'log_level'); comboLogLevel.model = Gtk.StringList.new(Logger.getLogLevelNameList()); From 5bfd150f4eebd2dcd4f66b230d7994614b71e6c7 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Fri, 5 Apr 2024 01:43:14 +0200 Subject: [PATCH 11/14] Make version backwards compatible with 45 The recommended "add_child" call doesn't behave exactly the same as "add_actor" in 45 and causes the history section to render incorrectly. With this commit, the working function is used depending on the major version. --- src/historyMenuElements.ts | 9 ++++++++- types/misc/index.d.ts | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/historyMenuElements.ts b/src/historyMenuElements.ts index 74dba777..71c4896f 100644 --- a/src/historyMenuElements.ts +++ b/src/historyMenuElements.ts @@ -20,6 +20,9 @@ import {Logger} from './logger.js'; Gio._promisify(Gio.File.prototype, 'copy_async', 'copy_finish'); Gio._promisify(Gio.File.prototype, 'replace_contents_bytes_async', 'replace_contents_finish'); +import * as Config from 'resource:///org/gnome/shell/misc/config.js'; +const [MAJOR, unused_MINOR] = Config.PACKAGE_VERSION.split('.').map(s => Number(s)); + // FIXME: Generated static class code produces a no-unused-expressions rule error /* eslint-disable no-unused-expressions */ @@ -595,7 +598,11 @@ class HistorySection extends PopupMenu.PopupMenuSection { overlay_scrollbars: true, }); - this.actor.add_child(this.box); + // https://gjs.guide/extensions/upgrading/gnome-shell-46.html#clutter-container + if (MAJOR < 46) + this.actor.add_actor(this.box); + else + this.actor.add_child(this.box); } /** diff --git a/types/misc/index.d.ts b/types/misc/index.d.ts index 05e5fc35..c1de8fb9 100644 --- a/types/misc/index.d.ts +++ b/types/misc/index.d.ts @@ -153,3 +153,7 @@ declare module 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js' { getPreferencesWidget(): Gtk.Widget; } } + +declare module 'resource:///org/gnome/shell/misc/config.js' { + export const PACKAGE_VERSION: string; +} From 5260881145b97359c9bff8d1476a518b56b9044c Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Sun, 5 May 2024 22:30:00 +0200 Subject: [PATCH 12/14] Enable extension in container on startup --- container/runx11docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container/runx11docker.sh b/container/runx11docker.sh index 35bc7854..a2f1ac47 100755 --- a/container/runx11docker.sh +++ b/container/runx11docker.sh @@ -18,6 +18,6 @@ $SCRIPT_DIR/x11docker/x11docker \ --network \ --init=systemd \ --user=RETAIN \ - --runasuser="journalctl -f &" \ + --runasuser="gnome-extensions enable randomwallpaper@iflow.space; journalctl -f &" \ -- --mount type=bind,source=$SRC_DIR,target=$DST_DIR,readonly -- \ $1 From db1fcf10941f5c10246f74c33ce928211a84e130 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Sun, 5 May 2024 22:31:01 +0200 Subject: [PATCH 13/14] Rename zoomMode and bind it directly to gnome settings * Change the name to "Scaling Mode" to be more generic * Bind settings UI directly to the gnome shell background and screen-saver settings to provide direct feedback when changing the value * The internal copy of the currently selected mode is kept as string to restore the selected value when not using an external wallpaper manager with multi-monitor support --- src/manager/defaultWallpaperManager.ts | 12 ++++---- src/manager/wallpaperManager.ts | 5 ++-- src/prefs.ts | 28 +++++++++++-------- ...ns.space.iflow.randomwallpaper.gschema.xml | 4 +-- src/ui/pageGeneral.blp | 4 +-- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/manager/defaultWallpaperManager.ts b/src/manager/defaultWallpaperManager.ts index d7b916df..3bf8e07f 100644 --- a/src/manager/defaultWallpaperManager.ts +++ b/src/manager/defaultWallpaperManager.ts @@ -1,6 +1,6 @@ import * as Utils from '../utils.js'; -import {WallpaperManager, getZoomModeEnum} from './wallpaperManager.js'; +import {WallpaperManager} from './wallpaperManager.js'; import {Logger} from '../logger.js'; import {Settings} from '../settings.js'; @@ -50,11 +50,12 @@ class DefaultWallpaperManager extends WallpaperManager { * @returns {Promise} Only resolves */ static setSingleBackground(wallpaperURI: string, backgroundSettings: Settings): Promise { + const storedScalingMode = new Settings().getString('scaling-mode'); if (Utils.isImageMerged(wallpaperURI)) // merged wallpapers need mode "spanned" backgroundSettings.setString('picture-options', 'spanned'); - else - backgroundSettings.setString('picture-options', getZoomModeEnum()[new Settings().getInt('zoom-mode')]); + else if (storedScalingMode) + backgroundSettings.setString('picture-options', storedScalingMode); Utils.setPictureUriOfSettingsObject(backgroundSettings, wallpaperURI); return Promise.resolve(); @@ -69,11 +70,12 @@ class DefaultWallpaperManager extends WallpaperManager { * @returns {Promise} Only resolves */ static setSingleLockScreen(wallpaperURI: string, backgroundSettings: Settings, screensaverSettings: Settings): Promise { + const storedScalingMode = new Settings().getString('scaling-mode'); if (Utils.isImageMerged(wallpaperURI)) // merged wallpapers need mode "spanned" screensaverSettings.setString('picture-options', 'spanned'); - else - screensaverSettings.setString('picture-options', getZoomModeEnum()[new Settings().getInt('zoom-mode')]); + else if (storedScalingMode) + screensaverSettings.setString('picture-options', storedScalingMode); Utils.setPictureUriOfSettingsObject(screensaverSettings, wallpaperURI); return Promise.resolve(); diff --git a/src/manager/wallpaperManager.ts b/src/manager/wallpaperManager.ts index 9408d0cb..a94b99ff 100644 --- a/src/manager/wallpaperManager.ts +++ b/src/manager/wallpaperManager.ts @@ -112,11 +112,10 @@ function getModeNameList(): string[] { * * @returns {string[]} Array of string containing valid enum values */ -function getZoomModeEnum(): string[] { +function getScalingModeEnum(): string[] { const excludes = [ 'none', // No wallpaper 'wallpaper', // Tiled wallpapers, repeating pattern - 'stretched', // Ignoring aspect ratio 'spanned', // Ignoring aspect ratio ]; @@ -128,5 +127,5 @@ export { WallpaperManager, Mode, getModeNameList, - getZoomModeEnum + getScalingModeEnum }; diff --git a/src/prefs.ts b/src/prefs.ts index fd74ff45..9693cd50 100644 --- a/src/prefs.ts +++ b/src/prefs.ts @@ -71,17 +71,23 @@ class RandomWallpaperSettings extends ExtensionPreferences { 'selected', Gio.SettingsBindFlags.DEFAULT); - const comboZoomMode = this._getAs(builder, 'combo_zoom_mode'); - comboZoomMode.model = Gtk.StringList.new(WallpaperManager.getZoomModeEnum()); - settings.bind('zoom-mode', - comboZoomMode, - 'selected', - Gio.SettingsBindFlags.DEFAULT); - settings.observe('zoom-mode', () => { - new Settings.Settings('org.gnome.desktop.background') - .setString('picture-options', WallpaperManager.getZoomModeEnum()[settings.getInt('zoom-mode')]); - new Settings.Settings('org.gnome.desktop.screensaver') - .setString('picture-options', WallpaperManager.getZoomModeEnum()[settings.getInt('zoom-mode')]); + const comboScalingMode = this._getAs(builder, 'combo_scaling_mode'); + comboScalingMode.model = Gtk.StringList.new(WallpaperManager.getScalingModeEnum()); + const gnomeDesktopSettings = new Settings.Settings('org.gnome.desktop.background'); + const gnomeScreensaverSettings = new Settings.Settings('org.gnome.desktop.screensaver'); + + let storedScalingModeIdx = WallpaperManager.getScalingModeEnum().indexOf(settings.getString('scaling-mode')); + if (storedScalingModeIdx < 0) + // fallback to the current value set in gnome-shell for the desktop + storedScalingModeIdx = WallpaperManager.getScalingModeEnum().indexOf(gnomeDesktopSettings.getString('picture-options')); + + // can't bind a string to "selected" and "active-item" is not available on Adw.ComboRow, binding is implemented manually below + comboScalingMode.selected = storedScalingModeIdx >= 0 ? storedScalingModeIdx : Gtk.INVALID_LIST_POSITION; + comboScalingMode.connect('notify::selected', () => { + const selectedString = WallpaperManager.getScalingModeEnum()[comboScalingMode.selected]; + gnomeDesktopSettings.setString('picture-options', selectedString); + gnomeScreensaverSettings.setString('picture-options', selectedString); + settings.setString('scaling-mode', selectedString); }); const comboLogLevel = this._getAs(builder, 'log_level'); diff --git a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml index e1fc34ba..e4714c4a 100644 --- a/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml +++ b/src/schemas/org.gnome.shell.extensions.space.iflow.randomwallpaper.gschema.xml @@ -55,8 +55,8 @@ Allows to choose what backgrounds will be changed. - - 2 + + "" Choose which zoom mode wallpapers get Allows to choose what setting 'picture-options' will get. diff --git a/src/ui/pageGeneral.blp b/src/ui/pageGeneral.blp index 8e771f37..7ed0086c 100644 --- a/src/ui/pageGeneral.blp +++ b/src/ui/pageGeneral.blp @@ -31,8 +31,8 @@ Adw.PreferencesPage page_general { use-subtitle: true; } - Adw.ComboRow combo_zoom_mode { - title: _("Wallpaper Zoom Mode"); + Adw.ComboRow combo_scaling_mode { + title: _("Wallpaper Scaling Mode"); use-subtitle: true; } From ec148f19e46d8241121a9b1f456b07d4f32530e0 Mon Sep 17 00:00:00 2001 From: Wolfgang Rumpler Date: Tue, 26 Mar 2024 01:46:23 +0100 Subject: [PATCH 14/14] Bump version to v3.0.2 --- src/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metadata.json b/src/metadata.json index 6aee2b76..ca9231b0 100644 --- a/src/metadata.json +++ b/src/metadata.json @@ -4,8 +4,8 @@ "settings-schema": "org.gnome.shell.extensions.space.iflow.randomwallpaper", "name": "Random Wallpaper", "description": "Load new desktop wallpapers from various online sources with ease!", - "version": 34, - "semantic-version": "3.0.1", + "version": 35, + "semantic-version": "3.0.2", "url": "https://github.com/ifl0w/RandomWallpaperGnome3", "issue-url": "https://github.com/ifl0w/RandomWallpaperGnome3/issues" }