Commit Graph

175 Commits

Author SHA1 Message Date
Rémi Bernon 12c09051b4 winex11.drv: Destroy old clipping message window if it has been replaced.
When the same thread repeatedly calls ClipCursor, a message window is
created for every call, then stored in x11drv_thread_data->clip_hwnd.

The WM_X11DRV_CLIP_CURSOR notification is then sent to the desktop
window, then to the previous clipping thread in order for it to destroy
its clip_hwnd. But as the clipping thread is the same, and because
x11drv_thread_data->clip_hwnd has been overwritten, it does not satisfy
the "hwnd == data->clip_hwnd" condition and the window leaked.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-09-17 18:53:36 +02:00
Rémi Bernon 74efb3e872 winex11.drv: Only call XWarpPointer if we can get exclusive pointer grab.
XWarpPointer will always succeed, regardless of grabs, so if the pointer
is already grabbed, by some other application, we should not ask to warp
it.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-09-06 19:04:31 +02:00
Rémi Bernon ae4651b7ff winex11.drv: Explicitly call XUngrabPointer when clipping is released.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-09-06 19:04:29 +02:00
Rémi Bernon 92177b0b16 winex11.drv: Retry last ClipCursor when grab is released.
As we ignore these NotifyGrab / NotifyUngrab w.r.t focus decisions,
some applications are unaware of mouse grabs being lost and sometimes
cursor clipping is lost. We have to keep the last clip rectangle and
restore it when grab is released.

This has been squashed with the foreground window check from
Zhiyi Zhang <zzhang@codeweavers.com> to fix an issue that happens when
switching from a fullscreen window - because there's some additional
focus events involved - but in general, if the window that is getting
focus cannot be activated:

When FocusIn/NotifyWhileGrabbed is received, SetForegroundWindow is not
called if the window cannot be activated. When the FocusIn/NotifyUngrab
event arrives for the same window, we have to check the foreground
window before restoring cursor clipping rectangle.

For reference, the event sequence when pressing Alt-Tab - for WMs that
grab the keyboard - is the following:

1. FocusOut/NotifyGrab, when WM grabs the keyboard.
2. FocusOut/NotifyWhileGrabbed, while WM switches windows, this calls
   SetForegroundWindow(GetDesktopWindow()).

The event sequence for normal windows ends here, but for fullscreen
windows, there may be these additional events:

3. FocusIn/NotifyWhileGrabbed, which may not change Wine foreground
   window if it cannot be activated.
4. FocusIn/NotifyUnGrab, when WM releases the keyboard while switching
   windows, this is ignored but it should not retry to grab the cursor,
   because window is not foreground.
5. FocusOut/NotifyNormal, when WM finishes switching the windows.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-09-06 19:03:59 +02:00
Rémi Bernon 54f8077c41 winex11.drv: Only grab or warp the cursor when keyboard isn't grabbed.
When the window manager has taken a keyboard grab, it may be going to
move the window itself, so the application should not move the cursor
at the same time.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-09-06 19:03:44 +02:00
Sebastian Lackner e2389c015c winex11: Forward all clipping requests to the right thread.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38087
Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2019-03-18 16:53:30 +01:00
Michael Stefaniuc 8e1d40b966 winex11.drv: Use the ARRAY_SIZE() macro.
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2018-09-19 23:17:49 +02:00
Alexandre Julliard dc6f39ac29 server: Use screen coordinates in the update_window_zorder request.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2018-08-27 15:16:45 +02:00
Alexandre Julliard c102efbc35 winex11: Avoid left_side/top_side cursor names.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2018-04-27 11:22:00 +02:00
Alexandre Julliard 508ad84bbe winex11: Support multiple fallbacks for cursor names.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2018-04-23 12:01:40 +02:00
Alexandre Julliard 9b2b9d9cb3 winex11: Use more common names for resizing cursors.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2018-03-28 20:11:07 +02:00
Alexandre Julliard 2e0a1cfd83 winex11: Load a monochrome cursor instead of converting a color one when possible.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2017-07-10 20:51:09 +02:00
Chris Morgan 9c83e5ccf2 winex11: Wrap XInput2 dependent functions with appropriate #ifdef.
Signed-off-by: Chris Morgan <chmorgan@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2017-02-27 14:32:17 +01:00
Carlos Garnacho 448433ae03 winex11: Use XIAllDevices to select for XI_RawMotion.
Instead of selecting for XI2 events for every slave device individually,
do it for XIAllDevices, and store the current device's relative X/Y
valuators so they can be quickly looked up in the XI_RawMotion events
received.

Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2017-02-09 13:16:29 +01:00
Nikolay Sivov 703e82094b winex11: Pass correct buffer length to RegQueryValueExW().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2017-02-08 16:00:31 +01:00
Carlos Garnacho 64c27d62b5 winex11: Always use the client pointer for raw events.
Use XI2's client pointer, it will be the master pointer affected by X
core calls, and even if it doesn't currently have relative X/Y
capabilities, it will gain those as soon as a slave device with such
capabilities is used.

Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2016-11-21 20:57:06 +01:00
Akihiro Sagawa ce7a98e95c winex11: Return more reliable value from X11DRV_MsgWaitForMultipleObjects.
After processing several X events, X11DRV_MsgWaitForMultipleObjects always
tells us that a new message is available. This is not true for some cases.

For instance, when we call DestroyWindow, the X queues DestroyEvent. Then,
X11DRV_MsgWaitForMultipleObjects handles the event only; none is posted or
sent as hwnd for destroyed window is unavailable. However, the function
states "new message is available" by returning count - 1 value.

