Compare commits
No commits in common. 'c8' and 'c9' have entirely different histories.
@ -1 +1 @@ |
||||
SOURCES/gnome-settings-daemon-3.32.0.tar.xz |
||||
SOURCES/gnome-settings-daemon-40.0.1.tar.xz |
||||
|
@ -1 +1 @@ |
||||
92145a7a5714ebf3aeb90baaacb7e6955335731b SOURCES/gnome-settings-daemon-3.32.0.tar.xz |
||||
5c9249cc5e89627bd548d7cfc9f839c7524ad85f SOURCES/gnome-settings-daemon-40.0.1.tar.xz |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,125 +0,0 @@ |
||||
From a8115378fd876bfd4c3871428cdc16134ed484b1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 5 Jan 2021 11:11:18 +0100
|
||||
Subject: [PATCH] media-keys: Mark screen cast as stopped if it was signalled
|
||||
as such
|
||||
|
||||
gnome-shell now sends a 'Stopped' signal if it was stopped without
|
||||
gsd-media-keys itself being the stopper.
|
||||
---
|
||||
plugins/media-keys/gsd-media-keys-manager.c | 52 +++++++++++++++++++--
|
||||
1 file changed, 49 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
|
||||
index 4d251f08..a526d5cf 100644
|
||||
--- a/plugins/media-keys/gsd-media-keys-manager.c
|
||||
+++ b/plugins/media-keys/gsd-media-keys-manager.c
|
||||
@@ -210,6 +210,7 @@ struct GsdMediaKeysManagerPrivate
|
||||
guint screencast_timeout_id;
|
||||
gboolean screencast_recording;
|
||||
GCancellable *screencast_cancellable;
|
||||
+ guint screencast_stopped_signal_id;
|
||||
|
||||
/* Rotation */
|
||||
guint iio_sensor_watch_id;
|
||||
@@ -2346,20 +2347,26 @@ do_rfkill_action (GsdMediaKeysManager *manager,
|
||||
}
|
||||
|
||||
static void
|
||||
-screencast_stop (GsdMediaKeysManager *manager)
|
||||
+screencast_stopped (GsdMediaKeysManager *manager)
|
||||
{
|
||||
if (manager->priv->screencast_timeout_id > 0) {
|
||||
g_source_remove (manager->priv->screencast_timeout_id);
|
||||
manager->priv->screencast_timeout_id = 0;
|
||||
}
|
||||
|
||||
+ manager->priv->screencast_recording = FALSE;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+screencast_stop (GsdMediaKeysManager *manager)
|
||||
+{
|
||||
+ screencast_stopped (manager);
|
||||
+
|
||||
g_dbus_proxy_call (manager->priv->screencast_proxy,
|
||||
"StopScreencast", NULL,
|
||||
G_DBUS_CALL_FLAGS_NONE, -1,
|
||||
manager->priv->screencast_cancellable,
|
||||
NULL, NULL);
|
||||
-
|
||||
- manager->priv->screencast_recording = FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -2835,6 +2842,21 @@ initialize_volume_handler (GsdMediaKeysManager *manager)
|
||||
gnome_settings_profile_end ("gvc_mixer_control_new");
|
||||
}
|
||||
|
||||
+
|
||||
+static void
|
||||
+on_screencast_stopped (GDBusConnection *connection,
|
||||
+ const gchar *sender_name,
|
||||
+ const gchar *object_path,
|
||||
+ const gchar *interface_name,
|
||||
+ const gchar *signal_name,
|
||||
+ GVariant *parameters,
|
||||
+ gpointer data)
|
||||
+{
|
||||
+ GsdMediaKeysManager *manager = data;
|
||||
+
|
||||
+ screencast_stopped (manager);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
on_screencast_proxy_ready (GObject *source,
|
||||
GAsyncResult *result,
|
||||
@@ -2850,7 +2872,20 @@ on_screencast_proxy_ready (GObject *source,
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Failed to create proxy for screencast: %s", error->message);
|
||||
g_error_free (error);
|
||||
+ return;
|
||||
}
|
||||
+
|
||||
+ manager->priv->screencast_stopped_signal_id =
|
||||
+ g_dbus_connection_signal_subscribe (manager->priv->connection,
|
||||
+ SHELL_DBUS_NAME ".Screencast",
|
||||
+ SHELL_DBUS_NAME ".Screencast",
|
||||
+ "Stopped",
|
||||
+ SHELL_DBUS_PATH "/Screencast",
|
||||
+ NULL,
|
||||
+ G_DBUS_SIGNAL_FLAGS_NONE,
|
||||
+ on_screencast_stopped,
|
||||
+ manager,
|
||||
+ NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2901,6 +2936,11 @@ shell_presence_changed (GsdMediaKeysManager *manager)
|
||||
on_screencast_proxy_ready, manager);
|
||||
g_free (name_owner);
|
||||
} else {
|
||||
+ if (manager->priv->screencast_stopped_signal_id)
|
||||
+ g_dbus_connection_signal_unsubscribe (manager->priv->connection,
|
||||
+ manager->priv->screencast_stopped_signal_id);
|
||||
+ manager->priv->screencast_stopped_signal_id = 0;
|
||||
+
|
||||
g_ptr_array_set_size (manager->priv->keys, 0);
|
||||
g_clear_object (&manager->priv->key_grabber);
|
||||
g_clear_object (&manager->priv->screencast_proxy);
|
||||
@@ -3091,6 +3131,12 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
|
||||
priv->reenable_power_button_timer_id = 0;
|
||||
}
|
||||
|
||||
+ if (priv->screencast_stopped_signal_id) {
|
||||
+ g_dbus_connection_signal_unsubscribe (priv->connection,
|
||||
+ priv->screencast_stopped_signal_id);
|
||||
+ priv->screencast_stopped_signal_id = 0;
|
||||
+ }
|
||||
+
|
||||
g_clear_pointer (&manager->priv->ca, ca_context_destroy);
|
||||
|
||||
#if HAVE_GUDEV
|
||||
--
|
||||
2.27.0
|
||||
|
@ -1,34 +0,0 @@ |
||||
From 77b52a04c9154a7e7b2434f6c70ba6b4fd84c9f1 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Thu, 15 Oct 2020 15:18:35 +0200
|
||||
Subject: [PATCH] power: Avoid automatic logout in GDM/greeter
|
||||
|
||||
In GDM sessions (greeter, initial-setup), it does not make sense to
|
||||
automatically logout. This can happen if the system wide default is
|
||||
changed to default to the "logout" action.
|
||||
|
||||
Note that we already use the RUNNING_UNDER_GDM environment variable in
|
||||
the keyboard plugin currently. So doing this is likely sane, even if we
|
||||
probably want a more elegant strategy to detect whether we are in a
|
||||
"login" session.
|
||||
---
|
||||
plugins/power/gsd-power-manager.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||
index e103a8a7..b100ff9e 100644
|
||||
--- a/plugins/power/gsd-power-manager.c
|
||||
+++ b/plugins/power/gsd-power-manager.c
|
||||
@@ -872,6 +872,9 @@ static void
|
||||
gnome_session_logout (GsdPowerManager *manager,
|
||||
guint logout_mode)
|
||||
{
|
||||
+ if (g_getenv("RUNNING_UNDER_GDM"))
|
||||
+ return;
|
||||
+
|
||||
g_dbus_proxy_call (G_DBUS_PROXY (manager->priv->session),
|
||||
"Logout",
|
||||
g_variant_new ("(u)", logout_mode),
|
||||
--
|
||||
2.26.2
|
||||
|
@ -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
|
||||
|
@ -1,53 +0,0 @@ |
||||
From fbe9b7dba44cb284f649a1e916b2cf3ce8281211 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Tue, 7 May 2019 15:40:20 +0200
|
||||
Subject: [PATCH] power: Only disable Suspend/Hibernate actions inside VM
|
||||
|
||||
While we theoretically only want a different default value inside a VM,
|
||||
we currently hack this by never doing a suspend action inside VMs.
|
||||
However, that also breaks automatic logout, which is an unintended side
|
||||
effect.
|
||||
|
||||
Move the check to not install the corresponding timeout (preventing
|
||||
sleep warnings from being displayed) and also only enforce the VM
|
||||
specific hack for the Suspend and Hibernate actions.
|
||||
---
|
||||
plugins/power/gsd-power-manager.c | 15 ++++++++-------
|
||||
1 file changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||
index f965f6f..dbaa262 100644
|
||||
--- a/plugins/power/gsd-power-manager.c
|
||||
+++ b/plugins/power/gsd-power-manager.c
|
||||
@@ -1520,13 +1520,6 @@ idle_set_mode (GsdPowerManager *manager, GsdPowerIdleMode mode)
|
||||
return;
|
||||
}
|
||||
|
||||
- /* don't do any power saving if we're a VM */
|
||||
- if (manager->priv->is_virtual_machine) {
|
||||
- g_debug ("ignoring state transition to %s as virtual machine",
|
||||
- idle_mode_to_string (mode));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
manager->priv->current_idle_mode = mode;
|
||||
g_debug ("Doing a state transition: %s", idle_mode_to_string (mode));
|
||||
|
||||
@@ -1727,6 +1720,14 @@ idle_configure (GsdPowerManager *manager)
|
||||
clear_idle_watch (manager->priv->idle_monitor,
|
||||
&manager->priv->idle_sleep_warning_id);
|
||||
|
||||
+ /* don't do any power saving if we're a VM */
|
||||
+ if (manager->priv->is_virtual_machine &&
|
||||
+ (action_type == GSD_POWER_ACTION_SUSPEND ||
|
||||
+ action_type == GSD_POWER_ACTION_HIBERNATE)) {
|
||||
+ g_debug ("Ignoring sleep timeout with suspend action inside VM");
|
||||
+ timeout_sleep = 0;
|
||||
+ }
|
||||
+
|
||||
if (timeout_sleep != 0) {
|
||||
g_debug ("setting up sleep callback %is", timeout_sleep);
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,58 +0,0 @@ |
||||
From a1c2685bc6b255f22b6ce4645c001d428cb67907 Mon Sep 17 00:00:00 2001
|
||||
From: Marek Kasik <mkasik@redhat.com>
|
||||
Date: Wed, 22 May 2019 14:56:42 +0200
|
||||
Subject: [PATCH] smartcard: Cancel cancellable when stopping
|
||||
|
||||
self->cancellable in GsdSmartcardManager is not cancelled
|
||||
at gsd_smartcard_manager_stop() and hence some callbacks are
|
||||
still called after unload_nss() which clears SECMODListLock
|
||||
which is used by SECMOD_GetReadLock() / SECMOD_ReleaseReadLock().
|
||||
|
||||
This leads to crashes in NSSRWLock_LockRead_Util() and
|
||||
NSSRWLock_UnlockRead_Util() probably.
|
||||
|
||||
Also check for return value of g_cancellable_connect()
|
||||
and initialize pointer to PK11SlotInfo.
|
||||
|
||||
See https://bugzilla.redhat.com/show_bug.cgi?id=1646359,
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1688791 and
|
||||
their duplicates for additional info.
|
||||
---
|
||||
plugins/smartcard/gsd-smartcard-manager.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletion(-)
|
||||
|
||||
diff --git a/plugins/smartcard/gsd-smartcard-manager.c b/plugins/smartcard/gsd-smartcard-manager.c
|
||||
index 014c17be..da1e0d6d 100644
|
||||
--- a/plugins/smartcard/gsd-smartcard-manager.c
|
||||
+++ b/plugins/smartcard/gsd-smartcard-manager.c
|
||||
@@ -184,7 +184,7 @@
|
||||
GError **error)
|
||||
{
|
||||
GsdSmartcardManagerPrivate *priv = self->priv;
|
||||
- PK11SlotInfo *card, *old_card;
|
||||
+ PK11SlotInfo *card = NULL, *old_card;
|
||||
CK_SLOT_ID slot_id;
|
||||
gulong handler_id;
|
||||
int old_slot_series = -1, slot_series;
|
||||
@@ -190,7 +190,8 @@ watch_one_event_from_driver (GsdSmartcardManager *self,
|
||||
operation,
|
||||
NULL);
|
||||
|
||||
- card = SECMOD_WaitForAnyTokenEvent (operation->driver, 0, PR_SecondsToInterval (1));
|
||||
+ if (handler_id != 0)
|
||||
+ card = SECMOD_WaitForAnyTokenEvent (operation->driver, 0, PR_SecondsToInterval (1));
|
||||
|
||||
g_cancellable_disconnect (cancellable, handler_id);
|
||||
|
||||
@@ -773,6 +774,8 @@ gsd_smartcard_manager_stop (GsdSmartcardManager *self)
|
||||
|
||||
g_debug ("Stopping smartcard manager");
|
||||
|
||||
+ g_cancellable_cancel (priv->cancellable);
|
||||
+
|
||||
unload_nss (self);
|
||||
|
||||
g_clear_object (&priv->settings);
|
||||
--
|
||||
2.23.0
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,25 +0,0 @@ |
||||
From 6e790966c2b6e1db8dd2c145119d3fdd19e0c18f Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Clasen <mclasen@redhat.com>
|
||||
Date: Wed, 22 May 2019 16:04:42 -0400
|
||||
Subject: [PATCH] xsettings: Add an entry for the overlay scrolling setting
|
||||
|
||||
This will be used by GTK.
|
||||
---
|
||||
plugins/xsettings/gsd-xsettings-manager.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
|
||||
index c3ac7892..4164de40 100644
|
||||
--- a/plugins/xsettings/gsd-xsettings-manager.c
|
||||
+++ b/plugins/xsettings/gsd-xsettings-manager.c
|
||||
@@ -478,6 +478,7 @@ static TranslationEntry translations [] = {
|
||||
{ "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 },
|
||||
+ { "org.gnome.desktop.interface", "overlay-scrolling", "Gtk/OverlayScrolling", translate_bool_int },
|
||||
/* cursor-size is handled via the Xft side as it needs the scaling factor */
|
||||
|
||||
{ "org.gnome.desktop.sound", "theme-name", "Net/SoundThemeName", translate_string_string },
|
||||
--
|
||||
2.23.0
|
||||
|
@ -1,271 +0,0 @@ |
||||
From ad0fd6c905011b7bb9eac9fa8cb91f58d71e4a29 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Mon, 6 Nov 2017 15:49:58 -0500
|
||||
Subject: [PATCH 2/4] account: reshow the notification when screen unlocks
|
||||
|
||||
---
|
||||
plugins/account/gsd-account-manager.c | 48 ++++++++++++++++++++++++---
|
||||
1 file changed, 43 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/plugins/account/gsd-account-manager.c b/plugins/account/gsd-account-manager.c
|
||||
index 40b91cb6..cb37f466 100644
|
||||
--- a/plugins/account/gsd-account-manager.c
|
||||
+++ b/plugins/account/gsd-account-manager.c
|
||||
@@ -11,72 +11,75 @@
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <locale.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <cups/ppd.h>
|
||||
#include <libnotify/notify.h>
|
||||
|
||||
#include "gnome-settings-profile.h"
|
||||
+#include "gnome-settings-bus.h"
|
||||
#include "gsd-account-manager.h"
|
||||
#include "org.freedesktop.Accounts.h"
|
||||
#include "org.freedesktop.Accounts.User.h"
|
||||
|
||||
#define GSD_ACCOUNT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_ACCOUNT_MANAGER, GsdAccountManagerPrivate))
|
||||
|
||||
struct GsdAccountManagerPrivate
|
||||
{
|
||||
GsdAccounts *accounts_proxy;
|
||||
GsdAccountsUser *accounts_user_proxy;
|
||||
GCancellable *cancellable;
|
||||
|
||||
+ GsdScreenSaver *screensaver_proxy;
|
||||
+
|
||||
gint64 expiration_time;
|
||||
gint64 last_change_time;
|
||||
gint64 min_days_between_changes;
|
||||
gint64 max_days_between_changes;
|
||||
gint64 days_to_warn;
|
||||
gint64 days_after_expiration_until_lock;
|
||||
|
||||
NotifyNotification *notification;
|
||||
};
|
||||
|
||||
static void gsd_account_manager_class_init (GsdAccountManagerClass *klass);
|
||||
static void gsd_account_manager_init (GsdAccountManager *account_manager);
|
||||
static void gsd_account_manager_finalize (GObject *object);
|
||||
|
||||
G_DEFINE_TYPE (GsdAccountManager, gsd_account_manager, G_TYPE_OBJECT)
|
||||
|
||||
static gpointer manager_object = NULL;
|
||||
|
||||
static void
|
||||
on_notification_closed (NotifyNotification *notification,
|
||||
gpointer user_data)
|
||||
{
|
||||
GsdAccountManager *manager = user_data;
|
||||
|
||||
g_clear_object (&manager->priv->notification);
|
||||
}
|
||||
|
||||
static void
|
||||
hide_notification (GsdAccountManager *manager)
|
||||
{
|
||||
@@ -221,77 +224,111 @@ on_got_password_expiration_policy (GsdAccountsUser *accounts_user_proxy,
|
||||
gint64 days_after_expiration_until_lock;
|
||||
|
||||
gnome_settings_profile_start (NULL);
|
||||
succeeded = gsd_accounts_user_call_get_password_expiration_policy_finish (accounts_user_proxy,
|
||||
&expiration_time,
|
||||
&last_change_time,
|
||||
&min_days_between_changes,
|
||||
&max_days_between_changes,
|
||||
&days_to_warn,
|
||||
&days_after_expiration_until_lock,
|
||||
res,
|
||||
&error);
|
||||
|
||||
if (!succeeded) {
|
||||
g_warning ("Failed to get password expiration policy for user: %s", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
set_policy_number (&manager->priv->expiration_time, expiration_time);
|
||||
set_policy_number (&manager->priv->last_change_time, last_change_time);
|
||||
set_policy_number (&manager->priv->min_days_between_changes, min_days_between_changes);
|
||||
set_policy_number (&manager->priv->max_days_between_changes, max_days_between_changes);
|
||||
set_policy_number (&manager->priv->days_to_warn, days_to_warn);
|
||||
set_policy_number (&manager->priv->days_after_expiration_until_lock, days_after_expiration_until_lock);
|
||||
|
||||
update_password_notification (manager);
|
||||
out:
|
||||
gnome_settings_profile_end (NULL);
|
||||
}
|
||||
|
||||
+static void
|
||||
+fetch_password_expiration_policy (GsdAccountManager *manager)
|
||||
+{
|
||||
+ gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy,
|
||||
+ manager->priv->cancellable,
|
||||
+ (GAsyncReadyCallback)
|
||||
+ on_got_password_expiration_policy,
|
||||
+ manager);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+on_screensaver_signal (GDBusProxy *proxy,
|
||||
+ const gchar *sender_name,
|
||||
+ const gchar *signal_name,
|
||||
+ GVariant *parameters,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ GsdAccountManager *manager = user_data;
|
||||
+
|
||||
+ if (g_strcmp0 (signal_name, "ActiveChanged") == 0) {
|
||||
+ gboolean active;
|
||||
+
|
||||
+ g_variant_get (parameters, "(b)", &active);
|
||||
+
|
||||
+ if (!active) {
|
||||
+ fetch_password_expiration_policy (manager);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
on_got_accounts_user_proxy (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
GsdAccountManager *manager = user_data;
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
gnome_settings_profile_start (NULL);
|
||||
manager->priv->accounts_user_proxy = gsd_accounts_user_proxy_new_finish (res, &error);
|
||||
|
||||
if (manager->priv->accounts_user_proxy != NULL) {
|
||||
- gsd_accounts_user_call_get_password_expiration_policy (manager->priv->accounts_user_proxy,
|
||||
- manager->priv->cancellable,
|
||||
- (GAsyncReadyCallback)
|
||||
- on_got_password_expiration_policy,
|
||||
- manager);
|
||||
+ fetch_password_expiration_policy (manager);
|
||||
+
|
||||
+ manager->priv->screensaver_proxy = gnome_settings_bus_get_screen_saver_proxy ();
|
||||
+
|
||||
+ g_signal_connect (manager->priv->screensaver_proxy,
|
||||
+ "g-signal",
|
||||
+ G_CALLBACK (on_screensaver_signal),
|
||||
+ manager);
|
||||
+
|
||||
} else {
|
||||
g_warning ("Failed to get user proxy to accounts service: %s", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
gnome_settings_profile_end (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
on_got_user_object_path (GsdAccounts *accounts_proxy,
|
||||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
GsdAccountManager *manager = user_data;
|
||||
g_autoptr(GError) error = NULL;
|
||||
gboolean succeeded;
|
||||
gchar *object_path;
|
||||
GDBusConnection *connection;
|
||||
|
||||
gnome_settings_profile_start (NULL);
|
||||
|
||||
succeeded = gsd_accounts_call_find_user_by_id_finish (accounts_proxy,
|
||||
&object_path,
|
||||
res,
|
||||
&error);
|
||||
|
||||
if (!succeeded) {
|
||||
g_warning ("Unable to find current user in accounts service: %s",
|
||||
error->message);
|
||||
@@ -343,60 +380,61 @@ gsd_account_manager_start (GsdAccountManager *manager,
|
||||
g_debug ("Starting accounts manager");
|
||||
|
||||
gnome_settings_profile_start (NULL);
|
||||
manager->priv->cancellable = g_cancellable_new ();
|
||||
gsd_accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
"org.freedesktop.Accounts",
|
||||
"/org/freedesktop/Accounts",
|
||||
manager->priv->cancellable,
|
||||
(GAsyncReadyCallback)
|
||||
on_got_accounts_proxy,
|
||||
manager);
|
||||
gnome_settings_profile_end (NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
gsd_account_manager_stop (GsdAccountManager *manager)
|
||||
{
|
||||
g_debug ("Stopping accounts manager");
|
||||
|
||||
if (manager->priv->cancellable != NULL) {
|
||||
g_cancellable_cancel (manager->priv->cancellable);
|
||||
g_clear_object (&manager->priv->cancellable);
|
||||
}
|
||||
|
||||
g_clear_object (&manager->priv->accounts_proxy);
|
||||
g_clear_object (&manager->priv->accounts_user_proxy);
|
||||
g_clear_object (&manager->priv->notification);
|
||||
+ g_clear_object (&manager->priv->screensaver_proxy);
|
||||
}
|
||||
|
||||
static void
|
||||
gsd_account_manager_class_init (GsdAccountManagerClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->finalize = gsd_account_manager_finalize;
|
||||
|
||||
notify_init ("gnome-settings-daemon");
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GsdAccountManagerPrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
gsd_account_manager_init (GsdAccountManager *manager)
|
||||
{
|
||||
manager->priv = GSD_ACCOUNT_MANAGER_GET_PRIVATE (manager);
|
||||
}
|
||||
|
||||
static void
|
||||
gsd_account_manager_finalize (GObject *object)
|
||||
{
|
||||
GsdAccountManager *manager;
|
||||
|
||||
g_return_if_fail (object != NULL);
|
||||
g_return_if_fail (GSD_IS_ACCOUNT_MANAGER (object));
|
||||
|
||||
manager = GSD_ACCOUNT_MANAGER (object);
|
||||
|
||||
--
|
||||
2.21.0
|
||||
|
@ -1,49 +0,0 @@ |
||||
From f2cd5fb30892e3868732fca1d38fc15fdb73ec18 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Tue, 27 Oct 2020 10:20:34 +0100
|
||||
Subject: [PATCH 2/2] power: Never register sleep timeout for logout in GDM
|
||||
|
||||
We already suppress logout actions in GDM (10aa1714b05b, power: Avoid
|
||||
automatic logout in GDM/greeter). However, while this prevents the
|
||||
action, we may still warn.
|
||||
|
||||
Change it so that the corresponding timeouts will never be registered.
|
||||
Leave the guard in gnome_session_logout but add a warning as we should
|
||||
never be hitting that code path.
|
||||
---
|
||||
plugins/power/gsd-power-manager.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
|
||||
index 9f2e858e..ed855b6b 100644
|
||||
--- a/plugins/power/gsd-power-manager.c
|
||||
+++ b/plugins/power/gsd-power-manager.c
|
||||
@@ -872,8 +872,10 @@ static void
|
||||
gnome_session_logout (GsdPowerManager *manager,
|
||||
guint logout_mode)
|
||||
{
|
||||
- if (g_getenv("RUNNING_UNDER_GDM"))
|
||||
+ if (g_getenv ("RUNNING_UNDER_GDM")) {
|
||||
+ g_warning ("Prevented logout from GDM session! This indicates an issue in gsd-power.");
|
||||
return;
|
||||
+ }
|
||||
|
||||
g_dbus_proxy_call (G_DBUS_PROXY (manager->priv->session),
|
||||
"Logout",
|
||||
@@ -1773,6 +1775,13 @@ idle_configure (GsdPowerManager *manager)
|
||||
timeout_sleep = 0;
|
||||
}
|
||||
|
||||
+ /* don't do any automatic logout if we are in GDM */
|
||||
+ if (g_getenv ("RUNNING_UNDER_GDM") &&
|
||||
+ (action_type == GSD_POWER_ACTION_LOGOUT)) {
|
||||
+ g_debug ("Ignoring sleep timeout with logout action inside GDM");
|
||||
+ timeout_sleep = 0;
|
||||
+ }
|
||||
+
|
||||
if (timeout_sleep != 0) {
|
||||
g_debug ("setting up sleep callback %is", timeout_sleep);
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,768 +0,0 @@ |
||||
From f723ed1078e050c4d966d40b2aea74970c74279c Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Thu, 27 Jun 2019 16:12:00 +0200
|
||||
Subject: [PATCH 02/15] subman: Add InstalledProducts dbus property for g-c-c
|
||||
|
||||
---
|
||||
plugins/subman/gsd-subscription-manager.c | 135 ++++++++++++++++++++++
|
||||
1 file changed, 135 insertions(+)
|
||||
|
||||
diff --git a/plugins/subman/gsd-subscription-manager.c b/plugins/subman/gsd-subscription-manager.c
|
||||
index 08b13fa6..a8c18a26 100644
|
||||
--- a/plugins/subman/gsd-subscription-manager.c
|
||||
+++ b/plugins/subman/gsd-subscription-manager.c
|
||||
@@ -1,186 +1,304 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2019 Richard Hughes <richard@hughsie.com>
|
||||
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* 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 2 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 <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <json-glib/json-glib.h>
|
||||
#include <libnotify/notify.h>
|
||||
|
||||
#include "gnome-settings-profile.h"
|
||||
#include "gsd-subman-common.h"
|
||||
#include "gsd-subscription-manager.h"
|
||||
|
||||
#define GSD_DBUS_NAME "org.gnome.SettingsDaemon"
|
||||
#define GSD_DBUS_PATH "/org/gnome/SettingsDaemon"
|
||||
#define GSD_DBUS_BASE_INTERFACE "org.gnome.SettingsDaemon"
|
||||
|
||||
#define GSD_SUBSCRIPTION_DBUS_NAME GSD_DBUS_NAME ".Subscription"
|
||||
#define GSD_SUBSCRIPTION_DBUS_PATH GSD_DBUS_PATH "/Subscription"
|
||||
#define GSD_SUBSCRIPTION_DBUS_INTERFACE GSD_DBUS_BASE_INTERFACE ".Subscription"
|
||||
|
||||
static const gchar introspection_xml[] =
|
||||
"<node>"
|
||||
" <interface name='org.gnome.SettingsDaemon.Subscription'>"
|
||||
" <method name='Register'>"
|
||||
" <arg type='a{sv}' name='options' direction='in'/>"
|
||||
" </method>"
|
||||
" <method name='Unregister'/>"
|
||||
+" <property name='InstalledProducts' type='aa{sv}' access='read'/>"
|
||||
" <property name='SubscriptionStatus' type='u' access='read'/>"
|
||||
" </interface>"
|
||||
"</node>";
|
||||
|
||||
#define GSD_SUBSCRIPTION_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_SUBSCRIPTION_MANAGER, GsdSubscriptionManagerPrivate))
|
||||
|
||||
typedef enum {
|
||||
_RHSM_INTERFACE_CONFIG,
|
||||
_RHSM_INTERFACE_REGISTER_SERVER,
|
||||
_RHSM_INTERFACE_ATTACH,
|
||||
_RHSM_INTERFACE_ENTITLEMENT,
|
||||
_RHSM_INTERFACE_PRODUCTS,
|
||||
_RHSM_INTERFACE_CONSUMER,
|
||||
_RHSM_INTERFACE_SYSPURPOSE,
|
||||
_RHSM_INTERFACE_LAST
|
||||
} _RhsmInterface;
|
||||
|
||||
struct GsdSubscriptionManagerPrivate
|
||||
{
|
||||
/* D-Bus */
|
||||
guint name_id;
|
||||
GDBusNodeInfo *introspection_data;
|
||||
GDBusConnection *connection;
|
||||
GCancellable *bus_cancellable;
|
||||
|
||||
GDBusProxy *proxies[_RHSM_INTERFACE_LAST];
|
||||
const gchar *userlang; /* owned by GLib internally */
|
||||
GHashTable *config; /* str:str */
|
||||
+ GPtrArray *installed_products;
|
||||
gchar *address;
|
||||
|
||||
GTimer *timer_last_notified;
|
||||
NotifyNotification *notification_expired;
|
||||
NotifyNotification *notification_registered;
|
||||
NotifyNotification *notification_registration_required;
|
||||
GsdSubmanSubscriptionStatus subscription_status;
|
||||
GsdSubmanSubscriptionStatus subscription_status_last;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
};
|
||||
|
||||
static void gsd_subscription_manager_class_init (GsdSubscriptionManagerClass *klass);
|
||||
static void gsd_subscription_manager_init (GsdSubscriptionManager *subscription_manager);
|
||||
static void gsd_subscription_manager_finalize (GObject *object);
|
||||
|
||||
G_DEFINE_TYPE (GsdSubscriptionManager, gsd_subscription_manager, G_TYPE_OBJECT)
|
||||
|
||||
+typedef struct
|
||||
+{
|
||||
+ gchar *product_name;
|
||||
+ gchar *product_id;
|
||||
+ gchar *version;
|
||||
+ gchar *arch;
|
||||
+ gchar *status;
|
||||
+ gchar *starts;
|
||||
+ gchar *ends;
|
||||
+} ProductData;
|
||||
+
|
||||
+static void
|
||||
+product_data_free (ProductData *product)
|
||||
+{
|
||||
+ g_free (product->product_name);
|
||||
+ g_free (product->product_id);
|
||||
+ g_free (product->version);
|
||||
+ g_free (product->arch);
|
||||
+ g_free (product->status);
|
||||
+ g_free (product->starts);
|
||||
+ g_free (product->ends);
|
||||
+ g_free (product);
|
||||
+}
|
||||
+
|
||||
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free);
|
||||
+
|
||||
static gpointer manager_object = NULL;
|
||||
|
||||
GQuark
|
||||
gsd_subscription_manager_error_quark (void)
|
||||
{
|
||||
static GQuark quark = 0;
|
||||
if (!quark)
|
||||
quark = g_quark_from_static_string ("gsd_subscription_manager_error");
|
||||
return quark;
|
||||
}
|
||||
|
||||
static GsdSubmanSubscriptionStatus
|
||||
_client_subscription_status_from_text (const gchar *status_txt)
|
||||
{
|
||||
if (g_strcmp0 (status_txt, "Unknown") == 0)
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
|
||||
if (g_strcmp0 (status_txt, "Current") == 0)
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID;
|
||||
if (g_strcmp0 (status_txt, "Invalid") == 0)
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID;
|
||||
if (g_strcmp0 (status_txt, "Disabled") == 0)
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED;
|
||||
if (g_strcmp0 (status_txt, "Insufficient") == 0)
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID;
|
||||
g_warning ("Unknown subscription status: %s", status_txt); // 'Current'?
|
||||
return GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN;
|
||||
}
|
||||
|
||||
+static GVariant *
|
||||
+_make_installed_products_variant (GPtrArray *installed_products)
|
||||
+{
|
||||
+ GVariantBuilder builder;
|
||||
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
|
||||
+
|
||||
+ for (guint i = 0; i < installed_products->len; i++) {
|
||||
+ ProductData *product = g_ptr_array_index (installed_products, i);
|
||||
+ g_auto(GVariantDict) dict;
|
||||
+
|
||||
+ g_variant_dict_init (&dict, NULL);
|
||||
+
|
||||
+ g_variant_dict_insert (&dict, "product-name", "s", product->product_name);
|
||||
+ g_variant_dict_insert (&dict, "product-id", "s", product->product_id);
|
||||
+ g_variant_dict_insert (&dict, "version", "s", product->version);
|
||||
+ g_variant_dict_insert (&dict, "arch", "s", product->arch);
|
||||
+ g_variant_dict_insert (&dict, "status", "s", product->status);
|
||||
+ g_variant_dict_insert (&dict, "starts", "s", product->starts);
|
||||
+ g_variant_dict_insert (&dict, "ends", "s", product->ends);
|
||||
+
|
||||
+ g_variant_builder_add_value (&builder, g_variant_dict_end (&dict));
|
||||
+ }
|
||||
+
|
||||
+ return g_variant_builder_end (&builder);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
_emit_property_changed (GsdSubscriptionManager *manager,
|
||||
const gchar *property_name,
|
||||
GVariant *property_value)
|
||||
{
|
||||
GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
GVariantBuilder builder;
|
||||
GVariantBuilder invalidated_builder;
|
||||
|
||||
/* not yet connected */
|
||||
if (priv->connection == NULL)
|
||||
return;
|
||||
|
||||
/* build the dict */
|
||||
g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
|
||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
|
||||
g_variant_builder_add (&builder,
|
||||
"{sv}",
|
||||
property_name,
|
||||
property_value);
|
||||
g_dbus_connection_emit_signal (priv->connection,
|
||||
NULL,
|
||||
GSD_SUBSCRIPTION_DBUS_PATH,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged",
|
||||
g_variant_new ("(sa{sv}as)",
|
||||
GSD_SUBSCRIPTION_DBUS_INTERFACE,
|
||||
&builder,
|
||||
&invalidated_builder),
|
||||
NULL);
|
||||
g_variant_builder_clear (&builder);
|
||||
g_variant_builder_clear (&invalidated_builder);
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+_client_installed_products_update (GsdSubscriptionManager *manager, GError **error)
|
||||
+{
|
||||
+ GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
+ JsonNode *json_root;
|
||||
+ JsonArray *json_products_array;
|
||||
+ const gchar *json_txt = NULL;
|
||||
+ g_autoptr(GVariant) val = NULL;
|
||||
+ g_autoptr(JsonParser) json_parser = json_parser_new ();
|
||||
+
|
||||
+ val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_PRODUCTS],
|
||||
+ "ListInstalledProducts",
|
||||
+ g_variant_new ("(sa{sv}s)",
|
||||
+ "" /* filter_string */,
|
||||
+ NULL /* proxy_options */,
|
||||
+ priv->userlang),
|
||||
+ G_DBUS_CALL_FLAGS_NONE,
|
||||
+ -1, NULL, error);
|
||||
+ if (val == NULL)
|
||||
+ return FALSE;
|
||||
+ g_variant_get (val, "(&s)", &json_txt);
|
||||
+ g_debug ("Products.ListInstalledProducts JSON: %s", json_txt);
|
||||
+ if (!json_parser_load_from_data (json_parser, json_txt, -1, error))
|
||||
+ return FALSE;
|
||||
+ json_root = json_parser_get_root (json_parser);
|
||||
+ json_products_array = json_node_get_array (json_root);
|
||||
+ if (json_products_array == NULL) {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA,
|
||||
+ "no InstalledProducts array in %s", json_txt);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ g_ptr_array_set_size (priv->installed_products, 0);
|
||||
+
|
||||
+ for (guint i = 0; i < json_array_get_length (json_products_array); i++) {
|
||||
+ JsonArray *json_product = json_array_get_array_element (json_products_array, i);
|
||||
+ g_autoptr(ProductData) product = g_new0 (ProductData, 1);
|
||||
+
|
||||
+ if (json_product == NULL)
|
||||
+ continue;
|
||||
+ if (json_array_get_length (json_product) < 8) {
|
||||
+ g_debug ("Unexpected number of array elements in InstalledProducts JSON");
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ product->product_name = g_strdup (json_array_get_string_element (json_product, 0));
|
||||
+ product->product_id = g_strdup (json_array_get_string_element (json_product, 1));
|
||||
+ product->version = g_strdup (json_array_get_string_element (json_product, 2));
|
||||
+ product->arch = g_strdup (json_array_get_string_element (json_product, 3));
|
||||
+ product->status = g_strdup (json_array_get_string_element (json_product, 4));
|
||||
+ product->starts = g_strdup (json_array_get_string_element (json_product, 6));
|
||||
+ product->ends = g_strdup (json_array_get_string_element (json_product, 7));
|
||||
+
|
||||
+ g_ptr_array_add (priv->installed_products, g_steal_pointer (&product));
|
||||
+ }
|
||||
+
|
||||
+ /* emit notification for g-c-c */
|
||||
+ _emit_property_changed (manager, "InstalledProducts",
|
||||
+ _make_installed_products_variant (priv->installed_products));
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
_client_subscription_status_update (GsdSubscriptionManager *manager, GError **error)
|
||||
{
|
||||
GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
JsonNode *json_root;
|
||||
JsonObject *json_obj;
|
||||
const gchar *json_txt = NULL;
|
||||
const gchar *status_txt = NULL;
|
||||
g_autoptr(GVariant) val = NULL;
|
||||
g_autoptr(JsonParser) json_parser = json_parser_new ();
|
||||
|
||||
/* save old value */
|
||||
priv->subscription_status_last = priv->subscription_status;
|
||||
|
||||
val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_ENTITLEMENT],
|
||||
"GetStatus",
|
||||
g_variant_new ("(ss)",
|
||||
"", /* assumed as 'now' */
|
||||
priv->userlang),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, NULL, error);
|
||||
if (val == NULL)
|
||||
return FALSE;
|
||||
g_variant_get (val, "(&s)", &json_txt);
|
||||
g_debug ("Entitlement.GetStatus JSON: %s", json_txt);
|
||||
if (!json_parser_load_from_data (json_parser, json_txt, -1, error))
|
||||
return FALSE;
|
||||
json_root = json_parser_get_root (json_parser);
|
||||
json_obj = json_node_get_object (json_root);
|
||||
if (!json_object_has_member (json_obj, "status")) {
|
||||
@@ -423,185 +541,195 @@ _client_register_with_keys (GsdSubscriptionManager *manager,
|
||||
GError **error)
|
||||
{
|
||||
GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
g_autoptr(GSubprocess) subprocess = NULL;
|
||||
|
||||
/* apparently: "we can't send registration credentials over the regular
|
||||
* system or session bus since those aren't really locked down..." */
|
||||
if (!_client_register_start (manager, error))
|
||||
return FALSE;
|
||||
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
|
||||
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
|
||||
"pkexec", LIBEXECDIR "/gsd-subman-helper",
|
||||
"--kind", "register-with-key",
|
||||
"--address", priv->address,
|
||||
"--hostname", hostname,
|
||||
"--organisation", organisation,
|
||||
"--activation-key", activation_key,
|
||||
NULL);
|
||||
if (subprocess == NULL) {
|
||||
g_prefix_error (error, "failed to find pkexec: ");
|
||||
return FALSE;
|
||||
}
|
||||
if (!_client_subprocess_wait_check (subprocess, error))
|
||||
return FALSE;
|
||||
|
||||
/* FIXME: also do on error? */
|
||||
if (!_client_register_stop (manager, error))
|
||||
return FALSE;
|
||||
if (!_client_subscription_status_update (manager, error))
|
||||
return FALSE;
|
||||
+ if (!_client_installed_products_update (manager, error))
|
||||
+ return FALSE;
|
||||
_client_maybe__show_notification (manager);
|
||||
|
||||
/* success */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_client_register (GsdSubscriptionManager *manager,
|
||||
const gchar *hostname,
|
||||
const gchar *organisation,
|
||||
const gchar *username,
|
||||
const gchar *password,
|
||||
GError **error)
|
||||
{
|
||||
GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
g_autoptr(GSubprocess) subprocess = NULL;
|
||||
|
||||
/* fallback */
|
||||
if (organisation == NULL)
|
||||
organisation = "";
|
||||
|
||||
/* apparently: "we can't send registration credentials over the regular
|
||||
* system or session bus since those aren't really locked down..." */
|
||||
if (!_client_register_start (manager, error))
|
||||
return FALSE;
|
||||
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
|
||||
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
|
||||
"pkexec", LIBEXECDIR "/gsd-subman-helper",
|
||||
"--kind", "register-with-username",
|
||||
"--address", priv->address,
|
||||
"--hostname", hostname,
|
||||
"--organisation", organisation,
|
||||
"--username", username,
|
||||
"--password", password,
|
||||
NULL);
|
||||
if (subprocess == NULL) {
|
||||
g_prefix_error (error, "failed to find pkexec: ");
|
||||
return FALSE;
|
||||
}
|
||||
if (!_client_subprocess_wait_check (subprocess, error))
|
||||
return FALSE;
|
||||
|
||||
/* FIXME: also do on error? */
|
||||
if (!_client_register_stop (manager, error))
|
||||
return FALSE;
|
||||
if (!_client_subscription_status_update (manager, error))
|
||||
return FALSE;
|
||||
+ if (!_client_installed_products_update (manager, error))
|
||||
+ return FALSE;
|
||||
_client_maybe__show_notification (manager);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_client_unregister (GsdSubscriptionManager *manager, GError **error)
|
||||
{
|
||||
g_autoptr(GSubprocess) subprocess = NULL;
|
||||
|
||||
/* apparently: "we can't send registration credentials over the regular
|
||||
* system or session bus since those aren't really locked down..." */
|
||||
if (!_client_register_start (manager, error))
|
||||
return FALSE;
|
||||
g_debug ("spawning %s", LIBEXECDIR "/gsd-subman-helper");
|
||||
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDERR_PIPE, error,
|
||||
"pkexec", LIBEXECDIR "/gsd-subman-helper",
|
||||
"--kind", "unregister",
|
||||
NULL);
|
||||
if (subprocess == NULL) {
|
||||
g_prefix_error (error, "failed to find pkexec: ");
|
||||
return FALSE;
|
||||
}
|
||||
if (!_client_subprocess_wait_check (subprocess, error))
|
||||
return FALSE;
|
||||
if (!_client_subscription_status_update (manager, error))
|
||||
return FALSE;
|
||||
+ if (!_client_installed_products_update (manager, error))
|
||||
+ return FALSE;
|
||||
_client_maybe__show_notification (manager);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_client_update_config (GsdSubscriptionManager *manager, GError **error)
|
||||
{
|
||||
GsdSubscriptionManagerPrivate *priv = manager->priv;
|
||||
g_autoptr(GVariant) val = NULL;
|
||||
g_autoptr(GVariant) val_server = NULL;
|
||||
g_autoptr(GVariantDict) dict = NULL;
|
||||
GVariantIter iter;
|
||||
gchar *key;
|
||||
gchar *value;
|
||||
|
||||
val = g_dbus_proxy_call_sync (priv->proxies[_RHSM_INTERFACE_CONFIG],
|
||||
"GetAll",
|
||||
g_variant_new ("(s)", priv->userlang),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, NULL, error);
|
||||
if (val == NULL)
|
||||
return FALSE;
|
||||
dict = g_variant_dict_new (g_variant_get_child_value (val, 0));
|
||||
val_server = g_variant_dict_lookup_value (dict, "server", G_VARIANT_TYPE("a{ss}"));
|
||||
if (val_server != NULL) {
|
||||