]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
only configure the engine if something changed
[chaz/openbox] / openbox / client.c
index 8d1cc03449d3df97b9461ff4f729b2ed4229648d..bebd8949dc6756167dfee2d88d9a3c1a122b620f 100644 (file)
@@ -239,17 +239,6 @@ void client_unmanage(Client *client)
 
     engine_frame_hide(client->frame);
 
-    /* dispatch the unmapped event */
-    dispatch_client(Event_Client_Unmapped, client, 0, 0);
-    g_assert(client != NULL);
-
-    /* give the client its border back */
-    client_toggle_border(client, TRUE);
-
-    /* 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);
     g_hash_table_remove(client_map, (gpointer)client->window);
@@ -278,11 +267,22 @@ void client_unmanage(Client *client)
        client_calc_layer(it->data);
     }
 
+    /* dispatch the unmapped event */
+    dispatch_client(Event_Client_Unmapped, client, 0, 0);
+    g_assert(client != NULL);
+
     /* unfocus the client (dispatchs the focus event) (we're out of the
      transient lists already, so being modal doesn't matter) */
     if (client_focused(client))
        client_unfocus(client);
 
+    /* give the client its border back */
+    client_toggle_border(client, TRUE);
+
+    /* reparent the window out of the frame, and free the frame */
+    engine_frame_release_client(client->frame, client);
+    client->frame = NULL;
+     
     if (ob_state != State_Exiting) {
        /* these values should not be persisted across a window
           unmapping/mapping */
@@ -822,7 +822,7 @@ void client_setup_decor_and_functions(Client *self)
     if (self->frame) {
        /* change the decors on the frame, and with more/less decorations,
            we may also need to be repositioned */
-       engine_frame_adjust_area(self->frame);
+       engine_frame_adjust_area(self->frame, TRUE, TRUE);
        /* with new decor, the window's maximized size may change */
        client_remaximize(self);
     }
@@ -938,7 +938,7 @@ void client_update_wmhints(Client *self)
 
     if (ur != self->urgent) {
        self->urgent = ur;
-       g_message("Urgent Hint for 0x%lx: %s\n", self->window,
+       g_message("Urgent Hint for 0x%lx: %s", self->window,
                  ur ? "ON" : "OFF");
        /* fire the urgent callback if we're mapped, otherwise, wait until
           after we're mapped */
@@ -1390,7 +1390,8 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
 
     /* move/resize the frame to match the request */
     if (self->frame) {
-        engine_frame_adjust_area(self->frame);
+        if (moved || resized)
+            engine_frame_adjust_area(self->frame, moved, resized);
 
        if (moved) {
            if (!user || final) {
@@ -1511,6 +1512,9 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
     client_change_state(self);
     client_showhide(self);
     screen_update_struts();
+
+    dispatch_client(iconic ? Event_Client_Unmapped : Event_Client_Mapped,
+                    self, 0, 0);
 }
 
 void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
@@ -1627,7 +1631,7 @@ void client_shade(Client *self, gboolean shade)
     self->shaded = shade;
     client_change_state(self);
     /* resize the frame to just the titlebar */
-    engine_frame_adjust_area(self->frame);
+    engine_frame_adjust_area(self->frame, FALSE, FALSE);
 }
 
 void client_close(Client *self)
@@ -1650,7 +1654,7 @@ void client_close(Client *self)
     ce.xclient.window = self->window;
     ce.xclient.format = 32;
     ce.xclient.data.l[0] = prop_atoms.wm_delete_window;
-    ce.xclient.data.l[1] = CurrentTime;
+    ce.xclient.data.l[1] = event_lasttime;
     ce.xclient.data.l[2] = 0l;
     ce.xclient.data.l[3] = 0l;
     ce.xclient.data.l[4] = 0l;
@@ -1902,11 +1906,9 @@ gboolean client_focus(Client *self)
        }
     }
 
-    if (client_focused(self))
-        return TRUE;
-
     if (self->can_focus)
-       XSetInputFocus(ob_display, self->window, RevertToNone, CurrentTime);
+       XSetInputFocus(ob_display, self->window, RevertToNone,
+                       CurrentTime);
 
     if (self->focus_notify) {
        XEvent ce;
@@ -1916,7 +1918,7 @@ gboolean client_focus(Client *self)
        ce.xclient.window = self->window;
        ce.xclient.format = 32;
        ce.xclient.data.l[0] = prop_atoms.wm_take_focus;
-       ce.xclient.data.l[1] = event_lasttime;
+       ce.xclient.data.l[1] = CurrentTime;
        ce.xclient.data.l[2] = 0l;
        ce.xclient.data.l[3] = 0l;
        ce.xclient.data.l[4] = 0l;
@@ -1930,9 +1932,26 @@ gboolean client_focus(Client *self)
 void client_unfocus(Client *self)
 {
     g_assert(focus_client == self);
+    client_set_focused(self, FALSE);
 }
 
 gboolean client_focused(Client *self)
 {
     return self == focus_client;
 }
+
+void client_set_focused(Client *self, gboolean focused)
+{
+    if (focused) {
+        if (focus_client != self)
+            focus_set_client(self);
+    } else {
+       if (focus_client == self)
+           focus_set_client(NULL);
+    }
+
+    /* focus state can affect the stacking layer */
+    client_calc_layer(self);
+
+    engine_frame_adjust_focus(self->frame);
+}
This page took 0.028011 seconds and 4 git commands to generate.