diff options
-rw-r--r-- | devkit-power-gobject/dkp-client.c | 19 | ||||
-rw-r--r-- | devkit-power-gobject/dkp-client.h | 1 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/dkp-daemon.c | 77 | ||||
-rw-r--r-- | src/dkp-daemon.h | 2 | ||||
-rw-r--r-- | src/org.freedesktop.DeviceKit.Power.xml | 10 | ||||
-rw-r--r-- | tools/dkp-tool.c | 1 |
7 files changed, 104 insertions, 7 deletions
diff --git a/devkit-power-gobject/dkp-client.c b/devkit-power-gobject/dkp-client.c index 859a8be..7f4d349 100644 --- a/devkit-power-gobject/dkp-client.c +++ b/devkit-power-gobject/dkp-client.c @@ -48,6 +48,7 @@ struct DkpClientPrivate gchar *daemon_version; gboolean can_suspend; gboolean can_hibernate; + gboolean lid_is_closed; gboolean on_battery; gboolean on_low_battery; }; @@ -238,6 +239,13 @@ dkp_client_ensure_properties (DkpClient *client) } client->priv->can_hibernate = g_value_get_boolean (value); + value = g_hash_table_lookup (props, "lid-is-closed"); + if (value == NULL) { + g_warning ("No 'lid-is-closed' property"); + goto out; + } + client->priv->lid_is_closed = g_value_get_boolean (value); + value = g_hash_table_lookup (props, "on-battery"); if (value == NULL) { g_warning ("No 'on-battery' property"); @@ -283,6 +291,17 @@ dkp_client_can_hibernate (DkpClient *client) } /** + * dkp_client_lid_is_closed: + **/ +gboolean +dkp_client_lid_is_closed (DkpClient *client) +{ + g_return_val_if_fail (DKP_IS_CLIENT (client), FALSE); + dkp_client_ensure_properties (client); + return client->priv->lid_is_closed; +} + +/** * dkp_client_can_suspend: **/ gboolean diff --git a/devkit-power-gobject/dkp-client.h b/devkit-power-gobject/dkp-client.h index bb65f40..722ad5b 100644 --- a/devkit-power-gobject/dkp-client.h +++ b/devkit-power-gobject/dkp-client.h @@ -81,6 +81,7 @@ gboolean dkp_client_hibernate (DkpClient *client, GError **error); const gchar *dkp_client_get_daemon_version (DkpClient *client); gboolean dkp_client_can_hibernate (DkpClient *client); +gboolean dkp_client_lid_is_closed (DkpClient *client); gboolean dkp_client_can_suspend (DkpClient *client); gboolean dkp_client_on_battery (DkpClient *client); gboolean dkp_client_on_low_battery (DkpClient *client); diff --git a/src/Makefile.am b/src/Makefile.am index 230a584..7a16a4e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -69,6 +69,7 @@ devkit_power_daemon_SOURCES = \ dkp-device-list.h dkp-device-list.c \ dkp-supply.h dkp-supply.c \ dkp-csr.h dkp-csr.c \ + dkp-input.h dkp-input.c \ dkp-wup.h dkp-wup.c \ dkp-hid.h dkp-hid.c \ dkp-qos.h dkp-qos.c \ diff --git a/src/dkp-daemon.c b/src/dkp-daemon.c index bcc6504..f25e8d5 100644 --- a/src/dkp-daemon.c +++ b/src/dkp-daemon.c @@ -41,6 +41,7 @@ #include "dkp-csr.h" #include "dkp-wup.h" #include "dkp-hid.h" +#include "dkp-input.h" #include "dkp-device-list.h" #include "dkp-daemon-glue.h" @@ -54,6 +55,7 @@ enum PROP_CAN_HIBERNATE, PROP_ON_BATTERY, PROP_ON_LOW_BATTERY, + PROP_LID_IS_CLOSED, }; enum @@ -65,7 +67,7 @@ enum LAST_SIGNAL, }; -static const gchar *subsystems[] = {"power_supply", "usb", "tty", NULL}; +static const gchar *subsystems[] = {"power_supply", "usb", "tty", "input", NULL}; static guint signals[LAST_SIGNAL] = { 0 }; @@ -75,22 +77,48 @@ struct DkpDaemonPrivate DBusGProxy *proxy; DkpPolkit *polkit; DkpDeviceList *list; + GPtrArray *inputs; gboolean on_battery; gboolean low_battery; DevkitClient *devkit_client; + gboolean lid_is_closed; }; -static void dkp_daemon_class_init (DkpDaemonClass *klass); -static void dkp_daemon_init (DkpDaemon *seat); -static void dkp_daemon_finalize (GObject *object); -static gboolean dkp_daemon_get_on_battery_local (DkpDaemon *daemon); -static gboolean dkp_daemon_get_low_battery_local (DkpDaemon *daemon); +static void dkp_daemon_class_init (DkpDaemonClass *klass); +static void dkp_daemon_init (DkpDaemon *seat); +static void dkp_daemon_finalize (GObject *object); +static gboolean dkp_daemon_get_on_battery_local (DkpDaemon *daemon); +static gboolean dkp_daemon_get_low_battery_local (DkpDaemon *daemon); G_DEFINE_TYPE (DkpDaemon, dkp_daemon, G_TYPE_OBJECT) #define DKP_DAEMON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DKP_TYPE_DAEMON, DkpDaemonPrivate)) /** + * dkp_daemon_set_lid_is_closed: + **/ +gboolean +dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, gboolean lid_is_closed) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (DKP_IS_DAEMON (daemon), FALSE); + + egg_debug ("lid_is_closed=%i", lid_is_closed); + if (daemon->priv->lid_is_closed == lid_is_closed) { + egg_debug ("ignoring duplicate"); + goto out; + } + + /* save */ + g_signal_emit (daemon, signals[CHANGED_SIGNAL], 0); + daemon->priv->lid_is_closed = lid_is_closed; + ret = TRUE; +out: + return ret; +} + +/** * dkp_daemon_error_quark: **/ GQuark @@ -177,6 +205,10 @@ dkp_daemon_get_property (GObject *object, g_value_set_boolean (value, daemon->priv->on_battery && daemon->priv->low_battery); break; + case PROP_LID_IS_CLOSED: + g_value_set_boolean (value, daemon->priv->lid_is_closed); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -270,6 +302,14 @@ dkp_daemon_class_init (DkpDaemonClass *klass) FALSE, G_PARAM_READABLE)); + g_object_class_install_property (object_class, + PROP_LID_IS_CLOSED, + g_param_spec_boolean ("lid-is-closed", + "Laptop lid is closed", + "If the laptop lid is closed", + FALSE, + G_PARAM_READABLE)); + dbus_g_object_type_install_info (DKP_TYPE_DAEMON, &dbus_glib_dkp_daemon_object_info); dbus_g_error_domain_register (DKP_DAEMON_ERROR, NULL, DKP_DAEMON_TYPE_ERROR); @@ -283,6 +323,8 @@ dkp_daemon_init (DkpDaemon *daemon) { daemon->priv = DKP_DAEMON_GET_PRIVATE (daemon); daemon->priv->polkit = dkp_polkit_new (); + daemon->priv->lid_is_closed = FALSE; + daemon->priv->inputs = g_ptr_array_new (); } /** @@ -310,6 +352,10 @@ dkp_daemon_finalize (GObject *object) g_object_unref (daemon->priv->list); g_object_unref (daemon->priv->polkit); + /* unref inputs */ + g_ptr_array_foreach (daemon->priv->inputs, (GFunc) g_object_unref, NULL); + g_ptr_array_free (daemon->priv->inputs, TRUE); + G_OBJECT_CLASS (dkp_daemon_parent_class)->finalize (object); } @@ -426,6 +472,7 @@ gpk_daemon_device_get (DkpDaemon *daemon, DevkitDevice *d) const gchar *subsys; const gchar *native_path; DkpDevice *device = NULL; + DkpInput *input; gboolean ret; subsys = devkit_device_get_subsystem (d); @@ -472,6 +519,22 @@ gpk_daemon_device_get (DkpDaemon *daemon, DevkitDevice *d) /* no valid USB object ;-( */ device = NULL; + } else if (g_strcmp0 (subsys, "input") == 0) { + + /* check input device */ + input = dkp_input_new (); + ret = dkp_input_coldplug (input, daemon, d); + if (!ret) { + g_object_unref (input); + goto out; + } + + /* we can't use the device list as it's not a DkpDevice */ + g_ptr_array_add (daemon->priv->inputs, input); + + /* no valid input object */ + device = NULL; + } else { native_path = devkit_device_get_native_path (d); egg_warning ("native path %s (%s) ignoring", native_path, subsys); @@ -500,7 +563,7 @@ gpk_daemon_device_add (DkpDaemon *daemon, DevkitDevice *d, gboolean emit_event) /* get the right sort of device */ device = gpk_daemon_device_get (daemon, d); if (device == NULL) { - egg_debug ("ignoring add event on %s", devkit_device_get_native_path (d)); + egg_debug ("not adding device %s", devkit_device_get_native_path (d)); ret = FALSE; goto out; } diff --git a/src/dkp-daemon.h b/src/dkp-daemon.h index b7a5c41..f3492ca 100644 --- a/src/dkp-daemon.h +++ b/src/dkp-daemon.h @@ -79,6 +79,8 @@ gboolean dkp_daemon_can_suspend (DkpDaemon *daemon, gboolean dkp_daemon_can_hibernate (DkpDaemon *daemon, gboolean interactive, DBusGMethodInvocation *context); +gboolean dkp_daemon_set_lid_is_closed (DkpDaemon *daemon, + gboolean lid_is_closed); G_END_DECLS diff --git a/src/org.freedesktop.DeviceKit.Power.xml b/src/org.freedesktop.DeviceKit.Power.xml index b696364..6b5ce03 100644 --- a/src/org.freedesktop.DeviceKit.Power.xml +++ b/src/org.freedesktop.DeviceKit.Power.xml @@ -162,6 +162,16 @@ method return sender=:1.386 -> dest=:1.451 reply_serial=2 </doc:para></doc:description></doc:doc> </property> + <property name="lid-is-closed" type="b" access="read"> + <doc:doc> + <doc:description> + <doc:para> + Indicates if the laptop lid is closed where the display cannot be seen. + </doc:para> + </doc:description> + </doc:doc> + </property> + <signal name="Changed"> <doc:doc> <doc:description> diff --git a/tools/dkp-tool.c b/tools/dkp-tool.c index 15723f0..80c7d29 100644 --- a/tools/dkp-tool.c +++ b/tools/dkp-tool.c @@ -86,6 +86,7 @@ dkp_client_print (DkpClient *client) g_print (" can-hibernate %s\n", dkp_client_can_hibernate (client) ? "yes" : "no"); g_print (" on-battery: %s\n", dkp_client_on_battery (client) ? "yes" : "no"); g_print (" on-low-battery: %s\n", dkp_client_on_low_battery (client) ? "yes" : "no"); + g_print (" lid-is-closed: %s\n", dkp_client_lid_is_closed (client) ? "yes" : "no"); } /** |