aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ChangeLog7
-rw-r--r--xcompmgr.c31
2 files changed, 33 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index cb4adb9..3eea662 100644
--- 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.
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);