summaryrefslogtreecommitdiffstats
path: root/platform/windows/display_server_windows.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/windows/display_server_windows.cpp')
-rw-r--r--platform/windows/display_server_windows.cpp41
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);
}