]> Dogcows Code - chaz/openbox/commitdiff
add the client_set_focused function.
authorDana Jansens <danakj@orodu.net>
Fri, 21 Mar 2003 10:26:26 +0000 (10:26 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 21 Mar 2003 10:26:26 +0000 (10:26 +0000)
make focus state be changed internally immediately after calling the X functions to make it so, basically, assume their success. this elimiates races all over the place with our state vs the server's state.

openbox/client.c
openbox/client.h

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)
index 6f303ffff689014fcaf0f3415715b26953adb9d0..c7acf7b882596bffe2ab766edc6288ee2a7440c1 100644 (file)
@@ -320,6 +320,11 @@ gboolean client_normal(Client *self);
 /* Returns if the window is focused */
 gboolean client_focused(Client *self);
 
+/*! Sets the client to a focused or unfocused state. This does not actually
+  change the input focus, but rather is used once focus has been moved to tell
+  the client that it is so. */
+void client_set_focused(Client *self, gboolean focused);
+
 /*! Move and/or resize the window.
   This also maintains things like the client's minsize, and size increments.
   @param anchor The corner to keep in the same position when resizing.
This page took 0.028187 seconds and 4 git commands to generate.