XQuartz: Made DarwinSendDDXEvent a little more robust to context switching diring server init.
(cherry picked from commit 5626b0949b1a6bdd2fa3ec2ef53a688084349b87)
This commit is contained in:
parent
adc62f62b9
commit
1d09deaa6e
|
@ -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)
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue