XQuartz: Make sure the Fn doesn't trigger unneccessary calls to DarwinUpdateModKeys()

(cherry picked from commit 70a18558c6b0a02b633fd8974f002cdf3cdc713e)
This commit is contained in:
Jeremy Huddleston 2009-04-11 14:23:41 -07:00
parent bd1d917909
commit 5e55becddc
3 changed files with 41 additions and 28 deletions

View File

@ -65,7 +65,6 @@ extern BOOL xpbproxy_init (void);
/* Stuck modifier / button state... force release when we context switch */ /* Stuck modifier / button state... force release when we context switch */
static NSEventType keyState[NUM_KEYCODES]; static NSEventType keyState[NUM_KEYCODES];
static int modifierFlagsMask;
int X11EnableKeyEquivalents = TRUE, quartzFullscreenMenu = FALSE; int X11EnableKeyEquivalents = TRUE, quartzFullscreenMenu = FALSE;
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE; int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
@ -207,7 +206,7 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
} }
} else { } else {
if(darwin_modifier_flags) if(darwin_all_modifier_flags)
DarwinUpdateModKeys(0); DarwinUpdateModKeys(0);
for(i=0; i < NUM_KEYCODES; i++) { for(i=0; i < NUM_KEYCODES; i++) {
if(keyState[i] == NSKeyDown) { if(keyState[i] == NSKeyDown) {
@ -880,7 +879,6 @@ environment the next time you start X11?", @"Startup xinitrc dialog");
void X11ApplicationMain (int argc, char **argv, char **envp) { void X11ApplicationMain (int argc, char **argv, char **envp) {
NSAutoreleasePool *pool; NSAutoreleasePool *pool;
int *p;
#ifdef DEBUG #ifdef DEBUG
while (access ("/tmp/x11-block", F_OK) == 0) sleep (1); while (access ("/tmp/x11-block", F_OK) == 0) sleep (1);
@ -925,10 +923,6 @@ void X11ApplicationMain (int argc, char **argv, char **envp) {
fprintf(stderr, "X11ApplicationMain: Could not build a valid keymap.\n"); fprintf(stderr, "X11ApplicationMain: Could not build a valid keymap.\n");
} }
for(p=darwin_modifier_mask_list, modifierFlagsMask=0; *p; p++) {
modifierFlagsMask |= *p;
}
/* Tell the server thread that it can proceed */ /* Tell the server thread that it can proceed */
QuartzInitServer(argc, argv, envp); QuartzInitServer(argc, argv, envp);
@ -1005,14 +999,14 @@ static inline int ensure_flag(int flags, int device_independent, int device_depe
modifierFlags = ensure_flag(modifierFlags, NX_ALTERNATEMASK, NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK, NX_DEVICELALTKEYMASK); modifierFlags = ensure_flag(modifierFlags, NX_ALTERNATEMASK, NX_DEVICELALTKEYMASK | NX_DEVICERALTKEYMASK, NX_DEVICELALTKEYMASK);
#endif #endif
modifierFlags &= modifierFlagsMask; modifierFlags &= darwin_all_modifier_mask;
/* We don't receive modifier key events while out of focus, and 3button /* We don't receive modifier key events while out of focus, and 3button
* emulation mucks this up, so we need to check our modifier flag state * emulation mucks this up, so we need to check our modifier flag state
* on every event... ugg * on every event... ugg
*/ */
if(darwin_modifier_flags != modifierFlags) if(darwin_all_modifier_flags != modifierFlags)
DarwinUpdateModKeys(modifierFlags); DarwinUpdateModKeys(modifierFlags);
switch ([e type]) { switch ([e type]) {

View File

@ -74,7 +74,9 @@ 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 darwin_modifier_flags = 0; // last known modifier state int darwin_all_modifier_flags = 0; // last known modifier state
int darwin_all_modifier_mask = 0;
int darwin_x11_modifier_mask = 0;
#define FD_ADD_MAX 128 #define FD_ADD_MAX 128
static int fd_add[FD_ADD_MAX]; static int fd_add[FD_ADD_MAX];
@ -145,7 +147,7 @@ static void DarwinPressModifierKey(int pressed, int key) {
* Send events to update the modifier state. * Send events to update the modifier state.
*/ */
int darwin_modifier_mask_list[] = { static int darwin_x11_modifier_mask_list[] = {
#ifdef NX_DEVICELCMDKEYMASK #ifdef NX_DEVICELCMDKEYMASK
NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK, NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK, NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
@ -154,10 +156,12 @@ int darwin_modifier_mask_list[] = {
#else #else
NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK, NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK,
#endif #endif
NX_ALPHASHIFTMASK, NX_SECONDARYFNMASK NX_ALPHASHIFTMASK,
0 0
}; };
static int darwin_all_modifier_mask_additions[] = { NX_SECONDARYFNMASK, };
static void DarwinUpdateModifiers( static void DarwinUpdateModifiers(
int pressed, // KeyPress or KeyRelease int pressed, // KeyPress or KeyRelease
int flags ) // modifier flags that have changed int flags ) // modifier flags that have changed
@ -173,11 +177,8 @@ static void DarwinUpdateModifiers(
DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK); DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
} }
for(f=darwin_modifier_mask_list; *f; f++) for(f=darwin_x11_modifier_mask_list; *f; f++)
/* NX_ALPHASHIFTMASK is handled above and NX_SECONDARYFNMASK is not if(*f & flags && *f != NX_ALPHASHIFTMASK) {
* mapped to a key (it is just useful for 3button mouse simulation
*/
if(*f & flags && *f != NX_ALPHASHIFTMASK && *f != NX_SECONDARYFNMASK) {
key = DarwinModifierNXMaskToNXKey(*f); key = DarwinModifierNXMaskToNXKey(*f);
if(key == -1) if(key == -1)
ErrorF("DarwinUpdateModifiers: Unsupported NXMask: 0x%x\n", *f); ErrorF("DarwinUpdateModifiers: Unsupported NXMask: 0x%x\n", *f);
@ -309,6 +310,16 @@ static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceInt
} }
Bool DarwinEQInit(void) { Bool DarwinEQInit(void) {
int *p;
for(p=darwin_x11_modifier_mask_list, darwin_all_modifier_mask=0; *p; p++) {
darwin_x11_modifier_mask |= *p;
}
for(p=darwin_all_modifier_mask_additions, darwin_all_modifier_mask= darwin_x11_modifier_mask; *p; p++) {
darwin_all_modifier_mask |= *p;
}
mieqInit(); mieqInit();
mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler); mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler);
mieqSetHandler(kXquartzActivate, DarwinEventHandler); mieqSetHandler(kXquartzActivate, DarwinEventHandler);
@ -437,14 +448,14 @@ void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, floa
DarwinSendPointerEvents(pDev, ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y); DarwinSendPointerEvents(pDev, ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y);
darwinFakeMouseButtonDown=0; darwinFakeMouseButtonDown=0;
} }
if (darwin_modifier_flags & darwinFakeMouse2Mask) { if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
ev_button = 2; ev_button = 2;
darwinFakeMouseButtonDown = 2; darwinFakeMouseButtonDown = 2;
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask); DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
} else if (darwin_modifier_flags & darwinFakeMouse3Mask) { } else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) {
ev_button = 3; ev_button = 3;
darwinFakeMouseButtonDown = 3; darwinFakeMouseButtonDown = 3;
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask); DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
} }
} }
@ -454,9 +465,9 @@ void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, floa
} }
if(darwinFakeMouseButtonDown == 2) { if(darwinFakeMouseButtonDown == 2) {
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask); DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
} else if(darwinFakeMouseButtonDown == 3) { } else if(darwinFakeMouseButtonDown == 3) {
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask); DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
} }
darwinFakeMouseButtonDown = 0; darwinFakeMouseButtonDown = 0;
@ -546,9 +557,9 @@ void DarwinSendScrollEvents(float count_x, float count_y,
/* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to /* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to
reflect changing modifier flags (alt, control, meta, etc) */ reflect changing modifier flags (alt, control, meta, etc) */
void DarwinUpdateModKeys(int flags) { void DarwinUpdateModKeys(int flags) {
DarwinUpdateModifiers(KeyRelease, darwin_modifier_flags & ~flags); DarwinUpdateModifiers(KeyRelease, darwin_all_modifier_flags & ~flags & darwin_x11_modifier_mask);
DarwinUpdateModifiers(KeyPress, ~darwin_modifier_flags & flags); DarwinUpdateModifiers(KeyPress, ~darwin_all_modifier_flags & flags & darwin_x11_modifier_mask);
darwin_modifier_flags = flags; darwin_all_modifier_flags = flags;
} }
/* /*

View File

@ -78,7 +78,15 @@ enum {
/* Send one of the above events to the server thread. */ /* Send one of the above events to the server thread. */
void DarwinSendDDXEvent(int type, int argc, ...); void DarwinSendDDXEvent(int type, int argc, ...);
extern int darwin_modifier_mask_list[]; /* A mask of the modifiers that are in our X11 keyboard layout:
extern int darwin_modifier_flags; * (Fn for example is just useful for 3button mouse emulation) */
extern int darwin_all_modifier_mask;
/* A mask of the modifiers that are in our X11 keyboard layout:
* (Fn for example is just useful for 3button mouse emulation) */
extern int darwin_x11_modifier_mask;
/* The current state of the above listed modifiers */
extern int darwin_all_modifier_flags;
#endif /* _DARWIN_EVENTS_H */ #endif /* _DARWIN_EVENTS_H */