summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c172
-rw-r--r--openbox/client.h6
-rw-r--r--openbox/event.c7
-rw-r--r--openbox/prop.c1
-rw-r--r--openbox/prop.h1
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 */