This is an issue for CoWaitForMultipleHandles because it expects a new
message in the queue and consumes the message.

Signed-off-by: Akihiro Sagawa <sagawa.aki@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2016-08-25 22:27:40 +09:00
Hadrien Boizard 81538ebb6d winex11.drv: Use wine_dbgstr_point in TRACES.
Signed-off-by: Hadrien Boizard <h.boizard@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2016-07-07 22:19:37 +09:00
Jacek Caban ecf9e9135d winex11.drv: Use grabbed window display in SetCapture.
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2016-03-14 13:54:50 +09:00
Alexandre Julliard 49e1ba7d4b winex11: Ignore EnterNotify events that are older than the last mouse wrap.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2015-12-01 17:42:38 +09:00
Alexandre Julliard 9d237f97fc winex11: Add a helper function to check a motion event against the serial number.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2015-12-01 17:42:01 +09:00
Sebastian Lackner 0f3fa3965b winex11: Initialize thread data in clip_cursor_notify. 2015-08-05 23:42:42 +09:00
Francois Gouget 3adc91f3fc winex11.drv: Remove unneeded NONAMELESSXXX directives. 2015-04-01 14:13:09 +09:00
Jinhui Chen 366ed5495c winex11.drv: Fix row-resize/col-resize mapping to X cursor. 2015-03-25 19:44:33 +09:00
Sebastian Lackner 7714efe213 winex11: Only enable XInput2 cursor warp workaround if necessary.
Based on a patch by Patrick Rudolph.
2015-02-27 15:06:24 +09:00
Frédéric Delanoy 323bec99b3 winex11.drv: Use BOOL type where appropriate. 2013-11-29 13:32:46 +01:00
Alexandre Julliard 0f03f264b7 winex11: Add a helper function to return the primary monitor rectangle. 2013-10-14 17:26:14 +02:00
Alexandre Julliard 9f1f29cc91 winex11: Add a helper function to return the virtual screen rectangle. 2013-10-14 17:26:14 +02:00
Alexandre Julliard 0b71e0bf12 winex11: Add helper functions for converting between root and virtual screen coords. 2013-10-14 17:26:13 +02:00
Frédéric Delanoy ff7fc1fd45 winex11.drv: Use BOOL type where appropriate. 2013-10-02 11:06:39 +02:00
Henri Verbeet 76bbf106a2 winex11: Move the desktop process check from X11DRV_ClipCursor() to grab_clipping_window().
We don't want to clip in the desktop process, but we still need it to call
ungrab_clipping_window() if the process that was previously clipping didn't.
This can happen for example when fullscreen clipping is enabled, but the
corresponding window isn't explicitly destroyed before process exit.
2013-04-25 11:47:39 +02:00
Andrew Talbot 0ff8c9da52 winex11.drv: Avoid signed-unsigned integer comparisons. 2013-03-06 11:43:06 +01:00
Alexandre Julliard 77af9035d8 winex11: Fallback to the standard cursor font when XCursor is missing. 2013-01-17 15:33:09 +01:00
Alexandre Julliard 91ebca2bf1 winex11: Send WM_ENTERSIZEMOVE when starting to poll for a window move/resize. 2012-12-11 15:49:04 +01:00
Alexandre Julliard ed47a507d0 winex11: Send WM_EXITSIZEMOVE when the mouse has been released. 2012-12-10 20:30:29 +01:00
Henri Verbeet 73d68c5a31 winex11: Handle a NULL cursor clipping rect the same as a fullscreen rect.
We want to avoid ungrabbing the clipping window if "fullscreen clipping" is
enabled.
2012-09-28 11:26:33 +02:00
Alexandre Julliard 988f2fde86 winex11: Store the full visual info for the default visual. 2012-09-26 14:40:39 +02:00
Alexandre Julliard 0a9398421c winex11: Add a workaround for XInput support with mouse drivers that don't provide labels. 2012-09-26 14:40:38 +02:00
Alexandre Julliard 1cfed8922e winex11: Add window data locking to the mouse functions. 2012-09-18 14:47:01 +02:00
Alexandre Julliard c8ea1e50dc winex11: Avoid passing a window data structure to functions that can send messages. 2012-09-17 12:42:21 +02:00
Alexandre Julliard 2967599286 winex11: Don't select for mouse events on the client window. 2012-08-30 12:57:45 +02:00
Alexandre Julliard cf1be58706 winex11: Remove the remaining X11 locking calls. 2012-08-16 16:48:00 +02:00
Alexandre Julliard c970621d90 winex11: Create contexts at initialization time to avoid the need for locks. 2012-08-16 14:34:00 +02:00
Alexandre Julliard ff60249cab winex11: Use the labels to find the mouse motion valuators for XInput2. 2012-08-16 10:27:19 +02:00
Alexandre Julliard f579091380 winex11: Store XInput2 device info in the thread data. 2012-08-16 10:25:49 +02:00
Alexandre Julliard 6f6217e9a4 winex11: Remove remaining X11 locking around graphics calls. 2012-08-14 15:13:21 +02:00
Alexandre Julliard 6bfcb347bf winex11: Remove X11 locking around simple X calls. 2012-08-14 15:13:08 +02:00
Alexandre Julliard 8ee12778f9 winex11: Use the create_pixmap_from_image helper to create monochrome cursors. 2012-05-15 17:02:09 +02:00
Alexandre Julliard 70a9bb9518 winex11: Use the create_pixmap_from_image helper to create color cursors. 2012-05-15 17:02:08 +02:00
Francois Gouget fac36c55e9 Assorted typo, spelling, wording and case fixes. 2012-05-15 16:26:43 +02:00