summaryrefslogtreecommitdiffstats
path: root/platform/linuxbsd
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2024-05-27 10:52:59 +0300
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2024-05-31 15:50:14 +0300
commit5168647530141bb08a75fb6bddc702295c45a052 (patch)
treedf911c560456315136254f85ad9eb1a9f585cef3 /platform/linuxbsd
parent705b7a0b0bd535c95e4e8fb439f3d84b3fb4f427 (diff)
downloadredot-engine-5168647530141bb08a75fb6bddc702295c45a052.tar.gz
Use current mouse button state instead of saved values.
Diffstat (limited to 'platform/linuxbsd')
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp51
-rw-r--r--platform/linuxbsd/x11/display_server_x11.h2
2 files changed, 37 insertions, 16 deletions
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp
index 767ea927c1..34b6d0219a 100644
--- a/platform/linuxbsd/x11/display_server_x11.cpp
+++ b/platform/linuxbsd/x11/display_server_x11.cpp
@@ -502,7 +502,34 @@ Point2i DisplayServerX11::mouse_get_position() const {
}
BitField<MouseButtonMask> DisplayServerX11::mouse_get_button_state() const {
- return last_button_state;
+ int number_of_screens = XScreenCount(x11_display);
+ for (int i = 0; i < number_of_screens; i++) {
+ Window root, child;
+ int root_x, root_y, win_x, win_y;
+ unsigned int mask;
+ if (XQueryPointer(x11_display, XRootWindow(x11_display, i), &root, &child, &root_x, &root_y, &win_x, &win_y, &mask)) {
+ BitField<MouseButtonMask> last_button_state = 0;
+
+ if (mask & Button1Mask) {
+ last_button_state.set_flag(MouseButtonMask::LEFT);
+ }
+ if (mask & Button2Mask) {
+ last_button_state.set_flag(MouseButtonMask::MIDDLE);
+ }
+ if (mask & Button3Mask) {
+ last_button_state.set_flag(MouseButtonMask::RIGHT);
+ }
+ if (mask & Button4Mask) {
+ last_button_state.set_flag(MouseButtonMask::MB_XBUTTON1);
+ }
+ if (mask & Button5Mask) {
+ last_button_state.set_flag(MouseButtonMask::MB_XBUTTON2);
+ }
+
+ return last_button_state;
+ }
+ }
+ return 0;
}
void DisplayServerX11::clipboard_set(const String &p_text) {
@@ -3351,18 +3378,6 @@ void DisplayServerX11::_get_key_modifier_state(unsigned int p_x11_state, Ref<Inp
state->set_meta_pressed((p_x11_state & Mod4Mask));
}
-BitField<MouseButtonMask> DisplayServerX11::_get_mouse_button_state(MouseButton p_x11_button, int p_x11_type) {
- MouseButtonMask mask = mouse_button_to_mask(p_x11_button);
-
- if (p_x11_type == ButtonPress) {
- last_button_state.set_flag(mask);
- } else {
- last_button_state.clear_flag(mask);
- }
-
- return last_button_state;
-}
-
void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, LocalVector<XEvent> &p_events, uint32_t &p_event_index, bool p_echo) {
WindowData &wd = windows[p_window];
// X11 functions don't know what const is
@@ -4750,12 +4765,20 @@ void DisplayServerX11::process_events() {
} else if (mb->get_button_index() == MouseButton::MIDDLE) {
mb->set_button_index(MouseButton::RIGHT);
}
- mb->set_button_mask(_get_mouse_button_state(mb->get_button_index(), event.xbutton.type));
mb->set_position(Vector2(event.xbutton.x, event.xbutton.y));
mb->set_global_position(mb->get_position());
mb->set_pressed((event.type == ButtonPress));
+ 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 {
+ mb->set_button_mask(mouse_get_button_state());
+ }
+
const WindowData &wd = windows[window_id];
if (event.type == ButtonPress) {
diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h
index 7c69df3df0..f0b1811986 100644
--- a/platform/linuxbsd/x11/display_server_x11.h
+++ b/platform/linuxbsd/x11/display_server_x11.h
@@ -263,7 +263,6 @@ 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_button_state;
bool app_focused = false;
uint64_t time_since_no_focus = 0;
@@ -292,7 +291,6 @@ class DisplayServerX11 : public DisplayServer {
Rect2i _screen_get_rect(int p_screen) const;
- BitField<MouseButtonMask> _get_mouse_button_state(MouseButton p_x11_button, int p_x11_type);
void _get_key_modifier_state(unsigned int p_x11_state, Ref<InputEventWithModifiers> state);
void _flush_mouse_motion();