Author: olivier
Date: 2008-10-17 12:53:05 +0000 (Fri, 17 Oct 2008)
New Revision: 28281

Modified:
   libxfcegui4/trunk/configure.in.in
   libxfcegui4/trunk/libxfcegui4/session-client.c
Log:
Add support for setting session properties after the connection was established 
with the session manager (required to be able to change restart style)

Modified: libxfcegui4/trunk/configure.in.in
===================================================================
--- libxfcegui4/trunk/configure.in.in   2008-10-17 09:30:43 UTC (rev 28280)
+++ libxfcegui4/trunk/configure.in.in   2008-10-17 12:53:05 UTC (rev 28281)
@@ -7,7 +7,7 @@
 dnl ***************************
 dnl *** Version information ***
 dnl ***************************
-m4_define([libxfcegui4_verinfo], [6:4:2])
+m4_define([libxfcegui4_verinfo], [6:5:2])
 m4_define([libxfcegui4_version_major], [4])
 m4_define([libxfcegui4_version_minor], [5])
 m4_define([libxfcegui4_version_micro], [91])

Modified: libxfcegui4/trunk/libxfcegui4/session-client.c
===================================================================
--- libxfcegui4/trunk/libxfcegui4/session-client.c      2008-10-17 09:30:43 UTC 
(rev 28280)
+++ libxfcegui4/trunk/libxfcegui4/session-client.c      2008-10-17 12:53:05 UTC 
(rev 28281)
@@ -916,24 +916,67 @@
 
 void client_session_set_restart_style(SessionClient * session_client, 
SessionRestartStyle value)
 {
+#ifdef HAVE_LIBSM
+    SmProp prop, *props[1];
+    SmPropValue propval;
+    char hint = SmRestartIfRunning;
+#endif /* HAVE_LIBSM */    
+    session_client->restart_style = value;
+
+#ifdef HAVE_LIBSM
     if (session_client->session_connection != NULL) {
-        g_error("SessionClient: changing \"restart_style\" while connected to 
session manager is not implemented.");
-        return;
+        switch (session_client->restart_style) {
+            case SESSION_RESTART_IF_RUNNING:
+                hint = SmRestartIfRunning;
+                break;
+            case SESSION_RESTART_ANYWAY:
+                hint = SmRestartAnyway;
+                break;
+            case SESSION_RESTART_IMMEDIATELY:
+                hint = SmRestartImmediately;
+                break;
+            case SESSION_RESTART_NEVER:
+            default:
+                hint = SmRestartNever;
+                break;
+        }
+
+        prop.name = SmRestartStyleHint;
+        prop.type = SmCARD8;
+        prop.num_vals = 1;
+        prop.vals = &propval;
+        propval.value = &hint;
+        propval.length = 1;
+        props[0] = ∝
+
+        SmcSetProperties ((SmcConn) session_client->session_connection, 1, 
props);
     }
-    
-    session_client->restart_style = value;
+#endif /* HAVE_LIBSM */    
 }
 
 /* void client_session_set_interact_style(SessionClient * session_client, 
SessionInteractStyle value) */
 
 void client_session_set_priority(SessionClient * session_client, gchar value)
 {
+#ifdef HAVE_LIBSM
+    SmProp prop, *props[1];
+    SmPropValue propval;
+#endif /* HAVE_LIBSM */    
+
+    session_client->priority = value;
+#ifdef HAVE_LIBSM
     if (session_client->session_connection != NULL) {
-        g_error("SessionClient: changing \"priority\" while connected to 
session manager is not implemented.");
-        return;
+        prop.name = "_GSM_Priority";
+        prop.type = SmCARD8;
+        prop.num_vals = 1;
+        prop.vals = &propval;
+        propval.value = &session_client->priority;
+        propval.length = 1;
+        props[0] = ∝
+
+        SmcSetProperties ((SmcConn) session_client->session_connection, 1, 
props);
     }
-    
-    session_client->priority = value;
+#endif /* HAVE_LIBSM */    
 }
 
 void client_session_set_client_id(SessionClient * session_client, gchar const* 
value)
@@ -953,28 +996,61 @@
 
 void client_session_set_current_directory(SessionClient * session_client, 
gchar const* value)
 {
-    if (session_client->session_connection != NULL) {
-        g_error("SessionClient: changing \"current_directory\" while connected 
to session manager is not implemented.");
-        return;
-    }
-    
+#ifdef HAVE_LIBSM
+    SmProp prop, *props[1];
+    SmPropValue propval;
+#endif /* HAVE_LIBSM */    
+
     if (session_client->current_directory != value) {
         g_free(session_client->current_directory);
-        session_client->current_directory = g_strdup(value);
+        session_client->current_directory = NULL;
+        if (value) {
+            session_client->current_directory = g_strdup(value);
+        }
     }
+#ifdef HAVE_LIBSM
+    if (session_client->session_connection != NULL) {
+        prop.name = SmCurrentDirectory;
+        prop.type = SmARRAY8;
+        prop.num_vals = 1;
+        prop.vals = &propval;
+        if (session_client->current_directory) {
+            propval.value = (char *) session_client->current_directory;
+        }
+        else {
+            propval.value = (char *) g_get_home_dir ();
+        }
+        propval.length = strlen (propval.value);
+        props[0] = ∝
+
+        SmcSetProperties ((SmcConn) session_client->session_connection, 1, 
props);
+    }
+#endif /* HAVE_LIBSM */    
 }
 
 void client_session_set_program(SessionClient * session_client, gchar const* 
value)
 {
-    if (session_client->session_connection != NULL) {
-        g_error("SessionClient: changing \"program\" while connected to 
session manager is not implemented.");
-        return;
-    }
+#ifdef HAVE_LIBSM
+    SmProp prop, *props[1];
+    SmPropValue propval;
+#endif /* HAVE_LIBSM */    
     
     if (session_client->program != value) {
         g_free(session_client->program);
         session_client->program = g_strdup(value);
     }
+#ifdef HAVE_LIBSM
+    if (session_client->session_connection != NULL) {
+        prop.name = SmProgram;
+        prop.type = SmARRAY8;
+        prop.num_vals = 1;
+        prop.vals = &propval;
+        propval.value = session_client->program;
+        propval.length = strlen (session_client->program);
+
+        SmcSetProperties ((SmcConn) session_client->session_connection, 1, 
props);
+    }
+#endif /* HAVE_LIBSM */    
 }
 
 void client_session_set_clone_command(SessionClient * session_client, gchar** 
const value)

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to