shithub: puzzles

Download patch

ref: 402408125eb8db989b125e3059f873b9a833632a
parent: 41ebdb29c6e40be97d2b02259c41522319d131d9
author: Simon Tatham <anakin@pobox.com>
date: Fri Jun 3 08:27:29 EDT 2005

Colin Watson suggests that Alt-click (or Option-click) could
usefully be equivalent to right-clicking on platforms other than OS
X; in particular, it's useful if you're running Linux on Apple
hardware such as PowerBook which inherently has only one button. So
here's the fix for GTK, and Windows as well (the latter for
completeness and consistency, not because I can actually think of
any reason somebody might be running Windows on one-button
hardware).

[originally from svn r5907]

--- a/gtk.c
+++ b/gtk.c
@@ -387,10 +387,10 @@
 
     if (event->button == 2 || (event->state & GDK_SHIFT_MASK))
 	button = MIDDLE_BUTTON;
+    else if (event->button == 3 || (event->state & GDK_MOD1_MASK))
+	button = RIGHT_BUTTON;
     else if (event->button == 1)
 	button = LEFT_BUTTON;
-    else if (event->button == 3)
-	button = RIGHT_BUTTON;
     else
 	return FALSE;		       /* don't even know what button! */
 
--- a/windows.c
+++ b/windows.c
@@ -1107,6 +1107,19 @@
     midend_redraw(fe->me);
 }
 
+static int is_alt_pressed(void)
+{
+    BYTE keystate[256];
+    int r = GetKeyboardState(keystate);
+    if (!r)
+	return FALSE;
+    if (keystate[VK_MENU] & 0x80)
+	return TRUE;
+    if (keystate[VK_RMENU] & 0x80)
+	return TRUE;
+    return FALSE;
+}
+
 static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
 				WPARAM wParam, LPARAM lParam)
 {
@@ -1316,10 +1329,10 @@
 	     */
 	    if (message == WM_MBUTTONDOWN || (wParam & MK_SHIFT))
 		button = MIDDLE_BUTTON;
-	    else if (message == WM_LBUTTONDOWN)
-		button = LEFT_BUTTON;
-	    else
+	    else if (message == WM_RBUTTONDOWN || is_alt_pressed())
 		button = RIGHT_BUTTON;
+	    else
+		button = LEFT_BUTTON;
 
 	    if (!midend_process_key(fe->me, (signed short)LOWORD(lParam),
 				    (signed short)HIWORD(lParam), button))
@@ -1341,10 +1354,10 @@
 	     */
 	    if (message == WM_MBUTTONUP || (wParam & MK_SHIFT))
 		button = MIDDLE_RELEASE;
-	    else if (message == WM_LBUTTONUP)
-		button = LEFT_RELEASE;
-	    else
+	    else if (message == WM_RBUTTONUP || is_alt_pressed())
 		button = RIGHT_RELEASE;
+	    else
+		button = LEFT_RELEASE;
 
 	    if (!midend_process_key(fe->me, (signed short)LOWORD(lParam),
 				    (signed short)HIWORD(lParam), button))
@@ -1359,10 +1372,10 @@
 
 	    if (wParam & (MK_MBUTTON | MK_SHIFT))
 		button = MIDDLE_DRAG;
-	    else if (wParam & MK_LBUTTON)
-		button = LEFT_DRAG;
-	    else
+	    else if (wParam & MK_RBUTTON || is_alt_pressed())
 		button = RIGHT_DRAG;
+	    else
+		button = LEFT_DRAG;
 	    
 	    if (!midend_process_key(fe->me, (signed short)LOWORD(lParam),
 				    (signed short)HIWORD(lParam), button))