From: Dana Jansens Date: Fri, 13 Apr 2007 14:43:56 +0000 (+0000) Subject: merge r5732-5737 from trunk X-Git-Tag: openbox-3_3_991-RELEASE~254 X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=921be98414222980cef03e8132a0c7aba6bf0115;p=dana%2Fopenbox.git merge r5732-5737 from trunk --- diff --git a/openbox/client.c b/openbox/client.c index eb00e6d6..7f4cba21 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -275,10 +275,11 @@ void client_manage(Window window) self->user_time = client_last_user_time; client_get_all(self); - client_restore_session_state(self); /* per-app settings override stuff, and return the settings for other uses too */ settings = client_get_settings_state(self); + /* the session should get the last say */ + client_restore_session_state(self); client_calc_layer(self); @@ -455,7 +456,7 @@ void client_manage(Window window) /* this has to happen before we try focus the window, but we want it to happen after the client's stacking has been determined or it looks bad */ - client_showhide(self); + client_show(self); /* use client_focus instead of client_activate cuz client_activate does stuff like switch desktops etc and I'm not interested in all that when @@ -576,34 +577,36 @@ void client_unmanage(ObClient *self) self->group = NULL; } - /* give the client its border back */ - client_toggle_border(self, TRUE); + /* restore the window's original geometry so it is not lost */ + { + Rect a = self->area; + + if (self->fullscreen) + a = self->pre_fullscreen_area; + else if (self->max_horz || self->max_vert) { + if (self->max_horz) { + a.x = self->pre_max_area.x; + a.width = self->pre_max_area.width; + } + if (self->max_vert) { + a.y = self->pre_max_area.y; + a.height = self->pre_max_area.height; + } + } + + /* give the client its border back */ + client_toggle_border(self, TRUE); + + self->fullscreen = self->max_horz = self->max_vert = FALSE; + self->decorations = 0; /* unmanaged windows have no decor */ + + client_move_resize(self, a.x, a.y, a.width, a.height); + } /* reparent the window out of the frame, and free the frame */ frame_release_client(self->frame, self); self->frame = NULL; - /* restore the window's original geometry so it is not lost */ - if (self->fullscreen) - XMoveResizeWindow(ob_display, self->window, - self->pre_fullscreen_area.x, - self->pre_fullscreen_area.y, - self->pre_fullscreen_area.width, - self->pre_fullscreen_area.height); - else if (self->max_horz || self->max_vert) { - Rect a = self->area; - if (self->max_horz) { - a.x = self->pre_max_area.x; - a.width = self->pre_max_area.width; - } - if (self->max_vert) { - a.y = self->pre_max_area.y; - a.height = self->pre_max_area.height; - } - XMoveResizeWindow(ob_display, self->window, - a.x, a.y, a.width, a.height); - } - if (ob_state() != OB_STATE_EXITING) { /* these values should not be persisted across a window unmapping/mapping */ @@ -616,7 +619,6 @@ void client_unmanage(ObClient *self) XMapWindow(ob_display, self->window); } - ob_debug("Unmanaged window 0x%lx\n", self->window); /* free all data allocated in the client struct */ @@ -689,7 +691,7 @@ static ObAppSettings *client_get_settings_state(ObClient *self) if (settings->desktop < screen_num_desktops || settings->desktop == DESKTOP_ALL) - client_set_desktop(self, settings->desktop, TRUE); + self->desktop = settings->desktop; if (settings->layer == -1) { self->below = TRUE; @@ -893,10 +895,9 @@ static void client_toggle_border(ObClient *self, gboolean show) if (show) { XSetWindowBorderWidth(ob_display, self->window, self->border_width); - /* move the client so it is back it the right spot _with_ its - border! */ - if (x != oldx || y != oldy) - XMoveWindow(ob_display, self->window, x, y); + /* set border_width to 0 because there is no border to add into + calculations anymore */ + self->border_width = 0; } else XSetWindowBorderWidth(ob_display, self->window, 0); } @@ -968,6 +969,7 @@ static void client_get_area(ObClient *self) g_assert(ret != BadWindow); RECT_SET(self->area, wattrib.x, wattrib.y, wattrib.width, wattrib.height); + POINT_SET(self->root_pos, wattrib.x, wattrib.y); self->border_width = wattrib.border_width; ob_debug("client area: %d %d %d %d\n", wattrib.x, wattrib.y, @@ -2058,6 +2060,33 @@ gboolean client_should_show(ObClient *self) return FALSE; } +void client_show(ObClient *self) +{ + + if (client_should_show(self)) { + frame_show(self->frame); + } + + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it + needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); +} + +void client_hide(ObClient *self) +{ + if (!client_should_show(self)) { + frame_hide(self->frame); + } + + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it + needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); +} + void client_showhide(ObClient *self) { @@ -2066,10 +2095,6 @@ void client_showhide(ObClient *self) } else { frame_hide(self->frame); - - /* Fall back focus since we're disappearing */ - if (focus_client == self) - client_unfocus(self); } /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it @@ -2331,9 +2356,9 @@ void client_configure_full(ObClient *self, ObCorner anchor, gboolean user, gboolean final, gboolean force_reply) { - gint oldw, oldh; + gint oldw, oldh, oldrx, oldry; gboolean send_resize_client; - gboolean moved = FALSE, resized = FALSE; + gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE; guint fdecor = self->frame->decorations; gboolean fhorz = self->frame->max_horz; gint logicalw, logicalh; @@ -2365,35 +2390,47 @@ void client_configure_full(ObClient *self, ObCorner anchor, if (send_resize_client && user && (w > oldw || h > oldh)) XResizeWindow(ob_display, self->window, MAX(w, oldw), MAX(h, oldh)); - /* move/resize the frame to match the request */ - if (self->frame) { - if (self->decorations != fdecor || self->max_horz != fhorz) - moved = resized = TRUE; - - if (moved || resized) - frame_adjust_area(self->frame, moved, resized, FALSE); - - if (!resized && (force_reply || ((!user && moved) || (user && final)))) - { - XEvent event; - event.type = ConfigureNotify; - event.xconfigure.display = ob_display; - event.xconfigure.event = self->window; - event.xconfigure.window = self->window; - - /* root window real coords */ - event.xconfigure.x = self->frame->area.x + self->frame->size.left - - self->border_width; - event.xconfigure.y = self->frame->area.y + self->frame->size.top - - self->border_width; - event.xconfigure.width = w; - event.xconfigure.height = h; - event.xconfigure.border_width = 0; - event.xconfigure.above = self->frame->plate; - event.xconfigure.override_redirect = FALSE; - XSendEvent(event.xconfigure.display, event.xconfigure.window, - FALSE, StructureNotifyMask, &event); - } + /* find the frame's dimensions and move/resize it */ + if (self->decorations != fdecor || self->max_horz != fhorz) + moved = resized = TRUE; + if (moved || resized) + frame_adjust_area(self->frame, moved, resized, FALSE); + + /* find the client's position relative to the root window */ + oldrx = self->root_pos.x; + oldry = self->root_pos.y; + rootmoved = (oldrx != (signed)(self->frame->area.x + + self->frame->size.left - + self->border_width) || + oldry != (signed)(self->frame->area.y + + self->frame->size.top - + self->border_width)); + + if (force_reply || ((!user || (user && final)) && rootmoved)) + { + XEvent event; + + POINT_SET(self->root_pos, + self->frame->area.x + self->frame->size.left - + self->border_width, + self->frame->area.y + self->frame->size.top - + self->border_width); + + event.type = ConfigureNotify; + event.xconfigure.display = ob_display; + event.xconfigure.event = self->window; + event.xconfigure.window = self->window; + + /* root window real coords */ + event.xconfigure.x = self->root_pos.x; + event.xconfigure.y = self->root_pos.y; + event.xconfigure.width = w; + event.xconfigure.height = h; + event.xconfigure.border_width = 0; + event.xconfigure.above = self->frame->plate; + event.xconfigure.override_redirect = FALSE; + XSendEvent(event.xconfigure.display, event.xconfigure.window, + FALSE, StructureNotifyMask, &event); } /* if the client is shrinking, then resize the frame before the client */ diff --git a/openbox/client.h b/openbox/client.h index 53a318e0..1c4a2b1f 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -136,6 +136,9 @@ struct _ObClient */ Rect area; + /*! Position of the client window relative to the root window */ + Point root_pos; + /*! Position and size of the window prior to being maximized */ Rect pre_max_area; /*! Position and size of the window prior to being fullscreened */ @@ -458,6 +461,12 @@ void client_kill(ObClient *self); desktop has been changed. Generally this should be FALSE. */ void client_set_desktop(ObClient *self, guint target, gboolean donthide); +/*! Show the client if it should be shown. */ +void client_show(ObClient *self); + +/*! Show the client if it should be shown. */ +void client_hide(ObClient *self); + /*! Show the client if it should be shown, and hide it if it should be hidden. This is for example, when switching desktops. */ diff --git a/openbox/event.c b/openbox/event.c index 3aa91c61..7dfcc0c7 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -560,9 +560,11 @@ static void event_handle_root(XEvent *e) msgtype = e->xclient.message_type; if (msgtype == prop_atoms.net_current_desktop) { guint d = e->xclient.data.l[0]; - event_curtime = e->xclient.data.l[1]; - if (d < screen_num_desktops) + if (d < screen_num_desktops) { + event_curtime = e->xclient.data.l[1]; + ob_debug("SWITCH DESKTOP TIME: %d\n", event_curtime); screen_set_desktop(d); + } } else if (msgtype == prop_atoms.net_number_of_desktops) { guint d = e->xclient.data.l[0]; if (d > 0) diff --git a/openbox/frame.c b/openbox/frame.c index 880ab1b5..554e7b55 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -234,8 +234,6 @@ static void frame_free(ObFrame *self) void frame_show(ObFrame *self) { - ob_debug("frame_show for window 0x%x : %d\n", self->client->window, - self->visible); if (!self->visible) { self->visible = TRUE; XMapWindow(ob_display, self->client->window); @@ -245,8 +243,6 @@ void frame_show(ObFrame *self) void frame_hide(ObFrame *self) { - ob_debug("frame_hide for window 0x%x : %d\n", self->client->window, - self->visible); if (self->visible) { self->visible = FALSE; self->client->ignore_unmaps += 1; diff --git a/openbox/screen.c b/openbox/screen.c index 298a0b22..1705fa89 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -435,11 +435,11 @@ void screen_set_desktop(guint num) /* show windows before hiding the rest to lessen the enter/leave events */ - /* show windows from top to bottom */ + /* show/hide windows from top to bottom */ for (it = stacking_list; it; it = g_list_next(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - client_showhide(c); + client_show(c); } } @@ -447,7 +447,7 @@ void screen_set_desktop(guint num) for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - client_showhide(c); + client_hide(c); } } @@ -458,9 +458,10 @@ void screen_set_desktop(guint num) frame_adjust_focus(focus_hilite->frame, TRUE); /*! - When this focus_client check is not used, you can end up with races, - as demonstrated with gnome-panel, sometmies the window you click on - another desktop ends up losing focus cuz of the focus change here. + When this focus_client check is not used, you can end up with + races, as demonstrated with gnome-panel, sometimes the window + you click on another desktop ends up losing focus cuz of the + focus change here. */ /*if (!focus_client)*/ client_focus(focus_hilite);