gnome-screensaver r1582 - in trunk: . src



Author: mccann
Date: Mon Jan 19 01:49:56 2009
New Revision: 1582
URL: http://svn.gnome.org/viewvc/gnome-screensaver?rev=1582&view=rev

Log:
2009-01-18  William Jon McCann  <jmccann redhat com>

	* src/gs-listener-dbus.c (add_session_inhibit),
	(remove_session_inhibit), (listener_add_ref_entry),
	(listener_remove_ref_entry):
	Proxy g-s inhibitors over to the session.



Modified:
   trunk/ChangeLog
   trunk/src/gs-listener-dbus.c

Modified: trunk/src/gs-listener-dbus.c
==============================================================================
--- trunk/src/gs-listener-dbus.c	(original)
+++ trunk/src/gs-listener-dbus.c	Mon Jan 19 01:49:56 2009
@@ -64,6 +64,10 @@
 #define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
 #define CK_SESSION_INTERFACE "org.freedesktop.ConsoleKit.Session"
 
+#define SESSION_NAME         "org.gnome.SessionManager"
+#define SESSION_PATH         "/org/gnome/SessionManager"
+#define SESSION_INTERFACE    "org.gnome.SessionManager"
+
 #define TYPE_MISMATCH_ERROR GS_LISTENER_INTERFACE ".TypeMismatch"
 
 #define GS_LISTENER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GS_TYPE_LISTENER, GSListenerPrivate))
@@ -93,6 +97,7 @@
         char    *reason;
         char    *connection;
         guint32  cookie;
+        guint32  foreign_cookie;
         GTimeVal since;
 } GSListenerRefEntry;
 
@@ -599,6 +604,104 @@
 }
 
 static void
+add_session_inhibit (GSListener         *listener,
+                     GSListenerRefEntry *entry)
+{
+        DBusMessage    *message;
+        DBusMessage    *reply;
+        DBusMessageIter iter;
+        DBusMessageIter reply_iter;
+        DBusError       error;
+        guint           xid;
+        guint           flags;
+
+        g_return_if_fail (listener != NULL);
+
+        dbus_error_init (&error);
+
+        message = dbus_message_new_method_call (SESSION_NAME,
+                                                SESSION_PATH,
+                                                SESSION_INTERFACE,
+                                                "Inhibit");
+        if (message == NULL) {
+                gs_debug ("Couldn't allocate the dbus message");
+                return;
+        }
+
+        dbus_message_iter_init_append (message, &iter);
+        xid = 0;
+        flags = 8;
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &entry->application);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &xid);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &entry->reason);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &flags);
+
+        /* FIXME: use async? */
+        reply = dbus_connection_send_with_reply_and_block (listener->priv->connection,
+                                                           message,
+                                                           -1,
+                                                           &error);
+        dbus_message_unref (message);
+
+        if (dbus_error_is_set (&error)) {
+                gs_debug ("%s raised:\n %s\n\n", error.name, error.message);
+                dbus_error_free (&error);
+                return;
+        }
+
+        dbus_message_iter_init (reply, &reply_iter);
+        dbus_message_iter_get_basic (&reply_iter, &entry->foreign_cookie);
+
+        dbus_message_unref (reply);
+}
+
+static void
+remove_session_inhibit (GSListener         *listener,
+                        GSListenerRefEntry *entry)
+{
+        DBusMessage    *message;
+        DBusMessage    *reply;
+        DBusMessageIter iter;
+        DBusError       error;
+
+        g_return_if_fail (listener != NULL);
+
+        if (entry->foreign_cookie == 0) {
+                gs_debug ("Can't remove inhibitor from session: Session cookie not set");
+                return;
+        }
+
+        dbus_error_init (&error);
+
+        message = dbus_message_new_method_call (SESSION_NAME,
+                                                SESSION_PATH,
+                                                SESSION_INTERFACE,
+                                                "Uninhibit");
+        if (message == NULL) {
+                gs_debug ("Couldn't allocate the dbus message");
+                return;
+        }
+
+        dbus_message_iter_init_append (message, &iter);
+        dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &entry->foreign_cookie);
+
+        /* FIXME: use async? */
+        reply = dbus_connection_send_with_reply_and_block (listener->priv->connection,
+                                                           message,
+                                                           -1,
+                                                           &error);
+        dbus_message_unref (message);
+
+        if (dbus_error_is_set (&error)) {
+                gs_debug ("%s raised:\n %s\n\n", error.name, error.message);
+                dbus_error_free (&error);
+                return;
+        }
+
+        dbus_message_unref (reply);
+}
+
+static void
 listener_add_ref_entry (GSListener         *listener,
                         int                 entry_type,
                         GSListenerRefEntry *entry)
@@ -614,6 +717,11 @@
         hash = get_hash_for_entry_type (listener, entry_type);
         g_hash_table_insert (hash, &entry->cookie, entry);
 
+        if (entry_type == REF_ENTRY_TYPE_INHIBIT) {
+                /* proxy inhibit over to gnome session */
+                add_session_inhibit (listener, entry);
+        }
+
         listener_ref_entry_check (listener, entry_type);
 }
 
@@ -637,6 +745,11 @@
                           entry->connection);
         }
 
+        if (entry_type == REF_ENTRY_TYPE_INHIBIT) {
+                /* remove inhibit from gnome session */
+                remove_session_inhibit (listener, entry);
+        }
+
         removed = g_hash_table_remove (hash, &cookie);
 
         if (removed) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]