Allow manual position for is_cursor_in_wine_window

We'll need this for the `LeaveNotify` because `GetCursorPos()` updates
only once every 100 ms, which means that it would still point to the old
window we're actually leaving.
This commit is contained in:
Robbert van der Helm
2021-07-26 15:08:23 +02:00
parent e1ed35bfd8
commit e42448f758
2 changed files with 14 additions and 5 deletions
+8 -4
View File
@@ -1259,12 +1259,16 @@ ATOM get_window_class() noexcept {
return window_class_handle; return window_class_handle;
} }
bool is_cursor_in_wine_window() noexcept { bool is_cursor_in_wine_window(
std::optional<POINT> windows_pointer_pos) noexcept {
static const HWND windows_desktop_window = GetDesktopWindow(); static const HWND windows_desktop_window = GetDesktopWindow();
POINT windows_pointer_pos; if (!windows_pointer_pos) {
GetCursorPos(&windows_pointer_pos); windows_pointer_pos.emplace();
if (HWND windows_window = WindowFromPoint(windows_pointer_pos); GetCursorPos(&*windows_pointer_pos);
}
if (HWND windows_window = WindowFromPoint(*windows_pointer_pos);
windows_window && windows_window != windows_desktop_window) { windows_window && windows_window != windows_desktop_window) {
// NOTE: Because resizing reparented Wine windows without XEmbed is a // NOTE: Because resizing reparented Wine windows without XEmbed is a
// bit janky, yabridge creates windows with client areas large // bit janky, yabridge creates windows with client areas large
+6 -1
View File
@@ -75,8 +75,13 @@ xcb_atom_t get_atom_by_name(xcb_connection_t& x11_connection,
* area of yabridge windows. (so it will consider other Wine windows to the * area of yabridge windows. (so it will consider other Wine windows to the
* right or to the bottom of a yabridge plugin editor, but not the extended * right or to the bottom of a yabridge plugin editor, but not the extended
* client area itself) * client area itself)
*
* @param windows_pointer_pos The screen coordinates to use for the query. If
* this is left at a nullopt, we will simply use `GetCursorPos()`. Note that
* this value only updates once every 100 milliseconds.
*/ */
bool is_cursor_in_wine_window() noexcept; bool is_cursor_in_wine_window(
std::optional<POINT> windows_pointer_pos = std::nullopt) noexcept;
/** /**
* Used to store the maximum width and height of a screen. * Used to store the maximum width and height of a screen.