ref: 6fcd59e9ec30216fa9e46647e9ad1f3fe92be7a7
parent: a25f83e3c592e6819b9edf2884e3ea1db8a96422
	author: Russ Cox <rsc@swtch.com>
	date: Tue Jan 16 19:26:51 EST 2007
	
more fixes from andrey
--- a/gui-osx/screen.c
+++ b/gui-osx/screen.c
@@ -335,8 +335,8 @@
UInt32 class = GetEventClass (event);
UInt32 kind = GetEventKind (event);
static uint32_t mousebuttons = 0; // bitmask of buttons currently down
- static uint32_t mouseX = 0; // current mouse X position
- static uint32_t mouseY = 0; // current mouse Y position
+ static uint32_t mouseX = 0;
+ static uint32_t mouseY = 0;
 	if(class == kEventClassKeyboard) {char macCharCodes;
@@ -353,30 +353,55 @@
case kEventRawKeyModifiersChanged:
if (macKeyModifiers == (controlKey | optionKey)) leave_full_screen();
-			if(macKeyModifiers & optionKey) {+			switch(macKeyModifiers & (optionKey | cmdKey)) {+ case (optionKey | cmdKey):
+ /* due to chording we need to handle the case when both
+ * modifier keys are pressed at the same time.
+ * currently it's only 2-3 snarf and the 3-2 noop
+ */
altPressed = true;
-				if(mousebuttons & 1) {+				if(mousebuttons & 1 || mousebuttons & 2 || mousebuttons & 4) {mousebuttons |= 2; /* set button 2 */
+ mousebuttons |= 4; /* set button 3 */
button2 = true;
+ button3 = true;
sendbuttons(mousebuttons, mouseX, mouseY);
- }
-			} else if(macKeyModifiers & cmdKey) {-				if(mousebuttons & 1) {+ }
+ break;
+ case optionKey:
+ altPressed = true;
+				if(mousebuttons & 1 || mousebuttons & 4) {+ mousebuttons |= 2; /* set button 2 */
+ button2 = true;
+ sendbuttons(mousebuttons, mouseX, mouseY);
+ }
+ break;
+ case cmdKey:
+				if(mousebuttons & 1 || mousebuttons & 2) {mousebuttons |= 4; /* set button 3 */
button3 = true;
sendbuttons(mousebuttons, mouseX, mouseY);
}
-			} else if(altPressed) {- kbdputc(kbdq, Kalt);
- altPressed = false;
-			} else if(button2) {- mousebuttons &= ~2; /* clear button 2 */
- button2 = false;
- sendbuttons(mousebuttons, mouseX, mouseY);
-			} else if(button3) {- mousebuttons &= ~4; /* clear button 3 */
- button3 = false;
- sendbuttons(mousebuttons, mouseX, mouseY);
+ break;
+ case 0:
+ default:
+				if(button2 || button3) {+					if(button2) {+ mousebuttons &= ~2; /* clear button 2 */
+ button2 = false;
+ altPressed = false;
+ }
+					if(button3) {+ mousebuttons &= ~4; /* clear button 3 */
+ button3 = false;
+ }
+ sendbuttons(mousebuttons, mouseX, mouseY);
+ }
+				if(altPressed) {+ kbdputc(kbdq, Kalt);
+ altPressed = false;
+ }
+ break;
}
break;
case kEventRawKeyDown:
--
⑨