Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix double click state for mouse button release input events. #92582

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions platform/linuxbsd/x11/display_server_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4987,6 +4987,8 @@ void DisplayServerX11::process_events() {
last_click_ms = 0;
last_click_pos = Point2i(-100, -100);
last_click_button_index = MouseButton::NONE;
MouseButtonMask button_mask = mouse_button_to_mask(mb->get_button_index());
last_double_click_button_mask.set_flag(button_mask);
mb->set_double_click(true);
}

Expand All @@ -5001,6 +5003,12 @@ 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());

MouseButtonMask button_mask = mouse_button_to_mask(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