|
@@ -3,6 +3,7 @@
|
|
|
|
|
|
// Implemented features:
|
|
|
// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
|
|
|
+// [X] Platform: Mouse support. Can discriminate Mouse/TouchScreen/Pen.
|
|
|
// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
|
|
|
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
|
|
// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
|
|
@@ -34,6 +35,7 @@ typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*);
|
|
|
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
+// 2023-04-04: Inputs: Added support for io.AddMouseSourceEvent() to discriminate ImGuiMouseSource_Mouse/ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen. (#2702)
|
|
|
// 2023-02-15: Inputs: Use WM_NCMOUSEMOVE / WM_NCMOUSELEAVE to track mouse position over non-client area (e.g. OS decorations) when app is not focused. (#6045, #6162)
|
|
|
// 2023-02-02: Inputs: Flipping WM_MOUSEHWHEEL (horizontal mouse-wheel) value to match other backends and offer consistent horizontal scrolling direction. (#4019, #6096, #1463)
|
|
|
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
|
@@ -506,6 +508,19 @@ static ImGuiKey ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam)
|
|
|
// Copy this line into your .cpp file to forward declare the function.
|
|
|
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
#endif
|
|
|
+
|
|
|
+// See https://learn.microsoft.com/en-us/windows/win32/tablet/system-events-and-mouse-messages
|
|
|
+// Prefer to call this at the top of the message handler to avoid the possibility of other Win32 calls interfering with this.
|
|
|
+static ImGuiMouseSource GetMouseSourceFromMessageExtraInfo()
|
|
|
+{
|
|
|
+ LPARAM extra_info = ::GetMessageExtraInfo();
|
|
|
+ if ((extra_info & 0xFFFFFF80) == 0xFF515700)
|
|
|
+ return ImGuiMouseSource_Pen;
|
|
|
+ if ((extra_info & 0xFFFFFF80) == 0xFF515780)
|
|
|
+ return ImGuiMouseSource_TouchScreen;
|
|
|
+ return ImGuiMouseSource_Mouse;
|
|
|
+}
|
|
|
+
|
|
|
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
|
{
|
|
|
if (ImGui::GetCurrentContext() == nullptr)
|
|
@@ -520,6 +535,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
case WM_NCMOUSEMOVE:
|
|
|
{
|
|
|
// We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events
|
|
|
+ ImGuiMouseSource mouse_source = GetMouseSourceFromMessageExtraInfo();
|
|
|
const int area = (msg == WM_MOUSEMOVE) ? 1 : 2;
|
|
|
bd->MouseHwnd = hwnd;
|
|
|
if (bd->MouseTrackedArea != area)
|
|
@@ -534,6 +550,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
POINT mouse_pos = { (LONG)GET_X_LPARAM(lParam), (LONG)GET_Y_LPARAM(lParam) };
|
|
|
if (msg == WM_NCMOUSEMOVE && ::ScreenToClient(hwnd, &mouse_pos) == FALSE) // WM_NCMOUSEMOVE are provided in absolute coordinates.
|
|
|
break;
|
|
|
+ io.AddMouseSourceEvent(mouse_source);
|
|
|
io.AddMousePosEvent((float)mouse_pos.x, (float)mouse_pos.y);
|
|
|
break;
|
|
|
}
|
|
@@ -555,6 +572,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
|
|
|
case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
|
|
|
{
|
|
|
+ ImGuiMouseSource mouse_source = GetMouseSourceFromMessageExtraInfo();
|
|
|
int button = 0;
|
|
|
if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
|
|
|
if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
|
|
@@ -563,6 +581,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
if (bd->MouseButtonsDown == 0 && ::GetCapture() == nullptr)
|
|
|
::SetCapture(hwnd);
|
|
|
bd->MouseButtonsDown |= 1 << button;
|
|
|
+ io.AddMouseSourceEvent(mouse_source);
|
|
|
io.AddMouseButtonEvent(button, true);
|
|
|
return 0;
|
|
|
}
|
|
@@ -571,6 +590,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
case WM_MBUTTONUP:
|
|
|
case WM_XBUTTONUP:
|
|
|
{
|
|
|
+ ImGuiMouseSource mouse_source = GetMouseSourceFromMessageExtraInfo();
|
|
|
int button = 0;
|
|
|
if (msg == WM_LBUTTONUP) { button = 0; }
|
|
|
if (msg == WM_RBUTTONUP) { button = 1; }
|
|
@@ -579,6 +599,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA
|
|
|
bd->MouseButtonsDown &= ~(1 << button);
|
|
|
if (bd->MouseButtonsDown == 0 && ::GetCapture() == hwnd)
|
|
|
::ReleaseCapture();
|
|
|
+ io.AddMouseSourceEvent(mouse_source);
|
|
|
io.AddMouseButtonEvent(button, false);
|
|
|
return 0;
|
|
|
}
|