summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--devkit-power-gobject/dkp-client.c19
-rw-r--r--devkit-power-gobject/dkp-client.h1
-rw-r--r--src/Makefile.am1
-rw-r--r--src/dkp-daemon.c77
-rw-r--r--src/dkp-daemon.h2
-rw-r--r--src/org.freedesktop.DeviceKit.Power.xml10
-rw-r--r--tools/dkp-tool.c1
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");
}
/**