Author: olivier
Date: 2008-04-05 09:56:37 +0000 (Sat, 05 Apr 2008)
New Revision: 26782

Modified:
   xfwm4/trunk/src/client.c
   xfwm4/trunk/src/client.h
   xfwm4/trunk/src/compositor.c
   xfwm4/trunk/src/events.c
   xfwm4/trunk/src/focus.c
   xfwm4/trunk/src/frame.c
   xfwm4/trunk/src/frame.h
   xfwm4/trunk/src/netwm.c
Log:
Implements asynchronous frames update

Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c    2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/client.c    2008-04-05 09:56:37 UTC (rev 26782)
@@ -206,7 +206,7 @@
                 g_free (c->name);
                 c->name = name;
                 FLAG_SET (c->flags, CLIENT_FLAG_NAME_CHANGED);
-                frameQueueDraw (c);
+                frameQueueDraw (c, TRUE);
             }
         }
     }
@@ -281,7 +281,7 @@
         }
         if (mask & UPDATE_FRAME)
         {
-            frameDraw (c, TRUE);
+            frameQueueDraw (c, TRUE);
         }
 
     }
@@ -325,7 +325,7 @@
     if (c != clientGetFocus ())
     {
         FLAG_TOGGLE (c->xfwm_flags, XFWM_FLAG_SEEN_ACTIVE);
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
     return (TRUE);
 }
@@ -341,7 +341,7 @@
     if (c->blink_timeout_id)
     {
         g_source_remove (c->blink_timeout_id);
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
     FLAG_UNSET (c->wm_flags, WM_FLAG_URGENT);
 
@@ -363,7 +363,7 @@
         && (c != clientGetFocus ()))
     {
         FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_SEEN_ACTIVE);
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
 }
 
@@ -663,7 +663,7 @@
 
         if (WIN_RESIZED || (flags & CFG_FORCE_REDRAW))
         {
-            frameDraw (c, (flags & CFG_FORCE_REDRAW));
+            frameQueueDraw (c, (flags & CFG_FORCE_REDRAW));
         }
 
         change_values.x = frameLeft (c);
@@ -1106,7 +1106,7 @@
         }
         else if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_IS_RESIZABLE) != 
previous_value)
         {
-            frameQueueDraw (c);
+            frameQueueDraw (c, FALSE);
         }
     }
     else
@@ -1536,7 +1536,7 @@
             {
                 clientUnstick (c, TRUE);
             }
-            frameDraw (c, FALSE);
+            frameQueueDraw (c, FALSE);
         }
     }
     else if ((action & WIN_STATE_MAXIMIZED)
@@ -1656,7 +1656,7 @@
     clientUpdateIconPix (c);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_VISIBLE))
     {
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
     c->icon_timeout_id = 0;
 
@@ -1770,7 +1770,7 @@
     c->size = NULL;
     c->flags = 0L;
     c->wm_flags = 0L;
-    c->xfwm_flags = CLIENT_FLAG_INITIAL_VALUES;
+    c->xfwm_flags = XFWM_FLAG_INITIAL_VALUES;
     c->x = attr.x;
     c->y = attr.y;
     c->width = attr.width;
@@ -1839,7 +1839,10 @@
     c->opacity_applied = c->opacity;
     c->opacity_flags = 0;
 
-    c->opacity_locked = getOpacityLock (display_info, c->window);
+    if (getOpacityLock (display_info, c->window))
+    {
+        FLAG_SET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+    }
 
     /* Timout for asynchronous icon update */
     c->icon_timeout_id = 0;
@@ -3045,7 +3048,7 @@
 
     c->win_state &= ~WIN_STATE_MAXIMIZED;
     FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED);
-    frameDraw (c, FALSE);
+    frameQueueDraw (c, FALSE);
     clientSetNetState (c);
 }
 
@@ -3498,7 +3501,7 @@
 
     c->opacity_flags = (c->opacity_flags & ~clear) ^ xor;
 
-    if (c->opacity_locked)
+    if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
     {
         applied = c->opacity;
     }
