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);
{
/* 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;
{
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;
}
}
+ /* 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)) {
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 */
/* 'move' the window to the new desktop */
if (!donthide)
client_showhide(self);
- stacking_raise(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 (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) {