|
|
@ -32,10 +32,6 @@ EmuWindow_SDL2::~EmuWindow_SDL2() {
|
|
|
|
SDL_Quit();
|
|
|
|
SDL_Quit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
|
|
|
|
|
|
|
|
input_subsystem->GetMouse()->MouseMove(x, y, 0, 0, 0, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InputCommon::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) const {
|
|
|
|
InputCommon::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) const {
|
|
|
|
switch (button) {
|
|
|
|
switch (button) {
|
|
|
|
case SDL_BUTTON_LEFT:
|
|
|
|
case SDL_BUTTON_LEFT:
|
|
|
@ -53,44 +49,36 @@ InputCommon::MouseButton EmuWindow_SDL2::SDLButtonToMouseButton(u32 button) cons
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::pair<float, float> EmuWindow_SDL2::MouseToTouchPos(s32 touch_x, s32 touch_y) const {
|
|
|
|
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
SDL_GetWindowSize(render_window, &w, &h);
|
|
|
|
|
|
|
|
const float fx = static_cast<float>(touch_x) / w;
|
|
|
|
|
|
|
|
const float fy = static_cast<float>(touch_y) / h;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return {std::clamp<float>(fx, 0.0f, 1.0f), std::clamp<float>(fy, 0.0f, 1.0f)};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
|
|
|
|
void EmuWindow_SDL2::OnMouseButton(u32 button, u8 state, s32 x, s32 y) {
|
|
|
|
const auto mouse_button = SDLButtonToMouseButton(button);
|
|
|
|
const auto mouse_button = SDLButtonToMouseButton(button);
|
|
|
|
if (state == SDL_PRESSED) {
|
|
|
|
if (state == SDL_PRESSED) {
|
|
|
|
input_subsystem->GetMouse()->PressButton(x, y, 0, 0, mouse_button);
|
|
|
|
const auto [touch_x, touch_y] = MouseToTouchPos(x, y);
|
|
|
|
|
|
|
|
input_subsystem->GetMouse()->PressButton(x, y, touch_x, touch_y, mouse_button);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
input_subsystem->GetMouse()->ReleaseButton(mouse_button);
|
|
|
|
input_subsystem->GetMouse()->ReleaseButton(mouse_button);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::pair<unsigned, unsigned> EmuWindow_SDL2::TouchToPixelPos(float touch_x, float touch_y) const {
|
|
|
|
void EmuWindow_SDL2::OnMouseMotion(s32 x, s32 y) {
|
|
|
|
int w, h;
|
|
|
|
const auto [touch_x, touch_y] = MouseToTouchPos(x, y);
|
|
|
|
SDL_GetWindowSize(render_window, &w, &h);
|
|
|
|
input_subsystem->GetMouse()->MouseMove(x, y, touch_x, touch_y, 0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
touch_x *= w;
|
|
|
|
|
|
|
|
touch_y *= h;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return {static_cast<unsigned>(std::max(std::round(touch_x), 0.0f)),
|
|
|
|
|
|
|
|
static_cast<unsigned>(std::max(std::round(touch_y), 0.0f))};
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmuWindow_SDL2::OnFingerDown(float x, float y, std::size_t id) {
|
|
|
|
void EmuWindow_SDL2::OnFingerDown(float x, float y, std::size_t id) {
|
|
|
|
int width, height;
|
|
|
|
input_subsystem->GetTouchScreen()->TouchPressed(x, y, id);
|
|
|
|
SDL_GetWindowSize(render_window, &width, &height);
|
|
|
|
|
|
|
|
const auto [px, py] = TouchToPixelPos(x, y);
|
|
|
|
|
|
|
|
const float fx = px * 1.0f / width;
|
|
|
|
|
|
|
|
const float fy = py * 1.0f / height;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
input_subsystem->GetTouchScreen()->TouchPressed(fx, fy, id);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmuWindow_SDL2::OnFingerMotion(float x, float y, std::size_t id) {
|
|
|
|
void EmuWindow_SDL2::OnFingerMotion(float x, float y, std::size_t id) {
|
|
|
|
int width, height;
|
|
|
|
input_subsystem->GetTouchScreen()->TouchMoved(x, y, id);
|
|
|
|
SDL_GetWindowSize(render_window, &width, &height);
|
|
|
|
|
|
|
|
const auto [px, py] = TouchToPixelPos(x, y);
|
|
|
|
|
|
|
|
const float fx = px * 1.0f / width;
|
|
|
|
|
|
|
|
const float fy = py * 1.0f / height;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
input_subsystem->GetTouchScreen()->TouchMoved(fx, fy, id);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void EmuWindow_SDL2::OnFingerUp() {
|
|
|
|
void EmuWindow_SDL2::OnFingerUp() {
|
|
|
|