All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] [PATCH 3/4] msmouse: switch to new input interface
Date: Mon,  4 Jul 2016 11:42:54 +0200	[thread overview]
Message-ID: <1467625375-31774-4-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1467625375-31774-1-git-send-email-kraxel@redhat.com>

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

diff --git a/backends/msmouse.c b/backends/msmouse.c
index 9ade31b..b1e1bea 100644
--- a/backends/msmouse.c
+++ b/backends/msmouse.c
@@ -25,13 +25,16 @@
 #include "qemu-common.h"
 #include "sysemu/char.h"
 #include "ui/console.h"
+#include "ui/input.h"
 
 #define MSMOUSE_LO6(n) ((n) & 0x3f)
 #define MSMOUSE_HI2(n) (((n) & 0xc0) >> 6)
 
 typedef struct {
     CharDriverState *chr;
-    QEMUPutMouseEntry *entry;
+    QemuInputHandlerState *hs;
+    int axis[INPUT_AXIS__MAX];
+    bool btns[INPUT_BUTTON__MAX];
     uint8_t outbuf[32];
     int outlen;
 } MouseState;
@@ -56,12 +59,16 @@ static void msmouse_chr_accept_input(CharDriverState *chr)
     }
 }
 
-static void msmouse_event(void *opaque,
-                          int dx, int dy, int dz, int buttons_state)
+static void msmouse_queue_event(MouseState *mouse)
 {
-    CharDriverState *chr = (CharDriverState *)opaque;
-    MouseState *mouse = chr->opaque;
     unsigned char bytes[4] = { 0x40, 0x00, 0x00, 0x00 };
+    int dx, dy;
+
+    dx = mouse->axis[INPUT_AXIS_X];
+    mouse->axis[INPUT_AXIS_X] = 0;
+
+    dy = mouse->axis[INPUT_AXIS_Y];
+    mouse->axis[INPUT_AXIS_Y] = 0;
 
     /* Movement deltas */
     bytes[0] |= (MSMOUSE_HI2(dy) << 2) | MSMOUSE_HI2(dx);
@@ -69,9 +76,9 @@ static void msmouse_event(void *opaque,
     bytes[2] |= MSMOUSE_LO6(dy);
 
     /* Buttons */
-    bytes[0] |= (buttons_state & 0x01 ? 0x20 : 0x00);
-    bytes[0] |= (buttons_state & 0x02 ? 0x10 : 0x00);
-    bytes[3] |= (buttons_state & 0x04 ? 0x20 : 0x00);
+    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->outlen <= sizeof(mouse->outbuf) - 4) {
         /* We always send the packet of, so that we do not have to keep track
@@ -82,8 +89,38 @@ static void msmouse_event(void *opaque,
     } else {
         /* queue full -> drop event */
     }
+}
 
-    msmouse_chr_accept_input(chr);
+static void msmouse_input_event(DeviceState *dev, QemuConsole *src,
+                                InputEvent *evt)
+{
+    MouseState *mouse = (MouseState *)dev;
+    InputMoveEvent *move;
+    InputBtnEvent *btn;
+
+    switch (evt->type) {
+    case INPUT_EVENT_KIND_REL:
+        move = evt->u.rel.data;
+        mouse->axis[move->axis] += move->value;
+        break;
+
+    case INPUT_EVENT_KIND_BTN:
+        btn = evt->u.btn.data;
+        mouse->btns[btn->button] = btn->down;
+        break;
+
+    default:
+        /* keep gcc happy */
+        break;
+    }
+}
+
+static void msmouse_input_sync(DeviceState *dev)
+{
+    MouseState *mouse = (MouseState *)dev;
+
+    msmouse_queue_event(mouse);
+    msmouse_chr_accept_input(mouse->chr);
 }
 
 static int msmouse_chr_write (struct CharDriverState *s, const uint8_t *buf, int len)
@@ -96,11 +133,18 @@ static void msmouse_chr_close (struct CharDriverState *chr)
 {
     MouseState *mouse = chr->opaque;
 
-    qemu_remove_mouse_event_handler(mouse->entry);
+    qemu_input_handler_unregister(mouse->hs);
     g_free(mouse);
     g_free(chr);
 }
 
+static QemuInputHandler msmouse_handler = {
+    .name  = "QEMU Microsoft Mouse",
+    .mask  = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_REL,
+    .event = msmouse_input_event,
+    .sync  = msmouse_input_sync,
+};
+
 static CharDriverState *qemu_chr_open_msmouse(const char *id,
                                               ChardevBackend *backend,
                                               ChardevReturn *ret,
@@ -117,8 +161,8 @@ static CharDriverState *qemu_chr_open_msmouse(const char *id,
     chr->explicit_be_open = true;
 
     mouse = g_new0(MouseState, 1);
-    mouse->entry = qemu_add_mouse_event_handler(msmouse_event, chr, 0,
-                                                "QEMU Microsoft Mouse");
+    mouse->hs = qemu_input_handler_register((DeviceState *)mouse,
+                                            &msmouse_handler);
 
     mouse->chr = chr;
     chr->opaque = mouse;
-- 
1.8.3.1

  parent reply	other threads:[~2016-07-04  9:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-04  9:42 [Qemu-devel] [PATCH v2 0/4] msmouse: misc fixes Gerd Hoffmann
2016-07-04  9:42 ` [Qemu-devel] [PATCH 1/4] msmouse: add MouseState, unregister handler on close Gerd Hoffmann
2016-07-04  9:42 ` [Qemu-devel] [PATCH 2/4] msmouse: fix buffer handling Gerd Hoffmann
2016-07-04  9:42 ` Gerd Hoffmann [this message]
2016-07-04  9:42 ` [Qemu-devel] [PATCH 4/4] msmouse: send short messages if possible Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1467625375-31774-4-git-send-email-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.