* [Qemu-devel] [PATCH 1/2] msmouse: switch to new input interface
2016-06-16 8:07 [Qemu-devel] [PATCH 0/2] more msmouse fixes Gerd Hoffmann
@ 2016-06-16 8:07 ` Gerd Hoffmann
2016-06-16 8:07 ` [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible Gerd Hoffmann
1 sibling, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2016-06-16 8:07 UTC (permalink / raw)
To: qemu-devel; +Cc: Anatoly Gusev, Gerd Hoffmann, Paolo Bonzini
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible.
2016-06-16 8:07 [Qemu-devel] [PATCH 0/2] more msmouse fixes Gerd Hoffmann
2016-06-16 8:07 ` [Qemu-devel] [PATCH 1/2] msmouse: switch to new input interface Gerd Hoffmann
@ 2016-06-16 8:07 ` Gerd Hoffmann
2016-06-16 8:13 ` Peter Maydell
1 sibling, 1 reply; 5+ messages in thread
From: Gerd Hoffmann @ 2016-06-16 8:07 UTC (permalink / raw)
To: qemu-devel; +Cc: Anatoly Gusev, Gerd Hoffmann, Paolo Bonzini
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. */
- 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
^ permalink raw reply related [flat|nested] 5+ messages in thread