]> Dogcows Code - chaz/openbox/commitdiff
the session properties are not set on the group leader, they are set on the "client...
authorDana Jansens <danakj@orodu.net>
Mon, 7 May 2007 00:10:15 +0000 (00:10 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 7 May 2007 00:10:15 +0000 (00:10 +0000)
openbox/client.c
openbox/client.h
openbox/event.c
openbox/prop.c
openbox/prop.h

index 3cef307e41de58096533c9110f3bba3f18e2760f..52dfaaa3aa1434d15c07e9eacb5bfefdc9b92a89 100644 (file)
@@ -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;                                                     \
index 2863a98f5dde5a1d7059c506a74664303e8c631f..b046e665d9314d553a30b23e75b336092695c901 100644 (file)
@@ -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);
index ff21918be9c162d049d1a437b93e39f7eb38c791..bb6a42f964de889d8ec1d3d3d907d067c3d7efb3 100644 (file)
@@ -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;
index 15be0292698d86e54fe18195a8a241d3bdc072a4..6bd05cc6a4fe0163653c40a3adb3a86e303a1c3a 100644 (file)
@@ -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");
index e256d480dd5749610b084c0fbefb4c01a87215cb..eaa1bf2d8897f495e07d3c15c9348920f6571bec 100644 (file)
@@ -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 */
This page took 0.034635 seconds and 4 git commands to generate.