diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | xcompmgr.c | 31 |
2 files changed, 33 insertions, 5 deletions
@@ -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. @@ -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); |