summaryrefslogtreecommitdiffstats
path: root/src/ck-manager.c
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-02-20 14:45:40 -0500
committerWilliam Jon McCann <mccann@jhu.edu>2007-02-20 14:45:40 -0500
commiteb9361c9b0b05c3bd51de7325c3327db79431fc9 (patch)
tree602343f318da4eb573fd2d5f4b2bb1d3e4f48cc9 /src/ck-manager.c
parentef89bbdb1be20fbca2a83037fcc922b444b7b513 (diff)
add a system-idle-hint and system-idle-since-hint
The system idle hint is TRUE when there are no busy (ie non-idle) sessions. So the system is idle when there are no sessions or all sessions are idle.
Diffstat (limited to 'src/ck-manager.c')
-rw-r--r--src/ck-manager.c160
1 files changed, 142 insertions, 18 deletions
diff --git a/src/ck-manager.c b/src/ck-manager.c
index 151badb..bba9b73 100644
--- a/src/ck-manager.c
+++ b/src/ck-manager.c
@@ -62,6 +62,9 @@ struct CkManagerPrivate
guint32 session_serial;
guint32 seat_serial;
+
+ gboolean system_idle_hint;
+ GTimeVal system_idle_since_hint;
};
@@ -76,6 +79,7 @@ typedef struct {
enum {
SEAT_ADDED,
SEAT_REMOVED,
+ SYSTEM_IDLE_HINT_CHANGED,
LAST_SIGNAL
};
@@ -320,6 +324,105 @@ out:
return res;
}
+static gboolean
+manager_set_system_idle_hint (CkManager *manager,
+ gboolean idle_hint)
+{
+ if (manager->priv->system_idle_hint != idle_hint) {
+ manager->priv->system_idle_hint = idle_hint;
+
+ /* FIXME: can we get a time from the dbus message? */
+ g_get_current_time (&manager->priv->system_idle_since_hint);
+
+ ck_debug ("Emitting system-idle-changed");
+ g_signal_emit (manager, signals [SYSTEM_IDLE_HINT_CHANGED], 0, idle_hint);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+is_session_busy (char *id,
+ CkSession *session,
+ gpointer data)
+{
+ gboolean idle_hint;
+
+ idle_hint = FALSE;
+
+ ck_session_get_idle_hint (session, &idle_hint, NULL);
+
+ /* return TRUE to stop search */
+ return !idle_hint;
+}
+
+static void
+manager_update_system_idle_hint (CkManager *manager)
+{
+ CkSession *session;
+ gboolean system_idle;
+
+ /* just look for any session that doesn't have the idle-hint set */
+ session = g_hash_table_find (manager->priv->sessions, (GHRFunc)is_session_busy, NULL);
+
+ /* if there aren't any busy sessions then the system is idle */
+ system_idle = (session == NULL);
+
+ manager_set_system_idle_hint (manager, system_idle);
+}
+
+static void
+session_idle_hint_changed (CkSession *session,
+ gboolean idle_hint,
+ CkManager *manager)
+{
+ manager_update_system_idle_hint (manager);
+}
+
+/*
+ Example:
+ dbus-send --system --dest=org.freedesktop.ConsoleKit \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/freedesktop/ConsoleKit/Manager \
+ org.freedesktop.ConsoleKit.Manager.GetSystemIdleHint
+*/
+gboolean
+ck_manager_get_system_idle_hint (CkManager *manager,
+ gboolean *idle_hint,
+ GError **error)
+{
+ g_return_val_if_fail (CK_IS_MANAGER (manager), FALSE);
+
+ if (idle_hint != NULL) {
+ *idle_hint = manager->priv->system_idle_hint;
+ }
+
+ return TRUE;
+}
+
+gboolean
+ck_manager_get_system_idle_since_hint (CkManager *manager,
+ char **iso8601_datetime,
+ GError **error)
+{
+ char *date_str;
+
+ g_return_val_if_fail (CK_IS_MANAGER (manager), FALSE);
+
+ date_str = NULL;
+ if (manager->priv->system_idle_hint) {
+ date_str = g_time_val_to_iso8601 (&manager->priv->system_idle_since_hint);
+ }
+
+ if (iso8601_datetime != NULL) {
+ *iso8601_datetime = g_strdup (date_str);
+ }
+
+ g_free (date_str);
+
+ return TRUE;
+}
+
static char *
create_session_for_caller (CkManager *manager,
const char *sender,
@@ -412,6 +515,11 @@ create_session_for_caller (CkManager *manager,
/* FIXME: connect to signals */
/* FIXME: add weak ref */
+ manager_update_system_idle_hint (manager);
+ g_signal_connect (session, "idle-hint-changed",
+ G_CALLBACK (session_idle_hint_changed),
+ manager);
+
g_object_unref (session);
out:
@@ -737,6 +845,8 @@ remove_session_for_cookie (CkManager *manager,
g_free (ssid);
+ manager_update_system_idle_hint (manager);
+
return TRUE;
}
@@ -939,24 +1049,36 @@ ck_manager_class_init (CkManagerClass *klass)
object_class->finalize = ck_manager_finalize;
- signals [SEAT_ADDED] = g_signal_new ("seat-added",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (CkManagerClass, seat_added),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
- signals [SEAT_REMOVED] = g_signal_new ("seat-removed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (CkManagerClass, seat_removed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
+ signals [SEAT_ADDED] =
+ g_signal_new ("seat-added",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (CkManagerClass, seat_added),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1, G_TYPE_STRING);
+ signals [SEAT_REMOVED] =
+ g_signal_new ("seat-removed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (CkManagerClass, seat_removed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1, G_TYPE_STRING);
+ signals [SYSTEM_IDLE_HINT_CHANGED] =
+ g_signal_new ("system-idle-hint-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (CkManagerClass, system_idle_hint_changed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE,
+ 1, G_TYPE_BOOLEAN);
dbus_g_object_type_install_info (CK_TYPE_MANAGER, &dbus_glib_ck_manager_object_info);
@@ -1050,6 +1172,8 @@ ck_manager_init (CkManager *manager)
manager->priv->session_serial = 1;
manager->priv->seat_serial = 1;
+ manager->priv->system_idle_hint = TRUE;
+
manager->priv->seats = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,