#define INNER_EVENTMASK (ButtonPressMask)
#define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */
-#define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 30) /* 30 Hz */
+#define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 60) /* 60 Hz */
#define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \
f->cbwidth_y)
{
if (self->visible) {
self->visible = FALSE;
- self->client->ignore_unmaps += 1;
+ if (!frame_iconify_animating(self))
+ XUnmapWindow(ob_display, self->window);
/* we unmap the client itself so that we can get MapRequest
events, and because the ICCCM tells us to! */
- XUnmapWindow(ob_display, self->window);
XUnmapWindow(ob_display, self->client->window);
+ self->client->ignore_unmaps += 1;
}
}
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);
vals[3] = self->size.bottom;
PROP_SETA32(self->client->window, net_frame_extents,
cardinal, vals, 4);
+ PROP_SETA32(self->client->window, kde_net_wm_frame_strut,
+ cardinal, vals, 4);
}
/* if this occurs while we are focus cycling, the indicator needs to
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_begin_iconify_animation(ObFrame *self, gboolean iconifying,
- ObFrameIconifyAnimateFunc callback,
- gpointer data)
+void frame_end_iconify_animation(ObFrame *self)
+{
+ /* see if there is an animation going */
+ if (self->iconify_animation_going == 0) return;
+
+ if (!self->visible)
+ XUnmapWindow(ob_display, self->window);
+
+ /* we're not animating any more ! */
+ self->iconify_animation_going = 0;
+
+ 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)
{
gulong time;
- gboolean start_timer = TRUE;
+ gboolean new_anim = FALSE;
gboolean set_end = TRUE;
GTimeVal now;
/* if there is no titlebar, just don't animate for now
XXX it would be nice tho.. */
- if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR)) {
- if (callback) callback(data);
+ if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
return;
- }
/* get the current time */
g_get_current_time(&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;
- self->iconify_animation_data = data;
-
/* set the ending time */
if (set_end) {
self->iconify_animation_end.tv_sec = now.tv_sec;
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);
+
+ /* show it during the animation even if it is not "visible" */
+ if (!self->visible)
+ XMapWindow(ob_display, self->window);
}
}