X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=a5a07609c0ad85013baedb76f9f406c1da772a19;hb=ac56fe1602af7f4a4ae5c10cfe83e3d9eaf02b4d;hp=6c4241aa7f749a9916eb7e83cd08f7142f76bb35;hpb=48a4eafb42ac2ab9badc2f7273cf64ec88a6f350;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 6c4241aa..a5a07609 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -481,17 +481,18 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->client->area.height); } - if (!fake && !self->iconify_animation_going) { - /* move and resize the top level frame. - shading can change without being moved or resized. - - but don't do this during an iconify animation. it will be - reflected afterwards. - */ - XMoveResizeWindow(ob_display, self->window, - self->area.x, self->area.y, - self->area.width - self->bwidth * 2, - self->area.height - self->bwidth * 2); + if (!fake) { + if (!frame_iconify_animating(self)) + /* move and resize the top level frame. + shading can change without being moved or resized. + + but don't do this during an iconify animation. it will be + reflected afterwards. + */ + XMoveResizeWindow(ob_display, self->window, + self->area.x, self->area.y, + self->area.width - self->bwidth * 2, + self->area.height - self->bwidth * 2); if (resized) { framerender_frame(self); @@ -839,10 +840,6 @@ ObFrameContext frame_context(ObClient *client, Window win) if (win == RootWindow(ob_display, ob_screen)) return OB_FRAME_CONTEXT_DESKTOP; if (client == NULL) return OB_FRAME_CONTEXT_NONE; - - self = client->frame; - if (self->iconify_animation_going) return OB_FRAME_CONTEXT_NONE; - if (win == client->window) { /* conceptually, this is the desktop, as far as users are concerned */ @@ -851,6 +848,7 @@ ObFrameContext frame_context(ObClient *client, Window win) return OB_FRAME_CONTEXT_CLIENT; } + self = client->frame; if (win == self->inner || win == self->plate) { /* conceptually, this is the desktop, as far as users are concerned */ @@ -1108,27 +1106,41 @@ static gboolean frame_animate_iconify(gpointer p) h = self->innersize.top; /* just the titlebar */ } - if (time == 0) { - /* call the callback when it's done */ - if (self->iconify_animation_cb) - self->iconify_animation_cb(self->iconify_animation_data); - /* we're not animating any more ! */ - self->iconify_animation_going = 0; + if (time == 0) + frame_end_iconify_animation(self); + else { + XMoveResizeWindow(ob_display, self->window, x, y, w, h); + XFlush(ob_display); } - /* move to the next spot (after the callback for the animation ending) */ - XMoveResizeWindow(ob_display, self->window, x, y, w, h); - XFlush(ob_display); - return time > 0; /* repeat until we're out of time */ } +void frame_end_iconify_animation(ObFrame *self) +{ + /* see if there is an animation going */ + if (self->iconify_animation_going == 0) return; + + /* call the callback when it's done */ + if (self->iconify_animation_cb) + self->iconify_animation_cb(self->iconify_animation_data); + /* we're not animating any more ! */ + self->iconify_animation_going = 0; + + /* move after the callback for the animation ending */ + XMoveResizeWindow(ob_display, self->window, + self->area.x, self->area.y, + self->area.width - self->bwidth * 2, + self->area.height - self->bwidth * 2); + XFlush(ob_display); +} + void frame_begin_iconify_animation(ObFrame *self, gboolean iconifying, ObFrameIconifyAnimateFunc callback, gpointer data) { gulong time; - gboolean start_timer = TRUE; + gboolean new_anim = FALSE; gboolean set_end = TRUE; GTimeVal now; @@ -1151,8 +1163,8 @@ void frame_begin_iconify_animation(ObFrame *self, gboolean iconifying, } else /* animation was already going in the same direction */ set_end = FALSE; - start_timer = FALSE; - } + } else + new_anim = TRUE; self->iconify_animation_going = iconifying ? 1 : -1; self->iconify_animation_cb = callback; @@ -1165,14 +1177,25 @@ void frame_begin_iconify_animation(ObFrame *self, gboolean iconifying, g_time_val_add(&self->iconify_animation_end, time); } - if (start_timer) { + if (new_anim) { ob_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify, self, FALSE); ob_main_loop_timeout_add(ob_main_loop, FRAME_ANIMATE_ICONIFY_STEP_TIME, frame_animate_iconify, self, g_direct_equal, NULL); + /* do the first step */ frame_animate_iconify(self); + + if (!self->visible) + frame_show(self); } } + +gboolean frame_visible(ObFrame *self) +{ + /* if it is animating back from iconic state then it is considered + visible. but if it is iconifying then it is not visible. */ + return self->visible && self->iconify_animation_going <= 0; +}