From 5f054a59b42870fc45bf6e926641ac8feda1ff7b Mon Sep 17 00:00:00 2001 From: Steve <48870638+svan71@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:50:16 -0400 Subject: [PATCH] Add apps-icon-name pref: themed icon override for the apps button Like dash-to-dock's show-apps icon swap: a string pref (empty = stock grid icon) applied to the real ShowAppsIcon St.Icon in _inspectIcon, with fallback_icon_name so missing theme names degrade to the stock icon. The animated renderer inherits it via icon_name cloning. Restored on icon cleanup. Also completes the half-implemented 'string' pref plumbing in PrefKeys: setValue never persisted strings to GSettings, connectBuilder had no string case (entries never saved), and connectSettings called set_value on widgets that only have set_text. --- dock.js | 15 +++++++++++++++ extension.js | 1 + preferences/keys.js | 4 ++++ preferences/prefKeys.js | 16 +++++++++++++++- schemas/gschemas.compiled | Bin 6700 -> 6796 bytes ...hell.extensions.dash2dock-lite.gschema.xml | 5 +++++ ui/others.ui | 5 +++++ 7 files changed, 45 insertions(+), 1 deletion(-) diff --git a/dock.js b/dock.js index d3202ad..15da31e 100644 --- a/dock.js +++ b/dock.js @@ -581,6 +581,17 @@ export let Dock = GObject.registerClass( } catch (err) { // ignore } + if (this.dash && c == this.dash._showAppsIcon) { + if (stIcon._defaultIconName === undefined) { + stIcon._defaultIconName = stIcon.icon_name; + } + // themed override; missing names fall back to the stock grid icon + stIcon.fallback_icon_name = stIcon._defaultIconName; + let appsIconName = this.extension.apps_icon_name || ''; + stIcon.icon_name = appsIconName.length + ? appsIconName + : stIcon._defaultIconName; + } } } @@ -658,6 +669,10 @@ export let Dock = GObject.registerClass( } _cleanupIcon(c) { + if (c._icon && c._icon._defaultIconName !== undefined) { + c._icon.icon_name = c._icon._defaultIconName; + delete c._icon._defaultIconName; + } if (c._image && c._image.get_parent()) { c._image.get_parent().remove_child(c._image); } diff --git a/extension.js b/extension.js index 15a7410..6df3a70 100644 --- a/extension.js +++ b/extension.js @@ -530,6 +530,7 @@ export default class Dash2DockLiteExt extends Extension { break; case 'apps-icon': case 'apps-icon-front': + case 'apps-icon-name': case 'calendar-icon': case 'clock-icon': case 'favorites-only': { diff --git a/preferences/keys.js b/preferences/keys.js index 868dd33..d891b22 100644 --- a/preferences/keys.js +++ b/preferences/keys.js @@ -168,6 +168,10 @@ export const SettingsKeys = () => { default_value: false, widget_type: 'switch', }, + 'apps-icon-name': { + default_value: '', + widget_type: 'string', + }, 'trash-icon': { default_value: false, widget_type: 'switch', diff --git a/preferences/prefKeys.js b/preferences/prefKeys.js index 9173087..4b6ae59 100644 --- a/preferences/prefKeys.js +++ b/preferences/prefKeys.js @@ -69,6 +69,10 @@ export let PrefKeys = class { settings.set_double(name, value); break; } + case 'string': { + settings.set_string(name, value); + break; + } case 'color': { settings.set_value(name, new GLib.Variant('(dddd)', value)); break; @@ -146,7 +150,7 @@ export let PrefKeys = class { } case 'string': { key.value = settings.get_string(name); - if (key.object) key.object.set_value(key.value); + if (key.object && key.object.set_text) key.object.set_text(key.value); break; } case 'color': { @@ -264,6 +268,16 @@ export let PrefKeys = class { }); break; } + case 'string': { + signal_id = key.object.connect('changed', (w) => { + let value = w.get_text(); + self.setValue(name, value); + if (key.callback) { + key.callback(value); + } + }); + break; + } case 'color': { signal_id = key.object.connect('color-set', (w) => { let rgba = w.get_rgba(); diff --git a/schemas/gschemas.compiled b/schemas/gschemas.compiled index fe036ce774f4ccf1b322c99e2532de84d670a253..58f1b84ae1e5edaffeffb262d1ded42755d47604 100644 GIT binary patch literal 6796 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 icon at front Position the apps icon at the front. + + '' + Apps icon name + Themed icon name for the apps icon. Leave empty for the default grid icon. + 0 Preferred monitor to dock diff --git a/ui/others.ui b/ui/others.ui index d1991ed..63f2c02 100644 --- a/ui/others.ui +++ b/ui/others.ui @@ -44,6 +44,11 @@ + + + Apps Icon Name (themed icon, empty for default) + +