Skip to content

Commit

Permalink
Fix double click state for mouse button release input events.
Browse files Browse the repository at this point in the history
Co-authored-by: jsjtxietian <[email protected]>
Co-authored-by: Markus Sauermann <[email protected]>
  • Loading branch information
3 people committed Feb 3, 2025
1 parent f60f69a commit a02a369
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 5 deletions.
16 changes: 12 additions & 4 deletions platform/linuxbsd/x11/display_server_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4959,14 +4959,16 @@ void DisplayServerX11::process_events() {

mb->set_pressed((event.type == ButtonPress));

MouseButtonMask button_mask;
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());
button_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);
scroll_mask.set_flag(button_mask);
button_mask = scroll_mask;

Check failure on line 4967 in platform/linuxbsd/x11/display_server_x11.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld)

assigning to 'MouseButtonMask' from incompatible type 'BitField<MouseButtonMask>'

Check failure on line 4967 in platform/linuxbsd/x11/display_server_x11.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

assigning to 'MouseButtonMask' from incompatible type 'BitField<MouseButtonMask>'
} else {
mb->set_button_mask(mouse_get_button_state());
button_mask = mouse_get_button_state();

Check failure on line 4969 in platform/linuxbsd/x11/display_server_x11.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld)

assigning to 'MouseButtonMask' from incompatible type 'BitField<MouseButtonMask>'

Check failure on line 4969 in platform/linuxbsd/x11/display_server_x11.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

assigning to 'MouseButtonMask' from incompatible type 'BitField<MouseButtonMask>'
}
mb->set_button_mask(button_mask);

const WindowData &wd = windows[window_id];

Expand All @@ -4987,6 +4989,7 @@ void DisplayServerX11::process_events() {
last_click_ms = 0;
last_click_pos = Point2i(-100, -100);
last_click_button_index = MouseButton::NONE;
last_double_click_button_mask.set_flag(button_mask);
mb->set_double_click(true);
}

Expand All @@ -5001,6 +5004,11 @@ void DisplayServerX11::process_events() {
} else {
DEBUG_LOG_X11("[%u] ButtonRelease window=%lu (%u), button_index=%u \n", frame, event.xbutton.window, window_id, mb->get_button_index());

if (last_double_click_button_mask.has_flag(button_mask)) {
mb->set_double_click(true);
last_double_click_button_mask.clear_flag(button_mask);
}

WindowID window_id_other = INVALID_WINDOW_ID;
Window wd_other_x11_window;
if (!wd.focused) {
Expand Down
1 change: 1 addition & 0 deletions platform/linuxbsd/x11/display_server_x11.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ class DisplayServerX11 : public DisplayServer {
Point2i last_click_pos = Point2i(-100, -100);
uint64_t last_click_ms = 0;
MouseButton last_click_button_index = MouseButton::NONE;
BitField<MouseButtonMask> last_double_click_button_mask;
bool app_focused = false;
uint64_t time_since_no_focus = 0;

Expand Down
2 changes: 1 addition & 1 deletion platform/macos/godot_content_view.mm
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ - (void)processMouseEvent:(NSEvent *)event index:(MouseButton)index pressed:(boo
mb->set_position(wd.mouse_pos);
mb->set_global_position(wd.mouse_pos);
mb->set_button_mask(ds->mouse_get_button_state());
if (!outofstream && index == MouseButton::LEFT && pressed) {
if (!outofstream) {
mb->set_double_click([event clickCount] == 2);
}

Expand Down
27 changes: 27 additions & 0 deletions platform/windows/display_server_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5359,6 +5359,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_LBUTTONUP: {
mb->set_pressed(false);
mb->set_button_index(MouseButton::LEFT);
MouseButtonMask mask = mouse_button_to_mask(MouseButton::LEFT);
if (last_double_click_button_mask.has_flag(mask)) {
mb->set_double_click(true);
last_double_click_button_mask.clear_flag(mask);
}
} break;
case WM_MBUTTONDOWN: {
mb->set_pressed(true);
Expand All @@ -5367,6 +5372,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_MBUTTONUP: {
mb->set_pressed(false);
mb->set_button_index(MouseButton::MIDDLE);
MouseButtonMask mask = mouse_button_to_mask(MouseButton::MIDDLE);
if (last_double_click_button_mask.has_flag(mask)) {
mb->set_double_click(true);
last_double_click_button_mask.clear_flag(mask);
}
} break;
case WM_RBUTTONDOWN: {
mb->set_pressed(true);
Expand All @@ -5375,21 +5385,29 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_RBUTTONUP: {
mb->set_pressed(false);
mb->set_button_index(MouseButton::RIGHT);
MouseButtonMask mask = mouse_button_to_mask(MouseButton::RIGHT);
if (last_double_click_button_mask.has_flag(mask)) {
mb->set_double_click(true);
last_double_click_button_mask.clear_flag(mask);
}
} break;
case WM_LBUTTONDBLCLK: {
mb->set_pressed(true);
mb->set_button_index(MouseButton::LEFT);
mb->set_double_click(true);
last_double_click_button_mask.set_flag(mouse_button_to_mask(MouseButton::LEFT));
} break;
case WM_RBUTTONDBLCLK: {
mb->set_pressed(true);
mb->set_button_index(MouseButton::RIGHT);
mb->set_double_click(true);
last_double_click_button_mask.set_flag(mouse_button_to_mask(MouseButton::RIGHT));
} break;
case WM_MBUTTONDBLCLK: {
mb->set_pressed(true);
mb->set_button_index(MouseButton::MIDDLE);
mb->set_double_click(true);
last_double_click_button_mask.set_flag(mouse_button_to_mask(MouseButton::MIDDLE));
} break;
case WM_MOUSEWHEEL: {
mb->set_pressed(true);
Expand Down Expand Up @@ -5429,18 +5447,27 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
} break;
case WM_XBUTTONUP: {
mb->set_pressed(false);
MouseButtonMask mask;
if (HIWORD(wParam) == XBUTTON1) {
mb->set_button_index(MouseButton::MB_XBUTTON1);
mask = mouse_button_to_mask(MouseButton::MB_XBUTTON1);
} else {
mb->set_button_index(MouseButton::MB_XBUTTON2);
mask = mouse_button_to_mask(MouseButton::MB_XBUTTON2);
}
if (last_double_click_button_mask.has_flag(mask)) {
mb->set_double_click(true);
last_double_click_button_mask.clear_flag(mask);
}
} break;
case WM_XBUTTONDBLCLK: {
mb->set_pressed(true);
if (HIWORD(wParam) == XBUTTON1) {
mb->set_button_index(MouseButton::MB_XBUTTON1);
last_double_click_button_mask.set_flag(mouse_button_to_mask(MouseButton::MB_XBUTTON1));
} else {
mb->set_button_index(MouseButton::MB_XBUTTON2);
last_double_click_button_mask.set_flag(mouse_button_to_mask(MouseButton::MB_XBUTTON2));
}
mb->set_double_click(true);
} break;
Expand Down
1 change: 1 addition & 0 deletions platform/windows/display_server_windows.h
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,7 @@ class DisplayServerWindows : public DisplayServer {
void _mouse_update_mode();
int restore_mouse_trails = 0;

BitField<MouseButtonMask> last_double_click_button_mask;
bool use_raw_input = false;
bool drop_events = false;
bool in_dispatch_input_event = false;
Expand Down

0 comments on commit a02a369

Please sign in to comment.