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);
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 */
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 */
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;
} 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;
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;
+}