SDL: Support Mouse.

In ImGui there are a couple of issues:
1) it ignores the menu area when computing relative motion
2) does not work well with windowed video

Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
Andrea Odetti 2021-04-04 16:44:04 +01:00
parent dd683e8e48
commit f144cb037f
3 changed files with 69 additions and 0 deletions

View file

@ -175,6 +175,16 @@ namespace sa2
return; // do not pass on return; // do not pass on
} }
} }
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEMOTION:
{
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse)
{
return; // do not pass on
}
}
} }
SDLFrame::ProcessSingleEvent(event, quit); SDLFrame::ProcessSingleEvent(event, quit);

View file

@ -15,6 +15,7 @@
#include "NTSC.h" #include "NTSC.h"
#include "CPU.h" #include "CPU.h"
#include "Mockingboard.h" #include "Mockingboard.h"
#include "MouseInterface.h"
#include "linux/paddle.h" #include "linux/paddle.h"
#include "linux/keyboard.h" #include "linux/keyboard.h"
@ -245,6 +246,17 @@ namespace sa2
ProcessText(e.text); ProcessText(e.text);
break; break;
} }
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
{
ProcessMouseButton(e.button);
break;
}
case SDL_MOUSEMOTION:
{
ProcessMouseMotion(e.motion);
break;
}
case SDL_DROPFILE: case SDL_DROPFILE:
{ {
ProcessDropEvent(e.drop); ProcessDropEvent(e.drop);
@ -254,6 +266,51 @@ namespace sa2
} }
} }
void SDLFrame::ProcessMouseButton(const SDL_MouseButtonEvent & event)
{
CardManager & cardManager = GetCardMgr();
if (cardManager.IsMouseCardInstalled() && cardManager.GetMouseCard()->IsActiveAndEnabled())
{
switch (event.button)
{
case SDL_BUTTON_LEFT:
case SDL_BUTTON_RIGHT:
{
const eBUTTONSTATE state = (event.state == SDL_PRESSED) ? BUTTON_DOWN : BUTTON_UP;
const eBUTTON button = (event.button == SDL_BUTTON_LEFT) ? BUTTON0 : BUTTON1;
cardManager.GetMouseCard()->SetButton(button, state);
break;
}
}
}
}
void SDLFrame::ProcessMouseMotion(const SDL_MouseMotionEvent & motion)
{
CardManager & cardManager = GetCardMgr();
if (cardManager.IsMouseCardInstalled() && cardManager.GetMouseCard()->IsActiveAndEnabled())
{
int iX, iMinX, iMaxX;
int iY, iMinY, iMaxY;
cardManager.GetMouseCard()->GetXY(iX, iMinX, iMaxX, iY, iMinY, iMaxY);
int width, height;
SDL_GetWindowSize(myWindow.get(), &width, &height);
const int newX = int((double(motion.x) / double(width)) * (iMaxX - iMinX) + iMinX);
const int newY = int((double(motion.y) / double(height)) * (iMaxY - iMinY) + iMinY);
const int dx = newX - iX;
const int dy = newY - iY;
int outOfBoundsX;
int outOfBoundsY;
cardManager.GetMouseCard()->SetPositionRel(dx, dy, &outOfBoundsX, &outOfBoundsY);
}
}
void SDLFrame::ProcessDropEvent(const SDL_DropEvent & drop) void SDLFrame::ProcessDropEvent(const SDL_DropEvent & drop)
{ {
const char * filename = drop.file; const char * filename = drop.file;

View file

@ -48,6 +48,8 @@ namespace sa2
void ProcessKeyUp(const SDL_KeyboardEvent & key); void ProcessKeyUp(const SDL_KeyboardEvent & key);
void ProcessText(const SDL_TextInputEvent & text); void ProcessText(const SDL_TextInputEvent & text);
void ProcessDropEvent(const SDL_DropEvent & drop); void ProcessDropEvent(const SDL_DropEvent & drop);
void ProcessMouseButton(const SDL_MouseButtonEvent & button);
void ProcessMouseMotion(const SDL_MouseMotionEvent & motion);
std::shared_ptr<SDL_Window> myWindow; std::shared_ptr<SDL_Window> myWindow;