From 25b77f6327c0dec3fe599b324a3ee4e7f1f617fd Mon Sep 17 00:00:00 2001 From: Ali Abdallah <ali.slackware@gmail.com> Date: Sun, 12 Apr 2009 15:09:46 +0000 Subject: [PATCH] Disable not mapped keys in the settings dialog (Old svn revision: 7170) --- ChangeLog | 3 + settings/xfpm-settings-main.c | 21 ++- settings/xfpm-settings.c | 324 ++++++++++++++++++--------------- settings/xfpm-settings.glade | 17 +- settings/xfpm-settings.h | 3 + src/org.xfce.Power.Manager.xml | 6 +- src/xfpm-button-hal.c | 27 +++ src/xfpm-button-hal.h | 3 + src/xfpm-button.c | 16 ++ src/xfpm-button.h | 2 + src/xfpm-engine.c | 43 +++-- src/xfpm-engine.h | 6 +- src/xfpm-manager.c | 26 +-- 13 files changed, 306 insertions(+), 191 deletions(-) diff --git a/ChangeLog b/ChangeLog index fd87a5e7..6222c81c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ +2009-04-12 17:09 Ali aliov@xfce.org + * : Disable not mapped keys in the settings dialog + 2009-04-12 2:14 Ali aliov@xfce.org * : Added debug macro for enum values+fix possible missing signal that preventing the OSD from getting displayed on brightness key press diff --git a/settings/xfpm-settings-main.c b/settings/xfpm-settings-main.c index c427ecf9..a18416d6 100644 --- a/settings/xfpm-settings-main.c +++ b/settings/xfpm-settings-main.c @@ -52,11 +52,16 @@ int main(int argc, char **argv) GError *error = NULL; DBusGConnection *bus; + GHashTable *config_hash; + gboolean system_laptop; gboolean user_privilege; gboolean can_suspend; gboolean can_hibernate; gboolean has_lcd_brightness; + gboolean has_sleep_button; + gboolean has_hibernate_button; + gboolean has_power_button; GdkNativeWindow socket_id = 0; @@ -130,8 +135,8 @@ int main(int argc, char **argv) "/org/xfce/PowerManager", "org.xfce.Power.Manager"); - xfpm_manager_dbus_client_get_config (proxy, &system_laptop, &user_privilege, - &can_suspend, &can_hibernate, &has_lcd_brightness, + xfpm_manager_dbus_client_get_config (proxy, + &config_hash, &error); if ( error ) @@ -143,9 +148,19 @@ int main(int argc, char **argv) return EXIT_FAILURE; } + system_laptop = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "system-laptop")); + can_suspend = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-suspend")); + can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-hibernate")); + user_privilege = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "caller-privilege")); + has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-brightness")); + has_sleep_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "sleep-button")); + has_power_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "power-button")); + has_hibernate_button = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "hibernate-button")); + xfpm_settings_dialog_new (channel, system_laptop, user_privilege, can_suspend, can_hibernate, has_lcd_brightness, - system_laptop, socket_id); + system_laptop, has_sleep_button, has_hibernate_button, has_power_button, + socket_id); gtk_main(); diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index bd80ab00..803369a4 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -867,7 +867,9 @@ xfpm_settings_on_ac (XfconfChannel *channel, gboolean user_privilege, gboolean c static void xfpm_settings_general (XfconfChannel *channel, gboolean user_privilege, - gboolean can_suspend, gboolean can_hibernate) + gboolean can_suspend, gboolean can_hibernate, + gboolean has_sleep_button, gboolean has_hibernate_button, + gboolean has_power_button) { gboolean valid; /* @@ -914,177 +916,204 @@ xfpm_settings_general (XfconfChannel *channel, gboolean user_privilege, */ list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); GtkWidget *power = glade_xml_get_widget (xml, "power-combox"); - if (!user_privilege ) - { - gtk_widget_set_sensitive (power, FALSE); - gtk_widget_set_tooltip_text (power, _("Hibernate and suspend operations not permitted")); - } - - gtk_combo_box_set_model (GTK_COMBO_BOX(power), GTK_TREE_MODEL(list_store)); - - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); + GtkWidget *power_label = glade_xml_get_widget (xml, "power-label"); - if ( can_suspend ) + if ( has_power_button ) { + if (!user_privilege ) + { + gtk_widget_set_sensitive (power, FALSE); + gtk_widget_set_tooltip_text (power, _("Hibernate and suspend operations not permitted")); + } + + gtk_combo_box_set_model (GTK_COMBO_BOX(power), GTK_TREE_MODEL(list_store)); + gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); - } - - if ( can_hibernate ) - { + gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); + + if ( can_suspend ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); + } + + if ( can_hibernate ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); + } + gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); - } - - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Shutdown"), 1, 3, -1); - - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); - - g_signal_connect (power, "changed", - G_CALLBACK(set_power_changed_cb), channel); - - gchar *default_power_value = xfconf_channel_get_string (channel, POWER_SWITCH_CFG, "Nothing"); - gint power_val_int = xfpm_shutdown_string_to_int (default_power_value ); - - if ( G_UNLIKELY (power_val_int == -1) ) - { - g_warning ("Invalid value %s for property %s\n", default_power_value, POWER_SWITCH_CFG); - power_val_int = 0; - } - for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); - valid; - valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) - { - gint list_value; - gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, - 1, &list_value, -1); - if ( power_val_int == list_value ) + gtk_list_store_set (list_store, &iter, 0, _("Shutdown"), 1, 3, -1); + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); + + g_signal_connect (power, "changed", + G_CALLBACK(set_power_changed_cb), channel); + + gchar *default_power_value = xfconf_channel_get_string (channel, POWER_SWITCH_CFG, "Nothing"); + gint power_val_int = xfpm_shutdown_string_to_int (default_power_value ); + + if ( G_UNLIKELY (power_val_int == -1) ) { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (power), &iter); - break; + g_warning ("Invalid value %s for property %s\n", default_power_value, POWER_SWITCH_CFG); + power_val_int = 0; + } + for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); + valid; + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) + { + gint list_value; + gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, + 1, &list_value, -1); + if ( power_val_int == list_value ) + { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (power), &iter); + break; + } } - } - g_free (default_power_value); + g_free (default_power_value); + } + else + { + gtk_widget_hide (power); + gtk_widget_hide (power_label); + } /* * Hibernate button */ list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); GtkWidget *hibernate = glade_xml_get_widget (xml, "hibernate-combox"); - if (!user_privilege ) + GtkWidget *hibernate_label = glade_xml_get_widget (xml, "hibernate-label"); + if (has_hibernate_button ) { - gtk_widget_set_sensitive (hibernate, FALSE); - gtk_widget_set_tooltip_text (hibernate, _("Hibernate and suspend operations not permitted")); - } - - gtk_combo_box_set_model (GTK_COMBO_BOX(hibernate), GTK_TREE_MODEL(list_store)); + if (!user_privilege ) + { + gtk_widget_set_sensitive (hibernate, FALSE); + gtk_widget_set_tooltip_text (hibernate, _("Hibernate and suspend operations not permitted")); + } + + gtk_combo_box_set_model (GTK_COMBO_BOX(hibernate), GTK_TREE_MODEL(list_store)); - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); - - if ( can_suspend ) - { gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); - } - - if ( can_hibernate ) - { + gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); + + if ( can_suspend ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); + } + + if ( can_hibernate ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); + } + gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); - } - - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); - - g_signal_connect (hibernate, "changed", - G_CALLBACK(set_hibernate_changed_cb), channel); - - gchar *default_hibernate_value = xfconf_channel_get_string (channel, HIBERNATE_SWITCH_CFG, "Nothing"); - gint hibernate_val_int = xfpm_shutdown_string_to_int (default_hibernate_value ); - - if ( G_UNLIKELY (hibernate_val_int == -1) ) - { - g_warning ("Invalid value %s for property %s\n", default_hibernate_value, POWER_SWITCH_CFG); - hibernate_val_int = 0; - } - for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); - valid; - valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) - { - gint list_value; - gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, - 1, &list_value, -1); - if ( hibernate_val_int == list_value ) + gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); + + g_signal_connect (hibernate, "changed", + G_CALLBACK(set_hibernate_changed_cb), channel); + + gchar *default_hibernate_value = xfconf_channel_get_string (channel, HIBERNATE_SWITCH_CFG, "Nothing"); + gint hibernate_val_int = xfpm_shutdown_string_to_int (default_hibernate_value ); + + if ( G_UNLIKELY (hibernate_val_int == -1) ) { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (hibernate), &iter); - break; + g_warning ("Invalid value %s for property %s\n", default_hibernate_value, POWER_SWITCH_CFG); + hibernate_val_int = 0; + } + for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); + valid; + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) + { + gint list_value; + gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, + 1, &list_value, -1); + if ( hibernate_val_int == list_value ) + { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (hibernate), &iter); + break; + } } - } - g_free (default_hibernate_value); - + g_free (default_hibernate_value); + } + else + { + gtk_widget_hide ( hibernate); + gtk_widget_hide (hibernate_label); + } /* * Sleep button */ list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); GtkWidget *sleep = glade_xml_get_widget (xml, "sleep-combox"); - if (!user_privilege ) + GtkWidget *sleep_label = glade_xml_get_widget (xml, "sleep-label"); + if ( has_sleep_button ) { - gtk_widget_set_sensitive (sleep, FALSE); - gtk_widget_set_tooltip_text (sleep, _("Hibernate and suspend operations not permitted")); - } - - gtk_combo_box_set_model (GTK_COMBO_BOX(sleep), GTK_TREE_MODEL(list_store)); + if (!user_privilege ) + { + gtk_widget_set_sensitive (sleep, FALSE); + gtk_widget_set_tooltip_text (sleep, _("Hibernate and suspend operations not permitted")); + } + + gtk_combo_box_set_model (GTK_COMBO_BOX(sleep), GTK_TREE_MODEL(list_store)); - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); - - if ( can_suspend ) - { - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); - } - - if ( can_hibernate ) - { gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); - } - - gtk_list_store_append (list_store, &iter); - gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); - - g_signal_connect (sleep, "changed", - G_CALLBACK(set_sleep_changed_cb), channel); - - gchar *default_sleep_value = xfconf_channel_get_string (channel, SLEEP_SWITCH_CFG, "Nothing"); - gint sleep_val_int = xfpm_shutdown_string_to_int (default_sleep_value ); - if ( G_UNLIKELY (sleep_val_int == -1 || sleep_val_int == 3) ) - { - g_warning ("Invalid value %s for property %s\n", default_sleep_value, SLEEP_SWITCH_CFG); - sleep_val_int = 0; - } - for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); - valid; - valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) + gtk_list_store_set (list_store, &iter, 0, _("Nothing"), 1, 0, -1); + + if ( can_suspend ) { - gint list_value; - gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, - 1, &list_value, -1); - if ( sleep_val_int == list_value ) + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, 1, -1); + } + + if ( can_hibernate ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, 2, -1); + } + + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Ask"), 1, 4, -1); + + g_signal_connect (sleep, "changed", + G_CALLBACK(set_sleep_changed_cb), channel); + + gchar *default_sleep_value = xfconf_channel_get_string (channel, SLEEP_SWITCH_CFG, "Nothing"); + gint sleep_val_int = xfpm_shutdown_string_to_int (default_sleep_value ); + if ( G_UNLIKELY (sleep_val_int == -1 || sleep_val_int == 3) ) + { + g_warning ("Invalid value %s for property %s\n", default_sleep_value, SLEEP_SWITCH_CFG); + sleep_val_int = 0; + } + for ( valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list_store), &iter); + valid; + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (list_store), &iter) ) { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (sleep), &iter); - break; + gint list_value; + gtk_tree_model_get (GTK_TREE_MODEL (list_store), &iter, + 1, &list_value, -1); + if ( sleep_val_int == list_value ) + { + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (sleep), &iter); + break; + } } - } - - g_free (default_sleep_value); + + g_free (default_sleep_value); + } + else + { + gtk_widget_hide (sleep); + gtk_widget_hide (sleep_label); + } /* * Enable/Disable Notification */ @@ -1370,12 +1399,17 @@ void xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop, gboolean user_privilege, gboolean can_suspend, gboolean can_hibernate, gboolean has_lcd_brightness, - gboolean has_lid, GdkNativeWindow id) + gboolean has_lid, gboolean has_sleep_button, + gboolean has_hibernate_button, gboolean has_power_button, + GdkNativeWindow id) { - TRACE("system_laptop=%s user_privilege=%s can_suspend=%s can_hibernate=%s has_lcd_brightness=%s has_lid=%s", + TRACE("system_laptop=%s user_privilege=%s can_suspend=%s can_hibernate=%s has_lcd_brightness=%s has_lid=%s"\ + "has_sleep_button=%s has_hibernate_button=%s has_power_button=%s", xfpm_bool_to_string (system_laptop), xfpm_bool_to_string (user_privilege), xfpm_bool_to_string (can_suspend), xfpm_bool_to_string (can_hibernate), - xfpm_bool_to_string (has_lcd_brightness), xfpm_bool_to_string (has_lid) ); + xfpm_bool_to_string (has_lcd_brightness), xfpm_bool_to_string (has_lid), + xfpm_bool_to_string (has_sleep_button), xfpm_bool_to_string (has_hibernate_button), + xfpm_bool_to_string (has_power_button) ); GtkWidget *plug; GtkWidget *dialog; @@ -1394,7 +1428,9 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean system_laptop, xfpm_settings_tree_view (channel, system_laptop); - xfpm_settings_general (channel, user_privilege, can_suspend, can_hibernate); + xfpm_settings_general (channel, user_privilege, can_suspend, can_hibernate, + has_sleep_button, has_hibernate_button, has_power_button ); + xfpm_settings_advanced (channel, system_laptop, user_privilege, can_suspend, can_hibernate); if ( id != 0 ) diff --git a/settings/xfpm-settings.glade b/settings/xfpm-settings.glade index 326f4219..c136e17a 100644 --- a/settings/xfpm-settings.glade +++ b/settings/xfpm-settings.glade @@ -120,7 +120,7 @@ <widget class="GtkHBox" id="hbox16"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label25"> + <widget class="GtkLabel" id="power-label"> <property name="visible">True</property> <property name="label" translatable="yes">When power button is pressed:</property> </widget> @@ -139,7 +139,7 @@ <widget class="GtkHBox" id="hbox3"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label4"> + <widget class="GtkLabel" id="hibernate-label"> <property name="visible">True</property> <property name="label" translatable="yes">When hibernate button is pressed:</property> </widget> @@ -179,7 +179,7 @@ <widget class="GtkHBox" id="hbox5"> <property name="visible">True</property> <child> - <widget class="GtkLabel" id="label3"> + <widget class="GtkLabel" id="sleep-label"> <property name="visible">True</property> <property name="label" translatable="yes">When sleep button is pressed:</property> </widget> @@ -247,6 +247,17 @@ <property name="position">2</property> </packing> </child> + <child> + <widget class="GtkHBox" id="power-key-box"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> </widget> </child> </widget> diff --git a/settings/xfpm-settings.h b/settings/xfpm-settings.h index 0877dffa..2f269d0c 100644 --- a/settings/xfpm-settings.h +++ b/settings/xfpm-settings.h @@ -29,6 +29,9 @@ void xfpm_settings_dialog_new (XfconfChannel *channel, gboolean can_hibernate, gboolean has_lcd_brightness, gboolean has_lid, + gboolean has_sleep_button, + gboolean has_hibernate_button, + gboolean has_power_button, GdkNativeWindow id); diff --git a/src/org.xfce.Power.Manager.xml b/src/org.xfce.Power.Manager.xml index ae4d198c..485fdde9 100644 --- a/src/org.xfce.Power.Manager.xml +++ b/src/org.xfce.Power.Manager.xml @@ -14,11 +14,7 @@ </method> <method name="GetConfig"> - <arg direction="out" name="system_laptop" type="b"/> - <arg direction="out" name="user_privilege" type="b"/> - <arg direction="out" name="can_suspend" type="b"/> - <arg direction="out" name="can_hibernate" type="b"/> - <arg direction="out" name="has_lcd_brightness" type="b"/> + <arg direction="out" name="config" type="a{ss}"/> </method> <method name="GetInfo"> diff --git a/src/xfpm-button-hal.c b/src/xfpm-button-hal.c index 7ad62b74..7fe542de 100644 --- a/src/xfpm-button-hal.c +++ b/src/xfpm-button-hal.c @@ -51,6 +51,7 @@ struct XfpmButtonHalPrivate { GPtrArray *array; guint8 keys; + guint8 mapped_keys; }; enum @@ -157,6 +158,7 @@ xfpm_button_hal_add_button (XfpmButtonHal *bt, const gchar *udi, gboolean lid_on if ( xfpm_strequal (button_type, "lid") ) { + bt->priv->mapped_keys |= LID_KEY; g_free (button_type); goto out; } @@ -168,6 +170,23 @@ xfpm_button_hal_add_button (XfpmButtonHal *bt, const gchar *udi, gboolean lid_on } } + if ( hal_device_has_key (device, "button.type") ) + { + button_type = hal_device_get_property_string (device, "button.type"); + if ( button_type == NULL ) goto out; + + if ( xfpm_strequal (button_type, "lid") ) + bt->priv->mapped_keys |= LID_KEY; + else if ( xfpm_strequal (button_type, "sleep") ) + bt->priv->mapped_keys |= SLEEP_KEY; + else if ( xfpm_strequal (button_type, "hibernate") ) + bt->priv->mapped_keys |= HIBERNATE_KEY; + else if ( xfpm_strequal (button_type, "power") ) + bt->priv->mapped_keys |= POWER_KEY; + + g_free (button_type); + } + out: g_signal_connect (device, "device-changed", G_CALLBACK (xfpm_button_hal_device_changed_cb), bt); @@ -229,6 +248,7 @@ xfpm_button_hal_init (XfpmButtonHal *button) button->priv = XFPM_BUTTON_HAL_GET_PRIVATE (button); button->priv->array = g_ptr_array_new (); button->priv->keys = 0; + button->priv->mapped_keys = 0; } static void @@ -273,3 +293,10 @@ void xfpm_button_hal_get_keys (XfpmButtonHal *button, gboolean lid_only, guint8 button->priv->keys = keys; xfpm_button_hal_get_buttons (button, lid_only); } + +guint8 xfpm_button_hal_get_mapped_keys (XfpmButtonHal *button) +{ + g_return_val_if_fail (XFPM_IS_BUTTON_HAL (button), 0); + + return button->priv->mapped_keys; +} diff --git a/src/xfpm-button-hal.h b/src/xfpm-button-hal.h index 23616172..1c1f5cf4 100644 --- a/src/xfpm-button-hal.h +++ b/src/xfpm-button-hal.h @@ -55,6 +55,9 @@ XfpmButtonHal *xfpm_button_hal_new (void); void xfpm_button_hal_get_keys (XfpmButtonHal *button, gboolean lid_only, guint8 buttons); + +guint8 xfpm_button_hal_get_mapped_keys (XfpmButtonHal *button) G_GNUC_PURE; + G_END_DECLS #endif /* __XFPM_BUTTON_HAL_H */ diff --git a/src/xfpm-button.c b/src/xfpm-button.c index 7730ac42..02a5ff33 100644 --- a/src/xfpm-button.c +++ b/src/xfpm-button.c @@ -179,3 +179,19 @@ xfpm_button_new (void) } return XFPM_BUTTON (xfpm_button_object); } + +guint8 xfpm_button_get_mapped (XfpmButton *button) +{ + guint8 mapped_keys = 0; + guint8 hal_mapped; + guint8 xf86_mapped; + + g_return_val_if_fail (XFPM_IS_BUTTON (button), 0); + + hal_mapped = xfpm_button_hal_get_mapped_keys (button->priv->hal); + xf86_mapped = xfpm_button_xf86_get_mapped_buttons (button->priv->xf86); + + mapped_keys = hal_mapped | xf86_mapped; + + return mapped_keys; +} diff --git a/src/xfpm-button.h b/src/xfpm-button.h index bd6c6ffe..7243c20b 100644 --- a/src/xfpm-button.h +++ b/src/xfpm-button.h @@ -51,6 +51,8 @@ typedef struct GType xfpm_button_get_type (void) G_GNUC_CONST; XfpmButton *xfpm_button_new (void); +guint8 xfpm_button_get_mapped (XfpmButton *button); + G_END_DECLS #endif /* __XFPM_BUTTON_H */ diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c index 9e62dee2..c2738f72 100644 --- a/src/xfpm-engine.c +++ b/src/xfpm-engine.c @@ -489,22 +489,41 @@ xfpm_engine_new (void) } void -xfpm_engine_get_info (XfpmEngine * engine, - gboolean * system_laptop, - gboolean * user_privilege, - gboolean * can_suspend, - gboolean * can_hibernate, - gboolean * has_lcd_brightness) +xfpm_engine_get_info (XfpmEngine * engine, GHashTable *hash) { + guint8 mapped_buttons; + gboolean user_privilege = FALSE; + gboolean can_suspend = FALSE; + gboolean can_hibernate = FALSE; + gboolean has_sleep_button = FALSE; + gboolean has_hibernate_button = FALSE; + gboolean has_power_button = FALSE; + g_return_if_fail (XFPM_IS_ENGINE (engine)); g_object_get (G_OBJECT (engine->priv->shutdown), - "caller-privilege", user_privilege, - "can-suspend", can_suspend, - "can-hibernate", can_hibernate, NULL); - - *system_laptop = engine->priv->is_laptop; - *has_lcd_brightness = engine->priv->has_lcd_brightness; + "caller-privilege", &user_privilege, + "can-suspend", &can_suspend, + "can-hibernate", &can_hibernate, NULL); + + + mapped_buttons = xfpm_button_get_mapped (engine->priv->button); + + if ( mapped_buttons & SLEEP_KEY ) + has_sleep_button = TRUE; + if ( mapped_buttons & HIBERNATE_KEY ) + has_hibernate_button = TRUE; + if ( mapped_buttons & POWER_KEY ) + has_power_button = TRUE; + + g_hash_table_insert (hash, g_strdup ("caller-privilege"), g_strdup (xfpm_bool_to_string (user_privilege))); + g_hash_table_insert (hash, g_strdup ("can-suspend"), g_strdup (xfpm_bool_to_string (can_suspend))); + g_hash_table_insert (hash, g_strdup ("can-hibernate"), g_strdup (xfpm_bool_to_string (can_hibernate))); + g_hash_table_insert (hash, g_strdup ("system-laptop"), g_strdup (xfpm_bool_to_string (engine->priv->is_laptop))); + g_hash_table_insert (hash, g_strdup ("has-brightness"), g_strdup (xfpm_bool_to_string (engine->priv->has_lcd_brightness))); + g_hash_table_insert (hash, g_strdup ("sleep-button"), g_strdup (xfpm_bool_to_string (has_sleep_button))); + g_hash_table_insert (hash, g_strdup ("power-button"), g_strdup (xfpm_bool_to_string (has_power_button))); + g_hash_table_insert (hash, g_strdup ("hibernate-button"), g_strdup (xfpm_bool_to_string (has_hibernate_button))); } void xfpm_engine_reload_hal_objects (XfpmEngine *engine) diff --git a/src/xfpm-engine.h b/src/xfpm-engine.h index cb26ee60..556cddc9 100644 --- a/src/xfpm-engine.h +++ b/src/xfpm-engine.h @@ -51,11 +51,7 @@ GType xfpm_engine_get_type (void) G_GNUC_CONST; XfpmEngine *xfpm_engine_new (void); void xfpm_engine_get_info (XfpmEngine *engine, - gboolean *system_laptop, - gboolean *user_privilege, - gboolean *can_suspend, - gboolean *can_hibernate, - gboolean *has_lcd_brightness); + GHashTable *hash); void xfpm_engine_reload_hal_objects (XfpmEngine *engine); G_END_DECLS diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 49671ccb..4eb9b07c 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -233,14 +233,9 @@ static gboolean xfpm_manager_dbus_restart (XfpmManager *manager, GError **error); static gboolean xfpm_manager_dbus_get_config (XfpmManager *manager, - gboolean *OUT_system_laptop, - gboolean *OUT_user_privilege, - gboolean *OUT_can_suspend, - gboolean *OUT_can_hibernate, - gboolean *OUT_has_lcd_brightness, - gboolean *OUT_has_lid, + GHashTable **OUT_config, GError **error); - + static gboolean xfpm_manager_dbus_get_info (XfpmManager *manager, gchar **OUT_name, gchar **OUT_version, @@ -287,21 +282,14 @@ static gboolean xfpm_manager_dbus_restart (XfpmManager *manager, } static gboolean xfpm_manager_dbus_get_config (XfpmManager *manager, - gboolean *OUT_system_laptop, - gboolean *OUT_user_privilege, - gboolean *OUT_can_suspend, - gboolean *OUT_can_hibernate, - gboolean *OUT_has_lcd_brightness, - gboolean *OUT_has_lid, + GHashTable **OUT_config, GError **error) { - xfpm_engine_get_info (manager->priv->engine, - OUT_system_laptop, - OUT_user_privilege, - OUT_can_suspend, - OUT_can_hibernate, - OUT_has_lcd_brightness); + *OUT_config = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + xfpm_engine_get_info (manager->priv->engine, *OUT_config); + return TRUE; } -- GitLab