summaryrefslogtreecommitdiff
path: root/src/dkp-daemon.c
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2009-05-05 12:51:26 +0100
committerRichard Hughes <richard@hughsie.com>2009-05-05 12:51:26 +0100
commit7bd2dfefcb88d2e40402f4e1272dd70255d34b87 (patch)
tree7dbd6b4122221439c54153c329b60b3a26ebce78 /src/dkp-daemon.c
parentdccd5fc898bcb3d66038902cfddeb9ea935f5a18 (diff)
downloadupower-7bd2dfefcb88d2e40402f4e1272dd70255d34b87.tar.gz
Add a property lid-is-closed so that we can finally drop the HAL dep in g-p-m and x-p-m
Diffstat (limited to 'src/dkp-daemon.c')
-rw-r--r--src/dkp-daemon.c77
1 files changed, 70 insertions, 7 deletions
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;
}