]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
defn vars at the top of funcs
[chaz/openbox] / openbox / client.c
index 3ef71e92f510a82bf5d2373b8d1edb9662d63cf5..c44fe3436de456a527cf340f771e7c76b95b70f8 100644 (file)
@@ -245,6 +245,7 @@ void client_unmanage(Client *client)
 
     /* reparent the window out of the frame, and free the frame */
     engine_frame_release_client(client->frame, client);
+    client->frame = NULL;
      
     client_list = g_slist_remove(client_list, client);
     stacking_list = g_list_remove(stacking_list, client);
@@ -1919,6 +1920,8 @@ 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;
 }
@@ -1926,7 +1929,30 @@ gboolean client_focus(Client *self)
 void client_unfocus(Client *self)
 {
     g_assert(focus_client == self);
-    focus_set_client(NULL);
+    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.022612 seconds and 4 git commands to generate.