From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33787) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uo3pC-0003OD-CS for qemu-devel@nongnu.org; Sat, 15 Jun 2013 23:40:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uo3pA-0005M4-Fn for qemu-devel@nongnu.org; Sat, 15 Jun 2013 23:40:18 -0400 Received: from cantor2.suse.de ([195.135.220.15]:44044 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uo3p9-0005Lr-W5 for qemu-devel@nongnu.org; Sat, 15 Jun 2013 23:40:16 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Sun, 16 Jun 2013 05:40:01 +0200 Message-Id: <1371354005-26873-5-git-send-email-afaerber@suse.de> In-Reply-To: <1371354005-26873-1-git-send-email-afaerber@suse.de> References: <1371354005-26873-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH RFC 4/8] ui/input: Introduce MouseOps for qemu_add_mouse_event_handler() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , Brad Hards , Luiz Capitulino , Gerd Hoffmann , Paolo Bonzini , Ludwig Nussel , =?UTF-8?q?Andreas=20F=C3=A4rber?= This allows to add callbacks to mouse event handlers without constantly touching all callers of qemu_add_mouse_event_handler() or qemu_add_mouse_event_handler() itself. Signed-off-by: Andreas F=C3=A4rber --- backends/msmouse.c | 6 +++++- hw/char/escc.c | 6 +++++- hw/display/ads7846.c | 6 +++++- hw/display/xenfb.c | 6 +++++- hw/input/adb.c | 6 +++++- hw/input/hid.c | 8 ++++++-- hw/input/ps2.c | 6 +++++- hw/input/tsc2005.c | 6 +++++- hw/input/tsc210x.c | 8 ++++++-- hw/input/vmmouse.c | 6 +++++- hw/usb/dev-wacom.c | 12 ++++++++++-- include/ui/console.h | 13 +++++++++++-- ui/input.c | 12 ++++++------ 13 files changed, 79 insertions(+), 22 deletions(-) diff --git a/backends/msmouse.c b/backends/msmouse.c index 1d24ac6..035b7b4 100644 --- a/backends/msmouse.c +++ b/backends/msmouse.c @@ -63,6 +63,10 @@ static void msmouse_chr_close (struct CharDriverState = *chr) g_free (chr); } =20 +static const MouseOps msmouse_mouse_ops =3D { + .put_event =3D msmouse_event, +}; + CharDriverState *qemu_chr_open_msmouse(void) { CharDriverState *chr; @@ -72,7 +76,7 @@ CharDriverState *qemu_chr_open_msmouse(void) chr->chr_close =3D msmouse_chr_close; chr->explicit_be_open =3D true; =20 - qemu_add_mouse_event_handler(msmouse_event, chr, false, + qemu_add_mouse_event_handler(&msmouse_mouse_ops, chr, false, "QEMU Microsoft Mouse"); =20 return chr; diff --git a/hw/char/escc.c b/hw/char/escc.c index 68a49cd..f6592cb 100644 --- a/hw/char/escc.c +++ b/hw/char/escc.c @@ -867,6 +867,10 @@ void slavio_serial_ms_kbd_init(hwaddr base, qemu_irq= irq, sysbus_mmio_map(s, 0, base); } =20 +static const MouseOps sunmouse_mouse_ops =3D { + .put_event =3D sunmouse_event, +}; + static int escc_init1(SysBusDevice *dev) { SerialState *s =3D FROM_SYSBUS(SerialState, dev); @@ -891,7 +895,7 @@ static int escc_init1(SysBusDevice *dev) sysbus_init_mmio(dev, &s->mmio); =20 if (s->chn[0].type =3D=3D mouse) { - qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], false, + qemu_add_mouse_event_handler(&sunmouse_mouse_ops, &s->chn[0], fa= lse, "QEMU Sun Mouse"); } if (s->chn[1].type =3D=3D kbd) { diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c index 4a02744..9026d97 100644 --- a/hw/display/ads7846.c +++ b/hw/display/ads7846.c @@ -133,6 +133,10 @@ static const VMStateDescription vmstate_ads7846 =3D = { } }; =20 +static const MouseOps ads7846_ts_ops =3D { + .put_event =3D ads7846_ts_event, +}; + static int ads7846_init(SSISlave *dev) { ADS7846State *s =3D FROM_SSI_SLAVE(ADS7846State, dev); @@ -145,7 +149,7 @@ static int ads7846_init(SSISlave *dev) s->input[7] =3D ADS_TEMP1; /* TEMP1 */ =20 /* We want absolute coordinates */ - qemu_add_mouse_event_handler(ads7846_ts_event, s, true, + qemu_add_mouse_event_handler(&ads7846_ts_ops, s, true, "QEMU ADS7846-driven Touchscreen"); =20 ads7846_int_update(s); diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index f0333a0..14dac45 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -366,6 +366,10 @@ static int input_initialise(struct XenDevice *xendev= ) return 0; } =20 +static const MouseOps xenfb_mouse_ops =3D { + .put_event =3D xenfb_mouse_event, +}; + static void input_connected(struct XenDevice *xendev) { struct XenInput *in =3D container_of(xendev, struct XenInput, c.xend= ev); @@ -378,7 +382,7 @@ static void input_connected(struct XenDevice *xendev) if (in->qmouse) { qemu_remove_mouse_event_handler(in->qmouse); } - in->qmouse =3D qemu_add_mouse_event_handler(xenfb_mouse_event, in, + in->qmouse =3D qemu_add_mouse_event_handler(&xenfb_mouse_ops, in, in->abs_pointer_wanted, "Xen PVFB Mouse"); } diff --git a/hw/input/adb.c b/hw/input/adb.c index 104bfc8..88edf57 100644 --- a/hw/input/adb.c +++ b/hw/input/adb.c @@ -529,6 +529,10 @@ static const VMStateDescription vmstate_adb_mouse =3D= { } }; =20 +static const MouseOps adb_mouse_ops =3D { + .put_event =3D adb_mouse_event, +}; + static void adb_mouse_realizefn(DeviceState *dev, Error **errp) { MouseState *s =3D ADB_MOUSE(dev); @@ -536,7 +540,7 @@ static void adb_mouse_realizefn(DeviceState *dev, Err= or **errp) =20 amc->parent_realize(dev, errp); =20 - qemu_add_mouse_event_handler(adb_mouse_event, s, false, "QEMU ADB Mo= use"); + qemu_add_mouse_event_handler(&adb_mouse_ops, s, false, "QEMU ADB Mou= se"); } =20 static void adb_mouse_initfn(Object *obj) diff --git a/hw/input/hid.c b/hw/input/hid.c index 7a3a7a4..4cdc8a9 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -425,6 +425,10 @@ void hid_free(HIDState *hs) hid_del_idle_timer(hs); } =20 +static const MouseOps hid_mouse_ops =3D { + .put_event =3D hid_pointer_event, +}; + void hid_init(HIDState *hs, int kind, HIDEventFunc event) { hs->kind =3D kind; @@ -433,11 +437,11 @@ void hid_init(HIDState *hs, int kind, HIDEventFunc = event) if (hs->kind =3D=3D HID_KEYBOARD) { hs->kbd.eh_entry =3D qemu_add_kbd_event_handler(hid_keyboard_eve= nt, hs); } else if (hs->kind =3D=3D HID_MOUSE) { - hs->ptr.eh_entry =3D qemu_add_mouse_event_handler(hid_pointer_ev= ent, + hs->ptr.eh_entry =3D qemu_add_mouse_event_handler(&hid_mouse_ops= , hs, false, "QEMU HID Mouse"= ); } else if (hs->kind =3D=3D HID_TABLET) { - hs->ptr.eh_entry =3D qemu_add_mouse_event_handler(hid_pointer_ev= ent, + hs->ptr.eh_entry =3D qemu_add_mouse_event_handler(&hid_mouse_ops= , hs, true, "QEMU HID Tablet= "); } diff --git a/hw/input/ps2.c b/hw/input/ps2.c index e555f74..743e380 100644 --- a/hw/input/ps2.c +++ b/hw/input/ps2.c @@ -663,6 +663,10 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), = void *update_arg) return s; } =20 +static const MouseOps ps2_mouse_ops =3D { + .put_event =3D ps2_mouse_event, +}; + void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg) { PS2MouseState *s =3D (PS2MouseState *)g_malloc0(sizeof(PS2MouseState= )); @@ -670,7 +674,7 @@ void *ps2_mouse_init(void (*update_irq)(void *, int),= void *update_arg) s->common.update_irq =3D update_irq; s->common.update_arg =3D update_arg; vmstate_register(NULL, 0, &vmstate_ps2_mouse, s); - qemu_add_mouse_event_handler(ps2_mouse_event, s, false, "QEMU PS/2 M= ouse"); + qemu_add_mouse_event_handler(&ps2_mouse_ops, s, false, "QEMU PS/2 Mo= use"); qemu_register_reset(ps2_mouse_reset, s); return s; } diff --git a/hw/input/tsc2005.c b/hw/input/tsc2005.c index b0d9263..69b543c 100644 --- a/hw/input/tsc2005.c +++ b/hw/input/tsc2005.c @@ -519,6 +519,10 @@ static int tsc2005_load(QEMUFile *f, void *opaque, i= nt version_id) return 0; } =20 +static const MouseOps tsc2005_touchscreen_ops =3D { + .put_event =3D tsc2005_touchscreen_event, +}; + void *tsc2005_init(qemu_irq pintdav) { TSC2005State *s; @@ -544,7 +548,7 @@ void *tsc2005_init(qemu_irq pintdav) =20 tsc2005_reset(s); =20 - qemu_add_mouse_event_handler(tsc2005_touchscreen_event, s, true, + qemu_add_mouse_event_handler(&tsc2005_touchscreen_ops, s, true, "QEMU TSC2005-driven Touchscreen"); =20 qemu_register_reset((void *) tsc2005_reset, s); diff --git a/hw/input/tsc210x.c b/hw/input/tsc210x.c index 02d3440..66e18fb 100644 --- a/hw/input/tsc210x.c +++ b/hw/input/tsc210x.c @@ -1100,6 +1100,10 @@ static int tsc210x_load(QEMUFile *f, void *opaque,= int version_id) return 0; } =20 +static const MouseOps tsc210x_touchscreen_ops =3D { + .put_event =3D tsc210x_touchscreen_event, +}; + uWireSlave *tsc2102_init(qemu_irq pint) { TSC210xState *s; @@ -1137,7 +1141,7 @@ uWireSlave *tsc2102_init(qemu_irq pint) =20 tsc210x_reset(s); =20 - qemu_add_mouse_event_handler(tsc210x_touchscreen_event, s, true, + qemu_add_mouse_event_handler(&tsc210x_touchscreen_ops, s, true, "QEMU TSC2102-driven Touchscreen"); =20 AUD_register_card(s->name, &s->card); @@ -1188,7 +1192,7 @@ uWireSlave *tsc2301_init(qemu_irq penirq, qemu_irq = kbirq, qemu_irq dav) =20 tsc210x_reset(s); =20 - qemu_add_mouse_event_handler(tsc210x_touchscreen_event, s, true, + qemu_add_mouse_event_handler(&tsc210x_touchscreen_ops, s, true, "QEMU TSC2301-driven Touchscreen"); =20 AUD_register_card(s->name, &s->card); diff --git a/hw/input/vmmouse.c b/hw/input/vmmouse.c index 2b2ea88..ec13a8b 100644 --- a/hw/input/vmmouse.c +++ b/hw/input/vmmouse.c @@ -114,6 +114,10 @@ static void vmmouse_remove_handler(VMMouseState *s) } } =20 +static const MouseOps vmmouse_mouse_ops =3D { + .put_event =3D vmmouse_mouse_event, +}; + static void vmmouse_update_handler(VMMouseState *s, uint8_t absolute) { if (s->status !=3D 0) { @@ -124,7 +128,7 @@ static void vmmouse_update_handler(VMMouseState *s, u= int8_t absolute) vmmouse_remove_handler(s); } if (s->entry =3D=3D NULL) { - s->entry =3D qemu_add_mouse_event_handler(vmmouse_mouse_event, + s->entry =3D qemu_add_mouse_event_handler(&vmmouse_mouse_ops, s, s->absolute, "vmmouse"); qemu_activate_mouse_event_handler(s->entry); diff --git a/hw/usb/dev-wacom.c b/hw/usb/dev-wacom.c index 78563ff..90b7fee 100644 --- a/hw/usb/dev-wacom.c +++ b/hw/usb/dev-wacom.c @@ -165,12 +165,16 @@ static inline int int_clamp(int val, int vmin, int = vmax) return val; } =20 +static const MouseOps usb_mouse_ops =3D { + .put_event =3D usb_mouse_event, +}; + static int usb_mouse_poll(USBWacomState *s, uint8_t *buf, int len) { int dx, dy, dz, b, l; =20 if (!s->mouse_grabbed) { - s->eh_entry =3D qemu_add_mouse_event_handler(usb_mouse_event, s,= false, + s->eh_entry =3D qemu_add_mouse_event_handler(&usb_mouse_ops, s, = false, "QEMU PenPartner tabl= et"); qemu_activate_mouse_event_handler(s->eh_entry); s->mouse_grabbed =3D 1; @@ -203,12 +207,16 @@ static int usb_mouse_poll(USBWacomState *s, uint8_t= *buf, int len) return l; } =20 +static const MouseOps usb_wacom_ops =3D { + .put_event =3D usb_wacom_event, +}; + static int usb_wacom_poll(USBWacomState *s, uint8_t *buf, int len) { int b; =20 if (!s->mouse_grabbed) { - s->eh_entry =3D qemu_add_mouse_event_handler(usb_wacom_event, s,= true, + s->eh_entry =3D qemu_add_mouse_event_handler(&usb_wacom_ops, s, = true, "QEMU PenPartner tabl= et"); qemu_activate_mouse_event_handler(s->eh_entry); s->mouse_grabbed =3D 1; diff --git a/include/ui/console.h b/include/ui/console.h index e25879f..30b0451 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -27,7 +27,16 @@ =20 typedef void QEMUPutKBDEvent(void *opaque, int keycode); typedef void QEMUPutLEDEvent(void *opaque, int ledstate); -typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int= buttons_state); +typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, + int buttons_state); + +/** + * MouseOps: + * @put_event: Signals a mouse event to a backend. + */ +typedef struct MouseOps { + QEMUPutMouseEvent *put_event; +} MouseOps; =20 typedef struct QEMUPutMouseEntry QEMUPutMouseEntry; typedef struct QEMUPutKbdEntry QEMUPutKbdEntry; @@ -36,7 +45,7 @@ typedef struct QEMUPutLEDEntry QEMUPutLEDEntry; QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque); void qemu_remove_kbd_event_handler(QEMUPutKbdEntry *entry); -QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, +QEMUPutMouseEntry *qemu_add_mouse_event_handler(const MouseOps *ops, void *opaque, bool absol= ute, const char *name); void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry); diff --git a/ui/input.c b/ui/input.c index 76ded94..7f1248b 100644 --- a/ui/input.c +++ b/ui/input.c @@ -31,7 +31,7 @@ #include "ui/keymaps.h" =20 struct QEMUPutMouseEntry { - QEMUPutMouseEvent *put_event; + const MouseOps *ops; void *opaque; bool absolute; char *name; @@ -346,7 +346,7 @@ static void check_mode_change(void) current_has_absolute =3D has_absolute; } =20 -QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func, +QEMUPutMouseEntry *qemu_add_mouse_event_handler(const MouseOps *ops, void *opaque, bool absol= ute, const char *name) { @@ -355,7 +355,7 @@ QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUP= utMouseEvent *func, =20 s =3D g_malloc0(sizeof(QEMUPutMouseEntry)); =20 - s->put_event =3D func; + s->ops =3D ops; s->opaque =3D opaque; s->absolute =3D absolute; s->name =3D g_strdup(name); @@ -443,7 +443,7 @@ void kbd_mouse_event(int dx, int dy, int dz, int butt= ons_state) =20 entry =3D QTAILQ_FIRST(&mouse_handlers); =20 - if (entry->put_event) { + if (entry->ops->put_event) { if (entry->absolute) { width =3D 0x7fff; height =3D 0x7fff; @@ -472,8 +472,8 @@ void kbd_mouse_event(int dx, int dy, int dz, int butt= ons_state) default: return; } - entry->put_event(entry->opaque, - rotated_dx, rotated_dy, dz, buttons_state); + entry->ops->put_event(entry->opaque, + rotated_dx, rotated_dy, dz, buttons_state)= ; } } =20 --=20 1.8.1.4