diff options
Diffstat (limited to 'platform/windows/display_server_windows.cpp')
| -rw-r--r-- | platform/windows/display_server_windows.cpp | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 4c52d88377..c114adff84 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -660,6 +660,24 @@ Point2i DisplayServerWindows::mouse_get_position() const { } BitField<MouseButtonMask> DisplayServerWindows::mouse_get_button_state() const { + BitField<MouseButtonMask> last_button_state = 0; + + if (GetAsyncKeyState(VK_LBUTTON) & (1 << 15)) { + last_button_state.set_flag(MouseButtonMask::LEFT); + } + if (GetAsyncKeyState(VK_RBUTTON) & (1 << 15)) { + last_button_state.set_flag(MouseButtonMask::RIGHT); + } + if (GetAsyncKeyState(VK_MBUTTON) & (1 << 15)) { + last_button_state.set_flag(MouseButtonMask::MIDDLE); + } + if (GetAsyncKeyState(VK_XBUTTON1) & (1 << 15)) { + last_button_state.set_flag(MouseButtonMask::MB_XBUTTON1); + } + if (GetAsyncKeyState(VK_XBUTTON2) & (1 << 15)) { + last_button_state.set_flag(MouseButtonMask::MB_XBUTTON2); + } + return last_button_state; } @@ -3999,7 +4017,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_pressure((raw->data.mouse.ulButtons & RI_MOUSE_LEFT_BUTTON_DOWN) ? 1.0f : 0.0f); - mm->set_button_mask(last_button_state); + mm->set_button_mask(mouse_get_button_state()); Point2i c(windows[window_id].width / 2, windows[window_id].height / 2); @@ -4103,7 +4121,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_tilt(windows[window_id].last_tilt); mm->set_pen_inverted(windows[window_id].last_pen_inverted); - mm->set_button_mask(last_button_state); + mm->set_button_mask(mouse_get_button_state()); mm->set_position(Vector2(coords.x, coords.y)); mm->set_global_position(Vector2(coords.x, coords.y)); @@ -4248,7 +4266,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT)); mm->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META)); - mm->set_button_mask(last_button_state); + mm->set_button_mask(mouse_get_button_state()); POINT coords; // Client coords. coords.x = GET_X_LPARAM(lParam); @@ -4378,7 +4396,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_tilt(windows[window_id].last_tilt); mm->set_pen_inverted(windows[window_id].last_pen_inverted); - mm->set_button_mask(last_button_state); + mm->set_button_mask(mouse_get_button_state()); mm->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); mm->set_global_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); @@ -4552,12 +4570,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mb->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT)); mb->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META)); - if (mb->is_pressed()) { - last_button_state.set_flag(mouse_button_to_mask(mb->get_button_index())); + if (mb->is_pressed() && mb->get_button_index() >= MouseButton::WHEEL_UP && mb->get_button_index() <= MouseButton::WHEEL_RIGHT) { + MouseButtonMask mask = mouse_button_to_mask(mb->get_button_index()); + BitField<MouseButtonMask> scroll_mask = mouse_get_button_state(); + scroll_mask.set_flag(mask); + mb->set_button_mask(scroll_mask); } else { - last_button_state.clear_flag(mouse_button_to_mask(mb->get_button_index())); + mb->set_button_mask(mouse_get_button_state()); } - mb->set_button_mask(last_button_state); mb->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); @@ -4571,7 +4591,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA SetCapture(hWnd); } } else { - if (--pressrc <= 0 || last_button_state.is_empty()) { + if (--pressrc <= 0 || mouse_get_button_state().is_empty()) { if (mouse_mode != MOUSE_MODE_CAPTURED) { ReleaseCapture(); } @@ -4596,8 +4616,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA // Send release for mouse wheel. Ref<InputEventMouseButton> mbd = mb->duplicate(); mbd->set_window_id(window_id); - last_button_state.clear_flag(mouse_button_to_mask(mbd->get_button_index())); - mbd->set_button_mask(last_button_state); + mbd->set_button_mask(mouse_get_button_state()); mbd->set_pressed(false); Input::get_singleton()->parse_input_event(mbd); } |
