summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAli Abdallah <ali.slackware@gmail.com>2009-03-18 21:18:15 +0000
committerAli Abdallah <ali.slackware@gmail.com>2009-03-18 21:18:15 +0000
commit1b01b4df19c0457f87a592b9be7bd8b918cea887 (patch)
treed59c9c13421f6a9b1a2faa831ee212da738a4eb3 /src
parent913d4a49399ad4fc5fd8c9a150353005a9e0427d (diff)
downloadixfce4-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.xml13
-rw-r--r--src/xfpm-adapter.c88
-rw-r--r--src/xfpm-adapter.h3
-rw-r--r--src/xfpm-brightness-hal.c7
-rw-r--r--src/xfpm-brightness-hal.h2
-rw-r--r--src/xfpm-engine.c123
-rw-r--r--src/xfpm-engine.h7
-rw-r--r--src/xfpm-idle.c2
-rw-r--r--src/xfpm-manager.c51
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,