@@ -3548,7 +3551,7 @@
         return;
     }
 
-    if ((c->opacity > OPACITY_SET_MIN) && !(c->opacity_locked ))
+    if ((c->opacity > OPACITY_SET_MIN) && !(FLAG_TEST (c->xfwm_flags, 
XFWM_FLAG_OPACITY_LOCKED)))
     {
          clientSetOpacity (c, c->opacity - OPACITY_SET_STEP, 0, 0);
     }
@@ -3568,7 +3571,7 @@
         return;
     }
 
-    if ((c->opacity < NET_WM_OPAQUE) && !(c->opacity_locked ))
+    if ((c->opacity < NET_WM_OPAQUE) && !(FLAG_TEST (c->xfwm_flags, 
XFWM_FLAG_OPACITY_LOCKED)))
     {
          guint opacity = c->opacity + OPACITY_SET_STEP;
 
@@ -4342,7 +4345,9 @@
 #endif /* SHOW_POSITION */
 
     /* Set window translucent while moving, looks nice */
-    if ((screen_info->params->move_opacity < 100) && 
!(screen_info->params->box_move) && !(c->opacity_locked))
+    if ((screen_info->params->move_opacity < 100) &&
+        !(screen_info->params->box_move) &&
+        !FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
     {
         clientSetOpacity (c, c->opacity, OPACITY_MOVE, OPACITY_MOVE);
     }
@@ -4906,7 +4911,9 @@
 #endif /* HAVE_XSYNC */
 
     /* Set window translucent while resizing, doesn't looks too nice  :( */
-    if ((screen_info->params->resize_opacity < 100) && 
!(screen_info->params->box_resize) && !(c->opacity_locked))
+    if ((screen_info->params->resize_opacity < 100) &&
+        !(screen_info->params->box_resize) &&
+        !FLAG_TEST (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED))
     {
         clientSetOpacity (c, c->opacity, OPACITY_RESIZE, OPACITY_RESIZE);
     }
@@ -5234,14 +5241,14 @@
             if ((xevent->xcrossing.mode != NotifyGrab) && 
(xevent->xcrossing.mode != NotifyUngrab))
             {
                 c->button_status[b] = BUTTON_STATE_PRESSED;
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
             }
             break;
         case LeaveNotify:
             if ((xevent->xcrossing.mode != NotifyGrab) && 
(xevent->xcrossing.mode != NotifyUngrab))
             {
                 c->button_status[b] = BUTTON_STATE_NORMAL;
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
             }
             break;
         case ButtonRelease:
@@ -5314,7 +5321,7 @@
     passdata.b = b;
 
     c->button_status[b] = BUTTON_STATE_PRESSED;
-    frameDraw (c, FALSE);
+    frameQueueDraw (c, FALSE);
 
     TRACE ("entering button press loop");
     eventFilterPush (display_info->xfilter, clientButtonPressEventFilter, 
&passdata);
@@ -5376,7 +5383,7 @@
             default:
                 break;
         }
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
 }
 

Modified: xfwm4/trunk/src/client.h
===================================================================
--- xfwm4/trunk/src/client.h    2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/client.h    2008-04-05 09:56:37 UTC (rev 26782)
@@ -124,6 +124,8 @@
 #define XFWM_FLAG_FIRST_MAP             (1L<<19)
 #define XFWM_FLAG_LEGACY_FULLSCREEN     (1L<<20)
 #define XFWM_FLAG_MOVING_RESIZING       (1L<<21)
+#define XFWM_FLAG_NEEDS_REDRAW          (1L<<22)
+#define XFWM_FLAG_OPACITY_LOCKED        (1L<<23)
 
 #define CLIENT_FLAG_HAS_STRUT           (1L<<0)
 #define CLIENT_FLAG_HAS_STRUT_PARTIAL   (1L<<1)
@@ -152,7 +154,7 @@
 #define WM_FLAG_CONTEXT_HELP            (1L<<3)
 #define WM_FLAG_URGENT                  (1L<<4)
 
