Patchwork [v2] usb-hid: Fix 0/0 position for Windows in tablet mode

login
register
mail settings
Submitter Jan Kiszka
Date July 12, 2011, 7:47 a.m.
Message ID <4E1BFC24.3000508@web.de>
Download mbox | patch
Permalink /patch/104325/
State New
Headers show

Comments

Jan Kiszka - July 12, 2011, 7:47 a.m.
On 2011-07-04 20:15, andrzej zaborowski wrote:
> On 26 June 2011 11:11, Jan Kiszka <jan.kiszka@web.de> wrote:
>> On 2011-06-25 15:10, Andreas Färber wrote:
>>> Am 25.06.2011 um 14:55 schrieb Jan Kiszka:
>>>
>>>> On 2011-06-25 14:37, Andreas Färber wrote:
>>>>> Am 24.06.2011 um 16:27 schrieb Jan Kiszka:
>>>>>
>>>>>> For unknown reasons, Windows drivers (tested with XP and Win7) ignore
>>>>>> usb-tablet events that move the pointer to 0/0. So always set bit 0 of
>>>>>> the coordinates.
>>>>>>
>>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>>>> ---
>>>>>> hw/usb-hid.c |    6 ++++--
>>>>>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
>>>>>> index d711b5c..2b9a451 100644
>>>>>> --- a/hw/usb-hid.c
>>>>>> +++ b/hw/usb-hid.c
>>>>>> @@ -457,8 +457,10 @@ static void
>>>>>> usb_pointer_event_combine(USBPointerEvent *e, int xyrel,
>>>>>>        e->xdx += x1;
>>>>>>        e->ydy += y1;
>>>>>>    } else {
>>>>>> -        e->xdx = x1;
>>>>>> -        e->ydy = y1;
>>>>>> +        /* Windows drivers do not like the 0/0 position and ignore
>>>>>> such
>>>>>> +         * events. */
>>>>>> +        e->xdx = x1 | 1;
>>>>>> +        e->ydy = y1 | 1;
>>>>>
>>>>> Doesn't this change mean we can't access any other even pixel either?
>>>>
>>>> Only on 32767x32767 screens (that's the resolution of the tablet).
>>>
>>> Well, if it's just a fix for 0/0 I would've expected something like:
>>>
>>> e->xdx = x1 ? x1 : 1;
>>> e->ydy = y1 ? y1 : 1;
>>
>> Works as well, my version is a little bit simpler. But I don't mind,
>> will post whatever is preferred to fix this.
> 
> Would it be enough to just do this for x or y, not both?

Yes, looks like. Is this one better?

Jan

----------8<---------

From: Jan Kiszka <jan.kiszka@siemens.com>

For unknown reasons, Windows drivers (tested with XP and Win7) ignore
usb-tablet events that move the pointer to 0/0. So always report 0/0 as
1/0.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/usb-hid.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
Andreas Färber - July 13, 2011, 9:05 p.m.
Am 12.07.2011 um 09:47 schrieb Jan Kiszka:

> On 2011-07-04 20:15, andrzej zaborowski wrote:
>> On 26 June 2011 11:11, Jan Kiszka <jan.kiszka@web.de> wrote:
>>> On 2011-06-25 15:10, Andreas Färber wrote:
>>>> Am 25.06.2011 um 14:55 schrieb Jan Kiszka:
>>>>
>>>>> On 2011-06-25 14:37, Andreas Färber wrote:
>>>>>> Am 24.06.2011 um 16:27 schrieb Jan Kiszka:
>>>>>>
>>>>>>> For unknown reasons, Windows drivers (tested with XP and Win7)  
>>>>>>> ignore
>>>>>>> usb-tablet events that move the pointer to 0/0. So always set  
>>>>>>> bit 0 of
>>>>>>> the coordinates.
>>>>>>>
>>>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>>>>> ---
>>>>>>> hw/usb-hid.c |    6 ++++--
>>>>>>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
>>>>>>> index d711b5c..2b9a451 100644
>>>>>>> --- a/hw/usb-hid.c
>>>>>>> +++ b/hw/usb-hid.c
>>>>>>> @@ -457,8 +457,10 @@ static void
>>>>>>> usb_pointer_event_combine(USBPointerEvent *e, int xyrel,
>>>>>>>       e->xdx += x1;
>>>>>>>       e->ydy += y1;
>>>>>>>   } else {
>>>>>>> -        e->xdx = x1;
>>>>>>> -        e->ydy = y1;
>>>>>>> +        /* Windows drivers do not like the 0/0 position and  
>>>>>>> ignore
>>>>>>> such
>>>>>>> +         * events. */
>>>>>>> +        e->xdx = x1 | 1;
>>>>>>> +        e->ydy = y1 | 1;
>>>>>>
>>>>>> Doesn't this change mean we can't access any other even pixel  
>>>>>> either?
>>>>>
>>>>> Only on 32767x32767 screens (that's the resolution of the tablet).
>>>>
>>>> Well, if it's just a fix for 0/0 I would've expected something  
>>>> like:
>>>>
>>>> e->xdx = x1 ? x1 : 1;
>>>> e->ydy = y1 ? y1 : 1;
>>>
>>> Works as well, my version is a little bit simpler. But I don't mind,
>>> will post whatever is preferred to fix this.
>>
>> Would it be enough to just do this for x or y, not both?
>
> Yes, looks like. Is this one better?

To me it looks better, yes.

Thanks,
Andreas

> ----------8<---------
>
> From: Jan Kiszka <jan.kiszka@siemens.com>
>
> For unknown reasons, Windows drivers (tested with XP and Win7) ignore
> usb-tablet events that move the pointer to 0/0. So always report 0/0  
> as
> 1/0.
>
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
> hw/usb-hid.c |    5 +++++
> 1 files changed, 5 insertions(+), 0 deletions(-)
>
> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
> index d711b5c..faf91c4 100644
> --- a/hw/usb-hid.c
> +++ b/hw/usb-hid.c
> @@ -459,6 +459,11 @@ static void  
> usb_pointer_event_combine(USBPointerEvent *e, int xyrel,
>     } else {
>         e->xdx = x1;
>         e->ydy = y1;
> +        /* Windows drivers do not like the 0/0 position and ignore  
> such
> +         * events. */
> +        if (!(x1 | y1)) {
> +            x1 = 1;
> +        }
>     }
>     e->dz += z1;
> }
> -- 
> 1.7.3.4
andrzej zaborowski - July 30, 2011, 5:51 a.m.
On 13 July 2011 23:05, Andreas Färber <andreas.faerber@web.de> wrote:
> Am 12.07.2011 um 09:47 schrieb Jan Kiszka:
>
>> On 2011-07-04 20:15, andrzej zaborowski wrote:
>>>
>>> On 26 June 2011 11:11, Jan Kiszka <jan.kiszka@web.de> wrote:
>>>>
>>>> On 2011-06-25 15:10, Andreas Färber wrote:
>>>>>
>>>>> Am 25.06.2011 um 14:55 schrieb Jan Kiszka:
>>>>>
>>>>>> On 2011-06-25 14:37, Andreas Färber wrote:
>>>>>>>
>>>>>>> Am 24.06.2011 um 16:27 schrieb Jan Kiszka:
>>>>>>>
>>>>>>>> For unknown reasons, Windows drivers (tested with XP and Win7)
>>>>>>>> ignore
>>>>>>>> usb-tablet events that move the pointer to 0/0. So always set bit 0
>>>>>>>> of
>>>>>>>> the coordinates.
>>>>>>>>
>>>>>>>> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
>>>>>>>> ---
>>>>>>>> hw/usb-hid.c |    6 ++++--
>>>>>>>> 1 files changed, 4 insertions(+), 2 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
>>>>>>>> index d711b5c..2b9a451 100644
>>>>>>>> --- a/hw/usb-hid.c
>>>>>>>> +++ b/hw/usb-hid.c
>>>>>>>> @@ -457,8 +457,10 @@ static void
>>>>>>>> usb_pointer_event_combine(USBPointerEvent *e, int xyrel,
>>>>>>>>      e->xdx += x1;
>>>>>>>>      e->ydy += y1;
>>>>>>>>  } else {
>>>>>>>> -        e->xdx = x1;
>>>>>>>> -        e->ydy = y1;
>>>>>>>> +        /* Windows drivers do not like the 0/0 position and ignore
>>>>>>>> such
>>>>>>>> +         * events. */
>>>>>>>> +        e->xdx = x1 | 1;
>>>>>>>> +        e->ydy = y1 | 1;
>>>>>>>
>>>>>>> Doesn't this change mean we can't access any other even pixel either?
>>>>>>
>>>>>> Only on 32767x32767 screens (that's the resolution of the tablet).
>>>>>
>>>>> Well, if it's just a fix for 0/0 I would've expected something like:
>>>>>
>>>>> e->xdx = x1 ? x1 : 1;
>>>>> e->ydy = y1 ? y1 : 1;
>>>>
>>>> Works as well, my version is a little bit simpler. But I don't mind,
>>>> will post whatever is preferred to fix this.
>>>
>>> Would it be enough to just do this for x or y, not both?
>>
>> Yes, looks like. Is this one better?

I pushed this version, thanks.

Cheers

Patch

diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index d711b5c..faf91c4 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -459,6 +459,11 @@  static void usb_pointer_event_combine(USBPointerEvent *e, int xyrel,
     } else {
         e->xdx = x1;
         e->ydy = y1;
+        /* Windows drivers do not like the 0/0 position and ignore such
+         * events. */
+        if (!(x1 | y1)) {
+            x1 = 1;
+        }
     }
     e->dz += z1;
 }