From 2651b15db1cf5a7b5df0620754a049106ff338d7 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 8 Jul 2019 17:36:55 -0400 Subject: [PATCH] Takes a first stab at mouse input support from SDL. There seems to be something odd going on with mouse buttons though; I'm going to test elsewhere. --- Inputs/QuadratureMouse/QuadratureMouse.hpp | 2 +- .../Mac/Clock Signal/Machine/CSMachine.mm | 2 +- OSBindings/SDL/main.cpp | 30 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Inputs/QuadratureMouse/QuadratureMouse.hpp b/Inputs/QuadratureMouse/QuadratureMouse.hpp index 5ec839eb0..0465f6f26 100644 --- a/Inputs/QuadratureMouse/QuadratureMouse.hpp +++ b/Inputs/QuadratureMouse/QuadratureMouse.hpp @@ -61,7 +61,7 @@ class QuadratureMouse: public Mouse { if(!axis_value) continue; primaries_[axis] ^= 1; - secondaries_[axis] = primaries_[axis]; + secondaries_[axis] = primaries_[axis] ^ axis; if(axis_value > 0) { -- axes_[axis]; secondaries_[axis] ^= 1; diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index 3d4c1566c..c2077baef 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -447,7 +447,7 @@ struct ActivityObserver: public Activity::Observer { auto mouse_machine = _machine->mouse_machine(); if(mouse_machine) { @synchronized(self) { - mouse_machine->get_mouse().move(int(deltaX), -int(deltaY)); + mouse_machine->get_mouse().move(int(deltaX), int(deltaY)); } } } diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index d030be004..5dce6daa8 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -583,6 +583,7 @@ int main(int argc, char *argv[]) { } // Run the main event loop until the OS tells us to quit. + const bool uses_mouse = !!machine->mouse_machine(); bool should_quit = false; Uint32 fullscreen_mode = 0; while(!should_quit) { @@ -621,6 +622,11 @@ int main(int argc, char *argv[]) { } } + // Use ctrl+escape to release the mouse (if captured). + if(event.key.keysym.sym == SDLK_ESCAPE && (SDL_GetModState()&KMOD_CTRL)) { + SDL_SetRelativeMouseMode(SDL_FALSE); + } + // Capture ctrl+shift+d as a take-a-screenshot command. if(event.key.keysym.sym == SDLK_d && (SDL_GetModState()&KMOD_CTRL) && (SDL_GetModState()&KMOD_SHIFT)) { // Grab the screen buffer. @@ -722,6 +728,30 @@ int main(int argc, char *argv[]) { } } break; + case SDL_MOUSEBUTTONDOWN: + if(uses_mouse && !SDL_GetRelativeMouseMode()) { + SDL_SetRelativeMouseMode(SDL_TRUE); + break; + } + case SDL_MOUSEBUTTONUP: { + const auto mouse_machine = machine->mouse_machine(); + if(mouse_machine) { + printf("%d %s\n", event.button.button, (event.type == SDL_PRESSED) ? "pressed" : "released"); + mouse_machine->get_mouse().set_button_pressed( + event.button.button % mouse_machine->get_mouse().get_number_of_buttons(), + event.type == SDL_PRESSED); + } + } break; + + case SDL_MOUSEMOTION: { + if(SDL_GetRelativeMouseMode()) { + const auto mouse_machine = machine->mouse_machine(); + if(mouse_machine) { + mouse_machine->get_mouse().move(event.motion.xrel, event.motion.yrel); + } + } + } break; + default: break; } }