#include "prop.h"
#include "extensions.h"
#include "frame.h"
-#include "engine.h"
#include "event.h"
#include "grab.h"
#include "focus.h"
#include "stacking.h"
#include "dispatch.h"
#include "group.h"
+#include "config.h"
#include <glib.h>
#include <X11/Xutil.h>
client_startup_stack_order = NULL;
client_startup_stack_size = 0;
- if (focus_new)
+ if (config_focus_new)
focus_fallback(Fallback_NoFocus);
}
XChangeSaveSet(ob_display, window, SetModeInsert);
/* create the decoration frame for the client window */
- self->frame = engine_frame_new();
+ self->frame = frame_new();
- engine_frame_grab_client(self->frame, self);
+ frame_grab_client(self->frame, self);
client_apply_startup_state(self);
dispatch_client(Event_Client_Mapped, self, 0, 0);
- if (ob_state != State_Starting && focus_new)
- client_focus(self);
+ /* focus the new window? */
+ if (ob_state != State_Starting) {
+ if (config_focus_new)
+ client_focus(self);
+ else if (self->transient_for) {
+ if (self->transient_for != TRAN_GROUP) {/* transient of a window */
+ if (focus_client == self->transient_for)
+ client_focus(self);
+ } else { /* transient of a group */
+ GSList *it;
+
+ for (it = self->group->members; it; it = it->next)
+ if (focus_client == it->data) {
+ client_focus(self);
+ break;
+ }
+ }
+ }
+ }
/* update the list hints */
client_set_list();
/* we dont want events no more */
XSelectInput(ob_display, self->window, NoEventMask);
- engine_frame_hide(self->frame);
+ frame_hide(self->frame);
client_list = g_list_remove(client_list, self);
stacking_list = g_list_remove(stacking_list, self);
}
}
- client_unfocus(self);
+ if (focus_client == self)
+ client_unfocus(self);
/* remove from its group */
if (self->group) {
client_toggle_border(self, TRUE);
/* reparent the window out of the frame, and free the frame */
- engine_frame_release_client(self->frame, self);
+ frame_release_client(self->frame, self);
self->frame = NULL;
if (ob_state != State_Exiting) {
break;
case Type_Dialog:
- /* dialogs cannot be maximized */
+ case Type_Utility:
+ /* these windows cannot be maximized */
self->decorations &= ~Decor_Maximize;
self->functions &= ~Func_Maximize;
break;
case Type_Menu:
case Type_Toolbar:
- case Type_Utility:
/* these windows get less functionality */
self->decorations &= ~(Decor_Iconify | Decor_Handle);
self->functions &= ~(Func_Iconify | Func_Resize);
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, TRUE, TRUE);
+ frame_adjust_area(self->frame, TRUE, TRUE);
/* with new decor, the window's maximized size may change */
client_remaximize(self);
}
self->pixmap_icon_mask = None;
if (self->frame)
- engine_frame_adjust_icon(self->frame);
+ frame_adjust_icon(self->frame);
}
}
self->title = data;
if (self->frame)
- engine_frame_adjust_title(self->frame);
+ frame_adjust_title(self->frame);
}
void client_update_icon_title(Client *self)
}
if (self->frame)
- engine_frame_adjust_icon(self->frame);
+ frame_adjust_icon(self->frame);
}
void client_update_kwm_icon(Client *self)
self->pixmap_icon = self->pixmap_icon_mask = None;
}
if (self->frame)
- engine_frame_adjust_icon(self->frame);
+ frame_adjust_icon(self->frame);
}
static void client_change_state(Client *self)
client_calc_layer(self);
if (self->frame)
- engine_frame_adjust_state(self->frame);
+ frame_adjust_state(self->frame);
}
static Client *search_focus_tree(Client *node, Client *skip)
{
if (client_should_show(self))
- engine_frame_show(self->frame);
+ frame_show(self->frame);
else
- engine_frame_hide(self->frame);
+ frame_hide(self->frame);
}
gboolean client_normal(Client *self) {
/* move/resize the frame to match the request */
if (self->frame) {
if (moved || resized)
- engine_frame_adjust_area(self->frame, moved, resized);
+ frame_adjust_area(self->frame, moved, resized);
if (!user || final) {
XEvent event;
void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
{
+ /* move up the transient chain as far as possible first if deiconifying */
+ if (!iconic)
+ while (self->transient_for) {
+ if (self->transient_for != TRAN_GROUP) {
+ if (self->transient_for->iconic == iconic)
+ break;
+ self = self->transient_for;
+ } else {
+ GSList *it;
+
+ /* the check for TRAN_GROUP is to prevent an infinate loop with
+ 2 transients of the same group at the head of the group's
+ members list */
+ for (it = self->group->members; it; it = it->next) {
+ Client *c = it->data;
+
+ if (c != self && c->transient_for->iconic != iconic &&
+ (c->transient_for != TRAN_GROUP ||
+ c->group != self->group)) {
+ self = it->data;
+ break;
+ }
+ }
+ if (it == NULL) break;
+ }
+ }
+
if (self->iconic == iconic) return; /* nothing to do */
g_message("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"),
self->shaded = shade;
client_change_state(self);
/* resize the frame to just the titlebar */
- engine_frame_adjust_area(self->frame, FALSE, FALSE);
+ frame_adjust_area(self->frame, FALSE, FALSE);
}
void client_close(Client *self)
self->desktop = target;
PROP_SET32(self->window, net_wm_desktop, cardinal, target);
/* the frame can display the current desktop state */
- engine_frame_adjust_state(self->frame);
+ frame_adjust_state(self->frame);
/* 'move' the window to the new desktop */
if (!donthide)
client_showhide(self);
focus_order[old] = g_list_remove(focus_order[old], self);
if (target == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i) {
- if (focus_new)
+ if (config_focus_new)
focus_order[i] = g_list_prepend(focus_order[i], self);
else
focus_order[i] = g_list_append(focus_order[i], self);
}
} else {
- if (focus_new)
+ if (config_focus_new)
focus_order[target] = g_list_prepend(focus_order[target], self);
else
focus_order[target] = g_list_append(focus_order[target], self);
void client_unfocus(Client *self)
{
g_assert(focus_client == self);
+#ifndef DEBUG_FOCUS
g_message("client_unfocus");
+#endif
focus_fallback(Fallback_Unfocusing);
}