]> Dogcows Code - chaz/openbox/blobdiff - openbox/frame.c
popups fixes. if the text for the popup is empty now, there wont be extra padding...
[chaz/openbox] / openbox / frame.c
index 6c4241aa7f749a9916eb7e83cd08f7142f76bb35..be4e688dff71c89ae6e7ec79f09467292ee3e73d 100644 (file)
@@ -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);
     }
 }
This page took 0.023685 seconds and 4 git commands to generate.