Merge pull request #19605 from hrydgard/imgui-integration-work
Some checks are pending
Build / build-windows (ARM64) (push) Waiting to run
Build / build-windows (x64) (push) Waiting to run
Build / build-uwp (push) Waiting to run
Build / test-windows (push) Blocked by required conditions
Build / build (./b.sh --headless --unittest --fat --no-png --no-sdl2, clang, clang++, test, macos, macos-latest) (push) Waiting to run
Build / build (./b.sh --headless --unittest, clang, clang++, test, clang-normal, ubuntu-latest) (push) Waiting to run
Build / build (./b.sh --headless --unittest, gcc, g++, gcc-normal, ubuntu-latest) (push) Waiting to run
Build / build (./b.sh --ios, clang, clang++, ios, ios, macos-latest) (push) Waiting to run
Build / build (./b.sh --libretro_android ppsspp_libretro, clang, clang++, android, android-libretro, ubuntu-latest) (push) Waiting to run
Build / build (./b.sh --qt, gcc, g++, qt, qt, ubuntu-latest) (push) Waiting to run
Build / build (cd android && ./ab.sh -j2 APP_ABI=arm64-v8a OPENXR=1, clang, clang++, android, android-vr, ubuntu-latest) (push) Waiting to run
Build / build (cd android && ./ab.sh -j2 APP_ABI=arm64-v8a UNITTEST=1 HEADLESS=1, clang, clang++, android, android-arm64, ubuntu-latest) (push) Waiting to run
Build / build (cd android && ./ab.sh -j2 APP_ABI=armeabi-v7a UNITTEST=1 HEADLESS=1, clang, clang++, android, android-arm32, ubuntu-latest) (push) Waiting to run
Build / build (cd android && ./ab.sh -j2 APP_ABI=x86_64 UNITTEST=1 HEADLESS=1, clang, clang++, android, android-x86_64, ubuntu-latest) (push) Waiting to run
Build / build (make -C libretro -f Makefile -j2, clang, clang++, libretro, clang-libretro, ubuntu-latest) (push) Waiting to run
Build / build (make -C libretro -f Makefile -j2, gcc, g++, libretro, gcc-libretro, ubuntu-latest) (push) Waiting to run
Build / test (macos-latest) (push) Blocked by required conditions
Build / test (ubuntu-latest) (push) Blocked by required conditions
Build / build_test_headless_alpine (push) Waiting to run
Generate Docker Layer / build (push) Waiting to run

ImGui integretion: Implement mousewheel and mouse hover
This commit is contained in:
Henrik Rydgård 2024-11-06 22:54:58 +01:00 committed by GitHub
commit 2891f6374b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 58 additions and 32 deletions

View File

