commit
b2c81bc5e1
@ -0,0 +1 @@
|
|||||||
|
SOURCES/gnome-settings-daemon-40.0.1.tar.xz
|
@ -0,0 +1 @@
|
|||||||
|
5c9249cc5e89627bd548d7cfc9f839c7524ad85f SOURCES/gnome-settings-daemon-40.0.1.tar.xz
|
@ -0,0 +1,458 @@
|
|||||||
|
From 8dd4c164f6ce166a5767588bd6fb8e4c3e8e1a09 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Fri, 16 Jul 2021 13:40:10 +0200
|
||||||
|
Subject: [PATCH 1/4] power: Enable power-saver profile when low on battery
|
||||||
|
|
||||||
|
When low on battery, and if the feature is enabled, hold the power
|
||||||
|
profile to "power-saver" until the battery is sufficiently recharged.
|
||||||
|
---
|
||||||
|
...ttings-daemon.plugins.power.gschema.xml.in | 5 +
|
||||||
|
plugins/power/gsd-power-manager.c | 128 ++++++++++++++++++
|
||||||
|
plugins/power/test.py | 32 +++++
|
||||||
|
3 files changed, 165 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
|
||||||
|
index 93c704e9..04b287bd 100644
|
||||||
|
--- a/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
|
||||||
|
+++ b/data/org.gnome.settings-daemon.plugins.power.gschema.xml.in
|
||||||
|
@@ -41,5 +41,10 @@
|
||||||
|
<summary>Power button action</summary>
|
||||||
|
<description>The action to take when the system power button is pressed. This action is hard-coded (and the setting ignored) on virtual machines (power off) and tablets (suspend).</description>
|
||||||
|
</key>
|
||||||
|
+ <key name="power-saver-profile-on-low-battery" type="b">
|
||||||
|
+ <default>true</default>
|
||||||
|
+ <summary>Enable power-saver profile when battery is low</summary>
|
||||||
|
+ <description>Automatically enable the "power-saver" profile using power-profiles-daemon if the battery is low.</description>
|
||||||
|
+ </key>
|
||||||
|
</schema>
|
||||||
|
</schemalist>
|
||||||
|
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||||
|
index 95cec9c3..1f125a6f 100644
|
||||||
|
--- a/plugins/power/gsd-power-manager.c
|
||||||
|
+++ b/plugins/power/gsd-power-manager.c
|
||||||
|
@@ -59,6 +59,10 @@
|
||||||
|
#define UPOWER_DBUS_INTERFACE "org.freedesktop.UPower"
|
||||||
|
#define UPOWER_DBUS_INTERFACE_KBDBACKLIGHT "org.freedesktop.UPower.KbdBacklight"
|
||||||
|
|
||||||
|
+#define PPD_DBUS_NAME "net.hadess.PowerProfiles"
|
||||||
|
+#define PPD_DBUS_PATH "/net/hadess/PowerProfiles"
|
||||||
|
+#define PPD_DBUS_INTERFACE "net.hadess.PowerProfiles"
|
||||||
|
+
|
||||||
|
#define GSD_POWER_SETTINGS_SCHEMA "org.gnome.settings-daemon.plugins.power"
|
||||||
|
|
||||||
|
#define GSD_POWER_DBUS_NAME GSD_DBUS_NAME ".Power"
|
||||||
|
@@ -185,6 +189,10 @@ struct _GsdPowerManager
|
||||||
|
gdouble ambient_last_absolute;
|
||||||
|
gint64 ambient_last_time;
|
||||||
|
|
||||||
|
+ /* Power Profiles */
|
||||||
|
+ GDBusProxy *power_profiles_proxy;
|
||||||
|
+ guint32 power_saver_cookie;
|
||||||
|
+
|
||||||
|
/* Sound */
|
||||||
|
guint32 critical_alert_timeout_id;
|
||||||
|
|
||||||
|
@@ -1927,6 +1935,67 @@ idle_configure (GsdPowerManager *manager)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+hold_profile_cb (GObject *source_object,
|
||||||
|
+ GAsyncResult *res,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ GsdPowerManager *manager = user_data;
|
||||||
|
+ g_autoptr(GError) error = NULL;
|
||||||
|
+ g_autoptr(GVariant) result = NULL;
|
||||||
|
+
|
||||||
|
+ result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object),
|
||||||
|
+ res,
|
||||||
|
+ &error);
|
||||||
|
+ if (result == NULL) {
|
||||||
|
+ g_warning ("Couldn't hold power-saver profile: %s", error->message);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(u)"))) {
|
||||||
|
+ g_variant_get (result, "(u)", &manager->power_saver_cookie);
|
||||||
|
+ g_debug ("Holding power-saver profile with cookie %u", manager->power_saver_cookie);
|
||||||
|
+ } else {
|
||||||
|
+ g_warning ("Calling HoldProfile() did not return a uint32");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+enable_power_saver (GsdPowerManager *manager)
|
||||||
|
+{
|
||||||
|
+ if (!manager->power_profiles_proxy)
|
||||||
|
+ return;
|
||||||
|
+ if (!g_settings_get_boolean (manager->settings, "power-saver-profile-on-low-battery"))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ g_debug ("Starting hold of power-saver profile");
|
||||||
|
+
|
||||||
|
+ g_dbus_proxy_call (manager->power_profiles_proxy,
|
||||||
|
+ "HoldProfile",
|
||||||
|
+ g_variant_new("(sss)",
|
||||||
|
+ "power-saver",
|
||||||
|
+ "Power saver profile when low on battery",
|
||||||
|
+ GSD_POWER_DBUS_NAME),
|
||||||
|
+ G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
+ -1, manager->cancellable, hold_profile_cb, manager);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+disable_power_saver (GsdPowerManager *manager)
|
||||||
|
+{
|
||||||
|
+ if (!manager->power_profiles_proxy || manager->power_saver_cookie == 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ g_debug ("Releasing power-saver profile");
|
||||||
|
+
|
||||||
|
+ g_dbus_proxy_call (manager->power_profiles_proxy,
|
||||||
|
+ "ReleaseProfile",
|
||||||
|
+ g_variant_new ("(u)", manager->power_saver_cookie),
|
||||||
|
+ G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
+ -1, NULL, dbus_call_log_error, "ReleaseProfile failed");
|
||||||
|
+ manager->power_saver_cookie = 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
main_battery_or_ups_low_changed (GsdPowerManager *manager,
|
||||||
|
gboolean is_low)
|
||||||
|
@@ -1935,6 +2004,10 @@ main_battery_or_ups_low_changed (GsdPowerManager *manager,
|
||||||
|
return;
|
||||||
|
manager->battery_is_low = is_low;
|
||||||
|
idle_configure (manager);
|
||||||
|
+ if (is_low)
|
||||||
|
+ enable_power_saver (manager);
|
||||||
|
+ else
|
||||||
|
+ disable_power_saver (manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
@@ -2078,6 +2151,39 @@ screensaver_signal_cb (GDBusProxy *proxy,
|
||||||
|
handle_wake_up_screen (GSD_POWER_MANAGER (user_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+power_profiles_proxy_signal_cb (GDBusProxy *proxy,
|
||||||
|
+ const gchar *sender_name,
|
||||||
|
+ const gchar *signal_name,
|
||||||
|
+ GVariant *parameters,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
|
||||||
|
+
|
||||||
|
+ if (g_strcmp0 (signal_name, "ProfileReleased") != 0)
|
||||||
|
+ return;
|
||||||
|
+ manager->power_saver_cookie = 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+power_profiles_proxy_ready_cb (GObject *source_object,
|
||||||
|
+ GAsyncResult *res,
|
||||||
|
+ gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ g_autoptr(GError) error = NULL;
|
||||||
|
+ GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
|
||||||
|
+
|
||||||
|
+ manager->power_profiles_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
|
||||||
|
+ if (manager->power_profiles_proxy == NULL) {
|
||||||
|
+ g_debug ("Could not connect to power-profiles-daemon: %s", error->message);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_signal_connect (manager->power_profiles_proxy, "g-signal",
|
||||||
|
+ G_CALLBACK (power_profiles_proxy_signal_cb),
|
||||||
|
+ manager);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
power_keyboard_proxy_ready_cb (GObject *source_object,
|
||||||
|
GAsyncResult *res,
|
||||||
|
@@ -2289,6 +2395,14 @@ engine_settings_key_changed_cb (GSettings *settings,
|
||||||
|
idle_configure (manager);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+ if (g_str_equal (key, "power-saver-profile-on-low-battery")) {
|
||||||
|
+ if (manager->battery_is_low &&
|
||||||
|
+ g_settings_get_boolean (settings, key))
|
||||||
|
+ enable_power_saver (manager);
|
||||||
|
+ else
|
||||||
|
+ disable_power_saver (manager);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -2599,6 +2713,17 @@ on_rr_screen_acquired (GObject *object,
|
||||||
|
g_signal_connect (manager->up_client, "notify::on-battery",
|
||||||
|
G_CALLBACK (up_client_on_battery_cb), manager);
|
||||||
|
|
||||||
|
+ /* connect to power-profiles-daemon */
|
||||||
|
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
||||||
|
+ G_DBUS_PROXY_FLAGS_NONE,
|
||||||
|
+ NULL,
|
||||||
|
+ PPD_DBUS_NAME,
|
||||||
|
+ PPD_DBUS_PATH,
|
||||||
|
+ PPD_DBUS_INTERFACE,
|
||||||
|
+ manager->cancellable,
|
||||||
|
+ power_profiles_proxy_ready_cb,
|
||||||
|
+ manager);
|
||||||
|
+
|
||||||
|
/* connect to UPower for keyboard backlight control */
|
||||||
|
manager->kbd_brightness_now = -1;
|
||||||
|
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
||||||
|
@@ -2862,6 +2987,9 @@ gsd_power_manager_stop (GsdPowerManager *manager)
|
||||||
|
|
||||||
|
g_clear_object (&manager->screensaver_proxy);
|
||||||
|
|
||||||
|
+ disable_power_saver (manager);
|
||||||
|
+ g_clear_object (&manager->power_profiles_proxy);
|
||||||
|
+
|
||||||
|
play_loop_stop (&manager->critical_alert_timeout_id);
|
||||||
|
|
||||||
|
g_clear_object (&manager->idle_monitor);
|
||||||
|
diff --git a/plugins/power/test.py b/plugins/power/test.py
|
||||||
|
index bb5861a4..f554400e 100755
|
||||||
|
--- a/plugins/power/test.py
|
||||||
|
+++ b/plugins/power/test.py
|
||||||
|
@@ -76,6 +76,13 @@ class PowerPluginBase(gsdtestcase.GSDTestCase):
|
||||||
|
'gnome_screensaver', stdout=subprocess.PIPE)
|
||||||
|
gsdtestcase.set_nonblock(self.screensaver.stdout)
|
||||||
|
|
||||||
|
+ # start mock power-profiles-daemon
|
||||||
|
+ try:
|
||||||
|
+ (self.ppd, self.obj_ppd) = self.spawn_server_template('power_profiles_daemon')
|
||||||
|
+ self.addCleanup(self.stop_process, self.ppd)
|
||||||
|
+ except ModuleNotFoundError:
|
||||||
|
+ self.ppd = None
|
||||||
|
+
|
||||||
|
self.session_log = OutputChecker()
|
||||||
|
self.session = subprocess.Popen(['gnome-session', '-f',
|
||||||
|
'-a', os.path.join(self.workdir, 'autostart'),
|
||||||
|
@@ -1302,5 +1309,30 @@ class PowerPluginTest8(PowerPluginBase):
|
||||||
|
|
||||||
|
self.assertEqual(exc.exception.get_dbus_message(), 'No usable backlight could be found!')
|
||||||
|
|
||||||
|
+ def test_power_saver_on_low_battery(self):
|
||||||
|
+ '''Check that the power-saver profile gets held when low on battery'''
|
||||||
|
+
|
||||||
|
+ if not self.ppd:
|
||||||
|
+ self.skipTest("power-profiles-daemon dbusmock support is not available")
|
||||||
|
+
|
||||||
|
+ obj_props = dbus.Interface(self.obj_ppd, dbus.PROPERTIES_IFACE)
|
||||||
|
+
|
||||||
|
+ self.set_composite_battery_discharging()
|
||||||
|
+ time.sleep(0.5)
|
||||||
|
+ holds = obj_props.Get('net.hadess.PowerProfiles', 'ActiveProfileHolds')
|
||||||
|
+ self.assertEqual(len(holds), 0)
|
||||||
|
+
|
||||||
|
+ self.set_composite_battery_critical()
|
||||||
|
+ time.sleep(0.5)
|
||||||
|
+ holds = obj_props.Get('net.hadess.PowerProfiles', 'ActiveProfileHolds')
|
||||||
|
+ self.assertEqual(len(holds), 1)
|
||||||
|
+ self.assertEqual(holds[0]['Profile'], 'power-saver')
|
||||||
|
+ self.assertEqual(holds[0]['ApplicationId'], 'org.gnome.SettingsDaemon.Power')
|
||||||
|
+
|
||||||
|
+ self.set_composite_battery_discharging()
|
||||||
|
+ time.sleep(0.5)
|
||||||
|
+ holds = obj_props.Get('net.hadess.PowerProfiles', 'ActiveProfileHolds')
|
||||||
|
+ self.assertEqual(len(holds), 0)
|
||||||
|
+
|
||||||
|
# avoid writing to stderr
|
||||||
|
unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, verbosity=2))
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 74ed476d1a37a43eeba8c8bee8f5be5d499b0805 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Wed, 28 Jul 2021 16:40:24 +0200
|
||||||
|
Subject: [PATCH 2/4] power: Dim screen faster if power saver mode is on
|
||||||
|
|
||||||
|
As done on other platforms, aggressively dim the screen after a
|
||||||
|
short period when the user has selected to enter power saver mode.
|
||||||
|
|
||||||
|
The same aggressive screen dim will be used if the battery is low and
|
||||||
|
power-profiles-daemon is not available. If it is available, then it
|
||||||
|
fixes a screen dim happening when the battery was low which might
|
||||||
|
have been unwanted.
|
||||||
|
|
||||||
|
See https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/232
|
||||||
|
|
||||||
|
Prior art:
|
||||||
|
https://support.apple.com/en-us/HT205234
|
||||||
|
---
|
||||||
|
plugins/power/gsd-power-manager.c | 46 +++++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 44 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||||
|
index 1f125a6f..cfef9718 100644
|
||||||
|
--- a/plugins/power/gsd-power-manager.c
|
||||||
|
+++ b/plugins/power/gsd-power-manager.c
|
||||||
|
@@ -192,6 +192,7 @@ struct _GsdPowerManager
|
||||||
|
/* Power Profiles */
|
||||||
|
GDBusProxy *power_profiles_proxy;
|
||||||
|
guint32 power_saver_cookie;
|
||||||
|
+ gboolean power_saver_enabled;
|
||||||
|
|
||||||
|
/* Sound */
|
||||||
|
guint32 critical_alert_timeout_id;
|
||||||
|
@@ -1780,6 +1781,20 @@ clear_idle_watch (GnomeIdleMonitor *monitor,
|
||||||
|
*id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+is_power_save_active (GsdPowerManager *manager)
|
||||||
|
+{
|
||||||
|
+ /*
|
||||||
|
+ * If we have power-profiles-daemon, then we follow its setting,
|
||||||
|
+ * otherwise we go into power-save mode when the battery is low.
|
||||||
|
+ */
|
||||||
|
+ if (manager->power_profiles_proxy &&
|
||||||
|
+ g_dbus_proxy_get_name_owner (manager->power_profiles_proxy))
|
||||||
|
+ return manager->power_saver_enabled;
|
||||||
|
+ else
|
||||||
|
+ return manager->battery_is_low;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
idle_configure (GsdPowerManager *manager)
|
||||||
|
{
|
||||||
|
@@ -1903,8 +1918,8 @@ idle_configure (GsdPowerManager *manager)
|
||||||
|
/* Don't dim when the screen lock is active */
|
||||||
|
} else if (!on_battery) {
|
||||||
|
/* Don't dim when charging */
|
||||||
|
- } else if (manager->battery_is_low) {
|
||||||
|
- /* Aggressively blank when battery is low */
|
||||||
|
+ } else if (is_power_save_active (manager)) {
|
||||||
|
+ /* Try to save power by dimming agressively */
|
||||||
|
timeout_dim = SCREENSAVER_TIMEOUT_BLANK;
|
||||||
|
} else {
|
||||||
|
if (g_settings_get_boolean (manager->settings, "idle-dim")) {
|
||||||
|
@@ -2165,6 +2180,27 @@ power_profiles_proxy_signal_cb (GDBusProxy *proxy,
|
||||||
|
manager->power_saver_cookie = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+update_active_power_profile (GsdPowerManager *manager)
|
||||||
|
+{
|
||||||
|
+ g_autoptr(GVariant) v = NULL;
|
||||||
|
+ const char *active_profile;
|
||||||
|
+ gboolean power_saver_enabled;
|
||||||
|
+
|
||||||
|
+ v = g_dbus_proxy_get_cached_property (manager->power_profiles_proxy, "ActiveProfile");
|
||||||
|
+ if (v) {
|
||||||
|
+ active_profile = g_variant_get_string (v, NULL);
|
||||||
|
+ power_saver_enabled = g_strcmp0 (active_profile, "power-saver") == 0;
|
||||||
|
+ if (power_saver_enabled != manager->power_saver_enabled) {
|
||||||
|
+ manager->power_saver_enabled = power_saver_enabled;
|
||||||
|
+ idle_configure (manager);
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ /* p-p-d might have disappeared from the bus */
|
||||||
|
+ idle_configure (manager);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
power_profiles_proxy_ready_cb (GObject *source_object,
|
||||||
|
GAsyncResult *res,
|
||||||
|
@@ -2179,9 +2215,15 @@ power_profiles_proxy_ready_cb (GObject *source_object,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ g_signal_connect_swapped (manager->power_profiles_proxy,
|
||||||
|
+ "g-properties-changed",
|
||||||
|
+ G_CALLBACK (update_active_power_profile),
|
||||||
|
+ manager);
|
||||||
|
g_signal_connect (manager->power_profiles_proxy, "g-signal",
|
||||||
|
G_CALLBACK (power_profiles_proxy_signal_cb),
|
||||||
|
manager);
|
||||||
|
+
|
||||||
|
+ update_active_power_profile (manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 89e25ed7871258aa6df7f824e226a7b8a28f23f3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Thu, 29 Jul 2021 12:05:40 +0200
|
||||||
|
Subject: [PATCH 3/4] power: Respect dim screen settings when not on battery
|
||||||
|
|
||||||
|
The dim screen settings in the UI was not well respected as it only
|
||||||
|
worked on discharging laptops.
|
||||||
|
|
||||||
|
Closes: https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/837
|
||||||
|
---
|
||||||
|
plugins/power/gsd-power-manager.c | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||||
|
index cfef9718..e7b9752f 100644
|
||||||
|
--- a/plugins/power/gsd-power-manager.c
|
||||||
|
+++ b/plugins/power/gsd-power-manager.c
|
||||||
|
@@ -1916,8 +1916,6 @@ idle_configure (GsdPowerManager *manager)
|
||||||
|
timeout_dim = 0;
|
||||||
|
if (manager->screensaver_active) {
|
||||||
|
/* Don't dim when the screen lock is active */
|
||||||
|
- } else if (!on_battery) {
|
||||||
|
- /* Don't dim when charging */
|
||||||
|
} else if (is_power_save_active (manager)) {
|
||||||
|
/* Try to save power by dimming agressively */
|
||||||
|
timeout_dim = SCREENSAVER_TIMEOUT_BLANK;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From f91abc0033b9cf17fd0e171cb7d652f88edac294 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bastien Nocera <hadess@hadess.net>
|
||||||
|
Date: Mon, 9 Aug 2021 17:57:11 +0200
|
||||||
|
Subject: [PATCH 4/4] power: When dimming the screen, dim it quicker by default
|
||||||
|
|
||||||
|
Now that we respect the "dim when idle" setting[1], dim quicker to try
|
||||||
|
and save more power. 4/5 of the timeout to the screensaver was always a
|
||||||
|
bit too undecided as a fraction, even when using the dimming as a
|
||||||
|
warning that the screen was going to go to the screensaver (see commit
|
||||||
|
7bc750a5).
|
||||||
|
|
||||||
|
[1]: Except in power-saver mode where we always dim aggressively
|
||||||
|
---
|
||||||
|
plugins/power/gsd-power-constants.h | 2 +-
|
||||||
|
plugins/power/gsdpowerconstants.py | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/power/gsd-power-constants.h b/plugins/power/gsd-power-constants.h
|
||||||
|
index 91e2296a..8bf9c641 100644
|
||||||
|
--- a/plugins/power/gsd-power-constants.h
|
||||||
|
+++ b/plugins/power/gsd-power-constants.h
|
||||||
|
@@ -25,7 +25,7 @@
|
||||||
|
#define IDLE_DIM_BLANK_DISABLED_MIN 60 /* seconds */
|
||||||
|
|
||||||
|
/* Which fraction of the idle-delay is the idle-dim delay */
|
||||||
|
-#define IDLE_DELAY_TO_IDLE_DIM_MULTIPLIER 4.0/5.0
|
||||||
|
+#define IDLE_DELAY_TO_IDLE_DIM_MULTIPLIER 1.0/2.0
|
||||||
|
|
||||||
|
/* The dim delay under which we do not bother dimming */
|
||||||
|
#define MINIMUM_IDLE_DIM_DELAY 10 /* seconds */
|
||||||
|
diff --git a/plugins/power/gsdpowerconstants.py b/plugins/power/gsdpowerconstants.py
|
||||||
|
index a07798ee..26fa5bfc 100644
|
||||||
|
--- a/plugins/power/gsdpowerconstants.py
|
||||||
|
+++ b/plugins/power/gsdpowerconstants.py
|
||||||
|
@@ -8,7 +8,7 @@
|
||||||
|
|
||||||
|
SCREENSAVER_TIMEOUT_BLANK = 15;
|
||||||
|
IDLE_DIM_BLANK_DISABLED_MIN = 60;
|
||||||
|
-IDLE_DELAY_TO_IDLE_DIM_MULTIPLIER = 4.0/5.0;
|
||||||
|
+IDLE_DELAY_TO_IDLE_DIM_MULTIPLIER = 1.0/2.0;
|
||||||
|
MINIMUM_IDLE_DIM_DELAY = 10;
|
||||||
|
POWER_UP_TIME_ON_AC = 15;
|
||||||
|
GSD_MOCK_DEFAULT_BRIGHTNESS = 50;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -0,0 +1,561 @@
|
|||||||
|
From 6ab152961de63dec953981aea24a7f0b4e7949ec Mon Sep 17 00:00:00 2001
|
||||||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
Date: Fri, 3 Dec 2021 23:38:50 +0100
|
||||||
|
Subject: [PATCH 1/3] xsettings: Adopt code to look up GTK IM module
|
||||||
|
|
||||||
|
Right now, gsd-keyboard and gsd-xsettings have a strange relation
|
||||||
|
where the first sets the gtk-im-module dconf setting for the latter
|
||||||
|
to read the setting and forward it through XSettings.
|
||||||
|
|
||||||
|
Since this detection is highly X11 specific, make it happen in the
|
||||||
|
Xsettings daemon itself, from the relevant setting and device presence.
|
||||||
|
|
||||||
|
This makes users still able to shoot themselves in the foot by changing
|
||||||
|
the setting, X11 clients able to be told to switch to ibus if it turns
|
||||||
|
out necessary, and Wayland clients unaffected otherwise.
|
||||||
|
|
||||||
|
Related: https://gitlab.gnome.org/GNOME/gtk/-/issues/4443
|
||||||
|
---
|
||||||
|
plugins/keyboard/gsd-keyboard-manager.c | 147 ---------------------
|
||||||
|
plugins/xsettings/gsd-xsettings-manager.c | 153 ++++++++++++++++++++++
|
||||||
|
2 files changed, 153 insertions(+), 147 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
index cb4ea98b..d41393bc 100644
|
||||||
|
--- a/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
+++ b/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
@@ -57,10 +57,6 @@
|
||||||
|
|
||||||
|
#define GNOME_DESKTOP_INTERFACE_DIR "org.gnome.desktop.interface"
|
||||||
|
|
||||||
|
-#define KEY_GTK_IM_MODULE "gtk-im-module"
|
||||||
|
-#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
|
||||||
|
-#define GTK_IM_MODULE_IBUS "ibus"
|
||||||
|
-
|
||||||
|
#define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources"
|
||||||
|
|
||||||
|
#define KEY_INPUT_SOURCES "sources"
|
||||||
|
@@ -71,9 +67,6 @@
|
||||||
|
|
||||||
|
#define DEFAULT_LAYOUT "us"
|
||||||
|
|
||||||
|
-#define GNOME_A11Y_APPLICATIONS_INTERFACE_DIR "org.gnome.desktop.a11y.applications"
|
||||||
|
-#define KEY_OSK_ENABLED "screen-keyboard-enabled"
|
||||||
|
-
|
||||||
|
struct _GsdKeyboardManager
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
@@ -81,21 +74,14 @@ struct _GsdKeyboardManager
|
||||||
|
guint start_idle_id;
|
||||||
|
GSettings *settings;
|
||||||
|
GSettings *input_sources_settings;
|
||||||
|
- GSettings *a11y_settings;
|
||||||
|
GDBusProxy *localed;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
-
|
||||||
|
- GdkDeviceManager *device_manager;
|
||||||
|
- guint device_added_id;
|
||||||
|
- guint device_removed_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void gsd_keyboard_manager_class_init (GsdKeyboardManagerClass *klass);
|
||||||
|
static void gsd_keyboard_manager_init (GsdKeyboardManager *keyboard_manager);
|
||||||
|
static void gsd_keyboard_manager_finalize (GObject *object);
|
||||||
|
|
||||||
|
-static void update_gtk_im_module (GsdKeyboardManager *manager);
|
||||||
|
-
|
||||||
|
G_DEFINE_TYPE (GsdKeyboardManager, gsd_keyboard_manager, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static gpointer manager_object = NULL;
|
||||||
|
@@ -218,121 +204,6 @@ settings_changed (GSettings *settings,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-device_added_cb (GdkDeviceManager *device_manager,
|
||||||
|
- GdkDevice *device,
|
||||||
|
- GsdKeyboardManager *manager)
|
||||||
|
-{
|
||||||
|
- GdkInputSource source;
|
||||||
|
-
|
||||||
|
- source = gdk_device_get_source (device);
|
||||||
|
- if (source == GDK_SOURCE_TOUCHSCREEN) {
|
||||||
|
- update_gtk_im_module (manager);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-device_removed_cb (GdkDeviceManager *device_manager,
|
||||||
|
- GdkDevice *device,
|
||||||
|
- GsdKeyboardManager *manager)
|
||||||
|
-{
|
||||||
|
- GdkInputSource source;
|
||||||
|
-
|
||||||
|
- source = gdk_device_get_source (device);
|
||||||
|
- if (source == GDK_SOURCE_TOUCHSCREEN)
|
||||||
|
- update_gtk_im_module (manager);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-set_devicepresence_handler (GsdKeyboardManager *manager)
|
||||||
|
-{
|
||||||
|
- GdkDeviceManager *device_manager;
|
||||||
|
-
|
||||||
|
- if (gnome_settings_is_wayland ())
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
|
||||||
|
-
|
||||||
|
- manager->device_added_id = g_signal_connect (G_OBJECT (device_manager), "device-added",
|
||||||
|
- G_CALLBACK (device_added_cb), manager);
|
||||||
|
- manager->device_removed_id = g_signal_connect (G_OBJECT (device_manager), "device-removed",
|
||||||
|
- G_CALLBACK (device_removed_cb), manager);
|
||||||
|
- manager->device_manager = device_manager;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static gboolean
|
||||||
|
-need_ibus (GVariant *sources)
|
||||||
|
-{
|
||||||
|
- GVariantIter iter;
|
||||||
|
- const gchar *type;
|
||||||
|
-
|
||||||
|
- g_variant_iter_init (&iter, sources);
|
||||||
|
- while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL))
|
||||||
|
- if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
|
||||||
|
- return TRUE;
|
||||||
|
-
|
||||||
|
- return FALSE;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static gboolean
|
||||||
|
-need_osk (GsdKeyboardManager *manager)
|
||||||
|
-{
|
||||||
|
- gboolean has_touchscreen = FALSE;
|
||||||
|
- GList *devices;
|
||||||
|
- GdkSeat *seat;
|
||||||
|
-
|
||||||
|
- if (g_settings_get_boolean (manager->a11y_settings,
|
||||||
|
- KEY_OSK_ENABLED))
|
||||||
|
- return TRUE;
|
||||||
|
-
|
||||||
|
- seat = gdk_display_get_default_seat (gdk_display_get_default ());
|
||||||
|
- devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
|
||||||
|
-
|
||||||
|
- has_touchscreen = devices != NULL;
|
||||||
|
-
|
||||||
|
- g_list_free (devices);
|
||||||
|
-
|
||||||
|
- return has_touchscreen;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-set_gtk_im_module (GsdKeyboardManager *manager,
|
||||||
|
- GSettings *settings,
|
||||||
|
- GVariant *sources)
|
||||||
|
-{
|
||||||
|
- const gchar *new_module;
|
||||||
|
- gchar *current_module;
|
||||||
|
-
|
||||||
|
- if (need_ibus (sources) || need_osk (manager))
|
||||||
|
- new_module = GTK_IM_MODULE_IBUS;
|
||||||
|
- else
|
||||||
|
- new_module = GTK_IM_MODULE_SIMPLE;
|
||||||
|
-
|
||||||
|
- current_module = g_settings_get_string (settings, KEY_GTK_IM_MODULE);
|
||||||
|
- if (!g_str_equal (current_module, new_module))
|
||||||
|
- g_settings_set_string (settings, KEY_GTK_IM_MODULE, new_module);
|
||||||
|
- g_free (current_module);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-update_gtk_im_module (GsdKeyboardManager *manager)
|
||||||
|
-{
|
||||||
|
- GSettings *interface_settings;
|
||||||
|
- GVariant *sources;
|
||||||
|
-
|
||||||
|
- /* Gtk+ uses the IM module advertised in XSETTINGS so, if we
|
||||||
|
- * have IBus input sources, we want it to load that
|
||||||
|
- * module. Otherwise we can use the default "simple" module
|
||||||
|
- * which is builtin gtk+
|
||||||
|
- */
|
||||||
|
- interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
|
||||||
|
- sources = g_settings_get_value (manager->input_sources_settings,
|
||||||
|
- KEY_INPUT_SOURCES);
|
||||||
|
- set_gtk_im_module (manager, interface_settings, sources);
|
||||||
|
- g_object_unref (interface_settings);
|
||||||
|
- g_variant_unref (sources);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
get_sources_from_xkb_config (GsdKeyboardManager *manager)
|
||||||
|
{
|
||||||
|
@@ -580,18 +451,7 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
|
||||||
|
|
||||||
|
manager->settings = g_settings_new (GSD_KEYBOARD_DIR);
|
||||||
|
|
||||||
|
- set_devicepresence_handler (manager);
|
||||||
|
-
|
||||||
|
manager->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
|
||||||
|
- g_signal_connect_swapped (manager->input_sources_settings,
|
||||||
|
- "changed::" KEY_INPUT_SOURCES,
|
||||||
|
- G_CALLBACK (update_gtk_im_module), manager);
|
||||||
|
-
|
||||||
|
- manager->a11y_settings = g_settings_new (GNOME_A11Y_APPLICATIONS_INTERFACE_DIR);
|
||||||
|
- g_signal_connect_swapped (manager->a11y_settings,
|
||||||
|
- "changed::" KEY_OSK_ENABLED,
|
||||||
|
- G_CALLBACK (update_gtk_im_module), manager);
|
||||||
|
- update_gtk_im_module (manager);
|
||||||
|
|
||||||
|
manager->cancellable = g_cancellable_new ();
|
||||||
|
|
||||||
|
@@ -645,14 +505,7 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
|
||||||
|
|
||||||
|
g_clear_object (&manager->settings);
|
||||||
|
g_clear_object (&manager->input_sources_settings);
|
||||||
|
- g_clear_object (&manager->a11y_settings);
|
||||||
|
g_clear_object (&manager->localed);
|
||||||
|
-
|
||||||
|
- if (manager->device_manager != NULL) {
|
||||||
|
- g_signal_handler_disconnect (manager->device_manager, manager->device_added_id);
|
||||||
|
- g_signal_handler_disconnect (manager->device_manager, manager->device_removed_id);
|
||||||
|
- manager->device_manager = NULL;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
index 5f1b4583..1aa020db 100644
|
||||||
|
--- a/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
+++ b/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
@@ -56,6 +56,9 @@
|
||||||
|
#define PRIVACY_SETTINGS_SCHEMA "org.gnome.desktop.privacy"
|
||||||
|
#define WM_SETTINGS_SCHEMA "org.gnome.desktop.wm.preferences"
|
||||||
|
#define A11Y_SCHEMA "org.gnome.desktop.a11y"
|
||||||
|
+#define A11Y_INTERFACE_SCHEMA "org.gnome.desktop.a11y.interface"
|
||||||
|
+#define A11Y_APPLICATIONS_SCHEMA "org.gnome.desktop.a11y.applications"
|
||||||
|
+#define INPUT_SOURCES_SCHEMA "org.gnome.desktop.input-sources"
|
||||||
|
#define CLASSIC_WM_SETTINGS_SCHEMA "org.gnome.shell.extensions.classic-overrides"
|
||||||
|
|
||||||
|
#define XSETTINGS_PLUGIN_SCHEMA "org.gnome.settings-daemon.plugins.xsettings"
|
||||||
|
@@ -72,9 +75,18 @@
|
||||||
|
#define FONT_HINTING_KEY "font-hinting"
|
||||||
|
#define FONT_RGBA_ORDER_KEY "font-rgba-order"
|
||||||
|
|
||||||
|
+#define INPUT_SOURCES_KEY "sources"
|
||||||
|
+#define OSK_ENABLED_KEY "screen-keyboard-enabled"
|
||||||
|
+#define GTK_IM_MODULE_KEY "gtk-im-module"
|
||||||
|
+
|
||||||
|
#define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings"
|
||||||
|
#define GTK_SETTINGS_DBUS_NAME "org.gtk.Settings"
|
||||||
|
|
||||||
|
+#define INPUT_SOURCE_TYPE_IBUS "ibus"
|
||||||
|
+
|
||||||
|
+#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
|
||||||
|
+#define GTK_IM_MODULE_IBUS "ibus"
|
||||||
|
+
|
||||||
|
static const gchar introspection_xml[] =
|
||||||
|
"<node name='/org/gtk/Settings'>"
|
||||||
|
" <interface name='org.gtk.Settings'>"
|
||||||
|
@@ -277,6 +289,11 @@ struct _GsdXSettingsManager
|
||||||
|
FcMonitor *fontconfig_monitor;
|
||||||
|
gint64 fontconfig_timestamp;
|
||||||
|
|
||||||
|
+ GSettings *interface_settings;
|
||||||
|
+ GSettings *input_sources_settings;
|
||||||
|
+ GSettings *a11y_settings;
|
||||||
|
+ GdkSeat *user_seat;
|
||||||
|
+
|
||||||
|
GsdXSettingsGtk *gtk;
|
||||||
|
|
||||||
|
guint introspect_properties_changed_id;
|
||||||
|
@@ -286,6 +303,9 @@ struct _GsdXSettingsManager
|
||||||
|
guint display_config_watch_id;
|
||||||
|
guint monitors_changed_id;
|
||||||
|
|
||||||
|
+ guint device_added_id;
|
||||||
|
+ guint device_removed_id;
|
||||||
|
+
|
||||||
|
guint shell_name_watch_id;
|
||||||
|
gboolean have_shell;
|
||||||
|
|
||||||
|
@@ -1291,6 +1311,112 @@ migrate_settings (void)
|
||||||
|
mouse_entries, G_N_ELEMENTS (mouse_entries));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+need_ibus (GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ GVariant *sources;
|
||||||
|
+ GVariantIter iter;
|
||||||
|
+ const gchar *type;
|
||||||
|
+ gboolean needs_ibus = FALSE;
|
||||||
|
+
|
||||||
|
+ sources = g_settings_get_value (manager->input_sources_settings,
|
||||||
|
+ INPUT_SOURCES_KEY);
|
||||||
|
+
|
||||||
|
+ g_variant_iter_init (&iter, sources);
|
||||||
|
+ while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL)) {
|
||||||
|
+ if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
|
||||||
|
+ needs_ibus = TRUE;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_variant_unref (sources);
|
||||||
|
+
|
||||||
|
+ return needs_ibus;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static gboolean
|
||||||
|
+need_osk (GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ gboolean has_touchscreen = FALSE;
|
||||||
|
+ GList *devices;
|
||||||
|
+ GdkSeat *seat;
|
||||||
|
+
|
||||||
|
+ if (g_settings_get_boolean (manager->a11y_settings,
|
||||||
|
+ OSK_ENABLED_KEY))
|
||||||
|
+ return TRUE;
|
||||||
|
+
|
||||||
|
+ seat = gdk_display_get_default_seat (gdk_display_get_default ());
|
||||||
|
+ devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
|
||||||
|
+
|
||||||
|
+ has_touchscreen = devices != NULL;
|
||||||
|
+
|
||||||
|
+ g_list_free (devices);
|
||||||
|
+
|
||||||
|
+ return has_touchscreen;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+update_gtk_im_module (GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ const gchar *module;
|
||||||
|
+ gchar *setting;
|
||||||
|
+
|
||||||
|
+ setting = g_settings_get_string (manager->interface_settings,
|
||||||
|
+ GTK_IM_MODULE_KEY);
|
||||||
|
+ if (setting && *setting)
|
||||||
|
+ module = setting;
|
||||||
|
+ else if (need_ibus (manager) || need_osk (manager))
|
||||||
|
+ module = GTK_IM_MODULE_IBUS;
|
||||||
|
+ else
|
||||||
|
+ module = GTK_IM_MODULE_SIMPLE;
|
||||||
|
+
|
||||||
|
+ xsettings_manager_set_string (manager->manager, "Gtk/IMModule", module);
|
||||||
|
+ g_free (setting);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+device_added_cb (GdkSeat *user_seat,
|
||||||
|
+ GdkDevice *device,
|
||||||
|
+ GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ GdkInputSource source;
|
||||||
|
+
|
||||||
|
+ source = gdk_device_get_source (device);
|
||||||
|
+ if (source == GDK_SOURCE_TOUCHSCREEN) {
|
||||||
|
+ update_gtk_im_module (manager);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+device_removed_cb (GdkSeat *user_seat,
|
||||||
|
+ GdkDevice *device,
|
||||||
|
+ GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ GdkInputSource source;
|
||||||
|
+
|
||||||
|
+ source = gdk_device_get_source (device);
|
||||||
|
+ if (source == GDK_SOURCE_TOUCHSCREEN)
|
||||||
|
+ update_gtk_im_module (manager);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+set_devicepresence_handler (GsdXSettingsManager *manager)
|
||||||
|
+{
|
||||||
|
+ GdkSeat *user_seat;
|
||||||
|
+
|
||||||
|
+ if (gnome_settings_is_wayland ())
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ user_seat = gdk_display_get_default_seat (gdk_display_get_default ());
|
||||||
|
+
|
||||||
|
+ manager->device_added_id = g_signal_connect (G_OBJECT (user_seat), "device-added",
|
||||||
|
+ G_CALLBACK (device_added_cb), manager);
|
||||||
|
+ manager->device_removed_id = g_signal_connect (G_OBJECT (user_seat), "device-removed",
|
||||||
|
+ G_CALLBACK (device_removed_cb), manager);
|
||||||
|
+ manager->user_seat = user_seat;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
gboolean
|
||||||
|
gsd_xsettings_manager_start (GsdXSettingsManager *manager,
|
||||||
|
GError **error)
|
||||||
|
@@ -1312,6 +1438,23 @@ gsd_xsettings_manager_start (GsdXSettingsManager *manager,
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ set_devicepresence_handler (manager);
|
||||||
|
+ manager->interface_settings = g_settings_new (INTERFACE_SETTINGS_SCHEMA);
|
||||||
|
+ g_signal_connect_swapped (manager->interface_settings,
|
||||||
|
+ "changed::" GTK_IM_MODULE_KEY,
|
||||||
|
+ G_CALLBACK (update_gtk_im_module), manager);
|
||||||
|
+
|
||||||
|
+ manager->input_sources_settings = g_settings_new (INPUT_SOURCES_SCHEMA);
|
||||||
|
+ g_signal_connect_swapped (manager->input_sources_settings,
|
||||||
|
+ "changed::" INPUT_SOURCES_KEY,
|
||||||
|
+ G_CALLBACK (update_gtk_im_module), manager);
|
||||||
|
+
|
||||||
|
+ manager->a11y_settings = g_settings_new (A11Y_APPLICATIONS_SCHEMA);
|
||||||
|
+ g_signal_connect_swapped (manager->a11y_settings,
|
||||||
|
+ "changed::" OSK_ENABLED_KEY,
|
||||||
|
+ G_CALLBACK (update_gtk_im_module), manager);
|
||||||
|
+ update_gtk_im_module (manager);
|
||||||
|
+
|
||||||
|
manager->monitors_changed_id =
|
||||||
|
g_dbus_connection_signal_subscribe (manager->dbus_connection,
|
||||||
|
"org.gnome.Mutter.DisplayConfig",
|
||||||
|
@@ -1507,6 +1650,16 @@ gsd_xsettings_manager_stop (GsdXSettingsManager *manager)
|
||||||
|
g_object_unref (manager->gtk);
|
||||||
|
manager->gtk = NULL;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (manager->user_seat != NULL) {
|
||||||
|
+ g_signal_handler_disconnect (manager->user_seat, manager->device_added_id);
|
||||||
|
+ g_signal_handler_disconnect (manager->user_seat, manager->device_removed_id);
|
||||||
|
+ manager->user_seat = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_clear_object (&manager->a11y_settings);
|
||||||
|
+ g_clear_object (&manager->input_sources_settings);
|
||||||
|
+ g_clear_object (&manager->interface_settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
||||||
|
|
||||||
|
From c1de15e0c7f145491482045c688e9f2d444cb041 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
Date: Tue, 15 Mar 2022 13:31:23 +0100
|
||||||
|
Subject: [PATCH 2/3] keyboard: "Migrate" gtk-im-context setting before giving
|
||||||
|
control to user
|
||||||
|
|
||||||
|
This setting used to be modified by gsd-keyboard at runtime, but it no
|
||||||
|
longer does. We want to leave this setting in a pristine state before
|
||||||
|
we lend control to the user in order to avoid setting leftovers make
|
||||||
|
GTK and others use the unintended IM module.
|
||||||
|
|
||||||
|
Since the setting is actually staying on the same schema/path, there is
|
||||||
|
no nice mechanism that would help us in doing a one-time port, so rely
|
||||||
|
on a file at ~/.cache to make this happen once. In the common case, it
|
||||||
|
just adds one stat() more at startup.
|
||||||
|
|
||||||
|
After this migration is done, the gtk-im-module setting can be considered
|
||||||
|
in full control of the user.
|
||||||
|
---
|
||||||
|
plugins/keyboard/gsd-keyboard-manager.c | 35 +++++++++++++++++++++++++
|
||||||
|
1 file changed, 35 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
index d41393bc..15247c78 100644
|
||||||
|
--- a/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
+++ b/plugins/keyboard/gsd-keyboard-manager.c
|
||||||
|
@@ -67,6 +67,8 @@
|
||||||
|
|
||||||
|
#define DEFAULT_LAYOUT "us"
|
||||||
|
|
||||||
|
+#define SETTINGS_PORTED_FILE ".gsd-keyboard.settings-ported"
|
||||||
|
+
|
||||||
|
struct _GsdKeyboardManager
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
@@ -541,6 +543,14 @@ gsd_keyboard_manager_finalize (GObject *object)
|
||||||
|
G_OBJECT_CLASS (gsd_keyboard_manager_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static GVariant *
|
||||||
|
+reset_gtk_im_module (GVariant *variant,
|
||||||
|
+ GVariant *old_default,
|
||||||
|
+ GVariant *new_default)
|
||||||
|
+{
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
migrate_keyboard_settings (void)
|
||||||
|
{
|
||||||
|
@@ -550,12 +560,37 @@ migrate_keyboard_settings (void)
|
||||||
|
{ "delay", "delay", NULL },
|
||||||
|
{ "remember-numlock-state", "remember-numlock-state", NULL },
|
||||||
|
};
|
||||||
|
+ g_autofree char *filename = NULL;
|
||||||
|
|
||||||
|
gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.keyboard.deprecated",
|
||||||
|
"/org/gnome/settings-daemon/peripherals/keyboard/",
|
||||||
|
"org.gnome.desktop.peripherals.keyboard",
|
||||||
|
"/org/gnome/desktop/peripherals/keyboard/",
|
||||||
|
entries, G_N_ELEMENTS (entries));
|
||||||
|
+
|
||||||
|
+ /* In prior versions to GNOME 42, the gtk-im-module setting was
|
||||||
|
+ * owned by gsd-keyboard. Reset it once before giving it back
|
||||||
|
+ * to the user.
|
||||||
|
+ */
|
||||||
|
+ filename = g_build_filename (g_get_user_config_dir (),
|
||||||
|
+ SETTINGS_PORTED_FILE,
|
||||||
|
+ NULL);
|
||||||
|
+
|
||||||
|
+ if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
|
||||||
|
+ GsdSettingsMigrateEntry im_entry[] = {
|
||||||
|
+ { "gtk-im-module", "gtk-im-module", reset_gtk_im_module },
|
||||||
|
+ };
|
||||||
|
+ g_autoptr(GError) error = NULL;
|
||||||
|
+
|
||||||
|
+ gsd_settings_migrate_check ("org.gnome.desktop.interface",
|
||||||
|
+ "/org/gnome/desktop/interface/",
|
||||||
|
+ "org.gnome.desktop.interface",
|
||||||
|
+ "/org/gnome/desktop/interface/",
|
||||||
|
+ im_entry, G_N_ELEMENTS (im_entry));
|
||||||
|
+
|
||||||
|
+ if (!g_file_set_contents (filename, "", -1, &error))
|
||||||
|
+ g_warning ("Error migrating gtk-im-module: %s", error->message);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
GsdKeyboardManager *
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
||||||
|
|
||||||
|
From 46452c04aee1bfd51e23a53dba89ac95e0c06823 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
Date: Fri, 29 Apr 2022 14:37:27 +0200
|
||||||
|
Subject: [PATCH 3/3] xsettings: Remove direct mapping from gtk-im-module to
|
||||||
|
Gtk/IMModule
|
||||||
|
|
||||||
|
This is now handled dynamically since commit e2d268eb00, so we should
|
||||||
|
not tie dconf setting and Xsetting automatically here. Doing so, we
|
||||||
|
are clobbering the dynamic value on startup, making it only effective
|
||||||
|
on later changes.
|
||||||
|
|
||||||
|
Fixes: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/issues/682
|
||||||
|
---
|
||||||
|
plugins/xsettings/gsd-xsettings-manager.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
index 1aa020db..d692cefb 100644
|
||||||
|
--- a/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
+++ b/plugins/xsettings/gsd-xsettings-manager.c
|
||||||
|
@@ -498,7 +498,6 @@ static TranslationEntry translations [] = {
|
||||||
|
{ "org.gnome.desktop.interface", "cursor-blink-time", "Net/CursorBlinkTime", translate_int_int },
|
||||||
|
{ "org.gnome.desktop.interface", "cursor-blink-timeout", "Gtk/CursorBlinkTimeout", translate_int_int },
|
||||||
|
{ "org.gnome.desktop.interface", "gtk-theme", "Net/ThemeName", translate_string_string },
|
||||||
|
- { "org.gnome.desktop.interface", "gtk-im-module", "Gtk/IMModule", translate_string_string },
|
||||||
|
{ "org.gnome.desktop.interface", "icon-theme", "Net/IconThemeName", translate_string_string },
|
||||||
|
{ "org.gnome.desktop.interface", "cursor-theme", "Gtk/CursorThemeName", translate_string_string },
|
||||||
|
{ "org.gnome.desktop.interface", "gtk-enable-primary-paste", "Gtk/EnablePrimaryPaste", translate_bool_int },
|
||||||
|
--
|
||||||
|
2.37.1
|
||||||
|
|
@ -0,0 +1,2 @@
|
|||||||
|
[org.gnome.settings-daemon.plugins.power]
|
||||||
|
sleep-inactive-ac-timeout=0
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue