w = client_startup_stack_order[i-1];
c = g_hash_table_lookup(client_map, &w);
- g_message("0x%lx %d %d", c->window, c->iconic, c->shaded);
if (c) stacking_lower(c);
}
g_free(client_startup_stack_order);
/* get the hints from the window */
if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) {
- self->positioned = (size.flags & (PPosition|USPosition));
+ self->positioned = !!(size.flags & (PPosition|USPosition));
if (size.flags & PWinGravity) {
self->gravity = size.win_gravity;
{
/* start with everything (cept fullscreen) */
self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border |
- Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize;
+ Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize |
+ Decor_Shade;
self->functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize |
Func_Shade;
if (self->delete_window) {
self->decorations &= ~Decor_Maximize;
if (self->disabled_decorations & Decor_AllDesktops)
self->decorations &= ~Decor_AllDesktops;
+ if (self->disabled_decorations & Decor_Shade)
+ self->decorations &= ~Decor_Shade;
if (self->disabled_decorations & Decor_Close)
self->decorations &= ~Decor_Close;
else self->shaded = FALSE;
}
if (!(self->functions & Func_Iconify) && self->iconic) {
+ g_message("UNSETTING ICONIC");
if (self->frame) client_iconify(self, FALSE, TRUE);
else self->iconic = FALSE;
}
if (hints->flags & InputHint)
self->can_focus = hints->input;
- /* only do this when starting! */
- if (ob_state == State_Starting && (hints->flags & StateHint))
- self->iconic = hints->initial_state == IconicState;
+ /* only do this when first managing the window *AND* when we aren't
+ starting up! */
+ if (ob_state != State_Starting && self->frame == NULL)
+ if (hints->flags & StateHint)
+ self->iconic = hints->initial_state == IconicState;
if (hints->flags & XUrgencyHint)
ur = TRUE;
gulong *data;
if (PROP_GET32A(self->window, net_wm_strut, cardinal, data, 4)) {
- STRUT_SET(self->strut, data[0], data[1], data[2], data[3]);
+ STRUT_SET(self->strut, data[0], data[2], data[1], data[3]);
g_free(data);
} else
STRUT_SET(self->strut, 0, 0, 0, 0);
{
gboolean moved = FALSE, resized = FALSE;
+ /* gets the frame's position */
+ frame_client_gravity(self->frame, &x, &y);
+
+ /* these positions are frame positions, not client positions */
+
/* set the size and position if fullscreen */
if (self->fullscreen) {
x = 0;
/* set the size and position if maximized */
if (self->max_horz) {
x = screen_area(self->desktop)->x - self->frame->size.left;
- w = screen_area(self->desktop)->x +
- screen_area(self->desktop)->width;
+ w = screen_area(self->desktop)->width;
}
if (self->max_vert) {
y = screen_area(self->desktop)->y;
- h = screen_area(self->desktop)->y +
- screen_area(self->desktop)->height -
+ h = screen_area(self->desktop)->height -
self->frame->size.top - self->frame->size.bottom;
}
}
+ /* gets the client's position */
+ frame_frame_gravity(self->frame, &x, &y);
+
/* these override the above states! if you cant move you can't move! */
if (user) {
if (!(self->functions & Func_Move)) {
XUnmapWindow(ob_display, self->window);
} else {
if (curdesk)
- client_set_desktop(self, screen_desktop);
+ client_set_desktop(self, screen_desktop, FALSE);
self->wmstate = self->shaded ? IconicState : NormalState;
XMapWindow(ob_display, self->window);
}
PROP_SET32A(self->window, openbox_premax, cardinal,
dimensions, 4);
}
-
- /* pass the client's current position info. the client_configure
- will move/size stuff as appropriate for a maximized window */
- x = self->area.x;
- y = self->area.y;
- w = self->area.width;
- h = self->area.height;
} else {
long *dimensions;
void client_shade(Client *self, gboolean shade)
{
- if (!(self->functions & Func_Shade) || /* can't */
+ if ((!(self->functions & Func_Shade) && shade) || /* can't shade */
self->shaded == shade) return; /* already done */
/* when we're iconic, don't change the wmstate */
XKillClient(ob_display, self->window);
}
-void client_set_desktop(Client *self, guint target)
+void client_set_desktop(Client *self, guint target, gboolean donthide)
{
guint old, i;
+ ConfigValue focus_new;
if (target == self->desktop) return;
- g_message("Setting desktop %u\n", target);
+ g_message("Setting desktop %u", target);
g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
/* the frame can display the current desktop state */
engine_frame_adjust_state(self->frame);
/* 'move' the window to the new desktop */
- client_showhide(self);
+ if (!donthide)
+ client_showhide(self);
+ /* raise if it was not already on the desktop */
+ if (old != DESKTOP_ALL)
+ stacking_raise(self);
screen_update_struts();
/* update the focus lists */
+ if (!config_get("focusNew", Config_Bool, &focus_new))
+ g_assert_not_reached();
if (old == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i)
focus_order[i] = g_list_remove(focus_order[i], self);
- focus_order[target] = g_list_prepend(focus_order[target], self);
- } else {
+ } else
focus_order[old] = g_list_remove(focus_order[old], self);
- if (target == DESKTOP_ALL)
- for (i = 0; i < screen_num_desktops; ++i)
+ if (target == DESKTOP_ALL) {
+ for (i = 0; i < screen_num_desktops; ++i) {
+ if (focus_new.bool)
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.bool)
+ focus_order[target] = g_list_prepend(focus_order[target], self);
+ else
+ focus_order[target] = g_list_append(focus_order[target], self);
}
dispatch_client(Event_Client_Desktop, self, target, old);
}
if (self->can_focus)
- /* RevertToNone is used so that windows dont get focused inadvertantly
- by having the pointer in them, and then FocusIn events go missing */
- XSetInputFocus(ob_display, self->window, RevertToNone,
+ /* RevertToPointerRoot causes much more headache than TevertToNone, so
+ I choose to use it always, hopefully to find errors quicker, if any
+ are left. (I hate X. I hate focus events.) */
+ XSetInputFocus(ob_display, self->window, RevertToPointerRoot,
event_lasttime);
if (self->focus_notify) {