diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-05-05 16:16:26 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-05-05 16:16:26 +0000 |
| commit | b5e597f1b3a810610fd63f50c55dc5a8b715744e (patch) | |
| tree | 133d9e1f30a99eb95b6064d7a7fd734bd3439cc6 /openbox/frame.c | |
| parent | 99daa7f5237b220b93bbec4854344d76cde3ef84 (diff) | |
lots of fixes for the iconify animation. i think it should all work perfectly now ?
one change in action.c may affect bindings... THIS COULD BREAK CURRENT CONFIG FILES. ya.
so, if you used a press binding and it moved the window, no enter event will be generated for that anymore because you are holding down the button when the window moves. if you don't like that then use a click binding instead.
1
Diffstat (limited to 'openbox/frame.c')
| -rw-r--r-- | openbox/frame.c | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/openbox/frame.c b/openbox/frame.c index 6c4241aa..3af354c3 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -42,7 +42,8 @@ from the frame. */ #define INNER_EVENTMASK (ButtonPressMask) -#define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */ +//#define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */ +#define FRAME_ANIMATE_ICONIFY_TIME 2000000 #define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 30) /* 30 Hz */ #define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \ @@ -481,17 +482,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 +841,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 +849,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 +1107,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 +1164,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 +1178,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; +} |
