diff options
author | Maxim Mikityanskiy <maxtram95@gmail.com> | 2022-10-01 14:08:45 +0300 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-04-18 09:26:18 +0000 |
commit | 2a139f0646b1412f9b40bc558f0b71a51656ecf4 (patch) | |
tree | 3d9431a7a2207ca56b96eace893cbdd2f96eefcc | |
parent | ad062551ff7fbe0fde06b2fe0308d684b12d2800 (diff) | |
download | gnome-settings-daemon-2a139f0646b1412f9b40bc558f0b71a51656ecf4.tar.gz |
rfkill: Monitor WwanEnabled property changes properly
g-signal is not fired on property changes, so nm_signal is never called,
and all changes of NetworkManager's WwanEnabled property are missed.
That leads to an inability to disable the airplane mode on laptops with
WWAN after the airplane mode was once enabled by button.
Fix this by subscribing to g-properties-changed to actually listen to
the updates of WwanEnabled. It also makes the code simpler.
The bug was caused by a breaking change in NetworkManager [1] when it
deprecated the custom signal in favor of the standard PropertiesChanged
on org.freedesktop.DBus.Properties, and gnome-settings-daemon still used
the old one. The standard one is supported since NetworkManager 1.2.0,
as noted here [2].
[1]: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/853
[2]: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/commit/6fb917178aa19c61e909957f5146aa4565e0cb2f
Fixes: d74b6de142a2 ("rfkill: watch and set NetworkManager wwan-enabled")
-rw-r--r-- | plugins/rfkill/gsd-rfkill-manager.c | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/plugins/rfkill/gsd-rfkill-manager.c b/plugins/rfkill/gsd-rfkill-manager.c index 5c8b6906..ed684466 100644 --- a/plugins/rfkill/gsd-rfkill-manager.c +++ b/plugins/rfkill/gsd-rfkill-manager.c @@ -679,27 +679,20 @@ sync_wwan_enabled (GsdRfkillManager *manager) } static void -nm_signal (GDBusProxy *proxy, - char *sender_name, - char *signal_name, - GVariant *parameters, - gpointer user_data) +nm_properties_changed (GDBusProxy *proxy, + GVariant *changed, + gchar **invalidated, + gpointer user_data) { GsdRfkillManager *manager = user_data; - GVariant *changed; GVariant *property; - if (g_strcmp0 (signal_name, "PropertiesChanged") == 0) { - changed = g_variant_get_child_value (parameters, 0); - property = g_variant_lookup_value (changed, "WwanEnabled", G_VARIANT_TYPE ("b")); - g_dbus_proxy_set_cached_property (proxy, "WwanEnabled", property); + property = g_variant_lookup_value (changed, "WwanEnabled", G_VARIANT_TYPE ("b")); + g_dbus_proxy_set_cached_property (proxy, "WwanEnabled", property); - if (property != NULL) { - sync_wwan_enabled (manager); - g_variant_unref (property); - } - - g_variant_unref (changed); + if (property != NULL) { + sync_wwan_enabled (manager); + g_variant_unref (property); } } @@ -726,8 +719,8 @@ on_nm_proxy_gotten (GObject *source, manager->nm_client = proxy; - g_signal_connect (manager->nm_client, "g-signal", - G_CALLBACK (nm_signal), manager); + g_signal_connect (manager->nm_client, "g-properties-changed", + G_CALLBACK (nm_properties_changed), manager); sync_wwan_enabled (manager); out: |