diff options
author | Giovanni Campagna <gcampagna@src.gnome.org> | 2013-10-08 23:10:31 +0200 |
---|---|---|
committer | Giovanni Campagna <gcampagna@src.gnome.org> | 2013-10-21 22:35:55 +0200 |
commit | bc474312f67d577458af69aec3e46b2857c73344 (patch) | |
tree | 3cbbcf8d41e2344df4079491135e5f8f90ea02f8 | |
parent | d74b6de142a2177c306a24de2e1ebe10a4f66553 (diff) | |
download | gnome-settings-daemon-bc474312f67d577458af69aec3e46b2857c73344.tar.gz |
rfkill: expose in the API if the rfkill is blocked in hardware
Hardware-blocked rfkills can't be toggled, so they should cause
a different "Airplane mode" UI in the shell and control center
(one that cannot be toggled)
https://bugzilla.gnome.org/show_bug.cgi?id=709684
-rw-r--r-- | plugins/rfkill/gsd-rfkill-manager.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/plugins/rfkill/gsd-rfkill-manager.c b/plugins/rfkill/gsd-rfkill-manager.c index b0bc027f..3813f08e 100644 --- a/plugins/rfkill/gsd-rfkill-manager.c +++ b/plugins/rfkill/gsd-rfkill-manager.c @@ -65,6 +65,7 @@ static const gchar introspection_xml[] = " <interface name='org.gnome.SettingsDaemon.Rfkill'>" " <annotation name='org.freedesktop.DBus.GLib.CSymbol' value='gsd_rfkill_manager'/>" " <property name='AirplaneMode' type='b' access='readwrite'/>" +" <property name='HardwareAirplaneMode' type='b' access='read'/>" " <property name='HasAirplaneMode' type='b' access='read'/>" " </interface>" "</node>"; @@ -106,14 +107,13 @@ engine_get_airplane_mode (GsdRfkillManager *manager) g_hash_table_iter_init (&iter, manager->priv->killswitches); while (g_hash_table_iter_next (&iter, &key, &value)) { - gboolean state; + int state; state = GPOINTER_TO_INT (value); - /* A single rfkill switch that's disabled? Airplane mode is off */ - if (!state) { + /* A single rfkill switch that's unblocked? Airplane mode is off */ + if (state == RFKILL_STATE_UNBLOCKED) return FALSE; - } } /* wwan enabled? then airplane mode is off (because an USB modem @@ -125,6 +125,32 @@ engine_get_airplane_mode (GsdRfkillManager *manager) } static gboolean +engine_get_hardware_airplane_mode (GsdRfkillManager *manager) +{ + GHashTableIter iter; + gpointer key, value; + + /* If we have no killswitches, hw airplane mode is off. */ + if (g_hash_table_size (manager->priv->killswitches) == 0) { + return FALSE; + } + + g_hash_table_iter_init (&iter, manager->priv->killswitches); + while (g_hash_table_iter_next (&iter, &key, &value)) { + int state; + + state = GPOINTER_TO_INT (value); + + /* A single rfkill switch that's not hw blocked? Hw airplane mode is off */ + if (state != RFKILL_STATE_HARD_BLOCKED) { + return FALSE; + } + } + + return TRUE; +} + +static gboolean engine_get_has_airplane_mode (GsdRfkillManager *manager) { return (g_hash_table_size (manager->priv->killswitches) > 0) || @@ -141,6 +167,8 @@ engine_properties_changed (GsdRfkillManager *manager) g_variant_builder_add (&props_builder, "{sv}", "AirplaneMode", g_variant_new_boolean (engine_get_airplane_mode (manager))); + g_variant_builder_add (&props_builder, "{sv}", "HardwareAirplaneMode", + g_variant_new_boolean (engine_get_hardware_airplane_mode (manager))); g_variant_builder_add (&props_builder, "{sv}", "HasAirplaneMode", g_variant_new_boolean (engine_get_has_airplane_mode (manager))); @@ -162,6 +190,7 @@ rfkill_changed (CcRfkillGlib *rfkill, GsdRfkillManager *manager) { GList *l; + int value; for (l = events; l != NULL; l = l->next) { struct rfkill_event *event = l->data; @@ -169,9 +198,16 @@ rfkill_changed (CcRfkillGlib *rfkill, switch (event->op) { case RFKILL_OP_ADD: case RFKILL_OP_CHANGE: - g_hash_table_insert (manager->priv->killswitches, - GINT_TO_POINTER (event->idx), - GINT_TO_POINTER (event->soft || event->hard)); + if (event->hard) + value = RFKILL_STATE_HARD_BLOCKED; + else if (event->soft) + value = RFKILL_STATE_SOFT_BLOCKED; + else + value = RFKILL_STATE_UNBLOCKED; + + g_hash_table_insert (manager->priv->killswitches, + GINT_TO_POINTER (event->idx), + GINT_TO_POINTER (value)); break; case RFKILL_OP_DEL: g_hash_table_remove (manager->priv->killswitches, @@ -297,6 +333,12 @@ handle_get_property (GDBusConnection *connection, return g_variant_new_boolean (airplane_mode); } + if (g_strcmp0 (property_name, "HardwareAirplaneMode") == 0) { + gboolean hw_airplane_mode; + hw_airplane_mode = engine_get_hardware_airplane_mode (manager); + return g_variant_new_boolean (hw_airplane_mode); + } + if (g_strcmp0 (property_name, "HasAirplaneMode") == 0) { gboolean has_airplane_mode; has_airplane_mode = engine_get_has_airplane_mode (manager); |