Skip to content

Commit

Permalink
Merge pull request #19605 from hrydgard/imgui-integration-work
Browse files Browse the repository at this point in the history
ImGui integretion: Implement mousewheel and mouse hover
  • Loading branch information
hrydgard authored Nov 6, 2024
2 parents 864e733 + f0ae048 commit 2891f63
Show file tree
Hide file tree
Showing 8 changed files with 58 additions and 32 deletions.
5 changes: 5 additions & 0 deletions Common/Input/InputState.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,11 @@ struct KeyInput {
int unicodeChar; // for KEY_CHAR
};
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 {
Expand Down
1 change: 1 addition & 0 deletions Common/UI/View.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1413,6 +1413,7 @@ bool TriggerButton::Touch(const TouchInput &input) {
down_ |= 1 << input.id;
}
}

if (input.flags & TOUCH_MOVE) {
if (contains)
down_ |= 1 << input.id;
Expand Down
21 changes: 14 additions & 7 deletions SDL/SDLMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,11 @@ static void UpdateScreenDPI(SDL_Window *window) {
SDL_GL_GetDrawableSize(window, &drawable_width, NULL);
else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN)
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
// in fractional scaling
g_DesktopDPI = ((float) drawable_width + 1.0f) / window_width;
Expand Down Expand Up @@ -729,7 +733,7 @@ struct InputStateTracker {
}
}

bool mouseDown;
int mouseDown; // bitflags
bool mouseCaptured;
};

