From f506cbceae9e3d41f1e6e09d7c5e83ab3935adf9 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 7 May 2007 00:10:15 +0000 Subject: [PATCH] the session properties are not set on the group leader, they are set on the "client leader" which is in the WM_CLIENT_LEADER property. also they are all set when the window maps, and not to be changed thereafter. --- openbox/client.c | 172 ++++++++++++++++++++++++----------------------- openbox/client.h | 6 -- openbox/event.c | 7 -- openbox/prop.c | 1 + openbox/prop.h | 1 + 5 files changed, 91 insertions(+), 96 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 3cef307e..52dfaaa3 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -68,6 +68,7 @@ static GSList *client_destructors = NULL; static void client_get_all(ObClient *self); static void client_toggle_border(ObClient *self, gboolean show); static void client_get_startup_id(ObClient *self); +static void client_get_session_ids(ObClient *self); static void client_get_area(ObClient *self); static void client_get_desktop(ObClient *self); static void client_get_state(ObClient *self); @@ -75,7 +76,6 @@ static void client_get_layer(ObClient *self); static void client_get_shaped(ObClient *self); static void client_get_mwm_hints(ObClient *self); static void client_get_gravity(ObClient *self); -static void client_get_client_machine(ObClient *self); static void client_get_colormap(ObClient *self); static void client_get_transientness(ObClient *self); static void client_change_allowed_actions(ObClient *self); @@ -994,12 +994,12 @@ static void client_get_all(ObClient *self) #ifdef SYNC client_update_sync_request_counter(self); #endif - client_get_client_machine(self); + + /* get the session related properties */ + client_get_session_ids(self); + client_get_colormap(self); client_update_title(self); - client_update_class(self); - client_update_sm_client_id(self); - client_update_command(self); client_update_strut(self); client_update_icons(self); client_update_user_time(self); @@ -1858,34 +1858,6 @@ void client_update_title(ObClient *self) self->icon_title = data; } -void client_update_class(ObClient *self) -{ - gchar **data; - gchar *s; - - if (self->name) g_free(self->name); - if (self->class) g_free(self->class); - if (self->role) g_free(self->role); - - self->name = self->class = self->role = NULL; - - if (PROP_GETSS(self->window, wm_class, locale, &data)) { - if (data[0]) { - self->name = g_strdup(data[0]); - if (data[1]) - self->class = g_strdup(data[1]); - } - g_strfreev(data); - } - - if (PROP_GETS(self->window, wm_window_role, locale, &s)) - self->role = s; - - if (self->name == NULL) self->name = g_strdup(""); - if (self->class == NULL) self->class = g_strdup(""); - if (self->role == NULL) self->role = g_strdup(""); -} - void client_update_strut(ObClient *self) { guint num; @@ -2072,21 +2044,95 @@ void client_update_icon_geometry(ObClient *self) } } -static void client_get_client_machine(ObClient *self) +static void client_get_session_ids(ObClient *self) { - gchar *data = NULL; - gchar localhost[128]; + guint32 leader; + gboolean got; + gchar *s; + gchar **ss; - g_free(self->client_machine); + if (!PROP_GET32(self->window, wm_client_leader, window, &leader)) + leader = None; + + /* get the SM_CLIENT_ID */ + got = FALSE; + if (leader) + got = PROP_GETS(leader, sm_client_id, locale, &self->sm_client_id); + if (!got) + PROP_GETS(self->window, sm_client_id, locale, &self->sm_client_id); + + /* get the WM_CLASS (name and class). make them "" if they are not + provided */ + got = FALSE; + if (leader) + got = PROP_GETSS(leader, wm_class, locale, &ss); + if (!got) + got = PROP_GETSS(self->window, wm_class, locale, &ss); + + if (got) { + if (ss[0]) { + self->name = g_strdup(ss[0]); + if (ss[1]) + self->class = g_strdup(ss[1]); + } + g_strfreev(ss); + } + + if (self->name == NULL) self->name = g_strdup(""); + if (self->class == NULL) self->class = g_strdup(""); + + /* get the WM_WINDOW_ROLE. make it "" if it is not provided */ + got = FALSE; + if (leader) + got = PROP_GETS(leader, wm_window_role, locale, &s); + if (!got) + got = PROP_GETS(self->window, wm_window_role, locale, &s); + + if (got) + self->role = s; + else + self->role = g_strdup(""); + + /* get the WM_COMMAND */ + got = FALSE; + + if (leader) + got = PROP_GETSS(leader, wm_command, locale, &ss); + if (!got) + got = PROP_GETSS(self->window, wm_command, locale, &ss); + + if (got) { + /* merge/mash them all together */ + gchar *merge = NULL; + gint i; + + for (i = 0; ss[i]; ++i) { + gchar *tmp = merge; + if (merge) + merge = g_strconcat(merge, ss[i], NULL); + else + merge = g_strconcat(ss[i], NULL); + g_free(tmp); + } + g_strfreev(ss); + + self->wm_command = merge; + } + + /* get the WM_CLIENT_MACHINE */ + got = FALSE; + if (leader) + got = PROP_GETS(leader, wm_client_machine, locale, &s); + if (!got) + got = PROP_GETS(self->window, wm_client_machine, locale, &s); + + if (got) { + gchar localhost[128]; - if (PROP_GETS(self->window, wm_client_machine, locale, &data) || - (self->group && - PROP_GETS(self->group->leader, wm_client_machine, locale, &data))) - { gethostname(localhost, 127); localhost[127] = '\0'; - if (strcmp(localhost, data)) - self->client_machine = data; + if (strcmp(localhost, s) != 0) + self->client_machine = s; } } @@ -3583,46 +3629,6 @@ ObClient *client_search_transient(ObClient *self, ObClient *search) return NULL; } -void client_update_sm_client_id(ObClient *self) -{ - g_free(self->sm_client_id); - self->sm_client_id = NULL; - - if (!PROP_GETS(self->window, sm_client_id, locale, &self->sm_client_id)) - if (self->group) - PROP_GETS(self->group->leader, sm_client_id, locale, - &self->sm_client_id); -} - -void client_update_command(ObClient *self) -{ - gchar **data; - - g_free(self->wm_command); - self->wm_command = NULL; - - if (PROP_GETSS(self->window, wm_command, locale, &data) || - (self->group && - PROP_GETSS(self->group->leader, wm_command, locale, &data))) - { - /* merge/mash them all together */ - gchar *merge = NULL; - gint i; - - for (i = 0; data[i]; ++i) { - gchar *tmp = merge; - if (merge) - merge = g_strconcat(merge, data[i], NULL); - else - merge = g_strconcat(data[i], NULL); - g_free(tmp); - } - g_strfreev(data); - - self->wm_command = merge; - } -} - #define WANT_EDGE(cur, c) \ if(cur == c) \ continue; \ diff --git a/openbox/client.h b/openbox/client.h index 2863a98f..b046e665 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -558,10 +558,6 @@ void client_update_normal_hints(ObClient *self); void client_update_wmhints(ObClient *self); /*! Updates the window's title and icon title */ void client_update_title(ObClient *self); -/*! Updates the command used to run the program */ -void client_update_command(ObClient *self); -/*! Updates the window's application name and class */ -void client_update_class(ObClient *self); /*! Updates the strut for the client */ void client_update_strut(ObClient *self); /*! Updates the window's icons */ @@ -650,8 +646,6 @@ void client_set_undecorated(ObClient *self, gboolean undecorated); guint client_monitor(ObClient *self); -void client_update_sm_client_id(ObClient *self); - ObClient* client_under_pointer(); gboolean client_has_group_siblings(ObClient *self); diff --git a/openbox/event.c b/openbox/event.c index ff21918b..bb6a42f9 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1167,10 +1167,6 @@ static void event_handle_client(ObClient *client, XEvent *e) msgtype == prop_atoms.net_wm_icon_name || msgtype == prop_atoms.wm_icon_name) { client_update_title(client); - } else if (msgtype == prop_atoms.wm_command) { - client_update_command(client); - } else if (msgtype == prop_atoms.wm_class) { - client_update_class(client); } else if (msgtype == prop_atoms.wm_protocols) { client_update_protocols(client); client_setup_decor_and_functions(client); @@ -1192,9 +1188,6 @@ static void event_handle_client(ObClient *client, XEvent *e) client_update_sync_request_counter(client); } #endif - else if (msgtype == prop_atoms.sm_client_id) { - client_update_sm_client_id(client); - } case ColormapNotify: client_update_colormap(client, e->xcolormap.colormap); break; diff --git a/openbox/prop.c b/openbox/prop.c index 15be0292..6bd05cc6 100644 --- a/openbox/prop.c +++ b/openbox/prop.c @@ -50,6 +50,7 @@ void prop_startup() CREATE(wm_window_role, "WM_WINDOW_ROLE"); CREATE(wm_client_machine, "WM_CLIENT_MACHINE"); CREATE(wm_command, "WM_COMMAND"); + CREATE(wm_client_leader, "WM_CLIENT_LEADER"); CREATE(motif_wm_hints, "_MOTIF_WM_HINTS"); CREATE(sm_client_id, "SM_CLIENT_ID"); diff --git a/openbox/prop.h b/openbox/prop.h index e256d480..eaa1bf2d 100644 --- a/openbox/prop.h +++ b/openbox/prop.h @@ -52,6 +52,7 @@ typedef struct Atoms { Atom wm_window_role; Atom wm_client_machine; Atom wm_command; + Atom wm_client_leader; Atom motif_wm_hints; /* SM atoms */ -- 2.44.0