[Goodies-commits] r5564 - xfce4-power-manager/trunk/src
Ali Abdallah
aliov at xfce.org
Fri Oct 10 15:54:38 CEST 2008
Author: aliov
Date: 2008-10-10 13:54:38 +0000 (Fri, 10 Oct 2008)
New Revision: 5564
Modified:
xfce4-power-manager/trunk/src/xfpm-button.c
xfce4-power-manager/trunk/src/xfpm-enums.h
Log:
lid,sleep and power buttons improvements
Modified: xfce4-power-manager/trunk/src/xfpm-button.c
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-button.c 2008-10-10 10:47:58 UTC (rev 5563)
+++ xfce4-power-manager/trunk/src/xfpm-button.c 2008-10-10 13:54:38 UTC (rev 5564)
@@ -70,10 +70,10 @@
static gboolean xfpm_button_hibernate(XfpmButton *bt);
static gboolean xfpm_button_suspend(XfpmButton *bt);
-static void xfpm_button_handle_condition_detail(XfpmButton *bt,
- const gchar *udi,
- const gchar *condition_detail);
-
+static void xfpm_button_lid_pressed(XfpmButton *bt,const gchar *udi);
+static void xfpm_button_power_pressed(XfpmButton *bt,const gchar *udi);
+static void xfpm_button_sleep_pressed(XfpmButton *bt,const gchar *udi);
+
static void xfpm_button_handle_device_condition_cb(XfpmHal *hal,
const gchar *udi,
const gchar *condition_name,
@@ -86,8 +86,16 @@
struct XfpmButtonPrivate
{
XfpmHal *hal;
- GHashTable *buttons;
gulong handler_id;
+
+ gboolean have_lid_bt;
+ gboolean lid_button_has_state;
+
+ gboolean have_power_bt;
+ gboolean power_button_has_state;
+
+ gboolean have_sleep_bt;
+ gboolean sleep_button_has_state;
};
@@ -152,8 +160,16 @@
XfpmButtonPrivate *priv;
priv = XFPM_BUTTON_GET_PRIVATE(bt);
- priv->buttons = g_hash_table_new(g_str_hash,g_str_equal);
+ priv->have_lid_bt = FALSE;
+ priv->lid_button_has_state = FALSE;
+ priv->have_power_bt = FALSE;
+ priv->power_button_has_state= FALSE;
+
+ priv->have_sleep_bt = FALSE;
+ priv->sleep_button_has_state= FALSE;
+
+
priv->hal = xfpm_hal_new();
xfpm_button_load_config(bt);
@@ -285,7 +301,6 @@
g_signal_handler_block(priv->hal,priv->handler_id);
g_timeout_add_seconds(2,(GSourceFunc)xfpm_button_hibernate,bt);
-
}
static void
@@ -299,61 +314,133 @@
}
static void
-xfpm_button_handle_condition_detail(XfpmButton *bt,const gchar *udi,const gchar *condition_detail)
+_proccess_action(XfpmButton *bt,XfpmButtonAction action)
{
+ if ( action == BUTTON_DO_SUSPEND )
+ {
+ xfpm_lock_screen();
+ xfpm_button_do_suspend(bt);
+ }
+ else if ( action == BUTTON_DO_HIBERNATE )
+ {
+ xfpm_lock_screen();
+ xfpm_button_do_hibernate(bt);
+ }
+ else if ( action == BUTTON_DO_SHUTDOWN )
+ {
+ XfpmButtonPrivate *priv;
+ priv = XFPM_BUTTON_GET_PRIVATE(bt);
+
+ g_signal_handler_block(priv->hal,priv->handler_id);
+ xfpm_hal_shutdown(priv->hal);
+ }
+
+}
+
+static void
+xfpm_button_lid_pressed(XfpmButton *bt,const gchar *udi)
+{
+ if ( bt->lid_action == BUTTON_DO_NOTHING )
+ {
+ return;
+ }
+
XfpmButtonPrivate *priv;
priv = XFPM_BUTTON_GET_PRIVATE(bt);
- if ( !strcmp(condition_detail,"lid") && bt->lid_action != BUTTON_DO_NOTHING )
+ if ( priv->have_lid_bt )
{
- GError *error = NULL;
- gboolean pressed =
- xfpm_hal_get_bool_info(priv->hal,udi,"button.state.value",&error);
- if ( error )
+ if ( priv->lid_button_has_state )
{
- XFPM_DEBUG("Error getting lid switch state: %s\n",error->message);
- g_error_free(error);
- return;
- }
- else if ( pressed == TRUE )
- {
- if ( bt->lid_action == BUTTON_DO_SUSPEND )
+ GError *error = NULL;
+ gboolean pressed =
+ xfpm_hal_get_bool_info(priv->hal,udi,"button.state.value",&error);
+ if ( error )
{
- xfpm_lock_screen();
- xfpm_button_do_suspend(bt);
+ XFPM_DEBUG("Error getting lid switch state: %s\n",error->message);
+ g_error_free(error);
+ return;
}
- else if ( bt->lid_action == BUTTON_DO_HIBERNATE )
+ else if ( pressed == TRUE )
{
- xfpm_lock_screen();
- xfpm_button_do_hibernate(bt);
+ _proccess_action(bt,bt->lid_action);
}
}
+ else
+ {
+ _proccess_action(bt,bt->lid_action);
+ }
}
- else if ( !strcmp(condition_detail,"sleep") && bt->sleep_action != BUTTON_DO_NOTHING )
+}
+
+static void
+xfpm_button_power_pressed(XfpmButton *bt,const gchar *udi)
+{
+ if ( bt->power_action == BUTTON_DO_NOTHING )
{
- if ( bt->sleep_action == BUTTON_DO_SUSPEND )
+ return;
+ }
+
+ XfpmButtonPrivate *priv;
+ priv = XFPM_BUTTON_GET_PRIVATE(bt);
+
+ if ( priv->have_power_bt )
+ {
+ if ( priv->power_button_has_state )
{
- xfpm_lock_screen();
- xfpm_button_do_suspend(bt);
+ GError *error = NULL;
+ gboolean pressed =
+ xfpm_hal_get_bool_info(priv->hal,udi,"button.state.value",&error);
+ if ( error )
+ {
+ XFPM_DEBUG("Error getting lid switch state: %s\n",error->message);
+ g_error_free(error);
+ return;
+ }
+ else if ( pressed == TRUE )
+ {
+ _proccess_action(bt,bt->power_action);
+ }
}
- else if ( bt->sleep_action == BUTTON_DO_HIBERNATE )
+ else
{
- xfpm_lock_screen();
- xfpm_button_do_hibernate(bt);
+ _proccess_action(bt,bt->power_action);
}
}
-
- else if ( !strcmp(condition_detail,"power") && bt->lid_action != BUTTON_DO_NOTHING )
+}
+
+static void
+xfpm_button_sleep_pressed(XfpmButton *bt,const gchar *udi)
+{
+ XfpmButtonPrivate *priv;
+ priv = XFPM_BUTTON_GET_PRIVATE(bt);
+
+ if ( bt->sleep_action == BUTTON_DO_NOTHING )
{
- if ( bt->power_action == BUTTON_DO_SUSPEND )
+ return;
+ }
+
+ if ( priv->have_sleep_bt )
+ {
+ if ( priv->sleep_button_has_state )
{
- xfpm_lock_screen();
- xfpm_button_do_suspend(bt);
+ GError *error = NULL;
+ gboolean pressed =
+ xfpm_hal_get_bool_info(priv->hal,udi,"button.state.value",&error);
+ if ( error )
+ {
+ XFPM_DEBUG("Error getting lid switch state: %s\n",error->message);
+ g_error_free(error);
+ return;
+ }
+ else if ( pressed == TRUE )
+ {
+ _proccess_action(bt,bt->sleep_action);
+ }
}
- else if ( bt->power_action == BUTTON_DO_HIBERNATE )
+ else
{
- xfpm_lock_screen();
- xfpm_button_do_hibernate(bt);
+ _proccess_action(bt,bt->sleep_action);
}
}
}
@@ -376,7 +463,18 @@
return;
}
XFPM_DEBUG("proccessing event: %s %s\n",condition_name,condition_detail);
- xfpm_button_handle_condition_detail(bt,udi,condition_detail);
+ if ( !strcmp(condition_detail,"lid") )
+ {
+ xfpm_button_lid_pressed(bt,udi);
+ }
+ else if ( !strcmp(condition_detail,"power") )
+ {
+ xfpm_button_power_pressed(bt,udi);
+ }
+ else if ( !strcmp(condition_detail,"sleep") )
+ {
+ xfpm_button_sleep_pressed(bt,udi);
+ }
}
}
@@ -409,6 +507,33 @@
}
static void
+_check_button(XfpmButtonPrivate *priv,const gchar *button_type,const gchar *udi)
+{
+ if ( !strcmp(button_type,"lid"))
+ {
+ priv->have_lid_bt = TRUE;
+ priv->lid_button_has_state = xfpm_hal_get_bool_info(priv->hal,udi,
+ "button.has_state",
+ NULL);
+
+ }
+ else if ( !strcmp(button_type,"power") )
+ {
+ priv->have_power_bt = TRUE;
+ priv->power_button_has_state = xfpm_hal_get_bool_info(priv->hal,udi,
+ "button.has_state",
+ NULL);
+ }
+ else if ( !strcmp(button_type,"sleep"))
+ {
+ priv->have_sleep_bt = TRUE;
+ priv->sleep_button_has_state = xfpm_hal_get_bool_info(priv->hal,udi,
+ "button.has_state",
+ NULL);
+ }
+}
+
+static void
xfpm_button_get_switches(XfpmButton *bt)
{
XfpmButtonPrivate *priv;
@@ -420,6 +545,13 @@
udi = xfpm_hal_get_device_udi_by_capability(priv->hal,"button",&dummy,&error);
+ if ( error )
+ {
+ XFPM_DEBUG("Unable to get button switches: %s\n",error->message);
+ g_error_free(error);
+ return;
+ }
+
if ( !udi )
{
XFPM_DEBUG("No buttons found\n");
@@ -427,9 +559,59 @@
int i = 0 ;
for ( i = 0 ; udi[i] ; i++)
{
-
+ if ( xfpm_hal_device_have_key(priv->hal,udi[i],"button.type") &&
+ xfpm_hal_device_have_key(priv->hal,udi[i],"button.has_state") )
+ {
+ GError *error = NULL;
+ const gchar *button_type =
+ xfpm_hal_get_string_info(priv->hal,udi[i],"button.type",&error);
+ if ( error )
+ {
+ XFPM_DEBUG(":%s\n",error->message);
+ g_error_free(error);
+ continue;
+ }
+
+ _check_button(priv,button_type,udi[i]);
+ }
}
+#ifdef DEBUG
+ gchar *content1;
+ gchar *content2;
+ GValue value = { 0, };
+ g_value_init(&value,G_TYPE_BOOLEAN);
+
+ g_value_set_boolean(&value,priv->have_lid_bt);
+ content1 = g_strdup_value_contents(&value);
+
+ g_value_set_boolean(&value,priv->lid_button_has_state);
+ content2 = g_strdup_value_contents(&value);
+
+ XFPM_DEBUG("LID Switch found = %s has_state = %s\n",content1,content2);
+ g_free(content1);
+ g_free(content2);
+
+ g_value_set_boolean(&value,priv->have_power_bt);
+ content1 = g_strdup_value_contents(&value);
+
+ g_value_set_boolean(&value,priv->power_button_has_state);
+ content2 = g_strdup_value_contents(&value);
+
+ XFPM_DEBUG("Power Switch found = %s has_state = %s\n",content1,content2);
+ g_free(content1);
+ g_free(content2);
+
+ g_value_set_boolean(&value,priv->have_sleep_bt);
+ content1 = g_strdup_value_contents(&value);
+
+ g_value_set_boolean(&value,priv->sleep_button_has_state);
+ content2 = g_strdup_value_contents(&value);
+
+ XFPM_DEBUG("Sleep Switch found = %s has_state = %s\n",content1,content2);
+ g_free(content1);
+ g_free(content2);
+#endif
libhal_free_string_array(udi);
}
Modified: xfce4-power-manager/trunk/src/xfpm-enums.h
===================================================================
--- xfce4-power-manager/trunk/src/xfpm-enums.h 2008-10-10 10:47:58 UTC (rev 5563)
+++ xfce4-power-manager/trunk/src/xfpm-enums.h 2008-10-10 13:54:38 UTC (rev 5564)
@@ -61,7 +61,8 @@
{
BUTTON_DO_NOTHING,
BUTTON_DO_SUSPEND,
- BUTTON_DO_HIBERNATE
+ BUTTON_DO_HIBERNATE,
+ BUTTON_DO_SHUTDOWN
} XfpmButtonAction;
More information about the Goodies-commits
mailing list