-#define CLIENT_FLAG_INITIAL_VALUES      XFWM_FLAG_HAS_BORDER | \
+#define XFWM_FLAG_INITIAL_VALUES        XFWM_FLAG_HAS_BORDER | \
                                         XFWM_FLAG_HAS_MENU | \
                                         XFWM_FLAG_HAS_MAXIMIZE | \
                                         XFWM_FLAG_HAS_STICK | \
@@ -160,7 +162,8 @@
                                         XFWM_FLAG_HAS_CLOSE | \
                                         XFWM_FLAG_HAS_MOVE | \
                                         XFWM_FLAG_HAS_RESIZE | \
-                                        XFWM_FLAG_FIRST_MAP
+                                        XFWM_FLAG_FIRST_MAP | \
+                                        XFWM_FLAG_NEEDS_REDRAW
 
 #define ALL_WORKSPACES                  (int) 0xFFFFFFFF
 
@@ -292,7 +295,6 @@
     guint opacity;
     guint opacity_applied;
     guint opacity_flags;
-    gboolean opacity_locked;
 
 #ifdef HAVE_LIBSTARTUP_NOTIFICATION
     /* Startup notification */

Modified: xfwm4/trunk/src/compositor.c
===================================================================
--- xfwm4/trunk/src/compositor.c        2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/compositor.c        2008-04-05 09:56:37 UTC (rev 26782)
@@ -1869,7 +1869,7 @@
     cw->native_opacity = FALSE;
     if (c)
     {
-        cw->opacity_locked = c->opacity_locked;
+        cw->opacity_locked = FLAG_TEST (c->xfwm_flags, 
XFWM_FLAG_OPACITY_LOCKED);
         cw->opacity = c->opacity_applied;
         cw->native_opacity = WIN_IS_OPAQUE(cw);
     }
@@ -2269,7 +2269,14 @@
             cw->opacity_locked = getOpacityLock (display_info, cw->id);
             if (cw->c)
             {
-                cw->c->opacity_locked = cw->opacity_locked;
+                if (cw->opacity_locked)
+                {
+                    FLAG_SET (cw->c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+                }
+                else
+                {
+                    FLAG_UNSET (cw->c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+                }
             }
         }
     }

Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c    2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/events.c    2008-04-05 09:56:37 UTC (rev 26782)
@@ -404,7 +404,7 @@
                 if (CLIENT_CAN_STICK_WINDOW(c))
                 {
                     clientToggleSticky (c, TRUE);
-                    frameDraw (c, FALSE);
+                    frameQueueDraw (c, FALSE);
                 }
                 break;
             case KEY_RAISE_WINDOW:
@@ -1528,7 +1528,7 @@
             }
             if (need_redraw)
             {
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
             }
         }
         /* No need to process the event any further */
@@ -1682,7 +1682,7 @@
         }
         if (need_redraw)
         {
-            frameDraw (c, FALSE);
+            frameQueueDraw (c, FALSE);
         }
 
         /* No need to process the event any further */
@@ -1968,7 +1968,7 @@
         {
             TRACE ("client \"%s\" (0x%lx) has received a NET_WM_WINDOW_TYPE 
notify", c->name, c->window);
             clientGetNetWmType (c);
-            frameQueueDraw (c);
+            frameQueueDraw (c, TRUE);
         }
         else if ((ev->atom == display_info->atoms[NET_WM_STRUT]) ||
                  (ev->atom == display_info->atoms[NET_WM_STRUT_PARTIAL]))
@@ -2009,7 +2009,14 @@
         else if (ev->atom == display_info->atoms[NET_WM_WINDOW_OPACITY_LOCKED])
         {
             TRACE ("client \"%s\" (0x%lx) has received a NET_WM_OPACITY_LOCKED 
notify", c->name, c->window);
-            c->opacity_locked = getOpacityLock (display_info, c->window);
+            if (getOpacityLock (display_info, c->window))
+            {
+                FLAG_SET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+            }
+            else
+            {
+                FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_OPACITY_LOCKED);
+            }
         }
         else if ((screen_info->params->show_app_icon) &&
                  ((ev->atom == display_info->atoms[NET_WM_ICON]) ||
@@ -2129,7 +2136,7 @@
                     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_STICK) && 
!FLAG_TEST (c->flags, CLIENT_FLAG_STICKY))
                     {
                         clientStick (c, TRUE);
-                        frameDraw (c, FALSE);
+                        frameQueueDraw (c, FALSE);
                     }
                 }
                 else
