redo the event loop to make event response better

This commit is contained in:
Brian Paul
2004-07-02 14:35:05 +00:00
parent 3bdc8535fc
commit d07859e718

View File

@@ -1,4 +1,3 @@
/* /*
* Copyright (C) 2000 Brian Paul All Rights Reserved. * Copyright (C) 2000 Brian Paul All Rights Reserved.
* *
@@ -60,7 +59,7 @@ struct winthread {
#define MAX_WINTHREADS 100 #define MAX_WINTHREADS 100
static struct winthread WinThreads[MAX_WINTHREADS]; static struct winthread WinThreads[MAX_WINTHREADS];
static int NumWinThreads = 0; static int NumWinThreads = 0;
static GLboolean ExitFlag = GL_FALSE; static volatile GLboolean ExitFlag = GL_FALSE;
@@ -186,33 +185,30 @@ draw_loop(struct winthread *wt)
static void static void
event_loop(Display *dpy) event_loop(Display *dpy)
{ {
while (!ExitFlag) { XEvent event;
static long mask = StructureNotifyMask | ExposureMask | KeyPressMask; int i;
XEvent event;
int i;
for (i = 0; i < NumWinThreads; i++) { while (!ExitFlag) {
struct winthread *wt = &WinThreads[i]; XNextEvent(dpy, &event);
while (XCheckWindowEvent(dpy, wt->Win, mask, &event)) { switch (event.type) {
if (event.xany.window == wt->Win) { case ConfigureNotify:
switch (event.type) { /* Find winthread for this event's window */
case ConfigureNotify: for (i = 0; i < NumWinThreads; i++) {
resize(wt, event.xconfigure.width, struct winthread *wt = &WinThreads[i];
event.xconfigure.height); if (event.xconfigure.window == wt->Win) {
break; resize(wt, event.xconfigure.width,
case KeyPress: event.xconfigure.height);
/* tell all threads to exit */ break;
ExitFlag = GL_TRUE;
/*printf("exit draw_loop %d\n", wt->Index);*/
return;
default:
/*no-op*/ ;
} }
} }
else { break;
printf("window mismatch\n"); case KeyPress:
} /* tell all threads to exit */
} ExitFlag = GL_TRUE;
/*printf("exit draw_loop %d\n", wt->Index);*/
return;
default:
/*no-op*/ ;
} }
} }
} }
@@ -391,7 +387,7 @@ main(int argc, char *argv[])
for (i = 0; i < numThreads; i++) { for (i = 0; i < numThreads; i++) {
pthread_create(&WinThreads[i].Thread, NULL, thread_function, pthread_create(&WinThreads[i].Thread, NULL, thread_function,
(void*) &WinThreads[i]); (void*) &WinThreads[i]);
printf("Created Thread %p\n", WinThreads[i].Thread); printf("Created Thread %d\n", (int) WinThreads[i].Thread);
} }
event_loop(dpy); event_loop(dpy);