redo the event loop to make event response better
This commit is contained in:
@@ -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);
|
||||||
|
Reference in New Issue
Block a user