chiark / gitweb /
Colin Watson suggests that Alt-click (or Option-click) could
authorSimon Tatham <anakin@pobox.com>
Fri, 3 Jun 2005 12:27:29 +0000 (12:27 +0000)
committerSimon Tatham <anakin@pobox.com>
Fri, 3 Jun 2005 12:27:29 +0000 (12:27 +0000)
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]

gtk.c
windows.c

diff --git a/gtk.c b/gtk.c
index 7a92d668712ab51100977321bc83e0f3986607a3..7483a98eea4bc9f5fcb87f753af79ca8d7aaa0cb 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -387,10 +387,10 @@ static gint button_event(GtkWidget *widget, GdkEventButton *event,
 
     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! */
 
index 430fff045ba2c6a3f1244e8129930f943f01fc79..be1f17cb8a5fd2de04b8fe9fc3d693c567e405cf 100644 (file)
--- a/windows.c
+++ b/windows.c
@@ -1107,6 +1107,19 @@ static void new_game_type(frontend *fe)
     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 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
             */
            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 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
             */
            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 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
 
            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))