[Xfce4-commits] <terminal:master> Fix session client startup again.

Nick Schermer noreply at xfce.org
Wed Dec 26 22:22:02 CET 2012


Updating branch refs/heads/master
         to 073f97934dd6fbad43ae4bc04368d024f0ab9744 (commit)
       from 349662efdef4a5c8015ad39e2ad85d943905f587 (commit)

commit 073f97934dd6fbad43ae4bc04368d024f0ab9744
Author: Nick Schermer <nick at xfce.org>
Date:   Wed Dec 26 22:19:32 2012 +0100

    Fix session client startup again.
    
    Positioning is not working all the time, but at least all
    the windows show again.

 terminal/terminal-app.c     |   78 +++++++++++++++++++++++++++++++-----------
 terminal/terminal-options.c |   17 +++++++++-
 terminal/terminal-options.h |    1 +
 terminal/terminal-window.c  |   11 ++----
 terminal/terminal-window.h  |    3 +-
 5 files changed, 79 insertions(+), 31 deletions(-)

diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c
index 4f5241c..3aaba4b 100644
--- a/terminal/terminal-app.c
+++ b/terminal/terminal-app.c
@@ -52,6 +52,7 @@ static void               terminal_app_update_mnemonics         (TerminalApp
 static gboolean           terminal_app_accel_map_load           (gpointer            user_data);
 static gboolean           terminal_app_accel_map_save           (gpointer            user_data);
 static GtkWidget         *terminal_app_create_window            (TerminalApp        *app,
+                                                                 const gchar        *role,
                                                                  gboolean            fullscreen,
                                                                  TerminalVisibility  menubar,
                                                                  TerminalVisibility  borders,
@@ -281,14 +282,29 @@ terminal_app_accel_map_load (gpointer user_data)
 
 static GtkWidget*
 terminal_app_create_window (TerminalApp       *app,
+                            const gchar       *role,
                             gboolean           fullscreen,
                             TerminalVisibility menubar,
                             TerminalVisibility borders,
                             TerminalVisibility toolbar)
 {
   GtkWidget *window;
+  gchar     *new_role = NULL;
+  GtkWindowGroup *group;
+
+  if (role == NULL)
+    {
+      /* create a new window role */
+      new_role =  g_strdup_printf (PACKAGE_NAME "-%u-%d", (guint) time (NULL), g_random_int ());
+      role = new_role;
+    }
+
+  window = terminal_window_new (role, fullscreen, menubar, borders, toolbar);
+
+  group = gtk_window_group_new ();
+  gtk_window_group_add_window (group, GTK_WINDOW (window));
+  g_object_weak_ref (G_OBJECT (window), (GWeakNotify) g_object_unref, group);
 
-  window = terminal_window_new (fullscreen, menubar, borders, toolbar);
   g_signal_connect (G_OBJECT (window), "destroy",
                     G_CALLBACK (terminal_app_window_destroyed), app);
   g_signal_connect (G_OBJECT (window), "new-window",
@@ -297,6 +313,8 @@ terminal_app_create_window (TerminalApp       *app,
                     G_CALLBACK (terminal_app_new_window_with_terminal), app);
   app->windows = g_slist_prepend (app->windows, window);
 
+  g_free (new_role);
+
   return window;
 }
 
@@ -357,7 +375,7 @@ terminal_app_new_window_with_terminal (TerminalWindow *existing,
   terminal_return_if_fail (TERMINAL_IS_SCREEN (terminal));
   terminal_return_if_fail (TERMINAL_IS_APP (app));
 
-  window = terminal_app_create_window (app, FALSE,
+  window = terminal_app_create_window (app, NULL, FALSE,
                                        TERMINAL_VISIBILITY_DEFAULT,
                                        TERMINAL_VISIBILITY_DEFAULT,
                                        TERMINAL_VISIBILITY_DEFAULT);
@@ -427,7 +445,6 @@ terminal_app_save_yourself (XfceSMClient *client,
   if (oargv != NULL)
     {
       terminal_assert (oargv[0] != NULL);
-
       argv[0] = g_strdup (oargv[0]);
     }
   else
@@ -516,7 +533,7 @@ static void
 terminal_app_open_window (TerminalApp        *app,
                           TerminalWindowAttr *attr)
 {
-  TerminalTabAttr *tab_attr;
+  TerminalTabAttr *tab_attr = NULL;
   GtkWidget       *window;
   GtkWidget       *terminal;
   GdkScreen       *screen;
@@ -538,13 +555,12 @@ terminal_app_open_window (TerminalApp        *app,
     {
       /* create new window */
       window = terminal_app_create_window (app,
+                                           attr->role,
                                            attr->fullscreen,
                                            attr->menubar,
                                            attr->borders,
                                            attr->toolbar);
 
-      if (attr->role != NULL)
-        gtk_window_set_role (GTK_WINDOW (window), attr->role);
       if (attr->startup_id != NULL)
         gtk_window_set_startup_id (GTK_WINDOW (window), attr->startup_id);
       if (attr->maximize)
@@ -605,18 +621,6 @@ terminal_app_open_window (TerminalApp        *app,
 
   /* show the window */
   gtk_widget_show (window);
-
-  /* register with session manager on first display
-   * opened by Terminal. This is to ensure that we
-   * get restarted by only _one_ session manager (the
-   * one running on the first display).
-   */
-  if (G_UNLIKELY (app->session_client == NULL))
-    {
-      app->session_client = xfce_sm_client_get ();
-      g_signal_connect (G_OBJECT (app->session_client), "save-state",
-                        G_CALLBACK (terminal_app_save_yourself), app);
-    }
 }
 
 
@@ -636,7 +640,10 @@ terminal_app_process (TerminalApp  *app,
                       gint          argc,
                       GError      **error)
 {
-  GSList *attrs, *lp;
+  GSList             *attrs, *lp;
+  gchar              *sm_client_id = NULL;
+  TerminalWindowAttr *attr;
+  GError             *err = NULL;
 
   attrs = terminal_window_attr_parse (argc, argv, app->windows != NULL, error);
   if (G_UNLIKELY (attrs == NULL))
@@ -644,11 +651,40 @@ terminal_app_process (TerminalApp  *app,
 
   for (lp = attrs; lp != NULL; lp = lp->next)
     {
-      terminal_app_open_window (app, lp->data);
-      terminal_window_attr_free (lp->data);
+      attr = lp->data;
+
+      /* take first sm client id */
+      if (sm_client_id == NULL && attr->sm_client_id != NULL)
+        sm_client_id = g_strdup (attr->sm_client_id);
+
+      terminal_app_open_window (app, attr);
+      terminal_window_attr_free (attr);
+    }
+
+  if (G_LIKELY (app->session_client == NULL))
+    {
+      app->session_client = xfce_sm_client_get_full (XFCE_SM_CLIENT_RESTART_NORMAL,
+                                                     XFCE_SM_CLIENT_PRIORITY_DEFAULT,
+                                                     sm_client_id,
+                                                     xfce_get_homedir (),
+                                                     NULL,
+                                                     PACKAGE_NAME ".desktop");
+      if (xfce_sm_client_connect (app->session_client, &err))
+        {
+          g_signal_connect (G_OBJECT (app->session_client), "save-state",
+                            G_CALLBACK (terminal_app_save_yourself), app);
+          g_signal_connect (G_OBJECT (app->session_client), "quit",
+                            G_CALLBACK (gtk_main_quit), NULL);
+        }
+      else
+        {
+          g_printerr ("Failed to connect to session manager: %s\n", err->message);
+          g_error_free (err);
+        }
     }
 
   g_slist_free (attrs);
+  g_free (sm_client_id);
 
   return TRUE;
 }
diff --git a/terminal/terminal-options.c b/terminal/terminal-options.c
index 52633cf..375b285 100644
--- a/terminal/terminal-options.c
+++ b/terminal/terminal-options.c
@@ -349,6 +349,21 @@ terminal_window_attr_parse (gint              argc,
               win_attr->role = g_strdup (s);
             }
         }
+      else if (terminal_option_cmp ("sm-client-id", 0, argc, argv, &n, &s))
+        {
+          if (G_UNLIKELY (s == NULL))
+            {
+              g_set_error (error, G_SHELL_ERROR, G_SHELL_ERROR_FAILED,
+                           _("Option \"--sm-client-id\" requires specifying "
+                             "the unique session id as its parameter"));
+              goto failed;
+            }
+          else
+            {
+              g_free (win_attr->sm_client_id);
+              win_attr->sm_client_id = g_strdup (s);
+            }
+        }
       else if (terminal_option_cmp ("startup-id", 0, argc, argv, &n, &s))
         {
           if (G_UNLIKELY (s == NULL))
@@ -426,7 +441,6 @@ terminal_window_attr_parse (gint              argc,
       else if (terminal_option_cmp ("help", 'h', argc, argv, &n, NULL)
                || terminal_option_cmp ("version", 'V', argc, argv, &n, NULL)
                || terminal_option_cmp ("disable-server", 0, argc, argv, &n, NULL)
-               || terminal_option_cmp ("sm-client-id", 0, argc, argv, &n, NULL)
                || terminal_option_cmp ("sync", 0, argc, argv, &n, NULL)
                || terminal_option_cmp ("g-fatal-warnings", 0, argc, argv, &n, NULL))
         {
@@ -512,6 +526,7 @@ terminal_window_attr_free (TerminalWindowAttr *attr)
   g_slist_foreach (attr->tabs, (GFunc) terminal_tab_attr_free, NULL);
   g_slist_free (attr->tabs);
   g_free (attr->startup_id);
+  g_free (attr->sm_client_id);
   g_free (attr->geometry);
   g_free (attr->display);
   g_free (attr->role);
diff --git a/terminal/terminal-options.h b/terminal/terminal-options.h
index 4d72a3f..591d36b 100644
--- a/terminal/terminal-options.h
+++ b/terminal/terminal-options.h
@@ -51,6 +51,7 @@ struct _TerminalWindowAttr
   gchar               *geometry;
   gchar               *role;
   gchar               *startup_id;
+  gchar               *sm_client_id;
   gchar               *icon;
   guint                fullscreen : 1;
   TerminalVisibility   menubar;
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index 6d8a64d..a59ca32 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -329,7 +329,6 @@ terminal_window_init (TerminalWindow *window)
   GtkAction      *action;
   GtkWidget      *vbox;
   gboolean        always_show_tabs;
-  gchar          *role;
   GtkRcStyle     *style;
   GdkScreen      *screen;
   GdkColormap    *colormap;
@@ -419,11 +418,6 @@ terminal_window_init (TerminalWindow *window)
   gtk_box_pack_start (GTK_BOX (vbox), window->notebook, TRUE, TRUE, 0);
   gtk_widget_show (window->notebook);
 
-  /* set a unique role on each window (for session management) */
-  role = g_strdup_printf (PACKAGE_NAME "-%p-%d-%d", window, (gint) getpid (), (gint) time (NULL));
-  gtk_window_set_role (GTK_WINDOW (window), role);
-  g_free (role);
-
   /* create encoding action */
   window->encoding_action = terminal_encoding_action_new ("set-encoding", _("Set _Encoding"));
   gtk_action_group_add_action (window->action_group, window->encoding_action);
@@ -1747,7 +1741,8 @@ terminal_window_action_about (GtkAction      *action,
  * Return value:
  **/
 GtkWidget*
-terminal_window_new (gboolean           fullscreen,
+terminal_window_new (const gchar       *role,
+                     gboolean           fullscreen,
                      TerminalVisibility menubar,
                      TerminalVisibility borders,
                      TerminalVisibility toolbar)
@@ -1758,7 +1753,7 @@ terminal_window_new (gboolean           fullscreen,
   gboolean        show_toolbar;
   gboolean        show_borders;
 
-  window = g_object_new (TERMINAL_TYPE_WINDOW, NULL);
+  window = g_object_new (TERMINAL_TYPE_WINDOW, "role", role, NULL);
 
   /* read default preferences */
   g_object_get (G_OBJECT (window->preferences),
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index 1a0922c..f877519 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -38,7 +38,8 @@ typedef struct _TerminalWindow      TerminalWindow;
 
 GType           terminal_window_get_type             (void) G_GNUC_CONST;
 
-GtkWidget      *terminal_window_new                  (gboolean            fullscreen,
+GtkWidget      *terminal_window_new                  (const gchar        *role,
+                                                      gboolean            fullscreen,
                                                       TerminalVisibility  menubar,
                                                       TerminalVisibility  borders,
                                                       TerminalVisibility  toolbar);


More information about the Xfce4-commits mailing list