[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 44/56] hw/char/escc: convert Sun mouse to use QemuInputHandler
From: |
Philippe Mathieu-Daudé |
Subject: |
[PULL 44/56] hw/char/escc: convert Sun mouse to use QemuInputHandler |
Date: |
Wed, 11 Sep 2024 14:14:09 +0200 |
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Update the Sun mouse implementation to use QemuInputHandler instead of the
legacy qemu_add_mouse_event_handler() function.
Note that this conversion adds extra sunmouse_* members to ESCCChannelState
but they are not added to the migration stream (similar to the Sun keyboard
members). If this were desired in future, the Sun devices should be split
into separate devices and added to the migration stream there instead.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2518
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Carl Hauser <chauser@pullman.com>
Message-ID: <20240904102301.175706-1-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/hw/char/escc.h | 3 ++
hw/char/escc.c | 92 +++++++++++++++++++++++++++++++-----------
2 files changed, 71 insertions(+), 24 deletions(-)
diff --git a/include/hw/char/escc.h b/include/hw/char/escc.h
index 5669a5b811..8c4c6a7730 100644
--- a/include/hw/char/escc.h
+++ b/include/hw/char/escc.h
@@ -46,6 +46,9 @@ typedef struct ESCCChannelState {
uint8_t rx, tx;
QemuInputHandlerState *hs;
char *sunkbd_layout;
+ int sunmouse_dx;
+ int sunmouse_dy;
+ int sunmouse_buttons;
} ESCCChannelState;
struct ESCCState {
diff --git a/hw/char/escc.c b/hw/char/escc.c
index d450d70eda..245a7b19d3 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -287,6 +287,7 @@ static void escc_reset_chn(ESCCChannelState *s)
s->rxint = s->txint = 0;
s->rxint_under_svc = s->txint_under_svc = 0;
s->e0_mode = s->led_mode = s->caps_lock_mode = s->num_lock_mode = 0;
+ s->sunmouse_dx = s->sunmouse_dy = s->sunmouse_buttons = 0;
clear_queue(s);
}
@@ -952,53 +953,96 @@ static void handle_kbd_command(ESCCChannelState *s, int
val)
}
}
-static void sunmouse_event(void *opaque,
- int dx, int dy, int dz, int buttons_state)
+static void sunmouse_handle_event(DeviceState *dev, QemuConsole *src,
+ InputEvent *evt)
{
- ESCCChannelState *s = opaque;
+ ESCCChannelState *s = (ESCCChannelState *)dev;
+ InputMoveEvent *move;
+ InputBtnEvent *btn;
+ static const int bmap[INPUT_BUTTON__MAX] = {
+ [INPUT_BUTTON_LEFT] = 0x4,
+ [INPUT_BUTTON_MIDDLE] = 0x2,
+ [INPUT_BUTTON_RIGHT] = 0x1,
+ };
+
+ switch (evt->type) {
+ case INPUT_EVENT_KIND_REL:
+ move = evt->u.rel.data;
+ if (move->axis == INPUT_AXIS_X) {
+ s->sunmouse_dx += move->value;
+ } else if (move->axis == INPUT_AXIS_Y) {
+ s->sunmouse_dy -= move->value;
+ }
+ break;
+
+ case INPUT_EVENT_KIND_BTN:
+ btn = evt->u.btn.data;
+ if (bmap[btn->button]) {
+ if (btn->down) {
+ s->sunmouse_buttons |= bmap[btn->button];
+ } else {
+ s->sunmouse_buttons &= ~bmap[btn->button];
+ }
+ /* Indicate we have a supported button event */
+ s->sunmouse_buttons |= 0x80;
+ }
+ break;
+
+ default:
+ /* keep gcc happy */
+ break;
+ }
+}
+
+static void sunmouse_sync(DeviceState *dev)
+{
+ ESCCChannelState *s = (ESCCChannelState *)dev;
int ch;
- trace_escc_sunmouse_event(dx, dy, buttons_state);
+ if (s->sunmouse_dx == 0 && s->sunmouse_dy == 0 &&
+ (s->sunmouse_buttons & 0x80) == 0) {
+ /* Nothing to do after button event filter */
+ return;
+ }
+
+ /* Clear our button event flag */
+ s->sunmouse_buttons &= ~0x80;
+ trace_escc_sunmouse_event(s->sunmouse_dx, s->sunmouse_dy,
+ s->sunmouse_buttons);
ch = 0x80 | 0x7; /* protocol start byte, no buttons pressed */
-
- if (buttons_state & MOUSE_EVENT_LBUTTON) {
- ch ^= 0x4;
- }
- if (buttons_state & MOUSE_EVENT_MBUTTON) {
- ch ^= 0x2;
- }
- if (buttons_state & MOUSE_EVENT_RBUTTON) {
- ch ^= 0x1;
- }
-
+ ch ^= s->sunmouse_buttons;
put_queue(s, ch);
- ch = dx;
-
+ ch = s->sunmouse_dx;
if (ch > 127) {
ch = 127;
} else if (ch < -127) {
ch = -127;
}
-
put_queue(s, ch & 0xff);
+ s->sunmouse_dx -= ch;
- ch = -dy;
-
+ ch = s->sunmouse_dy;
if (ch > 127) {
ch = 127;
} else if (ch < -127) {
ch = -127;
}
-
put_queue(s, ch & 0xff);
+ s->sunmouse_dy -= ch;
/* MSC protocol specifies two extra motion bytes */
-
put_queue(s, 0);
put_queue(s, 0);
}
+static const QemuInputHandler sunmouse_handler = {
+ .name = "QEMU Sun Mouse",
+ .mask = INPUT_EVENT_MASK_BTN | INPUT_EVENT_MASK_REL,
+ .event = sunmouse_handle_event,
+ .sync = sunmouse_sync,
+};
+
static void escc_init1(Object *obj)
{
ESCCState *s = ESCC(obj);
@@ -1036,8 +1080,8 @@ static void escc_realize(DeviceState *dev, Error **errp)
}
if (s->chn[0].type == escc_mouse) {
- qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
- "QEMU Sun Mouse");
+ s->chn[0].hs = qemu_input_handler_register((DeviceState *)(&s->chn[0]),
+ &sunmouse_handler);
}
if (s->chn[1].type == escc_kbd) {
s->chn[1].hs = qemu_input_handler_register((DeviceState *)(&s->chn[1]),
--
2.45.2
- [PULL 26/56] hw/char/pl011: Split RX/TX path of pl011_reset_fifo(), (continued)
- [PULL 26/56] hw/char/pl011: Split RX/TX path of pl011_reset_fifo(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 27/56] hw/char/pl011: Extract pl011_write_txdata() from pl011_write(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 33/56] fifo8: introduce head variable for fifo8_peekpop_bufptr(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 28/56] hw/char/pl011: Extract pl011_read_rxdata() from pl011_read(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 38/56] fifo8: add fifo8_peek_buf() function, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 36/56] fifo8: rename fifo8_pop_buf() to fifo8_peekpop_buf(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 42/56] tests/unit: Expand test_fifo8_peek_buf_wrap() coverage, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 37/56] fifo8: honour do_pop argument in fifo8_peekpop_buf(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 39/56] fifo8: introduce fifo8_peek() function, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 43/56] tests/unit: Comment FIFO8 tests, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 44/56] hw/char/escc: convert Sun mouse to use QemuInputHandler,
Philippe Mathieu-Daudé <=
- [PULL 35/56] fifo8: replace fifo8_pop_bufptr() with fifo8_peekpop_bufptr() in fifo8_pop_buf(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 40/56] tests/unit: add test-fifo unit test, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 41/56] tests/unit: Strengthen FIFO8 tests, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 45/56] hw/input/adb-mouse: convert to use QemuInputHandler, Philippe Mathieu-Daudé, 2024/09/11
- [PULL 46/56] hw/char: replace assert(0) with g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 47/56] hw/core: replace assert(0) with g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 48/56] hw/watchdog: replace assert(0) with g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 49/56] hw/gpio: remove break after g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 50/56] hw/misc: remove break after g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11
- [PULL 51/56] hw/pci-host: remove break after g_assert_not_reached(), Philippe Mathieu-Daudé, 2024/09/11