diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-01-11 14:49:39 -0800 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2009-01-11 16:37:46 -0800 |
commit | 0720816aea20971ee94b5df3faa9cb9f16e93f82 (patch) | |
tree | 8ab4328c9eadd635ef0c234456eeb5983f1736dc /hw | |
parent | c8bf582db8111f71b9250a602a9d5aa7bd828136 (diff) |
XQuartz: Only call DarwinUpdateModKeys when needed
Previously, we were calling it on almost every itteration through sendX11Event
(cherry picked from commit 6461729647ff4441d80811e73f0c0d2f108f2700)
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xquartz/X11Application.m | 12 | ||||
-rw-r--r-- | hw/xquartz/darwinEvents.c | 4 | ||||
-rw-r--r-- | hw/xquartz/darwinEvents.h | 3 |
3 files changed, 15 insertions, 4 deletions
diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 50212dc9b..7bf4d71f5 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -65,6 +65,7 @@ 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; @@ -200,7 +201,8 @@ static void message_kit_thread (SEL selector, NSObject *arg) { } } else { - DarwinUpdateModKeys(0); + if(darwin_modifier_flags) + DarwinUpdateModKeys(0); for(i=0; i < NUM_KEYCODES; i++) { if(keyState[i] == NSKeyDown) { DarwinSendKeyboardEvents(KeyRelease, i); @@ -872,6 +874,7 @@ 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); @@ -916,6 +919,10 @@ 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); @@ -932,7 +939,6 @@ void X11ApplicationMain (int argc, char **argv, char **envp) { } @implementation X11Application (Private) -extern int darwin_modifier_flags; // darwinEvents.c #ifdef NX_DEVICELCMDKEYMASK /* This is to workaround a bug in the VNC server where we sometimes see the L @@ -987,6 +993,8 @@ 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; + /* 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 diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index 0d864db97..2dc048278 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -145,7 +145,7 @@ static void DarwinPressModifierKey(int pressed, int key) { * Send events to update the modifier state. */ -static int modifier_mask_list[] = { +int darwin_modifier_mask_list[] = { #ifdef NX_DEVICELCMDKEYMASK NX_DEVICELCTLKEYMASK, NX_DEVICERCTLKEYMASK, NX_DEVICELSHIFTKEYMASK, NX_DEVICERSHIFTKEYMASK, @@ -172,7 +172,7 @@ static void DarwinUpdateModifiers( DarwinPressModifierKey(KeyRelease, NX_MODIFIERKEY_ALPHALOCK); } - for(f=modifier_mask_list; *f; f++) + for(f=darwin_modifier_mask_list; *f; f++) if(*f & flags) { key = DarwinModifierNXMaskToNXKey(*f); if(key == -1) diff --git a/hw/xquartz/darwinEvents.h b/hw/xquartz/darwinEvents.h index 2f1d9ff6f..9ec3bda2f 100644 --- a/hw/xquartz/darwinEvents.h +++ b/hw/xquartz/darwinEvents.h @@ -78,4 +78,7 @@ 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; + #endif /* _DARWIN_EVENTS_H */ |