@@ -2137,7 +2144,7 @@
                     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_STICK) && 
FLAG_TEST (c->flags, CLIENT_FLAG_STICKY))
                     {
                         clientUnstick (c, TRUE);
-                        frameDraw (c, FALSE);
+                        frameQueueDraw (c, FALSE);
                     }
                     if (ev->data.l[0] != c->win_workspace)
                     {
@@ -2328,7 +2335,7 @@
         }
         if (!update)
         {
-            frameDraw (c, FALSE);
+            frameQueueDraw (c, FALSE);
         }
     }
 
@@ -2568,11 +2575,11 @@
                 {
                     clientHide (c, c->win_workspace, TRUE);
                 }
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
             case MENU_OP_MINIMIZE_ALL:
                 clientHideAll (c, c->win_workspace);
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
             case MENU_OP_UNMINIMIZE:
                 clientShow (c, TRUE);
@@ -2585,26 +2592,26 @@
             case MENU_OP_STICK:
             case MENU_OP_UNSTICK:
                 clientToggleSticky (c, TRUE);
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
             case MENU_OP_WORKSPACES:
                 clientSetWorkspace (c, GPOINTER_TO_INT (item_data), TRUE);
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
             case MENU_OP_DELETE:
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 clientClose (c);
                 break;
             case MENU_OP_CONTEXT_HELP:
                 clientEnterContextMenuState (c);
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
             case MENU_OP_ABOVE:
             case MENU_OP_NORMAL:
                 clientToggleAbove (c);
                 /* Fall thru */
             default:
-                frameDraw (c, FALSE);
+                frameQueueDraw (c, FALSE);
                 break;
         }
     }
@@ -2642,7 +2649,7 @@
     y = py;
 
     c->button_status[MENU_BUTTON] = BUTTON_STATE_PRESSED;
-    frameDraw (c, FALSE);
+    frameQueueDraw (c, FALSE);
     y = (gdouble) c->y;
     ops = MENU_OP_DELETE | MENU_OP_MINIMIZE_ALL | MENU_OP_WORKSPACES;
     insensitive = 0;
@@ -2789,7 +2796,7 @@
         TRACE ("Cannot open menu");
         gdk_beep ();
         c->button_status[MENU_BUTTON] = BUTTON_STATE_NORMAL;
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
         xfwmWindowDelete (&menu_event_window);
         menu_free (menu);
     }

Modified: xfwm4/trunk/src/focus.c
===================================================================
--- xfwm4/trunk/src/focus.c     2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/focus.c     2008-04-05 09:56:37 UTC (rev 26782)
@@ -468,7 +468,7 @@
         }
         data[0] = c->window;
         clientAdjustFullscreenLayer (c, TRUE);
-        frameDraw (c, FALSE);
+        frameQueueDraw (c, FALSE);
     }
     else
     {
@@ -481,7 +481,7 @@
             clientAdjustFullscreenLayer (c2, FALSE);
             /* clientRaise (c, None); */
         }
-        frameDraw (c2, FALSE);
+        frameQueueDraw (c2, FALSE);
     }
     data[1] = None;
     XChangeProperty (display_info->dpy, screen_info->xroot,
@@ -572,7 +572,7 @@
 
         if (c2)
         {
-            frameDraw (c2, FALSE);
+            frameQueueDraw (c2, FALSE);
             XChangeProperty (clientGetXDisplay (c2), c2->screen_info->xroot, 
display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
                              PropModeReplace, (unsigned char *) data, 2);
         }

Modified: xfwm4/trunk/src/frame.c
===================================================================
--- xfwm4/trunk/src/frame.c     2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/frame.c     2008-04-05 09:56:37 UTC (rev 26782)
@@ -831,7 +831,7 @@
 }
 
 void
