Add a bit of scheduling to updates; update every 30 ms instead of waiting
authorKeith Packard <keithp@keithp.com>
Mon, 10 Nov 2003 05:48:23 +0000 (05:48 +0000)
committerKeith Packard <keithp@keithp.com>
Mon, 10 Nov 2003 05:48:23 +0000 (05:48 +0000)
    for more events. Smooths out window moving. Interval needs to be
    configurable probably.

ChangeLog
xcompmgr.c

index cb4adb9..3eea662 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2003-11-09  Keith Packard  <keithp@keithp.com>
 
+       * xcompmgr.c: (time_in_millis), (main):
+       Add a bit of scheduling to updates; update every 30 ms
+       instead of waiting for more events.  Smooths out window moving.
+       Interval needs to be configurable probably.
+
+2003-11-09  Keith Packard  <keithp@keithp.com>
+
        * xcompmgr.c: (root_tile):
        Make sure _XROOTPMAP_ID property is right type, format and length
        before attempting to use the resulting value.
index 7b55eae..0662b82 100644 (file)
@@ -732,6 +732,17 @@ expose_root (Display *dpy, Window root, XRectangle *rects, int nrects)
     add_damage (dpy, region);
 }
 
+int
+time_in_millis ()
+{
+    struct timeval  tp;
+
+    gettimeofday (&tp, 0);
+    return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);
+}
+
+#define INTERVAL    30
+
 main ()
 {
     XEvent         ev;
@@ -751,6 +762,9 @@ main ()
     int                    n_expose = 0;
     struct pollfd   ufd;
     int                    n;
+    int                    last_update;
+    int                    now;
+    int                    timeout;
 
     dpy = XOpenDisplay (0);
     if (!dpy)
@@ -808,6 +822,7 @@ main ()
        add_win (dpy, children[i], i ? children[i-1] : None);
     XFree (children);
     XUngrabServer (dpy);
+    last_update = time_in_millis ();
     for (;;)
     {
 /*     dump_wins (); */
@@ -873,11 +888,17 @@ main ()
                break;
            }
        } while (XEventsQueued (dpy, QueuedAfterReading));
-       ufd.fd = ConnectionNumber (dpy);
-       ufd.events = POLLIN;
-       n = poll (&ufd, 1, 30);
-       if (n > 0 && (ufd.revents & POLLIN) && XEventsQueued (dpy, QueuedAfterReading))
-           continue;
+       now = time_in_millis ();
+       timeout = INTERVAL - (now - last_update);
+       if (timeout > 0)
+       {
+           ufd.fd = ConnectionNumber (dpy);
+           ufd.events = POLLIN;
+           n = poll (&ufd, 1, timeout);
+           if (n > 0 && (ufd.revents & POLLIN) && XEventsQueued (dpy, QueuedAfterReading))
+               continue;
+       }
+       last_update = time_in_millis();
        if (allDamage)
        {
            paint_all (dpy, allDamage);