diff options
author | Ali Abdallah <ali.slackware@gmail.com> | 2009-03-18 21:18:15 +0000 |
---|---|---|
committer | Ali Abdallah <ali.slackware@gmail.com> | 2009-03-18 21:18:15 +0000 |
commit | 1b01b4df19c0457f87a592b9be7bd8b918cea887 (patch) | |
tree | d59c9c13421f6a9b1a2faa831ee212da738a4eb3 /src | |
parent | 913d4a49399ad4fc5fd8c9a150353005a9e0427d (diff) | |
download | ixfce4-power-manager-1b01b4df19c0457f87a592b9be7bd8b918cea887.tar.gz |
Load relevent settings depending on the form factor the power manager is running on
(Old svn revision: 6944)
Diffstat (limited to 'src')
-rw-r--r-- | src/org.xfce.Power.Manager.xml | 13 | ||||
-rw-r--r-- | src/xfpm-adapter.c | 88 | ||||
-rw-r--r-- | src/xfpm-adapter.h | 3 | ||||
-rw-r--r-- | src/xfpm-brightness-hal.c | 7 | ||||
-rw-r--r-- | src/xfpm-brightness-hal.h | 2 | ||||
-rw-r--r-- | src/xfpm-engine.c | 123 | ||||
-rw-r--r-- | src/xfpm-engine.h | 7 | ||||
-rw-r--r-- | src/xfpm-idle.c | 2 | ||||
-rw-r--r-- | src/xfpm-manager.c | 51 |
9 files changed, 213 insertions, 83 deletions
diff --git a/src/org.xfce.Power.Manager.xml b/src/org.xfce.Power.Manager.xml index b9334056..62a9d398 100644 --- a/src/org.xfce.Power.Manager.xml +++ b/src/org.xfce.Power.Manager.xml @@ -10,14 +10,13 @@ <method name="Quit"> </method> - <method name="GetAll"> + <method name="GetConfig"> <arg direction="out" name="system_laptop" type="b"/> - <arg direction="out" name="power_management" type="i"/> - <arg direction="out" name="with_dpms" type="b"/> - <arg direction="out" name="governor" type="i"/> - <arg direction="out" name="switch_buttons" type="i"/> - <arg direction="out" name="brightness_control" type="b"/> - <arg direction="out" name="ups_found" 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="has_lid" type="b"/> </method> <method name="GetInfo"> diff --git a/src/xfpm-adapter.c b/src/xfpm-adapter.c index 59279d92..2e92b116 100644 --- a/src/xfpm-adapter.c +++ b/src/xfpm-adapter.c @@ -58,6 +58,7 @@ struct XfpmAdapterPrivate { HalDevice *device; gboolean present; + gboolean hw_found; }; enum @@ -82,7 +83,38 @@ xfpm_adapter_device_changed_cb (HalDevice *device, const gchar *udi, const gchar adapter->priv->present = hal_device_get_property_bool (adapter->priv->device, "ac_adapter.present"); g_signal_emit (G_OBJECT(adapter), signals[ADAPTER_CHANGED], 0, adapter->priv->present); } +} + +static void +xfpm_adapter_set_device (XfpmAdapter *adapter) +{ + HalManager *manager; + gchar **udi; + + manager = hal_manager_new (); + + udi = hal_manager_find_device_by_capability (manager, "ac_adapter"); + + if (!udi )//FIXME Adapter should be present on laptops + goto out; + + TRACE("Found AC Adapter with udi=%s\n", udi[0]); + + adapter->priv->hw_found = TRUE; + adapter->priv->device = hal_device_new (); + hal_device_set_udi (adapter->priv->device, udi[0]); + + hal_manager_free_string_array (udi); + + adapter->priv->present = hal_device_get_property_bool (adapter->priv->device, "ac_adapter.present"); + + g_signal_connect (adapter->priv->device, "device-changed", + G_CALLBACK(xfpm_adapter_device_changed_cb), adapter); + + hal_device_watch (adapter->priv->device); +out: + g_object_unref (manager); } static void @@ -107,41 +139,34 @@ xfpm_adapter_class_init(XfpmAdapterClass *klass) static void xfpm_adapter_init(XfpmAdapter *adapter) { - HalManager *manager; - gchar **udi = NULL; + HalDevice *device; gchar *form_factor = NULL; adapter->priv = XFPM_ADAPTER_GET_PRIVATE(adapter); - adapter->priv->device = hal_device_new (); - hal_device_set_udi (adapter->priv->device, "/org/freedesktop/Hal/devices/computer"); - - form_factor = hal_device_get_property_string (adapter->priv->device, "system.formfactor"); - - TRACE("System formfactor=%s\n", form_factor); //FIXME Use this value - g_free(form_factor); - - manager = hal_manager_new (); - - udi = hal_manager_find_device_by_capability (manager, "ac_adapter"); - - if (!udi )//FIXME Adapter should be present on laptops - goto out; - - TRACE("Found AC Adapter with udi=%s\n", udi[0]); - - hal_device_set_udi (adapter->priv->device, udi[0]); + adapter->priv->device = NULL; + adapter->priv->present = TRUE; + adapter->priv->hw_found = FALSE; - hal_manager_free_string_array (udi); + device = hal_device_new (); + hal_device_set_udi (device, "/org/freedesktop/Hal/devices/computer"); - adapter->priv->present = hal_device_get_property_bool (adapter->priv->device, "ac_adapter.present"); - g_signal_connect (adapter->priv->device, "device-changed", - G_CALLBACK(xfpm_adapter_device_changed_cb), adapter); - - hal_device_watch (adapter->priv->device); -out: - g_object_unref (manager); + form_factor = hal_device_get_property_string (device, "system.formfactor"); + + TRACE("System formfactor=%s\n", form_factor); + if ( xfpm_strequal (form_factor, "laptop") ) + { + xfpm_adapter_set_device (adapter); + TRACE("System is identified as a laptop"); + } + else + { + TRACE("System is not identified as a laptop"); + } + g_object_unref (device); + if ( form_factor ) + g_free(form_factor); } static void @@ -178,3 +203,10 @@ gboolean xfpm_adapter_get_present (XfpmAdapter *adapter) return adapter->priv->present; } + +gboolean xfpm_adapter_has_hw (XfpmAdapter *adapter) +{ + g_return_val_if_fail (XFPM_IS_ADAPTER(adapter), FALSE); + + return adapter->priv->hw_found; +} diff --git a/src/xfpm-adapter.h b/src/xfpm-adapter.h index 7a3d13e7..fbb92767 100644 --- a/src/xfpm-adapter.h +++ b/src/xfpm-adapter.h @@ -51,6 +51,9 @@ GType xfpm_adapter_get_type (void) G_GNUC_CONST; XfpmAdapter *xfpm_adapter_new (void); gboolean xfpm_adapter_get_present (XfpmAdapter *adapter); + +gboolean xfpm_adapter_has_hw (XfpmAdapter *adapter); + G_END_DECLS #endif /* __XFPM_ADAPTER_H */ diff --git a/src/xfpm-brightness-hal.c b/src/xfpm-brightness-hal.c index 4fdfb08d..d9f5a6c8 100644 --- a/src/xfpm-brightness-hal.c +++ b/src/xfpm-brightness-hal.c @@ -480,3 +480,10 @@ xfpm_brightness_hal_new () return brg; } + +gboolean xfpm_brightness_hal_has_hw (XfpmBrightnessHal *brg) +{ + g_return_val_if_fail (XFPM_IS_BRIGHTNESS_HAL (brg), FALSE); + + return brg->priv->hw_found; +} diff --git a/src/xfpm-brightness-hal.h b/src/xfpm-brightness-hal.h index b8f2d3c5..e58c67d1 100644 --- a/src/xfpm-brightness-hal.h +++ b/src/xfpm-brightness-hal.h @@ -46,6 +46,8 @@ typedef struct GType xfpm_brightness_hal_get_type (void) G_GNUC_CONST; XfpmBrightnessHal *xfpm_brightness_hal_new (void); + +gboolean xfpm_brightness_hal_has_hw (XfpmBrightnessHal *brg); G_END_DECLS #endif /* __XFPM_BRIGHTNESS_HAL_H */ diff --git a/src/xfpm-engine.c b/src/xfpm-engine.c index 088c82f0..eee59bbe 100644 --- a/src/xfpm-engine.c +++ b/src/xfpm-engine.c @@ -42,6 +42,7 @@ #include <xfconf/xfconf.h> #include "libxfpm/hal-iface.h" +#include "libxfpm/hal-device.h" #include "libxfpm/xfpm-string.h" #include "libxfpm/xfpm-common.h" @@ -95,6 +96,10 @@ struct XfpmEnginePrivate gboolean block_shutdown; + gboolean is_laptop; + gboolean has_lcd_brightness; + gboolean has_lid; + /*Configuration */ XfpmShutdownRequest sleep_button; XfpmShutdownRequest lid_button_ac; @@ -208,12 +213,38 @@ xfpm_engine_check_hal_iface (XfpmEngine *engine) static void xfpm_engine_load_all (XfpmEngine *engine) { + HalDevice *device; + gchar *form_factor = NULL; + xfpm_engine_check_hal_iface (engine); + device = hal_device_new (); + + hal_device_set_udi (device, "/org/freedesktop/Hal/devices/computer"); + + form_factor = hal_device_get_property_string (device, "system.formfactor"); + + TRACE("System formfactor=%s\n", form_factor); + if ( xfpm_strequal (form_factor, "laptop") ) + { + engine->priv->is_laptop = TRUE; + TRACE("System is identified as a laptop"); + } + else + { + engine->priv->is_laptop = FALSE; + TRACE("System is not identified as a laptop"); + } + if ( form_factor ) + g_free (form_factor); + + g_object_unref (device); + #ifdef HAVE_DPMS engine->priv->dpms = xfpm_dpms_new (); #endif - engine->priv->cpu = xfpm_cpu_new (); + if ( engine->priv->is_laptop ) + engine->priv->cpu = xfpm_cpu_new (); engine->priv->supply = xfpm_supply_new (engine->priv->power_management); xfpm_supply_monitor (engine->priv->supply); @@ -229,19 +260,30 @@ xfpm_engine_load_all (XfpmEngine *engine) /* * Lid from HAL */ - engine->priv->lid = xfpm_lid_hal_new (); - - if ( xfpm_lid_hw_found (engine->priv->lid )) - g_signal_connect (engine->priv->lid, "lid-closed", - G_CALLBACK(xfpm_engine_lid_closed_cb), engine); + if ( engine->priv->is_laptop ) + { + engine->priv->lid = xfpm_lid_hal_new (); + engine->priv->has_lid = xfpm_lid_hw_found (engine->priv->lid ); + if ( engine->priv->has_lid ) + g_signal_connect (engine->priv->lid, "lid-closed", + G_CALLBACK(xfpm_engine_lid_closed_cb), engine); + else + g_object_unref (engine->priv->lid); + } /* * Brightness HAL */ - engine->priv->brg_hal = xfpm_brightness_hal_new (); - - g_signal_connect (G_OBJECT(engine->priv->supply), "shutdown-request", - G_CALLBACK (xfpm_engine_shutdown_request_battery_cb), engine); + if ( engine->priv->is_laptop ) + { + engine->priv->brg_hal = xfpm_brightness_hal_new (); + engine->priv->has_lcd_brightness = xfpm_brightness_hal_has_hw (engine->priv->brg_hal); + if ( engine->priv->has_lcd_brightness ) + g_signal_connect (G_OBJECT(engine->priv->supply), "shutdown-request", + G_CALLBACK (xfpm_engine_shutdown_request_battery_cb), engine); + else + g_object_unref (engine->priv->brg_hal); + } } static void @@ -367,9 +409,11 @@ xfpm_engine_class_init(XfpmEngineClass *klass) static void xfpm_engine_init (XfpmEngine *engine) { + GError *error = NULL; engine->priv = XFPM_ENGINE_GET_PRIVATE(engine); engine->priv->iface = hal_iface_new (); + engine->priv->adapter = xfpm_adapter_new (); engine->priv->inhibit = xfpm_inhibit_new (); engine->priv->inhibited = FALSE; @@ -390,6 +434,25 @@ xfpm_engine_init (XfpmEngine *engine) engine->priv->power_management = 0; xfpm_engine_dbus_init (engine); + + if ( !xfconf_init(&error) ) + { + g_critical ("xfconf_init failed: %s\n", error->message); + g_error_free (error); + } + + engine->priv->conf = xfpm_xfconf_new (); + + engine->priv->on_battery = ! xfpm_adapter_get_present (engine->priv->adapter); + + g_signal_connect (engine->priv->adapter, "adapter-changed", + G_CALLBACK(xfpm_engine_adapter_changed_cb), engine); + + g_signal_connect (engine->priv->conf->channel, "property-changed", + G_CALLBACK(xfpm_engine_property_changed_cb), engine); + + xfpm_engine_load_configuration (engine); + xfpm_engine_load_all (engine); } static void @@ -431,28 +494,28 @@ xfpm_engine_new(void) XfpmEngine *engine = NULL; engine = g_object_new (XFPM_TYPE_ENGINE, NULL); - GError *error = NULL; - if ( !xfconf_init(&error) ) - { - g_critical ("xfconf_init failed: %s\n", error->message); - g_error_free (error); - } - - engine->priv->conf = xfpm_xfconf_new (); - engine->priv->adapter = xfpm_adapter_new (); - - engine->priv->on_battery = ! xfpm_adapter_get_present (engine->priv->adapter); - - g_signal_connect (engine->priv->adapter, "adapter-changed", - G_CALLBACK(xfpm_engine_adapter_changed_cb), engine); - - g_signal_connect (engine->priv->conf->channel, "property-changed", - G_CALLBACK(xfpm_engine_property_changed_cb), engine); + return engine; +} + +void xfpm_engine_get_info (XfpmEngine *engine, + gboolean *system_laptop, + gboolean *user_privilege, + gboolean *can_suspend, + gboolean *can_hibernate, + gboolean *has_lcd_brightness, + gboolean *has_lid) +{ + g_return_if_fail (XFPM_IS_ENGINE(engine)); - xfpm_engine_load_configuration (engine); - xfpm_engine_load_all (engine); + g_object_get (G_OBJECT(engine->priv->iface), + "caller-privilege", user_privilege, + "can-suspend", can_suspend, + "can-hibernate",can_hibernate, + NULL); - return engine; + *system_laptop = engine->priv->is_laptop; + *has_lcd_brightness = engine->priv->has_lcd_brightness; + *has_lid = engine->priv->has_lid; } /* diff --git a/src/xfpm-engine.h b/src/xfpm-engine.h index 194d3f9d..0595813f 100644 --- a/src/xfpm-engine.h +++ b/src/xfpm-engine.h @@ -47,6 +47,13 @@ typedef struct 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, + gboolean *has_lid); G_END_DECLS #endif /* __XFPM_ENGINE_H */ diff --git a/src/xfpm-idle.c b/src/xfpm-idle.c index 122aa98d..282f48c3 100644 --- a/src/xfpm-idle.c +++ b/src/xfpm-idle.c @@ -300,6 +300,8 @@ xfpm_idle_finalize(GObject *object) xfpm_idle_free_alarm (idle, alarm); } g_ptr_array_free (idle->priv->array, TRUE); + + gdk_window_remove_filter (NULL, xfpm_idle_x_event_filter, idle); G_OBJECT_CLASS(xfpm_idle_parent_class)->finalize(object); } diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 91dadf06..001e334d 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -171,16 +171,23 @@ void xfpm_manager_start (XfpmManager *manager) * DBus server implementation * */ -static gboolean xfpm_manager_dbus_quit (XfpmManager *manager, - GError **error); -static gboolean xfpm_manager_dbus_get_all (XfpmManager *manager, - GHashTable **OUT_hash, - GError **error); -static gboolean xfpm_manager_dbus_get_info (XfpmManager *manager, - gchar **OUT_name, - gchar **OUT_version, - gchar **OUT_vendor, - GError **error); +static gboolean xfpm_manager_dbus_quit (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, + GError **error); + +static gboolean xfpm_manager_dbus_get_info (XfpmManager *manager, + gchar **OUT_name, + gchar **OUT_version, + gchar **OUT_vendor, + GError **error); #include "xfce-power-manager-dbus-server.h" @@ -209,18 +216,26 @@ xfpm_manager_dbus_quit(XfpmManager *manager, GError **error) return TRUE; } -static gboolean -xfpm_manager_dbus_get_all(XfpmManager *manager, - GHashTable **OUT_hash, - 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, + GError **error) { - TRACE("Get all message received\n"); - - *OUT_hash = g_hash_table_new(g_str_hash, g_str_equal); + xfpm_engine_get_info (manager->priv->engine, + OUT_system_laptop, + OUT_user_privilege, + OUT_can_suspend, + OUT_can_hibernate, + OUT_has_lcd_brightness, + OUT_has_lid); return TRUE; } - + static gboolean xfpm_manager_dbus_get_info (XfpmManager *manager, gchar **OUT_name, |