-frameDraw (Client * c, gboolean clear_all)
+frameDraw (Client * c)
 {
     ScreenInfo *screen_info;
     FramePixmap frame_pix;
@@ -891,18 +891,12 @@
     FLAG_UNSET (c->xfwm_flags,  XFWM_FLAG_FIRST_MAP);
 
     /* Cache mgmt */
-    if (clear_all)
+    if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW))
     {
         width_changed = TRUE;
         height_changed = TRUE;
         requires_clearing = TRUE;
         frameClearQueueDraw (c);
-        if (c->frame_timeout_id)
-        {
-            g_source_remove (c->frame_timeout_id);
-            c->frame_timeout_id = 0;
-        }
-
     }
     else
     {
@@ -917,6 +911,7 @@
             c->previous_height = c->height;
         }
     }
+    FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW);
 
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
         && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
@@ -1185,7 +1180,7 @@
     c = (Client *) data;
     g_return_val_if_fail (c, FALSE);
 
-    frameDraw (c, TRUE);
+    frameDraw (c);
     c->frame_timeout_id = 0;
 
     return FALSE;
@@ -1206,12 +1201,22 @@
 }
 
 void
-frameQueueDraw (Client * c)
+frameQueueDraw (Client * c, gboolean clear_all)
 {
     g_return_if_fail (c);
 
     TRACE ("entering frameQueueDraw for \"%s\" (0x%lx)", c->name, c->window);
 
+    /* Reschedule update */
+    if (c->frame_timeout_id)
+    {
+        frameClearQueueDraw (c);
+    }
+    if (clear_all)
+    {
+        FLAG_SET (c->xfwm_flags, XFWM_FLAG_NEEDS_REDRAW);
+    }
+    /* Otherwise leave previous schedule */
     if (c->frame_timeout_id == 0)
     {
         c->frame_timeout_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,

Modified: xfwm4/trunk/src/frame.h
===================================================================
--- xfwm4/trunk/src/frame.h     2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/frame.h     2008-04-05 09:56:37 UTC (rev 26782)
@@ -42,9 +42,9 @@
 int                      frameY                                 (Client *);
 int                      frameWidth                             (Client *);
 int                      frameHeight                            (Client *);
-void                     frameDraw                              (Client *,
+void                     frameDraw                              (Client *);
+void                     frameClearQueueDraw                    (Client *);
+void                     frameQueueDraw                         (Client *,
                                                                  gboolean);
-void                     frameClearQueueDraw                    (Client *);
-void                     frameQueueDraw                         (Client *);
 
 #endif /* INC_FRAME_H */

Modified: xfwm4/trunk/src/netwm.c
===================================================================
--- xfwm4/trunk/src/netwm.c     2008-04-05 01:46:31 UTC (rev 26781)
+++ xfwm4/trunk/src/netwm.c     2008-04-05 09:56:37 UTC (rev 26782)
@@ -331,7 +331,7 @@
             {
                 clientToggleSticky (c, TRUE);
             }
-            frameDraw (c, FALSE);
+            frameQueueDraw (c, FALSE);
         }
     }
 
@@ -411,7 +411,7 @@
             clientSetNetState (c);
             clientWindowType (c);
         }
-        frameDraw (c, TRUE);
+        frameQueueDraw (c, TRUE);
     }
 
     if ((first  == display_info->atoms[NET_WM_STATE_FULLSCREEN]) ||
@@ -524,7 +524,7 @@
             FLAG_TOGGLE (c->flags, CLIENT_FLAG_SKIP_TASKBAR);
             clientSetNetState (c);
         }
-        frameDraw (c, TRUE);
+        frameQueueDraw (c, TRUE);
     }
 
     if ((first  == display_info->atoms[NET_WM_STATE_DEMANDS_ATTENTION]) ||

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to