From nobody Mon Feb 9 00:02:28 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1499087998076457.90039484174076; Mon, 3 Jul 2017 06:19:58 -0700 (PDT) Received: from localhost ([::1]:35207 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dS1Gd-0008UD-LA for importer@patchew.org; Mon, 03 Jul 2017 09:19:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50272) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dS1Ev-0006sQ-E3 for qemu-devel@nongnu.org; Mon, 03 Jul 2017 09:18:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dS1Es-0003oz-Id for qemu-devel@nongnu.org; Mon, 03 Jul 2017 09:18:09 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:14761) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1dS1Es-0003oY-1S for qemu-devel@nongnu.org; Mon, 03 Jul 2017 09:18:06 -0400 X-IronPort-AV: E=Sophos;i="5.40,303,1496102400"; d="scan'208";a="438661908" From: Owen Smith To: Date: Mon, 3 Jul 2017 13:17:40 +0000 Message-ID: <1499087861-2132-2-git-send-email-owen.smith@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1499087861-2132-1-git-send-email-owen.smith@citrix.com> References: <1499087861-2132-1-git-send-email-owen.smith@citrix.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 66.165.176.63 Subject: [Qemu-devel] [PATCH 1/2 v2] xenfb: Use qemu_input_handler_* calls directly X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: anthony.perard@citrix.com, sstabellini@kernel.org, kraxel@redhat.com, Owen Smith , xen-devel@lists.xen.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The xenvkbd input device uses functions from input-legacy.c Use the appropriate qemu_input_handler_* functions instead of calling functions in input-legacy.c that in turn call the correct functions. The bulk of this patch removes the extra layer of calls by moving the required structure members into the XenInput struct. Signed-off-by: Owen Smith --- hw/display/xenfb.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 113 insertions(+), 8 deletions(-) diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index e76c0d8..88815df 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -27,6 +27,7 @@ #include "qemu/osdep.h" =20 #include "hw/hw.h" +#include "ui/input.h" #include "ui/console.h" #include "hw/xen/xen_backend.h" =20 @@ -54,7 +55,14 @@ struct XenInput { int abs_pointer_wanted; /* Whether guest supports absolute pointer */ int button_state; /* Last seen pointer button state */ int extended; - QEMUPutMouseEntry *qmouse; + /* kbd */ + QemuInputHandler hkbd; + QemuInputHandlerState *qkbd; + /* mouse */ + QemuInputHandler hmouse; + QemuInputHandlerState *qmouse; + int axis[INPUT_AXIS__MAX]; + int buttons; }; =20 #define UP_QUEUE 8 @@ -293,6 +301,21 @@ static void xenfb_key_event(void *opaque, int scancode) xenfb_send_key(xenfb, down, scancode2linux[scancode]); } =20 +static void xenfb_legacy_key_event(DeviceState *dev, QemuConsole *src, + InputEvent *evt) +{ + struct XenInput *in =3D (struct XenInput *)dev; + int scancodes[3], i, count; + InputKeyEvent *key =3D evt->u.key.data; + + count =3D qemu_input_key_value_to_scancode(key->key, + key->down, + scancodes); + for (i =3D 0; i < count; ++i) { + xenfb_key_event(in, scancodes[i]); + } +} + /* * Send a mouse event from the client to the guest OS * @@ -333,6 +356,70 @@ static void xenfb_mouse_event(void *opaque, xenfb->button_state =3D button_state; } =20 +static void xenfb_legacy_mouse_event(DeviceState *dev, QemuConsole *src, + InputEvent *evt) +{ + static const int bmap[INPUT_BUTTON__MAX] =3D { + [INPUT_BUTTON_LEFT] =3D MOUSE_EVENT_LBUTTON, + [INPUT_BUTTON_MIDDLE] =3D MOUSE_EVENT_MBUTTON, + [INPUT_BUTTON_RIGHT] =3D MOUSE_EVENT_RBUTTON, + }; + struct XenInput *in =3D (struct XenInput *)dev; + InputBtnEvent *btn; + InputMoveEvent *move; + + switch (evt->type) { + case INPUT_EVENT_KIND_BTN: + btn =3D evt->u.btn.data; + if (btn->down) { + in->buttons |=3D bmap[btn->button]; + } else { + in->buttons &=3D ~bmap[btn->button]; + } + if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_UP) { + xenfb_mouse_event(in, + in->axis[INPUT_AXIS_X], + in->axis[INPUT_AXIS_Y], + -1, + in->buttons); + } + if (btn->down && btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { + xenfb_mouse_event(in, + in->axis[INPUT_AXIS_X], + in->axis[INPUT_AXIS_Y], + 1, + in->buttons); + } + break; + case INPUT_EVENT_KIND_ABS: + move =3D evt->u.abs.data; + in->axis[move->axis] =3D move->value; + break; + case INPUT_EVENT_KIND_REL: + move =3D evt->u.rel.data; + in->axis[move->axis] +=3D move->value; + break; + default: + break; + } +} + +static void xenfb_legacy_mouse_sync(DeviceState *dev) +{ + struct XenInput *in =3D (struct XenInput *)dev; + + xenfb_mouse_event(in, + in->axis[INPUT_AXIS_X], + in->axis[INPUT_AXIS_Y], + 0, + in->buttons); + + if (!in->abs_pointer_wanted) { + in->axis[INPUT_AXIS_X] =3D 0; + in->axis[INPUT_AXIS_Y] =3D 0; + } +} + static int input_init(struct XenDevice *xendev) { xenstore_write_be_int(xendev, "feature-abs-pointer", 1); @@ -353,7 +440,6 @@ static int input_initialise(struct XenDevice *xendev) if (rc !=3D 0) return rc; =20 - qemu_add_kbd_event_handler(xenfb_key_event, in); return 0; } =20 @@ -366,24 +452,43 @@ static void input_connected(struct XenDevice *xendev) in->abs_pointer_wanted =3D 0; } =20 + if (in->qkbd) { + qemu_input_handler_unregister(in->qkbd); + } if (in->qmouse) { - qemu_remove_mouse_event_handler(in->qmouse); + qemu_input_handler_unregister(in->qmouse); } trace_xenfb_input_connected(xendev, in->abs_pointer_wanted); - in->qmouse =3D qemu_add_mouse_event_handler(xenfb_mouse_event, in, - in->abs_pointer_wanted, - "Xen PVFB Mouse"); + + in->hkbd.name =3D "legacy-kbd"; + in->hkbd.mask =3D INPUT_EVENT_MASK_KEY; + in->hkbd.event =3D xenfb_legacy_key_event; + in->qkbd =3D qemu_input_handler_register((DeviceState *)in, + &in->hkbd); + qemu_input_handler_activate(in->qkbd); + + in->hmouse.name =3D "Xen PVFB Mouse"; + in->hmouse.mask =3D INPUT_EVENT_MASK_BTN | + (in->abs_pointer_wanted ? INPUT_EVENT_MASK_ABS : INPUT_EVENT_MASK_= REL); + in->hmouse.event =3D xenfb_legacy_mouse_event; + in->hmouse.sync =3D xenfb_legacy_mouse_sync; + in->qmouse =3D qemu_input_handler_register((DeviceState *)in, + &in->hmouse); + qemu_input_handler_activate(in->qmouse); } =20 static void input_disconnect(struct XenDevice *xendev) { struct XenInput *in =3D container_of(xendev, struct XenInput, c.xendev= ); =20 + if (in->qkbd) { + qemu_input_handler_unregister(in->qkbd); + in->qkbd =3D NULL; + } if (in->qmouse) { - qemu_remove_mouse_event_handler(in->qmouse); + qemu_input_handler_unregister(in->qmouse); in->qmouse =3D NULL; } - qemu_add_kbd_event_handler(NULL, NULL); common_unbind(&in->c); } =20 --=20 2.1.4