[PATCH 1/2] mi: fix cursor warping screens
Peter Hutterer
peter.hutterer at who-t.net
Wed Aug 5 18:11:16 PDT 2009
On Wed, Aug 05, 2009 at 09:18:55PM +0300, y at mgw-mx09.nokia.com wrote:
> From: Tiago Vignatti <tiago.vignatti at nokia.com>
>
> The server was processing ET_RawMotion type when the cursor was wrapping to
> another screen and getting wrong valuator values. This fix such issue
> considering only ET_Motion, ET_KeyPress, ET_KeyRelease, ET_ButtonPress and
> ET_ButtonRelease types when the cursor detects a new screen.
>
> Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
> ---
> mi/mieq.c | 24 ++++++++++++++++--------
> 1 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/mi/mieq.c b/mi/mieq.c
> index 6ec2dba..b52ed84 100644
> --- a/mi/mieq.c
> +++ b/mi/mieq.c
> @@ -367,14 +367,22 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
> /* Custom event handler */
> handler = miEventQueue.handlers[event->any.type];
>
> - if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> - /* Assumption - screen switching can only occur on motion events. */
> - DequeueScreen(dev) = screen;
> - x = event->device.root_x;
> - y = event->device.root_y;
> - NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> - }
> - else {
> + switch (event->any.type) {
> + /* Catch events that include valuator information and check if they
> + * are changing the screen */
> + case ET_Motion:
> + case ET_KeyPress:
> + case ET_KeyRelease:
> + case ET_ButtonPress:
> + case ET_ButtonRelease:
> + if (dev && screen && screen != DequeueScreen(dev) && !handler) {
> + DequeueScreen(dev) = screen;
> + x = event->device.root_x;
> + y = event->device.root_y;
> + NewCurrentScreen (dev, DequeueScreen(dev), x, y);
> + break;
> + }
please always add a comment when an intentional fallthrough is used in a
switch statement.
anyway, having a return instead of a break after the dequeue stuff means we
wouldn't need the large default block.
This whole thing looks odd though. If the screen switch happens on a button
or key release event, the event isn't processed and we'd end up with a stuck
button or key.
I think the return is only supposed to happen on a ET_Motion, with the other
events falling through to the default case.
> + default:
> master = CopyGetMasterEvent(dev, event, &mevent);
>
> if (master)
> --
> 1.5.6.3
Cheers,
Peter
More information about the xorg-devel
mailing list