Expand Down Expand Up @@ -943,7 +947,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
switch (event.button.button) {
case SDL_BUTTON_LEFT:
{
inputTracker->mouseDown = true;
inputTracker->mouseDown |= 1;
TouchInput input{};
input.x = mx;
input.y = my;
Expand All @@ -957,6 +961,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break;
case SDL_BUTTON_RIGHT:
{
inputTracker->mouseDown |= 2;
TouchInput input{};
input.x = mx;
input.y = my;
Expand Down Expand Up @@ -1018,21 +1023,22 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break;
}
case SDL_MOUSEMOTION:
if (inputTracker->mouseDown) {
{
TouchInput input{};
input.x = mx;
input.y = my;
input.flags = TOUCH_MOVE | TOUCH_MOUSE;
input.buttons = inputTracker->mouseDown;
input.id = 0;
NativeTouch(input);
NativeMouseDelta(event.motion.xrel, event.motion.yrel);
break;
}
NativeMouseDelta(event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONUP:
switch (event.button.button) {
case SDL_BUTTON_LEFT:
{
inputTracker->mouseDown = false;
inputTracker->mouseDown &= ~1;
TouchInput input{};
input.x = mx;
input.y = my;
Expand All @@ -1045,6 +1051,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break;
case SDL_BUTTON_RIGHT:
{
inputTracker->mouseDown &= ~2;
// Right button only emits mouse move events. This is weird,
// but consistent with Windows. Needs cleanup.
TouchInput input{};
Expand Down
2 changes: 0 additions & 2 deletions UI/BackgroundAudio.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ class SoundEffectMixer {
// This can be called on a thread.
void LoadSamplesOnThread();
private:
bool samplesLoaded_ = false;

std::mutex mutex_;
std::vector<PlayInstance> queue_;
std::vector<PlayInstance> plays_;
Expand Down
4 changes: 2 additions & 2 deletions UI/DevScreens.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1149,8 +1149,8 @@ void TouchTestScreen::touch(const TouchInput &touch) {
found = true;
}
}
if (!found) {
WARN_LOG(Log::System, "Move without touch down: %d", touch.id);
if (!found && touch.buttons) {
WARN_LOG(Log::System, "Move with buttons %d without touch down: %d", touch.buttons, touch.id);
}
}
if (touch.flags & TOUCH_UP) {
Expand Down
23 changes: 11 additions & 12 deletions Windows/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,19 +680,18 @@ namespace MainWindow
float y = (float)cursorY * g_display.dpi_scale_y;
WindowsRawInput::SetMousePos(x, y);

if (wParam & (MK_LBUTTON | MK_RBUTTON)) {
TouchInput touch{};
touch.flags = TOUCH_MOVE | TOUCH_MOUSE;
if (wParam & MK_LBUTTON) {
touch.buttons |= 1;
}
if (wParam & MK_RBUTTON) {
touch.buttons |= 2;
}
touch.x = x;
touch.y = y;
NativeTouch(touch);
// Mouse moves now happen also when no button is pressed.
TouchInput touch{};
touch.flags = TOUCH_MOVE | TOUCH_MOUSE;
if (wParam & MK_LBUTTON) {
touch.buttons |= 1;
}
if (wParam & MK_RBUTTON) {
touch.buttons |= 2;
}
touch.x = x;
touch.y = y;
NativeTouch(touch);
}
break;

Expand Down
1 change: 1 addition & 0 deletions Windows/RawInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ namespace WindowsRawInput {
{ VK_OEM_5, NKCODE_BACKSLASH },
{ VK_OEM_6, NKCODE_RIGHT_BRACKET },
{ 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_APPS, NKCODE_MENU }, // Context menu key, let's call this "menu".
{ VK_PAUSE, NKCODE_BREAK },
Expand Down
33 changes: 24 additions & 9 deletions ext/imgui/imgui_impl_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,24 @@ void ImGui_ImplPlatform_KeyEvent(const KeyInput &key) {
ImGuiIO& io = ImGui::GetIO();

if (key.flags & KEY_DOWN) {
ImGuiKey keyCode = KeyCodeToImGui(key.keyCode);
if (keyCode != ImGuiKey_None) {
io.AddKeyEvent(keyCode, true);
// 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);
if (keyCode == ImGuiKey_None) {
WARN_LOG(Log::System, "Unmapped ImGui keycode conversion from %d", key.keyCode);
} else {
io.AddKeyEvent(keyCode, true);
}
break;
}
}
}
if (key.flags & KEY_UP) {
Expand Down Expand Up @@ -103,7 +118,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_MOVE_END: return ImGuiKey_End;
case NKCODE_INSERT: return ImGuiKey_Insert;

// Numeric keys
// Numeric keys
case NKCODE_0: return ImGuiKey_0;
case NKCODE_1: return ImGuiKey_1;
case NKCODE_2: return ImGuiKey_2;
Expand All @@ -115,7 +130,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_8: return ImGuiKey_8;
case NKCODE_9: return ImGuiKey_9;

// Letter keys
// Letter keys
case NKCODE_A: return ImGuiKey_A;
case NKCODE_B: return ImGuiKey_B;
case NKCODE_C: return ImGuiKey_C;
Expand Down Expand Up @@ -143,7 +158,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_Y: return ImGuiKey_Y;
case NKCODE_Z: return ImGuiKey_Z;

// Symbols
// Symbols
case NKCODE_COMMA: return ImGuiKey_Comma;
case NKCODE_PERIOD: return ImGuiKey_Period;
case NKCODE_MINUS: return ImGuiKey_Minus;
Expand All @@ -156,7 +171,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_SLASH: return ImGuiKey_Slash;
case NKCODE_GRAVE: return ImGuiKey_GraveAccent;

// Function keys
// Function keys
case NKCODE_F1: return ImGuiKey_F1;
case NKCODE_F2: return ImGuiKey_F2;
case NKCODE_F3: return ImGuiKey_F3;
Expand All @@ -170,7 +185,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_F11: return ImGuiKey_F11;
case NKCODE_F12: return ImGuiKey_F12;

// Keypad
// Keypad
case NKCODE_NUMPAD_0: return ImGuiKey_Keypad0;
case NKCODE_NUMPAD_1: return ImGuiKey_Keypad1;
case NKCODE_NUMPAD_2: return ImGuiKey_Keypad2;
Expand All @@ -188,7 +203,7 @@ ImGuiKey KeyCodeToImGui(InputKeyCode keyCode) {
case NKCODE_NUMPAD_ENTER: return ImGuiKey_KeypadEnter;
case NKCODE_NUMPAD_EQUALS: return ImGuiKey_KeypadEqual;

// Lock keys
// Lock keys
case NKCODE_NUM_LOCK: return ImGuiKey_NumLock;
case NKCODE_SCROLL_LOCK: return ImGuiKey_ScrollLock;

Expand Down

0 comments on commit 2891f63

Please sign in to comment.