diff options
author | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-08-14 07:32:37 -0700 |
---|---|---|
committer | Jeremy Huddleston <jeremyhu@freedesktop.org> | 2008-08-14 09:13:35 -0700 |
commit | 1770c85374883229ec5e9685229b2333e62705e6 (patch) | |
tree | 52af102f537eff82af119b504f83cd5fceb1843c | |
parent | f51f77d25e69b51fa3fd557ffdb5573b61759706 (diff) | |
download | xserver-1770c85374883229ec5e9685229b2333e62705e6.tar.gz |
XQuartz: Made 3-button mouse simulation a little more consistent.
(cherry picked from commit d207b037d2ae213369e5627a17d8831c9bc16ad8)
-rw-r--r-- | hw/xquartz/darwinEvents.c | 102 |
1 files changed, 30 insertions, 72 deletions
diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index b731c72c3..d00c088de 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -77,7 +77,7 @@ in this Software without prior written authorization from The Open Group. /* FIXME: Abstract this better */ void QuartzModeEQInit(void); -static int old_flags = 0; // last known modifier state +static int modifier_flags = 0; // last known modifier state #define FD_ADD_MAX 128 static int fd_add[FD_ADD_MAX]; @@ -140,19 +140,19 @@ static inline void darwinEvents_unlock(void) { /* * DarwinPressModifierMask - * Press or release the given modifier key, specified by its mask. + * Press or release the given modifier key, specified by its mask (one of NX_*MASK constants) */ -static void DarwinPressModifierMask( - int pressed, - int mask) // one of NX_*MASK constants -{ +static void DarwinPressModifierMask(int pressed, int mask) { + int keycode; int key = DarwinModifierNXMaskToNXKey(mask); if (key != -1) { - int keycode = DarwinModifierNXKeyToNXKeycode(key, 0); + keycode = DarwinModifierNXKeyToNXKeycode(key, 0); if (keycode != 0) - DarwinSendKeyboardEvents(pressed, keycode); + DarwinSendKeyboardEvents(pressed, keycode); } + + ErrorF("DarwinPressModifierMask pressed=%s, mask=%d, key=%d, keycode=%d\n", pressed == KeyPress ? "press" : "release", mask, key, keycode); } #ifdef NX_DEVICELCTLKEYMASK @@ -187,6 +187,8 @@ static void DarwinUpdateModifiers( int pressed, // KeyPress or KeyRelease int flags ) // modifier flags that have changed { + fprintf(stderr, "DarwinUpdateModifiers pressed=%s, flags=%x\n", pressed == KeyPress ? "press" : "release", flags); + if (flags & NX_ALPHASHIFTMASK) { DarwinPressModifierMask(pressed, NX_ALPHASHIFTMASK); } @@ -214,45 +216,10 @@ static void DarwinUpdateModifiers( * are held down during a "context" switch -- otherwise, we would miss the KeyUp. */ static void DarwinReleaseModifiers(void) { + ErrorF("DarwinReleaseModifiers\n"); DarwinUpdateModifiers(KeyRelease, COMMAND_MASK(-1) | CONTROL_MASK(-1) | ALTERNATE_MASK(-1) | SHIFT_MASK(-1)); } -/* - * DarwinSimulateMouseClick - * Send a mouse click to X when multiple mouse buttons are simulated - * with modifier-clicks, such as command-click for button 2. The dix - * layer is told that the previously pressed modifier key(s) are - * released, the simulated click event is sent. After the mouse button - * is released, the modifier keys are reverted to their actual state, - * which may or may not be pressed at that point. This is usually - * closest to what the user wants. Ie. the user typically wants to - * simulate a button 2 press instead of Command-button 2. - */ -static void DarwinSimulateMouseClick( - int pointer_x, - int pointer_y, - float pressure, - float tilt_x, - float tilt_y, - int whichButton, // mouse button to be pressed - int modifierMask) // modifiers used for the fake click -{ - // first fool X into forgetting about the keys - // for some reason, it's not enough to tell X we released the Command key -- - // it has to be the *left* Command key. - if (modifierMask & NX_COMMANDMASK) modifierMask |=NX_DEVICELCMDKEYMASK ; - DarwinUpdateModifiers(KeyRelease, modifierMask); - - // push the mouse button - DarwinSendPointerEvents(ButtonPress, whichButton, pointer_x, pointer_y, - pressure, tilt_x, tilt_y); - DarwinSendPointerEvents(ButtonRelease, whichButton, pointer_x, pointer_y, - pressure, tilt_x, tilt_y); - - // restore old modifiers - DarwinUpdateModifiers(KeyPress, modifierMask); -} - /* Generic handler for Xquartz-specifc events. When possible, these should be moved into their own individual functions and set as handlers using mieqSetHandler. */ @@ -475,7 +442,6 @@ static void DarwinPrepareValuators(int *valuators, ScreenPtr screen, void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y, float pressure, float tilt_x, float tilt_y) { static int darwinFakeMouseButtonDown = 0; - static int darwinFakeMouseButtonMask = 0; int i, num_events; DeviceIntPtr dev; ScreenPtr screen; @@ -499,35 +465,27 @@ void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int poin return; } + /* Handle fake click */ if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) { - // Mimic multi-button mouse with modifier-clicks - // If both sets of modifiers are pressed, - // button 2 is clicked. - if ((old_flags & darwinFakeMouse2Mask) == darwinFakeMouse2Mask) { - DarwinSimulateMouseClick(pointer_x, pointer_y, pressure, - tilt_x, tilt_y, 2, darwinFakeMouse2Mask); + if(darwinFakeMouseButtonDown != 0) { + /* We're currently "down" with another button, so release it first */ + DarwinSendPointerEvents(ButtonRelease, darwinFakeMouseButtonDown, pointer_x, pointer_y, pressure, tilt_x, tilt_y); + darwinFakeMouseButtonDown=0; + } + if ((modifier_flags & darwinFakeMouse2Mask) == darwinFakeMouse2Mask) { + ev_button = 2; darwinFakeMouseButtonDown = 2; - darwinFakeMouseButtonMask = darwinFakeMouse2Mask; - return; - } else if ((old_flags & darwinFakeMouse3Mask) == darwinFakeMouse3Mask) { - DarwinSimulateMouseClick(pointer_x, pointer_y, pressure, - tilt_x, tilt_y, 3, darwinFakeMouse3Mask); + } else if ((modifier_flags & darwinFakeMouse3Mask) == darwinFakeMouse3Mask) { + ev_button = 3; darwinFakeMouseButtonDown = 3; - darwinFakeMouseButtonMask = darwinFakeMouse3Mask; - return; } } - if (ev_type == ButtonRelease && darwinFakeButtons && darwinFakeMouseButtonDown) { - // If last mousedown was a fake click, don't check for - // mouse modifiers here. The user may have released the - // modifiers before the mouse button. - ev_button = darwinFakeMouseButtonDown; - darwinFakeMouseButtonDown = 0; - // Bring modifiers back up to date - DarwinUpdateModifiers(KeyPress, darwinFakeMouseButtonMask & old_flags); - darwinFakeMouseButtonMask = 0; - return; + if (ev_type == ButtonRelease && ev_button == 1) { + if(darwinFakeMouseButtonDown) { + ev_button = darwinFakeMouseButtonDown; + darwinFakeMouseButtonDown = 0; + } } DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y); @@ -547,7 +505,7 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) { return; } - if (old_flags == 0 && darwinSyncKeymap && darwinKeymapFile == NULL) { + if (modifier_flags == 0 && darwinSyncKeymap && darwinKeymapFile == NULL) { /* See if keymap has changed. */ static unsigned int last_seed; @@ -627,9 +585,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, old_flags & ~flags); - DarwinUpdateModifiers(KeyPress, ~old_flags & flags); - old_flags = flags; + DarwinUpdateModifiers(KeyRelease, modifier_flags & ~flags); + DarwinUpdateModifiers(KeyPress, ~modifier_flags & flags); + modifier_flags = flags; } /* |