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);
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 */
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);
}
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 */
/* 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) {
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)
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)
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;
}
}
- 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;
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;
XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
}
- client_set_focused(self, TRUE);
-
/* XSync(ob_display, FALSE); XXX Why sync? */
return TRUE;
}
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) {
+ 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)
-{
- return self == focus_client;
+ /* focus state can affect the stacking layer */
+ client_calc_layer(self);
+
+ engine_frame_adjust_focus(self->frame);
}