diff mbox

[2/2] msmouse: send short messages if possible.

Message ID 1466064474-26229-3-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann June 16, 2016, 8:07 a.m. UTC
Keep track of button changes.  Send the extended 4-byte messages for
three button mice only in case we have something to report for the
middle button.  Use the short 3-byte messages (original protocol for
two-button microsoft mouse) otherwise.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 backends/msmouse.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Peter Maydell June 16, 2016, 8:13 a.m. UTC | #1
On 16 June 2016 at 09:07, Gerd Hoffmann <kraxel@redhat.com> wrote:
> Keep track of button changes.  Send the extended 4-byte messages for
> three button mice only in case we have something to report for the
> middle button.  Use the short 3-byte messages (original protocol for
> two-button microsoft mouse) otherwise.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  backends/msmouse.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/backends/msmouse.c b/backends/msmouse.c
> index b1e1bea..f6504be 100644
> --- a/backends/msmouse.c
> +++ b/backends/msmouse.c
> @@ -35,6 +35,7 @@ typedef struct {
>      QemuInputHandlerState *hs;
>      int axis[INPUT_AXIS__MAX];
>      bool btns[INPUT_BUTTON__MAX];
> +    bool btnc[INPUT_BUTTON__MAX];
>      uint8_t outbuf[32];
>      int outlen;
>  } MouseState;
> @@ -62,7 +63,7 @@ static void msmouse_chr_accept_input(CharDriverState *chr)
>  static void msmouse_queue_event(MouseState *mouse)
>  {
>      unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
> -    int dx, dy;
> +    int dx, dy, count = 3;
>
>      dx = mouse->axis[INPUT_AXIS_X];
>      mouse->axis[INPUT_AXIS_X] = 0;
> @@ -78,14 +79,19 @@ static void msmouse_queue_event(MouseState *mouse)
>      /* Buttons */
>      bytes[0] |= (mouse->btns[INPUT_BUTTON_LEFT]   ? 0x20 : 0x00);
>      bytes[0] |= (mouse->btns[INPUT_BUTTON_RIGHT]  ? 0x10 : 0x00);
> -    bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);
> +    if (mouse->btns[INPUT_BUTTON_MIDDLE] ||
> +        mouse->btnc[INPUT_BUTTON_MIDDLE]) {
> +        bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);
> +        mouse->btnc[INPUT_BUTTON_MIDDLE] = false;
> +        count = 4;
> +    }
>
> -    if (mouse->outlen <= sizeof(mouse->outbuf) - 4) {
> +    if (mouse->outlen <= sizeof(mouse->outbuf) - count) {
>          /* We always send the packet of, so that we do not have to keep track
>             of previous state of the middle button. This can potentially confuse
>             some very old drivers for two button mice though. */

Is this comment now out of date ?

> -        memcpy(mouse->outbuf + mouse->outlen, bytes, 4);
> -        mouse->outlen += 4;
> +        memcpy(mouse->outbuf + mouse->outlen, bytes, count);
> +        mouse->outlen += count;
>      } else {
>          /* queue full -> drop event */
>      }
> @@ -107,6 +113,7 @@ static void msmouse_input_event(DeviceState *dev, QemuConsole *src,
>      case INPUT_EVENT_KIND_BTN:
>          btn = evt->u.btn.data;
>          mouse->btns[btn->button] = btn->down;
> +        mouse->btnc[btn->button] = true;
>          break;
>
>      default:
> --
> 1.8.3.1
>

thanks
-- PMM
Gerd Hoffmann June 16, 2016, 8:41 a.m. UTC | #2
Hi,

> > -    if (mouse->outlen <= sizeof(mouse->outbuf) - 4) {
> > +    if (mouse->outlen <= sizeof(mouse->outbuf) - count) {
> >          /* We always send the packet of, so that we do not have to keep track
> >             of previous state of the middle button. This can potentially confuse
> >             some very old drivers for two button mice though. */
> 
> Is this comment now out of date ?

Yes.  I'll drop it in v2. 

cheers,
  Gerd
diff mbox

Patch

diff --git a/backends/msmouse.c b/backends/msmouse.c
index b1e1bea..f6504be 100644
--- a/backends/msmouse.c
+++ b/backends/msmouse.c
@@ -35,6 +35,7 @@  typedef struct {
     QemuInputHandlerState *hs;
     int axis[INPUT_AXIS__MAX];
     bool btns[INPUT_BUTTON__MAX];
+    bool btnc[INPUT_BUTTON__MAX];
     uint8_t outbuf[32];
     int outlen;
 } MouseState;
@@ -62,7 +63,7 @@  static void msmouse_chr_accept_input(CharDriverState *chr)
 static void msmouse_queue_event(MouseState *mouse)
 {
     unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
-    int dx, dy;
+    int dx, dy, count = 3;
 
     dx = mouse->axis[INPUT_AXIS_X];
     mouse->axis[INPUT_AXIS_X] = 0;
@@ -78,14 +79,19 @@  static void msmouse_queue_event(MouseState *mouse)
     /* Buttons */
     bytes[0] |= (mouse->btns[INPUT_BUTTON_LEFT]   ? 0x20 : 0x00);
     bytes[0] |= (mouse->btns[INPUT_BUTTON_RIGHT]  ? 0x10 : 0x00);
-    bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);
+    if (mouse->btns[INPUT_BUTTON_MIDDLE] ||
+        mouse->btnc[INPUT_BUTTON_MIDDLE]) {
+        bytes[3] |= (mouse->btns[INPUT_BUTTON_MIDDLE] ? 0x20 : 0x00);
+        mouse->btnc[INPUT_BUTTON_MIDDLE] = false;
+        count = 4;
+    }
 
-    if (mouse->outlen <= sizeof(mouse->outbuf) - 4) {
+    if (mouse->outlen <= sizeof(mouse->outbuf) - count) {
         /* We always send the packet of, so that we do not have to keep track
            of previous state of the middle button. This can potentially confuse
            some very old drivers for two button mice though. */
-        memcpy(mouse->outbuf + mouse->outlen, bytes, 4);
-        mouse->outlen += 4;
+        memcpy(mouse->outbuf + mouse->outlen, bytes, count);
+        mouse->outlen += count;
     } else {
         /* queue full -> drop event */
     }
@@ -107,6 +113,7 @@  static void msmouse_input_event(DeviceState *dev, QemuConsole *src,
     case INPUT_EVENT_KIND_BTN:
         btn = evt->u.btn.data;
         mouse->btns[btn->button] = btn->down;
+        mouse->btnc[btn->button] = true;
         break;
 
     default: