mbarnett@cs.utexas.edu (Michael Barnett) (12/13/89)
i am writing an X application that is accessed from inside of a
lisp application (using some facilities KCL provides for linking
KCL common lisp functions and C code).
my problem is that i don't want to call XtAppMainLoop as the event
loop. if i do, then when i want to exit the X application and return
to the lisp prompt, the X manual (X Toolkit Intrinsics - C Language
Interface X11 R3) says to call "exit" (from a callback, e.g.), but
this dumps me out of KCL and back to UNIX. (the manual says to do
this since XtAppMainLoop never returns.)
so in section 7.6 it says:
"there is nothing special about XtAppMainLoop; it is simply an
infinite loop that calls XtAppNextEvent and then XtDispatchEvent.
Applications can provide their own version of this loop, which
tests some global termination flag ... before circling back to
the call to XtAppNextEvent"
therefore i wrote the following:
XtAppContext app_context;
int NOT_DONE;
void main_loop()
{
XEvent *event;
NOT_DONE = 1;
while (NOT_DONE) {
XtAppNextEvent(app_context,&event);
XtDispatchEvent(&event);
}
}
void quit()
{
XtDestroyApplicationContext(app_context);
NOT_DONE = 0;
}
the application works fine, KCL allows me to define a function
main-loop that does nothing but call main_loop in the C code.
but when i try to call quit (from a callback), i get a
segmentation violation (which occurs in the function main_loop,
after the while loop). on the other hand, if i set NOT_DONE to
0 before the while loop, then the function returns and i get back
to the lisp prompt. i know this is rather skimpy on the details,
but does anyone have any ideas? i would very much appreciate it.
mike barnett (mbarnett@cs.utexas.edu)swick@ATHENA.MIT.EDU (Ralph R. Swick) (12/13/89)
Date: 12 Dec 89 16:57:51 GMT
From: snorkelwacker!usc!cs.utexas.edu!mbarnett@BLOOM-BEACON.MIT.EDU
(Michael Barnett)
void quit()
{
XtDestroyApplicationContext(app_context);
NOT_DONE = 0;
}
the application works fine, KCL allows me to define a function
main-loop that does nothing but call main_loop in the C code.
but when i try to call quit (from a callback), i get a
segmentation violation (which occurs in the function main_loop,
after the while loop).
Don't destroy the application context from within XtDispatchEvent
(i.e. from within a callback). This destroys lots of state that
Xt needs. If you simply set your flag and do the destroy when
XtDispatchEvent returns, you'll be safe.