@ -180,6 +180,11 @@ struct KeyInput {
int unicodeChar; // for KEY_CHAR int unicodeChar; // for KEY_CHAR
}; };
int flags; int flags;
// Used by mousewheel events. The delta is packed in the upper 16 bits of flags.
int Delta() const {
return flags >> 16;
}
}; };
struct AxisInput { struct AxisInput {

View File

@ -1413,6 +1413,7 @@ bool TriggerButton::Touch(const TouchInput &input) {
down_ |= 1 << input.id; down_ |= 1 << input.id;
} }
} }
if (input.flags & TOUCH_MOVE) { if (input.flags & TOUCH_MOVE) {
if (contains) if (contains)
down_ |= 1 << input.id; down_ |= 1 << input.id;

View File

@ -195,7 +195,11 @@ static void UpdateScreenDPI(SDL_Window *window) {
SDL_GL_GetDrawableSize(window, &drawable_width, NULL); SDL_GL_GetDrawableSize(window, &drawable_width, NULL);
else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN) else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN)
SDL_Vulkan_GetDrawableSize(window, &drawable_width, NULL); SDL_Vulkan_GetDrawableSize(window, &drawable_width, NULL);
else {
// If we add SDL support for more platforms, we'll end up here.
g_DesktopDPI = 1.0f;
return;
}
// Round up a little otherwise there would be a gap sometimes // Round up a little otherwise there would be a gap sometimes
// in fractional scaling // in fractional scaling
g_DesktopDPI = ((float) drawable_width + 1.0f) / window_width; g_DesktopDPI = ((float) drawable_width + 1.0f) / window_width;
@ -729,7 +733,7 @@ struct InputStateTracker {
} }
} }
bool mouseDown; int mouseDown; // bitflags
bool mouseCaptured; bool mouseCaptured;
}; };
@ -943,7 +947,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
switch (event.button.button) { switch (event.button.button) {
case SDL_BUTTON_LEFT: case SDL_BUTTON_LEFT:
{ {
inputTracker->mouseDown = true; inputTracker->mouseDown |= 1;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -957,6 +961,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
case SDL_BUTTON_RIGHT: case SDL_BUTTON_RIGHT:
{ {
inputTracker->mouseDown |= 2;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -1018,21 +1023,22 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
} }
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
if (inputTracker->mouseDown) { {
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
input.flags = TOUCH_MOVE | TOUCH_MOUSE; input.flags = TOUCH_MOVE | TOUCH_MOUSE;
input.buttons = inputTracker->mouseDown;
input.id = 0; input.id = 0;
NativeTouch(input); NativeTouch(input);
}
NativeMouseDelta(event.motion.xrel, event.motion.yrel); NativeMouseDelta(event.motion.xrel, event.motion.yrel);
break; break;
}
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
switch (event.button.button) { switch (event.button.button) {
case SDL_BUTTON_LEFT: case SDL_BUTTON_LEFT:
{ {
inputTracker->mouseDown = false; inputTracker->mouseDown &= ~1;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -1045,6 +1051,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
case SDL_BUTTON_RIGHT: case SDL_BUTTON_RIGHT:
{ {
inputTracker->mouseDown &= ~2;
// Right button only emits mouse move events. This is weird, // Right button only emits mouse move events. This is weird,
// but consistent with Windows. Needs cleanup. // but consistent with Windows. Needs cleanup.
TouchInput input{}; TouchInput input{};

View File

@ -46,8 +46,6 @@ public:
// This can be called on a thread. // This can be called on a thread.
void LoadSamplesOnThread(); void LoadSamplesOnThread();
private: private:
bool samplesLoaded_ = false;
std::mutex mutex_; std::mutex mutex_;
std::vector<PlayInstance> queue_; std::vector<PlayInstance> queue_;
std::vector<PlayInstance> plays_; std::vector<PlayInstance> plays_;

View File

@ -1149,8 +1149,8 @@ void TouchTestScreen::touch(const TouchInput &touch) {
found = true; found = true;
} }
} }
if (!found) { if (!found && touch.buttons) {
WARN_LOG(Log::System, "Move without touch down: %d", touch.id); WARN_LOG(Log::System, "Move with buttons %d without touch down: %d", touch.buttons, touch.id);
} }
} }
if (touch.flags & TOUCH_UP) { if (touch.flags & TOUCH_UP) {

View File

@ -680,7 +680,7 @@ namespace MainWindow
float y = (float)cursorY * g_display.dpi_scale_y; float y = (float)cursorY * g_display.dpi_scale_y;
WindowsRawInput::SetMousePos(x, y); WindowsRawInput::SetMousePos(x, y);
if (wParam & (MK_LBUTTON | MK_RBUTTON)) { // Mouse moves now happen also when no button is pressed.
TouchInput touch{}; TouchInput touch{};
touch.flags = TOUCH_MOVE | TOUCH_MOUSE; touch.flags = TOUCH_MOVE | TOUCH_MOUSE;
if (wParam & MK_LBUTTON) { if (wParam & MK_LBUTTON) {
@ -693,7 +693,6 @@ namespace MainWindow
touch.y = y; touch.y = y;
NativeTouch(touch); NativeTouch(touch);
} }
}
break; break;
case WM_LBUTTONUP: case WM_LBUTTONUP:

View File

@ -156,6 +156,7 @@ namespace WindowsRawInput {
{ VK_OEM_5, NKCODE_BACKSLASH }, { VK_OEM_5, NKCODE_BACKSLASH },
{ VK_OEM_6, NKCODE_RIGHT_BRACKET }, { VK_OEM_6, NKCODE_RIGHT_BRACKET },
{ VK_OEM_7, NKCODE_APOSTROPHE }, { VK_OEM_7, NKCODE_APOSTROPHE },
{ VK_OEM_8, NKCODE_GRAVE }, // Key left of 1 (above Q) on a lot of layouts.
{ VK_RETURN, NKCODE_ENTER }, { VK_RETURN, NKCODE_ENTER },
{ VK_APPS, NKCODE_MENU }, // Context menu key, let's call this "menu". { VK_APPS, NKCODE_MENU }, // Context menu key, let's call this "menu".
{ VK_PAUSE, NKCODE_BREAK }, { VK_PAUSE, NKCODE_BREAK },

View File

@ -11,10 +11,25 @@ void ImGui_ImplPlatform_KeyEvent(const KeyInput &key) {
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
if (key.flags & KEY_DOWN) { if (key.flags & KEY_DOWN) {
// Specially handle scroll events and any other special keys.
switch (key.keyCode) {
case NKCODE_EXT_MOUSEWHEEL_UP:
io.AddMouseWheelEvent(0, key.Delta() * 0.010f);
break;
case NKCODE_EXT_MOUSEWHEEL_DOWN:
io.AddMouseWheelEvent(0, -key.Delta() * 0.010f);
break;
default:
{
ImGuiKey keyCode = KeyCodeToImGui(key.keyCode); ImGuiKey keyCode = KeyCodeToImGui(key.keyCode);
if (keyCode != ImGuiKey_None) { if (keyCode == ImGuiKey_None) {
WARN_LOG(Log::System, "Unmapped ImGui keycode conversion from %d", key.keyCode);
} else {
io.AddKeyEvent(keyCode, true); io.AddKeyEvent(keyCode, true);
} }
break;
}
}
} }
if (key.flags & KEY_UP) { if (key.flags & KEY_UP) {
ImGuiKey keyCode = KeyCodeToImGui(key.keyCode); ImGuiKey keyCode = KeyCodeToImGui(key.keyCode);