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: