XQuartz: Make sure the Fn doesn't trigger unneccessary calls to DarwinUpdateModKeys()
This commit is contained in:
parent
b5ec3be6b5
commit
70a18558c6
|
@ -65,7 +65,6 @@ extern BOOL xpbproxy_init (void);
|
|||
|
||||
/* Stuck modifier / button state... force release when we context switch */
|
||||
static NSEventType keyState[NUM_KEYCODES];
|
||||
static int modifierFlagsMask;
|
||||
|
||||
int X11EnableKeyEquivalents = TRUE, quartzFullscreenMenu = FALSE;
|
||||
int quartzHasRoot = FALSE, quartzEnableRootless = TRUE;
|
||||
|
@ -207,7 +206,7 @@ static void message_kit_thread (SEL selector, NSObject *arg) {
|
|||
}
|
||||
} else {
|
||||
|
||||
if(darwin_modifier_flags)
|
||||
if(darwin_all_modifier_flags)
|
||||
DarwinUpdateModKeys(0);
|
||||
for(i=0; i < NUM_KEYCODES; i++) {
|
||||
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) {
|
||||
NSAutoreleasePool *pool;
|
||||
int *p;
|
||||
|
||||
#ifdef DEBUG
|
||||
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");
|
||||
}
|
||||
|
||||
for(p=darwin_modifier_mask_list, modifierFlagsMask=0; *p; p++) {
|
||||
modifierFlagsMask |= *p;
|
||||
}
|
||||
|
||||
/* Tell the server thread that it can proceed */
|
||||
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);
|
||||
#endif
|
||||
|
||||
modifierFlags &= modifierFlagsMask;
|
||||
modifierFlags &= darwin_all_modifier_mask;
|
||||
|
||||
/* 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
|
||||
* on every event... ugg
|
||||
*/
|
||||
|
||||
if(darwin_modifier_flags != modifierFlags)
|
||||
if(darwin_all_modifier_flags != modifierFlags)
|
||||
DarwinUpdateModKeys(modifierFlags);
|
||||
|
||||
switch ([e type]) {
|
||||
|
|
|
@ -75,7 +75,9 @@ in this Software without prior written authorization from The Open Group.
|
|||
/* FIXME: Abstract this better */
|
||||
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
|
||||
static int fd_add[FD_ADD_MAX];
|
||||
|
@ -146,7 +148,7 @@ static void DarwinPressModifierKey(int pressed, int key) {
|
|||
* Send events to update the modifier state.
|
||||
*/
|
||||
|
||||
int darwin_modifier_mask_list[] = {
|
||||
static int darwin_x11_modifier_mask_list[] = {
|
||||
#ifdef NX_DEVICELCMDKEYMASK
|
||||
NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK,
|
||||
NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK,
|
||||
|
@ -155,10 +157,12 @@ int darwin_modifier_mask_list[] = {
|
|||
#else
|
||||
NX_CONTROLMASK, NX_SHIFTMASK, NX_COMMANDMASK, NX_ALTERNATEMASK,
|
||||
#endif
|
||||
NX_ALPHASHIFTMASK, NX_SECONDARYFNMASK
|
||||
NX_ALPHASHIFTMASK,
|
||||
0
|
||||
};
|
||||
|
||||
static int darwin_all_modifier_mask_additions[] = { NX_SECONDARYFNMASK, };
|
||||
|
||||
static void DarwinUpdateModifiers(
|
||||
int pressed, // KeyPress or KeyRelease
|
||||
int flags ) // modifier flags that have changed
|
||||
|
@ -174,11 +178,8 @@ static void DarwinUpdateModifiers(
|
|||
DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK);
|
||||
}
|
||||
|
||||
for(f=darwin_modifier_mask_list; *f; f++)
|
||||
/* NX_ALPHASHIFTMASK is handled above and NX_SECONDARYFNMASK is not
|
||||
* mapped to a key (it is just useful for 3button mouse simulation
|
||||
*/
|
||||
if(*f & flags && *f != NX_ALPHASHIFTMASK && *f != NX_SECONDARYFNMASK) {
|
||||
for(f=darwin_x11_modifier_mask_list; *f; f++)
|
||||
if(*f & flags && *f != NX_ALPHASHIFTMASK) {
|
||||
key = DarwinModifierNXMaskToNXKey(*f);
|
||||
if(key == -1)
|
||||
ErrorF("DarwinUpdateModifiers: Unsupported NXMask: 0x%x\n", *f);
|
||||
|
@ -310,6 +311,16 @@ static void kXquartzListenOnOpenFDHandler(int screenNum, xEventPtr xe, DeviceInt
|
|||
}
|
||||
|
||||
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();
|
||||
mieqSetHandler(kXquartzReloadKeymap, DarwinKeyboardReloadHandler);
|
||||
mieqSetHandler(kXquartzActivate, DarwinEventHandler);
|
||||
|
@ -438,14 +449,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);
|
||||
darwinFakeMouseButtonDown=0;
|
||||
}
|
||||
if (darwin_modifier_flags & darwinFakeMouse2Mask) {
|
||||
if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
|
||||
ev_button = 2;
|
||||
darwinFakeMouseButtonDown = 2;
|
||||
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask);
|
||||
} else if (darwin_modifier_flags & darwinFakeMouse3Mask) {
|
||||
DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
|
||||
} else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) {
|
||||
ev_button = 3;
|
||||
darwinFakeMouseButtonDown = 3;
|
||||
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask);
|
||||
DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -455,9 +466,9 @@ void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, floa
|
|||
}
|
||||
|
||||
if(darwinFakeMouseButtonDown == 2) {
|
||||
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse2Mask);
|
||||
DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
|
||||
} else if(darwinFakeMouseButtonDown == 3) {
|
||||
DarwinUpdateModKeys(darwin_modifier_flags & ~darwinFakeMouse3Mask);
|
||||
DarwinUpdateModKeys(darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
|
||||
}
|
||||
|
||||
darwinFakeMouseButtonDown = 0;
|
||||
|
@ -547,9 +558,9 @@ void DarwinSendScrollEvents(float count_x, float count_y,
|
|||
/* Send the appropriate KeyPress/KeyRelease events to GetKeyboardEvents to
|
||||
reflect changing modifier flags (alt, control, meta, etc) */
|
||||
void DarwinUpdateModKeys(int flags) {
|
||||
DarwinUpdateModifiers(KeyRelease, darwin_modifier_flags & ~flags);
|
||||
DarwinUpdateModifiers(KeyPress, ~darwin_modifier_flags & flags);
|
||||
darwin_modifier_flags = flags;
|
||||
DarwinUpdateModifiers(KeyRelease, darwin_all_modifier_flags & ~flags & darwin_x11_modifier_mask);
|
||||
DarwinUpdateModifiers(KeyPress, ~darwin_all_modifier_flags & flags & darwin_x11_modifier_mask);
|
||||
darwin_all_modifier_flags = flags;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -78,7 +78,15 @@ enum {
|
|||
/* Send one of the above events to the server thread. */
|
||||
void DarwinSendDDXEvent(int type, int argc, ...);
|
||||
|
||||
extern int darwin_modifier_mask_list[];
|
||||
extern int darwin_modifier_flags;
|
||||
/* 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_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 */
|
||||
|
|
Loading…
Reference in New Issue
Block a user