]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
yet more improvements to focus handling
[chaz/openbox] / openbox / client.c
index 556430ec53594ce1d863bf12be441937b23570e1..8d1cc03449d3df97b9461ff4f729b2ed4229648d 100644 (file)
@@ -130,7 +130,7 @@ void client_manage(Window window)
     if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) ||
        XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) {
        XPutBackEvent(ob_display, &e);
-    
+
         grab_server(FALSE);
        return; /* don't manage it */
     }
@@ -186,6 +186,7 @@ void client_manage(Window window)
      
     client_list = g_slist_append(client_list, client);
     stacking_list = g_list_append(stacking_list, client);
+    g_assert(!g_hash_table_lookup(client_map, (gpointer)client->window));
     g_hash_table_insert(client_map, (gpointer)window, client);
 
     /* update the focus lists */
@@ -548,11 +549,13 @@ void client_update_transient_for(Client *self)
     if (c != self->transient_for) {
        if (self->transient_for)
            /* remove from old parent */
-           g_slist_remove(self->transient_for->transients, self);
+           self->transient_for->transients =
+                g_slist_remove(self->transient_for->transients, self);
        self->transient_for = c;
        if (self->transient_for)
            /* add to new parent */
-           g_slist_append(self->transient_for->transients, self);
+           self->transient_for->transients =
+                g_slist_append(self->transient_for->transients, self);
     }
 }
 
@@ -1166,7 +1169,7 @@ static Client *search_focus_tree(Client *node, Client *skip)
     GSList *it;
     Client *ret;
 
-    for (it = node->transients; it != NULL; it = g_slist_next(it)) {
+    for (it = node->transients; it != NULL; it = it->next) {
        Client *c = it->data;
        if (c == skip) continue; /* circular? */
        if ((ret = search_focus_tree(c, skip))) return ret;
@@ -1682,14 +1685,12 @@ void client_set_desktop(Client *self, guint target)
     if (old == DESKTOP_ALL) {
         for (i = 0; i < screen_num_desktops; ++i)
             focus_order[i] = g_list_remove(focus_order[i], self);
+        focus_order[target] = g_list_prepend(focus_order[target], self);
     } else {
         focus_order[old] = g_list_remove(focus_order[old], self);
-    }
-    if (target == DESKTOP_ALL) {
-        for (i = 0; i < screen_num_desktops; ++i)
-            focus_order[i] = g_list_prepend(focus_order[i], self);
-    } else {
-        focus_order[target] = g_list_prepend(focus_order[target], self);
+        if (target == DESKTOP_ALL)
+            for (i = 0; i < screen_num_desktops; ++i)
+                focus_order[i] = g_list_prepend(focus_order[i], self);
     }
 
     dispatch_client(Event_Client_Desktop, self, target, old);
@@ -1922,8 +1923,6 @@ gboolean client_focus(Client *self)
        XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
     }
 
-    client_set_focused(self, TRUE);
-
     /* XSync(ob_display, FALSE); XXX Why sync? */
     return TRUE;
 }
@@ -1931,30 +1930,6 @@ gboolean client_focus(Client *self)
 void client_unfocus(Client *self)
 {
     g_assert(focus_client == self);
-    client_set_focused(self, FALSE);
-}
-
-void client_set_focused(Client *self, gboolean focused)
-{
-    if (focused) {
-        if (focus_client != self) {
-            focus_set_client(self);
-
-            /* focus state can affect the stacking layer */
-            client_calc_layer(self);
-
-            engine_frame_adjust_focus(self->frame);
-        }
-    } else {
-       if (focus_client == self)
-           focus_set_client(NULL);
-
-        /* focus state can affect the stacking layer */
-        client_calc_layer(self);
-
-        if (self->frame != NULL) /* unfocus can happen while being unmanaged */
-            engine_frame_adjust_focus(self->frame);
-    }
 }
 
 gboolean client_focused(Client *self)
This page took 0.022305 seconds and 4 git commands to generate.