all repos — openbox @ f506cbceae9e3d41f1e6e09d7c5e83ab3935adf9

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

f506cbceae9e3d41f1e6e09d7c5e83ab3935adf9

parent

b02947c09fde26756924a03507a750048169c346

5 files changed, 91 insertions(+), 96 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -68,6 +68,7 @@

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 @@

#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 @@ PROP_SETS(self->window, net_wm_visible_icon_name, data);

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 @@ MAX(data[2],0), MAX(data[3],0));

} } -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(""); - if (PROP_GETS(self->window, wm_client_machine, locale, &data) || - (self->group && - PROP_GETS(self->group->leader, wm_client_machine, locale, &data))) - { + /* 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]; + gethostname(localhost, 127); localhost[127] = '\0'; - if (strcmp(localhost, data)) - self->client_machine = data; + if (strcmp(localhost, s) != 0) + self->client_machine = s; } }

@@ -3581,46 +3627,6 @@ if (client_search_transient(sit->data, search))

return 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) \
M openbox/client.hopenbox/client.h

@@ -558,10 +558,6 @@ */

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 */

@@ -649,8 +645,6 @@ /*! Set a client window to have decorations or not */

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();
M openbox/event.copenbox/event.c

@@ -1167,10 +1167,6 @@ msgtype == prop_atoms.wm_name ||

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 @@ else if (msgtype == prop_atoms.net_wm_sync_request_counter) {

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;
M openbox/prop.copenbox/prop.c

@@ -50,6 +50,7 @@ CREATE(wm_class, "WM_CLASS");

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");
M openbox/prop.hopenbox/prop.h

@@ -52,6 +52,7 @@ Atom wm_class;

Atom wm_window_role; Atom wm_client_machine; Atom wm_command; + Atom wm_client_leader; Atom motif_wm_hints; /* SM atoms */