XQuartz: Made DarwinSendDDXEvent a little more robust to context switching diring server init.

(cherry picked from commit 5626b0949b1a6bdd2fa3ec2ef53a688084349b87)
This commit is contained in:
Jeremy Huddleston 2008-05-15 05:49:43 -07:00
parent adc62f62b9
commit 1d09deaa6e
2 changed files with 15 additions and 15 deletions

View File

@ -59,11 +59,9 @@
int X11EnableKeyEquivalents = TRUE; int X11EnableKeyEquivalents = TRUE;
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE; int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
extern int darwinFakeButtons, input_check_flag; extern int darwinFakeButtons;
extern Bool enable_stereo; extern Bool enable_stereo;
extern xEvent *darwinEvents;
X11Application *X11App; X11Application *X11App;
#define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask) #define ALL_KEY_MASKS (NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask)

View File

@ -76,12 +76,10 @@ in this Software without prior written authorization from The Open Group.
/* FIXME: Abstract this better */ /* FIXME: Abstract this better */
void QuartzModeEQInit(void); void QuartzModeEQInit(void);
int input_check_zero, input_check_flag;
static int old_flags = 0; // last known modifier state static int old_flags = 0; // last known modifier state
xEvent *darwinEvents = NULL; static xEvent *darwinEvents = NULL;
pthread_mutex_t darwinEvents_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t darwinEvents_mutex = PTHREAD_MUTEX_INITIALIZER;
static inline void darwinEvents_lock(void) { static inline void darwinEvents_lock(void) {
int err; int err;
@ -307,11 +305,6 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in
} }
Bool DarwinEQInit(void) { Bool DarwinEQInit(void) {
if (!darwinEvents)
darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
if (!darwinEvents)
FatalError("Couldn't allocate event buffer\n");
mieqInit(); mieqInit();
mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler); mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler);
mieqSetHandler(kXquartzActivate, DarwinEventHandler); mieqSetHandler(kXquartzActivate, DarwinEventHandler);
@ -328,6 +321,11 @@ Bool DarwinEQInit(void) {
mieqSetHandler(kXquartzDisplayChanged, QuartzDisplayChangedHandler); mieqSetHandler(kXquartzDisplayChanged, QuartzDisplayChangedHandler);
QuartzModeEQInit(); QuartzModeEQInit();
if (!darwinEvents)
darwinEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
if (!darwinEvents)
FatalError("Couldn't allocate event buffer\n");
return TRUE; return TRUE;
} }
@ -354,7 +352,6 @@ void ProcessInputEvents(void) {
Dispatch() event loop to check out event queue */ Dispatch() event loop to check out event queue */
static void DarwinPokeEQ(void) { static void DarwinPokeEQ(void) {
char nullbyte=0; char nullbyte=0;
input_check_flag++;
// <daniels> oh, i ... er ... christ. // <daniels> oh, i ... er ... christ.
write(darwinEventWriteFD, &nullbyte, 1); write(darwinEventWriteFD, &nullbyte, 1);
} }
@ -567,8 +564,13 @@ void DarwinSendDDXEvent(int type, int argc, ...) {
va_end (args); va_end (args);
} }
darwinEvents_lock(); /* If we're called from something other than the X server thread, we need
* to wait for the X server to setup darwinEvents.
*/
while(darwinEvents == NULL) {
usleep(250000);
}
mieqEnqueue(darwinPointer, &xe); mieqEnqueue(darwinPointer, &xe);
DarwinPokeEQ(); DarwinPokeEQ();
darwinEvents_unlock();
} }