[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