diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-07-04 01:36:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-04 01:36:56 +0200 |
commit | 79b0a9ddfc41c5b9fe3bc903cab1001aefcedde2 (patch) | |
tree | d772ec7d9a38d26607735d51312ab8eb5378e179 /platform/linuxbsd/display_server_x11.cpp | |
parent | 0148a62d890e0d559bec86fcac14404c81742899 (diff) | |
parent | 14263d3d0d3c7a4b8696dc694c2c4c2b94c4f812 (diff) |
Merge pull request #40096 from reduz/improve-x11-dnd
Improve the situation of DND on X11
Diffstat (limited to 'platform/linuxbsd/display_server_x11.cpp')
-rw-r--r-- | platform/linuxbsd/display_server_x11.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 827d0361b9..dc14580d92 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -410,7 +410,18 @@ void DisplayServerX11::mouse_warp_to_position(const Point2i &p_to) { } Point2i DisplayServerX11::mouse_get_position() const { - return last_mouse_pos; + int root_x, root_y; + int win_x, win_y; + unsigned int mask_return; + Window window_returned; + + Bool result = XQueryPointer(x11_display, RootWindow(x11_display, DefaultScreen(x11_display)), &window_returned, + &window_returned, &root_x, &root_y, &win_x, &win_y, + &mask_return); + if (result == True) { + return Point2i(root_x, root_y); + } + return Point2i(); } Point2i DisplayServerX11::mouse_get_absolute_position() const { @@ -718,6 +729,14 @@ ObjectID DisplayServerX11::window_get_attached_instance_id(WindowID p_window) co } DisplayServerX11::WindowID DisplayServerX11::get_window_at_screen_position(const Point2i &p_position) const { +#warning This is an incorrect implementation, if windows overlap, it should return the topmost visible one or none if occluded by a foreign window + + for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) { + Rect2i win_rect = Rect2i(window_get_position(E->key()), window_get_size(E->key())); + if (win_rect.has_point(p_position)) { + return E->key(); + } + } return INVALID_WINDOW_ID; } |