From: Keith Packard Date: Mon, 10 Nov 2003 05:48:23 +0000 (+0000) Subject: Add a bit of scheduling to updates; update every 30 ms instead of waiting X-Git-Tag: XCOMPMGR_1_0~25 X-Git-Url: http://git.openbox.org/?p=dana%2Fxcompmgr.git;a=commitdiff_plain;h=9e767b89cfa434e762f65f23c3be872cd5d99087 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. --- diff --git a/ChangeLog b/ChangeLog index cb4adb9..3eea662 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2003-11-09 Keith Packard + * 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 + * xcompmgr.c: (root_tile): Make sure _XROOTPMAP_ID property is right type, format and length before attempting to use the resulting value. diff --git a/xcompmgr.c b/xcompmgr.c index 7b55eae..0662b82 100644 --- a/xcompmgr.c +++ b/xcompmgr.c @@ -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);