X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fclient.c;h=1df411e2090fae1c3a5303d2f1f1236b30ff0bac;hb=d447dc0f59619d26073699d9f81d7de77c200be4;hp=2e6862434cbc76988effd56bb9f1b7464fbd352b;hpb=91fed618842ca9594b05a726bdb7358db6804696;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 2e686243..1df411e2 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -132,7 +132,6 @@ void client_manage_all() 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); @@ -706,7 +705,7 @@ void client_update_normal_hints(Client *self) /* 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; @@ -747,7 +746,8 @@ void client_setup_decor_and_functions(Client *self) { /* 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) { @@ -842,6 +842,8 @@ void client_setup_decor_and_functions(Client *self) 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; @@ -1316,6 +1318,11 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, { 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; @@ -1326,17 +1333,18 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, /* 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)) { @@ -1543,7 +1551,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk) 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); } @@ -1607,13 +1615,6 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea) 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; @@ -1660,7 +1661,7 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea) 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 */ @@ -1704,13 +1705,14 @@ void client_kill(Client *self) 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); @@ -1720,19 +1722,33 @@ void client_set_desktop(Client *self, guint target) /* 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); @@ -1945,9 +1961,10 @@ gboolean client_focus(Client *self) } 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) {