SDL: testaudio: Make program usable without a 3-button mouse.

From bb2f767f5d7ab239e8483145b68428204260ce5d Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Wed, 11 Oct 2023 10:01:52 -0400
Subject: [PATCH] testaudio: Make program usable without a 3-button mouse.

---
 test/testaudio.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/test/testaudio.c b/test/testaudio.c
index 94de784715d3..3cb71a764273 100644
--- a/test/testaudio.c
+++ b/test/testaudio.c
@@ -113,6 +113,9 @@ static Thing *mouseover_thing = NULL;
 static Thing *droppable_highlighted_thing = NULL;
 static Thing *dragging_thing = NULL;
 static int dragging_button = -1;
+static int dragging_button_real = -1;
+static SDL_bool ctrl_held = SDL_FALSE;
+static SDL_bool alt_held = SDL_FALSE;
 
 static Texture *physdev_texture = NULL;
 static Texture *logdev_texture = NULL;
@@ -1077,11 +1080,21 @@ static void Loop(void)
                 thing = UpdateMouseOver(event.motion.x, event.motion.y);
                 if ((dragging_button == -1) && event.motion.state) {
                     if (event.motion.state & SDL_BUTTON_LMASK) {
-                        dragging_button = SDL_BUTTON_LEFT;
+                        /* for people that don't have all three buttons... */
+                        if (ctrl_held) {
+                            dragging_button = SDL_BUTTON_RIGHT;
+                        } else if (alt_held) {
+                            dragging_button = SDL_BUTTON_MIDDLE;
+                        } else {
+                            dragging_button = SDL_BUTTON_LEFT;
+                        }
+                        dragging_button_real = SDL_BUTTON_LEFT;
                     } else if (event.motion.state & SDL_BUTTON_RMASK) {
                         dragging_button = SDL_BUTTON_RIGHT;
+                        dragging_button_real = SDL_BUTTON_RIGHT;
                     } else if (event.motion.state & SDL_BUTTON_MMASK) {
                         dragging_button = SDL_BUTTON_MIDDLE;
+                        dragging_button_real = SDL_BUTTON_MIDDLE;
                     }
 
 
@@ -1117,10 +1130,11 @@ static void Loop(void)
                 break;
 
             case SDL_EVENT_MOUSE_BUTTON_UP:
-                if (dragging_button == event.button.button) {
+                if (dragging_button_real == event.button.button) {
                     Thing *dropped_thing = dragging_thing;
                     dragging_thing = NULL;
                     dragging_button = -1;
+                    dragging_button_real = -1;
                     if (dropped_thing && dropped_thing->ondrop) {
                         dropped_thing->ondrop(dropped_thing, event.button.button, event.button.x, event.button.y);
                     }
@@ -1133,6 +1147,12 @@ static void Loop(void)
                 UpdateMouseOver(event.wheel.mouseX, event.wheel.mouseY);
                 break;
 
+            case SDL_EVENT_KEY_DOWN:
+            case SDL_EVENT_KEY_UP:
+                ctrl_held = ((event.key.keysym.mod & SDL_KMOD_CTRL) != 0) ? SDL_TRUE : SDL_FALSE;
+                alt_held = ((event.key.keysym.mod & SDL_KMOD_ALT) != 0) ? SDL_TRUE : SDL_FALSE;
+                break;
+
             case SDL_EVENT_DROP_FILE:
                 SDL_Log("Drop file! '%s'", event.drop.file);
                 LoadWavThing(event.drop.file, event.drop.x, event.drop.y);