X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=be4e688dff71c89ae6e7ec79f09467292ee3e73d;hb=f138bd80071eb3177537210e8ce3e28ebb24a9ea;hp=6c4241aa7f749a9916eb7e83cd08f7142f76bb35;hpb=48a4eafb42ac2ab9badc2f7273cf64ec88a6f350;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 6c4241aa..be4e688d 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -43,7 +43,7 @@ #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) @@ -258,11 +258,12 @@ void frame_hide(ObFrame *self) { 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; } } @@ -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); @@ -506,6 +508,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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 @@ -839,10 +843,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 +851,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,36 +1109,45 @@ 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_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); @@ -1151,13 +1161,10 @@ 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; - self->iconify_animation_data = data; - /* set the ending time */ if (set_end) { self->iconify_animation_end.tv_sec = now.tv_sec; @@ -1165,14 +1172,19 @@ 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); + + /* show it during the animation even if it is not "visible" */ + if (!self->visible) + XMapWindow(ob_display, self->window); } }