X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=3249fd57e8efa9808484e012732d3aa5e6cac403;hb=276b2be581c6cb138b439537761ff2ca42201805;hp=11e42a0eb9a6cd48b30cd2ef518c42f29645268c;hpb=34e819738b344a992a1dbfd6cdd165e0c8ddb3a9;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 11e42a0e..3249fd57 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -254,7 +254,7 @@ void client_manage(Window window) focus_order_add_new(self); /* focus the new window? */ - if (ob_state != State_Starting && config_focus_new && + if (ob_state != OB_STATE_STARTING && config_focus_new && (self->type == Type_Normal || self->type == Type_Dialog)) { gboolean group_foc = FALSE; @@ -403,7 +403,7 @@ void client_unmanage(Client *self) frame_release_client(self->frame, self); self->frame = NULL; - if (ob_state != State_Exiting) { + if (ob_state != OB_STATE_EXITING) { /* these values should not be persisted across a window unmapping/mapping */ prop_erase(self->window, prop_atoms.net_wm_desktop); @@ -453,7 +453,7 @@ void client_move_onscreen(Client *self) frame_frame_gravity(self->frame, &x, &y); /* get where the client should be */ - client_configure(self , Corner_TopLeft, x, y, + client_configure(self, OB_CORNER_TOPLEFT, x, y, self->area.width, self->area.height, TRUE, TRUE); } @@ -595,7 +595,7 @@ static void client_get_desktop(Client *self) self->desktop = screen_num_desktops - 1; else self->desktop = d; - } else { + } else { gboolean trdesk = FALSE; if (self->transient_for) { @@ -1095,7 +1095,7 @@ void client_reconfigure(Client *self) /* by making this pass FALSE for user, we avoid the emacs event storm where every configurenotify causes an update in its normal hints, i think this is generally what we want anyways... */ - client_configure(self, Corner_TopLeft, self->area.x, self->area.y, + client_configure(self, OB_CORNER_TOPLEFT, self->area.x, self->area.y, self->area.width, self->area.height, FALSE, TRUE); } @@ -1114,7 +1114,7 @@ void client_update_wmhints(Client *self) /* only do this when first managing the window *AND* when we aren't starting up! */ - if (ob_state != State_Starting && self->frame == NULL) + if (ob_state != OB_STATE_STARTING && self->frame == NULL) if (hints->flags & StateHint) self->iconic = hints->initial_state == IconicState; @@ -1494,8 +1494,8 @@ static StackLayer calc_layer(Client *self) return l; } -static void calc_recursive(Client *self, Client *orig, StackLayer l, - gboolean raised) +static void client_calc_layer_recursive(Client *self, Client *orig, + StackLayer l, gboolean raised) { StackLayer old, own; GSList *it; @@ -1505,7 +1505,8 @@ static void calc_recursive(Client *self, Client *orig, StackLayer l, self->layer = l > own ? l : own; for (it = self->transients; it; it = it->next) - calc_recursive(it->data, orig, l, raised ? raised : l != old); + client_calc_layer_recursive(it->data, orig, + l, raised ? raised : l != old); if (!raised && l != old) if (orig->frame) { /* only restack if the original window is managed */ @@ -1523,24 +1524,11 @@ void client_calc_layer(Client *self) orig = self; /* transients take on the layer of their parents */ - if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { - self = self->transient_for; - } else { - GSList *it; - - for (it = self->group->members; it; it = it->next) - if (it->data != self && - !((Client*)it->data)->transient_for) { - self = it->data; - break; - } - } - } + self = client_search_top_transient(self); l = calc_layer(self); - calc_recursive(self, orig, l, FALSE); + client_calc_layer_recursive(self, orig, l, FALSE); } gboolean client_should_show(Client *self) @@ -1606,7 +1594,8 @@ static void client_apply_startup_state(Client *self) */ } -void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, +void client_configure(Client *self, ObCorner anchor, + int x, int y, int w, int h, gboolean user, gboolean final) { gboolean moved = FALSE, resized = FALSE; @@ -1625,8 +1614,8 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, Rect *a; guint i; - i = client_xinerama_area(self); - a = screen_physical_area_xinerama(i); + i = client_monitor(self); + a = screen_physical_area_monitor(i); #ifdef VIDMODE if (i == 0 && /* primary head */ @@ -1652,7 +1641,7 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, } else { Rect *a; - a = screen_area_xinerama(self->desktop, client_xinerama_area(self)); + a = screen_area_monitor(self->desktop, client_monitor(self)); /* set the size and position if maximized */ if (self->max_horz) { @@ -1765,15 +1754,15 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h, } switch (anchor) { - case Corner_TopLeft: + case OB_CORNER_TOPLEFT: break; - case Corner_TopRight: + case OB_CORNER_TOPRIGHT: x -= w - self->area.width; break; - case Corner_BottomLeft: + case OB_CORNER_BOTTOMLEFT: y -= h - self->area.height; break; - case Corner_BottomRight: + case OB_CORNER_BOTTOMRIGHT: x -= w - self->area.width; y -= h - self->area.height; break; @@ -1857,7 +1846,7 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea) Rect *a; /* pick some fallbacks... */ - a = screen_area_xinerama(self->desktop, 0); + a = screen_area_monitor(self->desktop, 0); x = a->x + a->width / 4; y = a->y + a->height / 4; w = a->width / 2; @@ -1877,80 +1866,82 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea) client_setup_decor_and_functions(self); - client_configure(self, Corner_TopLeft, x, y, w, h, TRUE, TRUE); + client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); /* try focus us when we go into fullscreen mode */ client_focus(self); } -void client_iconify(Client *self, gboolean iconic, gboolean curdesk) +static void client_iconify_recursive(Client *self, + gboolean iconic, gboolean curdesk) { GSList *it; + gboolean changed = FALSE; - /* move up the transient chain as far as possible first */ - if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { - if (self->transient_for->iconic != iconic) { - client_iconify(self->transient_for, iconic, curdesk); - return; - } - } else { - GSList *it; - - for (it = self->group->members; it; it = it->next) { - Client *c = it->data; - if (c != self && c->iconic != iconic && - !c->transient_for) { - client_iconify(it->data, iconic, curdesk); - break; - } - } - if (it != NULL) return; - } - } - if (self->iconic == iconic) return; /* nothing to do */ + if (self->iconic != iconic) { + g_message("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"), + self->window); - g_message("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"), - self->window); + self->iconic = iconic; - self->iconic = iconic; + if (iconic) { + if (self->functions & Func_Iconify) { + self->wmstate = IconicState; + self->ignore_unmaps++; + /* we unmap the client itself so that we can get MapRequest + events, and because the ICCCM tells us to! */ + XUnmapWindow(ob_display, self->window); - if (iconic) { - self->wmstate = IconicState; - self->ignore_unmaps++; - /* we unmap the client itself so that we can get MapRequest events, - and because the ICCCM tells us to! */ - XUnmapWindow(ob_display, self->window); + /* update the focus lists.. iconic windows go to the bottom of + the list, put the new iconic window at the 'top of the + bottom'. */ + focus_order_to_top(self); - /* update the focus lists.. iconic windows go to the bottom of the - list, put the new iconic window at the 'top of the bottom'. */ - focus_order_to_top(self); - } else { - if (curdesk) - client_set_desktop(self, screen_desktop, FALSE); - self->wmstate = self->shaded ? IconicState : NormalState; - XMapWindow(ob_display, self->window); + changed = TRUE; + } + } else { + if (curdesk) + client_set_desktop(self, screen_desktop, FALSE); + self->wmstate = self->shaded ? IconicState : NormalState; + XMapWindow(ob_display, self->window); + + /* this puts it after the current focused window */ + focus_order_remove(self); + focus_order_add_new(self); + + /* this is here cuz with the VIDMODE extension, the viewport can + change while a fullscreen window is iconic, and when it + uniconifies, it would be nice if it did so to the new position + of the viewport */ + client_reconfigure(self); + + changed = TRUE; + } + } - /* this puts it after the current focused window */ - focus_order_remove(self); - focus_order_add_new(self); + if (changed) { + client_change_state(self); + client_showhide(self); + screen_update_areas(); - /* this is here cuz with the VIDMODE extension, the viewport can change - while a fullscreen window is iconic, and when it uniconifies, it - would be nice if it did so to the new position of the viewport */ - client_reconfigure(self); + dispatch_client(iconic ? Event_Client_Unmapped : Event_Client_Mapped, + self, 0, 0); } - client_change_state(self); - client_showhide(self); - screen_update_areas(); - - dispatch_client(iconic ? Event_Client_Unmapped : Event_Client_Mapped, - self, 0, 0); /* iconify all transients */ for (it = self->transients; it != NULL; it = it->next) - if (it->data != self) client_iconify(it->data, iconic, curdesk); + if (it->data != self) client_iconify_recursive(it->data, + iconic, curdesk); +} + +void client_iconify(Client *self, gboolean iconic, gboolean curdesk) +{ + /* move up the transient chain as far as possible first */ + self = client_search_top_transient(self); + + client_iconify_recursive(client_search_top_transient(self), + iconic, curdesk); } void client_maximize(Client *self, gboolean max, int dir, gboolean savearea) @@ -2014,7 +2005,7 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea) Rect *a; /* pick some fallbacks... */ - a = screen_area_xinerama(self->desktop, 0); + a = screen_area_monitor(self->desktop, 0); if (dir == 0 || dir == 1) { /* horz */ x = a->x + a->width / 4; w = a->width / 2; @@ -2052,7 +2043,7 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea) /* figure out where the client should be going */ frame_frame_gravity(self->frame, &x, &y); - client_configure(self, Corner_TopLeft, x, y, w, h, TRUE, TRUE); + client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); } void client_shade(Client *self, gboolean shade) @@ -2101,39 +2092,53 @@ void client_kill(Client *self) XKillClient(ob_display, self->window); } -void client_set_desktop(Client *self, guint target, gboolean donthide) +void client_set_desktop_recursive(Client *self, + guint target, gboolean donthide) { guint old; + GSList *it; - if (target == self->desktop) return; - - g_message("Setting desktop %u", target+1); + if (target != self->desktop) { - g_assert(target < screen_num_desktops || target == DESKTOP_ALL); + g_message("Setting desktop %u", target+1); - /* remove from the old desktop(s) */ - focus_order_remove(self); + g_assert(target < screen_num_desktops || target == DESKTOP_ALL); - old = self->desktop; - self->desktop = target; - PROP_SET32(self->window, net_wm_desktop, cardinal, target); - /* the frame can display the current desktop state */ - frame_adjust_state(self->frame); - /* 'move' the window to the new desktop */ - if (!donthide) - client_showhide(self); - /* raise if it was not already on the desktop */ - if (old != DESKTOP_ALL) - stacking_raise(CLIENT_AS_WINDOW(self)); - screen_update_areas(); + /* remove from the old desktop(s) */ + focus_order_remove(self); - /* add to the new desktop(s) */ - if (config_focus_new) - focus_order_to_top(self); - else - focus_order_to_bottom(self); + old = self->desktop; + self->desktop = target; + PROP_SET32(self->window, net_wm_desktop, cardinal, target); + /* the frame can display the current desktop state */ + frame_adjust_state(self->frame); + /* 'move' the window to the new desktop */ + if (!donthide) + client_showhide(self); + /* raise if it was not already on the desktop */ + if (old != DESKTOP_ALL) + stacking_raise(CLIENT_AS_WINDOW(self)); + screen_update_areas(); + + /* add to the new desktop(s) */ + if (config_focus_new) + focus_order_to_top(self); + else + focus_order_to_bottom(self); - dispatch_client(Event_Client_Desktop, self, target, old); + dispatch_client(Event_Client_Desktop, self, target, old); + } + + /* move all transients */ + for (it = self->transients; it != NULL; it = it->next) + if (it->data != self) client_set_desktop_recursive(it->data, + target, donthide); +} + +void client_set_desktop(Client *self, guint target, gboolean donthide) +{ + client_set_desktop_recursive(client_search_top_transient(self), + target, donthide); } Client *client_search_modal_child(Client *self) @@ -2453,7 +2458,7 @@ Icon *client_icon(Client *self, int w, int h) } /* this be mostly ripped from fvwm */ -Client *client_find_directional(Client *c, Direction dir) +Client *client_find_directional(Client *c, ObDirection dir) { int my_cx, my_cy, his_cx, his_cy; int offset = 0; @@ -2508,21 +2513,23 @@ Client *client_find_directional(Client *c, Direction dir) } switch(dir) { - case Direction_North : - case Direction_South : - case Direction_NorthEast : - case Direction_SouthWest : + case OB_DIRECTION_NORTH: + case OB_DIRECTION_SOUTH: + case OB_DIRECTION_NORTHEAST: + case OB_DIRECTION_SOUTHWEST: offset = (his_cx < 0) ? -his_cx : his_cx; - distance = (dir == Direction_North || dir == Direction_NorthEast) ? - -his_cy : his_cy; + distance = ((dir == OB_DIRECTION_NORTH || + dir == OB_DIRECTION_NORTHEAST) ? + -his_cy : his_cy); break; - case Direction_East : - case Direction_West : - case Direction_SouthEast : - case Direction_NorthWest : + case OB_DIRECTION_EAST: + case OB_DIRECTION_WEST: + case OB_DIRECTION_SOUTHEAST: + case OB_DIRECTION_NORTHWEST: offset = (his_cy < 0) ? -his_cy : his_cy; - distance = (dir == Direction_West || dir == Direction_NorthWest) ? - -his_cx : his_cx; + distance = ((dir == OB_DIRECTION_WEST || + dir == OB_DIRECTION_NORTHWEST) ? + -his_cx : his_cx); break; } @@ -2562,16 +2569,40 @@ void client_set_layer(Client *self, int layer) client_change_state(self); /* reflect this in the state hints */ } -guint client_xinerama_area(Client *self) +guint client_monitor(Client *self) { guint i; - for (i = 0; i < screen_num_xin_areas; ++i) { - Rect *area = screen_physical_area_xinerama(i); + for (i = 0; i < screen_num_monitors; ++i) { + Rect *area = screen_physical_area_monitor(i); if (RECT_INTERSECTS_RECT(*area, self->frame->area)) break; } - if (i == screen_num_xin_areas) i = 0; - g_assert(i < screen_num_xin_areas); + if (i == screen_num_monitors) i = 0; + g_assert(i < screen_num_monitors); return i; } + +Client *client_search_top_transient(Client *self) +{ + /* move up the transient chain as far as possible */ + if (self->transient_for) { + if (self->transient_for != TRAN_GROUP) { + return client_search_top_transient(self->transient_for); + } else { + GSList *it; + + for (it = self->group->members; it; it = it->next) { + Client *c = it->data; + + /* checking transient_for prevents infinate loops! */ + if (c != self && !c->transient_for) + break; + } + if (it) + return it->data; + } + } + + return self; +}