shithub: choc

Download patch

ref: e4681dd485de5a393070e3fcb91505116405cc1d
parent: b361695b7aa13dc89149e7394e273b204394ef79
author: Simon Howard <fraggle@gmail.com>
date: Sun Jul 29 19:41:12 EDT 2007

Allow more than the standard three mouse buttons to be defined through
setup (hopefully)

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 939

--- a/setup/txt_mouseinput.c
+++ b/setup/txt_mouseinput.c
@@ -33,21 +33,6 @@
 
 #define MOUSE_INPUT_WIDTH 8
 
-static int MouseButtonToSetting(int b)
-{
-    switch (b)
-    {
-        case TXT_MOUSE_LEFT:
-            return 0;
-        case TXT_MOUSE_RIGHT:
-            return 1;
-        case TXT_MOUSE_MIDDLE:
-            return 2;
-        default:
-            return -1;
-    }
-}
-
 static int MousePressCallback(txt_window_t *window, 
                               int x, int y, int b,
                               TXT_UNCAST_ARG(mouse_input))
@@ -56,7 +41,7 @@
 
     // Got the mouse press.  Save to the variable and close the window.
 
-    *mouse_input->variable = MouseButtonToSetting(b);
+    *mouse_input->variable = b - TXT_MOUSE_BASE;
     TXT_EmitSignal(mouse_input, "set");
     TXT_CloseWindow(window);
 
--- a/textscreen/txt_main.h
+++ b/textscreen/txt_main.h
@@ -33,10 +33,12 @@
 #include "txt_sdl.h"
 
 // Special keypress values that correspond to mouse button clicks
-//
-#define TXT_MOUSE_LEFT   1
-#define TXT_MOUSE_RIGHT  2
-#define TXT_MOUSE_MIDDLE 3
+
+#define TXT_MOUSE_BASE   0x10000
+#define TXT_MOUSE_LEFT   (TXT_MOUSE_BASE + 0)
+#define TXT_MOUSE_RIGHT  (TXT_MOUSE_BASE + 1)
+#define TXT_MOUSE_MIDDLE (TXT_MOUSE_BASE + 2)
+#define TXT_MAX_MOUSE_BUTTONS  16
 
 // Screen size
 
--- a/textscreen/txt_sdl.c
+++ b/textscreen/txt_sdl.c
@@ -322,7 +322,25 @@
     }
 }
 
+// Convert an SDL button index to textscreen button index.
+//
+// Note special cases because 2 == mid in SDL, 3 == mid in textscreen/setup
 
+static int SDLButtonToTXTButton(int button)
+{
+    switch (button)
+    {
+        case SDL_BUTTON_LEFT:
+            return TXT_MOUSE_LEFT;
+        case SDL_BUTTON_RIGHT:
+            return TXT_MOUSE_RIGHT;
+        case SDL_BUTTON_MIDDLE:
+            return TXT_MOUSE_MIDDLE;
+        default:
+            return TXT_MOUSE_BASE + button - 1;
+    }
+}
+
 signed int TXT_GetChar(void)
 {
     SDL_Event ev;
@@ -345,12 +363,10 @@
         switch (ev.type)
         {
             case SDL_MOUSEBUTTONDOWN:
-                if (ev.button.button == SDL_BUTTON_LEFT)
-                    return TXT_MOUSE_LEFT;
-                else if (ev.button.button == SDL_BUTTON_RIGHT)
-                    return TXT_MOUSE_RIGHT;
-                else if (ev.button.button == SDL_BUTTON_MIDDLE)
-                    return TXT_MOUSE_MIDDLE;
+                if (ev.button.button < TXT_MAX_MOUSE_BUTTONS)
+                {
+                    return SDLButtonToTXTButton(ev.button.button);
+                }
                 break;
 
             case SDL_KEYDOWN:
--- a/textscreen/txt_window.c
+++ b/textscreen/txt_window.c
@@ -390,9 +390,7 @@
 
     // Is this a mouse button ?
     
-    if (c == TXT_MOUSE_LEFT
-     || c == TXT_MOUSE_MIDDLE
-     || c == TXT_MOUSE_RIGHT)
+    if (c >= TXT_MOUSE_BASE && c < TXT_MOUSE_BASE + TXT_MAX_MOUSE_BUTTONS)
     {
         MouseButtonPress(window, c);
         return;