diff --git a/src/core/window-private.h b/src/core/window-private.h index ec2cfd762..8583eefca 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -189,7 +189,6 @@ struct _MetaWindow char *res_class; char *res_name; char *role; - char *sm_client_id; char *wm_client_machine; char *startup_id; diff --git a/src/core/window.c b/src/core/window.c index a3e5a7685..be5f45859 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -324,7 +324,6 @@ meta_window_finalize (GObject *object) if (window->cgroup_path) g_object_unref (window->cgroup_path); - g_free (window->sm_client_id); g_free (window->wm_client_machine); g_free (window->startup_id); g_free (window->role); @@ -1098,7 +1097,6 @@ meta_window_constructed (GObject *object) window->res_class = NULL; window->res_name = NULL; window->role = NULL; - window->sm_client_id = NULL; window->wm_client_machine = NULL; window->is_remote = FALSE; window->startup_id = NULL; diff --git a/src/x11/session.c b/src/x11/session.c index c40a77d9e..8da4cc089 100644 --- a/src/x11/session.c +++ b/src/x11/session.c @@ -32,6 +32,7 @@ #include "core/util-private.h" #include "meta/meta-context.h" #include "x11/meta-x11-display-private.h" +#include "x11/window-x11-private.h" #ifndef HAVE_SM void @@ -959,10 +960,12 @@ save_state (MetaContext *context) while (tmp != NULL) { MetaWindow *window; + MetaWindowX11Private *priv; window = tmp->data; + priv = meta_window_x11_get_private (META_WINDOW_X11 (window)); - if (window->sm_client_id) + if (priv->sm_client_id) { char *sm_client_id; char *res_class; @@ -975,7 +978,7 @@ save_state (MetaContext *context) * in practice they are always ascii though.) */ - sm_client_id = encode_text_as_utf8_markup (window->sm_client_id); + sm_client_id = encode_text_as_utf8_markup (priv->sm_client_id); res_class = window->res_class ? encode_text_as_utf8_markup (window->res_class) : NULL; res_name = window->res_name ? @@ -988,7 +991,7 @@ save_state (MetaContext *context) title = NULL; meta_topic (META_DEBUG_SM, "Saving session managed window %s, client ID '%s'", - window->desc, window->sm_client_id); + window->desc, priv->sm_client_id); fprintf (outfile, " \n", @@ -1566,10 +1569,12 @@ get_possible_matches (MetaWindow *window) GSList *retval; GSList *tmp; gboolean ignore_client_id; + MetaWindowX11Private *priv; retval = NULL; ignore_client_id = g_getenv ("MUTTER_DEBUG_SM") != NULL; + priv = meta_window_x11_get_private (META_WINDOW_X11 (window)); tmp = window_info_list; while (tmp != NULL) @@ -1579,7 +1584,7 @@ get_possible_matches (MetaWindow *window) info = tmp->data; if ((ignore_client_id || - both_null_or_matching (info->id, window->sm_client_id)) && + both_null_or_matching (info->id, priv->sm_client_id)) && both_null_or_matching (info->res_class, window->res_class) && both_null_or_matching (info->res_name, window->res_name) && both_null_or_matching (info->role, window->role)) @@ -1596,10 +1601,10 @@ get_possible_matches (MetaWindow *window) { if (meta_is_verbose ()) { - if (!both_null_or_matching (info->id, window->sm_client_id)) + if (!both_null_or_matching (info->id, priv->sm_client_id)) meta_topic (META_DEBUG_SM, "Window %s has SM client ID %s, saved state has %s, no match", window->desc, - window->sm_client_id ? window->sm_client_id : "(none)", + priv->sm_client_id ? priv->sm_client_id : "(none)", info->id ? info->id : "(none)"); else if (!both_null_or_matching (info->res_class, window->res_class)) meta_topic (META_DEBUG_SM, "Window %s has class %s doesn't match saved class %s, no match", @@ -1677,13 +1682,15 @@ meta_window_lookup_saved_state (MetaWindow *window) { GSList *possibles; const MetaWindowSessionInfo *info; + MetaWindowX11Private *priv = + meta_window_x11_get_private (META_WINDOW_X11 (window)); /* Window is not session managed. * I haven't yet figured out how to deal with these * in a way that doesn't cause broken side effects in * situations other than on session restore. */ - if (window->sm_client_id == NULL) + if (priv->sm_client_id == NULL) { meta_topic (META_DEBUG_SM, "Window %s is not session managed, not checking for saved state", diff --git a/src/x11/window-x11-private.h b/src/x11/window-x11-private.h index 8b3ac2a4e..993a90465 100644 --- a/src/x11/window-x11-private.h +++ b/src/x11/window-x11-private.h @@ -95,6 +95,8 @@ struct _MetaWindowX11Private /* Used by keybindings.c */ gboolean keys_grabbed; /* normal keybindings grabbed */ gboolean grab_on_frame; /* grabs are on the frame */ + + char *sm_client_id; }; MetaWindowX11Private * meta_window_x11_get_private (MetaWindowX11 *window_x11); diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index 18ed0a5f4..0cdc032b2 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -188,7 +188,7 @@ update_sm_hints (MetaWindow *window) Window leader; priv->xclient_leader = None; - window->sm_client_id = NULL; + priv->sm_client_id = NULL; /* If not on the current window, we can get the client * leader from transient parents. If we find a client @@ -211,7 +211,7 @@ update_sm_hints (MetaWindow *window) meta_prop_get_latin1_string (window->display->x11_display, leader, window->display->x11_display->atom_SM_CLIENT_ID, - &window->sm_client_id); + &priv->sm_client_id); } else { @@ -225,9 +225,9 @@ update_sm_hints (MetaWindow *window) meta_prop_get_latin1_string (window->display->x11_display, priv->xwindow, window->display->x11_display->atom_SM_CLIENT_ID, - &window->sm_client_id); + &priv->sm_client_id); - if (window->sm_client_id) + if (priv->sm_client_id) meta_warning ("Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.", window->desc); } @@ -235,7 +235,7 @@ update_sm_hints (MetaWindow *window) meta_verbose ("Window %s client leader: 0x%lx SM_CLIENT_ID: '%s'", window->desc, priv->xclient_leader, - window->sm_client_id ? window->sm_client_id : "none"); + priv->sm_client_id ? priv->sm_client_id : "none"); } static void @@ -2143,6 +2143,17 @@ meta_window_x11_set_property (GObject *object, } } +static void +meta_window_x11_finalize (GObject *object) +{ + MetaWindowX11 *win = META_WINDOW_X11 (object); + MetaWindowX11Private *priv = meta_window_x11_get_instance_private (win); + + g_clear_pointer (&priv->sm_client_id, g_free); + + G_OBJECT_CLASS (meta_window_x11_parent_class)->finalize (object); +} + static void meta_window_x11_class_init (MetaWindowX11Class *klass) { @@ -2152,6 +2163,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass) object_class->get_property = meta_window_x11_get_property; object_class->set_property = meta_window_x11_set_property; object_class->constructed = meta_window_x11_constructed; + object_class->finalize = meta_window_x11_finalize; window_class->manage = meta_window_x11_manage; window_class->unmanage = meta_window_x11_unmanage;