if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) ||
XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) {
XPutBackEvent(ob_display, &e);
if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) ||
XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e)) {
XPutBackEvent(ob_display, &e);
client_list = g_slist_append(client_list, client);
stacking_list = g_list_append(stacking_list, client);
client_list = g_slist_append(client_list, client);
stacking_list = g_list_append(stacking_list, client);
g_hash_table_insert(client_map, (gpointer)window, client);
/* update the focus lists */
g_hash_table_insert(client_map, (gpointer)window, client);
/* update the focus lists */
g_message("Unmanaging window: %lx", client->window);
dispatch_client(Event_Client_Destroy, client, 0, 0);
g_message("Unmanaging window: %lx", client->window);
dispatch_client(Event_Client_Destroy, client, 0, 0);
/* remove the window from our save set */
XChangeSaveSet(ob_display, client->window, SetModeDelete);
/* remove the window from our save set */
XChangeSaveSet(ob_display, client->window, SetModeDelete);
- /* dispatch the unmapped event */
- dispatch_client(Event_Client_Unmapped, client, 0, 0);
-
- /* 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_list = g_slist_remove(client_list, client);
stacking_list = g_list_remove(stacking_list, client);
g_hash_table_remove(client_map, (gpointer)client->window);
+ /* 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);
/* 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;
+
/* can't maximize without moving/resizing */
if (!((self->functions & Func_Move) && (self->functions & Func_Resize)))
/* can't maximize without moving/resizing */
if (!((self->functions & Func_Move) && (self->functions & Func_Resize)))
if (self->frame) {
/* change the decors on the frame, and with more/less decorations,
we may also need to be repositioned */
if (self->frame) {
/* change the decors on the frame, and with more/less decorations,
we may also need to be repositioned */
data = g_ptr_array_new();
if (PROP_GETSA(self->window, wm_class, string, data)) {
if (data->len > 0)
data = g_ptr_array_new();
if (PROP_GETSA(self->window, wm_class, string, data)) {
if (data->len > 0)
if (PROP_GETS(self->window, wm_window_role, string, s))
self->role = g_strdup(s);
if (PROP_GETS(self->window, wm_window_role, string, s))
self->role = g_strdup(s);
- if (self->res_name == NULL) self->res_name = g_strdup("");
- if (self->res_class == NULL) self->res_class = g_strdup("");
+ if (self->name == NULL) self->name = g_strdup("");
+ if (self->class == NULL) self->class = g_strdup("");
Client *c = it->data;
if (c == skip) continue; /* circular? */
if ((ret = search_focus_tree(c, skip))) return ret;
Client *c = it->data;
if (c == skip) continue; /* circular? */
if ((ret = search_focus_tree(c, skip))) return ret;
- engine_frame_adjust_area(self->frame);
-
- if (moved) {
- if (!user || final) {
- XEvent event;
- event.type = ConfigureNotify;
- event.xconfigure.display = ob_display;
- event.xconfigure.event = self->window;
- event.xconfigure.window = self->window;
+ if (moved || resized)
+ engine_frame_adjust_area(self->frame, moved, resized);
+
+ if (!user || final) {
+ XEvent event;
+ event.type = ConfigureNotify;
+ event.xconfigure.display = ob_display;
+ event.xconfigure.event = self->window;
+ event.xconfigure.window = self->window;
- /* root window coords with border in mind */
- event.xconfigure.x = x - self->border_width +
- self->frame->size.left;
- event.xconfigure.y = y - self->border_width +
- self->frame->size.top;
+ /* root window coords with border in mind */
+ event.xconfigure.x = x - self->border_width +
+ self->frame->size.left;
+ event.xconfigure.y = y - self->border_width +
+ self->frame->size.top;
- event.xconfigure.width = self->area.width;
- event.xconfigure.height = self->area.height;
- event.xconfigure.border_width = self->border_width;
- event.xconfigure.above = self->frame->plate;
- event.xconfigure.override_redirect = FALSE;
- XSendEvent(event.xconfigure.display, event.xconfigure.window,
- FALSE, StructureNotifyMask, &event);
- }
+ event.xconfigure.width = self->area.width;
+ event.xconfigure.height = self->area.height;
+ event.xconfigure.border_width = self->border_width;
+ event.xconfigure.above = self->frame->plate;
+ event.xconfigure.override_redirect = FALSE;
+ XSendEvent(event.xconfigure.display, event.xconfigure.window,
+ FALSE, StructureNotifyMask, &event);
}
void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
}
void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
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);
}
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);
}
if (old == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i)
focus_order[i] = g_list_remove(focus_order[i], self);
if (old == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i)
focus_order[i] = g_list_remove(focus_order[i], 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);
}
dispatch_client(Event_Client_Desktop, self, target, old);
- XSetInputFocus(ob_display, self->window, RevertToNone, CurrentTime);
+ XSetInputFocus(ob_display, self->window, RevertToNone,
+ 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);
}
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);
}
-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);