summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorJeremy Huddleston <jeremyhu@freedesktop.org>2009-01-11 14:49:39 -0800
committerJeremy Huddleston <jeremyhu@freedesktop.org>2009-01-11 16:37:46 -0800
commit0720816aea20971ee94b5df3faa9cb9f16e93f82 (patch)
tree8ab4328c9eadd635ef0c234456eeb5983f1736dc /hw
parentc8bf582db8111f71b9250a602a9d5aa7bd828136 (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.m12
-rw-r--r--hw/xquartz/darwinEvents.c4
-rw-r--r--hw/xquartz/darwinEvents.h3
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 */