* [Qemu-devel] [PATCH 0/2] more msmouse fixes
@ 2016-06-16 8:07 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 ` [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible Gerd Hoffmann
0 siblings, 2 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2016-06-16 8:07 UTC (permalink / raw)
To: qemu-devel; +Cc: Anatoly Gusev, Gerd Hoffmann
Hi,
Two more msmouse patches, applying on top of the other msmouse patches
sent a few days ago.
cheers,
Gerd
Gerd Hoffmann (2):
msmouse: switch to new input interface
msmouse: send short messages if possible.
backends/msmouse.c | 81 ++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 66 insertions(+), 15 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [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
* Re: [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible.
2016-06-16 8:07 ` [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible Gerd Hoffmann
@ 2016-06-16 8:13 ` Peter Maydell
2016-06-16 8:41 ` Gerd Hoffmann
0 siblings, 1 reply; 5+ messages in thread
From: Peter Maydell @ 2016-06-16 8:13 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: QEMU Developers, Paolo Bonzini, Anatoly Gusev
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible.
2016-06-16 8:13 ` Peter Maydell
@ 2016-06-16 8:41 ` Gerd Hoffmann
0 siblings, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2016-06-16 8:41 UTC (permalink / raw)
To: Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini, Anatoly Gusev
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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-06-16 8:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [Qemu-devel] [PATCH 2/2] msmouse: send short messages if possible Gerd Hoffmann
2016-06-16 8:13 ` Peter Maydell
2016-06-16 8:41 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).