aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-10-13 17:16:29 +0000
committerrsc <devnull@localhost>2003-10-13 17:16:29 +0000
commit59d7d92ee7a1de3387cedb079b1bfcfc75d34b8b (patch)
tree37fa225d401c8f404b02c39c1304563d2b3ca444 /src
parente6f4b2e311cd461dd2d8380ba21ab113e5c8c072 (diff)
downloadplan9port-59d7d92ee7a1de3387cedb079b1bfcfc75d34b8b.tar.gz
plan9port-59d7d92ee7a1de3387cedb079b1bfcfc75d34b8b.tar.bz2
plan9port-59d7d92ee7a1de3387cedb079b1bfcfc75d34b8b.zip
Flush the display when we poll for events.
Diffstat (limited to 'src')
-rw-r--r--src/libdraw/x11-event.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libdraw/x11-event.c b/src/libdraw/x11-event.c
index 9a23547a..1361b42e 100644
--- a/src/libdraw/x11-event.c
+++ b/src/libdraw/x11-event.c
@@ -15,6 +15,24 @@ event(Event *e)
return eread(~0UL, e);
}
+static void
+eflush(void)
+{
+ /* avoid generating a message if there's nothing to show. */
+ /* this test isn't perfect, though; could do flushimage(display, 0) then call extract */
+ /* also: make sure we don't interfere if we're multiprocessing the display */
+ if(display->locking){
+ /* if locking is being done by program, this means it can't depend on automatic flush in emouse() etc. */
+ if(canqlock(&display->qlock)){
+ if(display->bufp > display->buf)
+ flushimage(display, 1);
+ unlockdisplay(display);
+ }
+ }else
+ if(display->bufp > display->buf)
+ flushimage(display, 1);
+}
+
ulong
eread(ulong keys, Event *e)
{
@@ -23,6 +41,8 @@ eread(ulong keys, Event *e)
xmask = ExposureMask;
+ eflush();
+
if(keys&Emouse)
xmask |= MouseMask|StructureNotifyMask;
if(keys&Ekeyboard)
@@ -103,6 +123,7 @@ ecanmouse(void)
XEvent xe;
Mouse m;
+ eflush();
again:
if(XCheckWindowEvent(_x.display, _x.drawable, MouseMask, &xe)){
if(xtoplan9mouse(&xe, &m) < 0)
@@ -118,6 +139,7 @@ ecankbd(void)
{
XEvent xe;
+ eflush();
again:
if(XCheckWindowEvent(_x.display, _x.drawable, KeyPressMask, &xe)){
if(xtoplan9kbd(&xe) == -1)
@@ -134,3 +156,9 @@ emoveto(Point p)
xmoveto(p);
}
+void
+esetcursor(Cursor *c)
+{
+ xsetcursor(c);
+}
+