From patchwork Mon Jul 3 13:17:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Owen Smith X-Patchwork-Id: 9822701 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BE94460246 for ; Mon, 3 Jul 2017 13:20:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ADEDA27FA6 for ; Mon, 3 Jul 2017 13:20:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9F48A2823E; Mon, 3 Jul 2017 13:20:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2D5F827FA6 for ; Mon, 3 Jul 2017 13:20:24 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dS1Ev-0001fp-CZ; Mon, 03 Jul 2017 13:18:09 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dS1Eu-0001ep-AY for xen-devel@lists.xen.org; Mon, 03 Jul 2017 13:18:08 +0000 Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id 63/AB-01735-F044A595; Mon, 03 Jul 2017 13:18:07 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprFIsWRWlGSWpSXmKPExsXitHSDvS6/S1S kwdaF7BZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8a7T1vYC2YaVNx4oN7AeEOpi5GTQ0LAX2LR 2lPsIDabgIbEjM7FLCC2iIC0RP+cdrA4s0A/o8T8H+IgtrCAm8SRZ9PZQGwWARWJqZ8ngdXwC rhIzP2ygQVippzE+eM/mbsYOTg4BVwlFkysAQkLAZWcOvGNEcJWkvi2+AUzRKugxMmZT1ggVk lIHHzxgnkCI+8sJKlZSFILGJlWMaoXpxaVpRbpGuolFWWmZ5TkJmbm6BoamOrlphYXJ6an5iQ mFesl5+duYgSGTT0DA+MOxqZe50OMkhxMSqK8rjcjI4X4kvJTKjMSizPii0pzUosPMcpwcChJ 8Ao7R0UKCRalpqdWpGXmAAMYJi3BwaMkwrvFECjNW1yQmFucmQ6ROsVoybFh9fovTByrZv78x sTxasL/b0xCLHn5ealS4rxeIPMEQBoySvPgxsGi7BKjrJQwLyMDA4MQT0FqUW5mCar8K0ZxDk YlYd6DTkBTeDLzSuC2vgI6iAnooIaeCJCDShIRUlINjIEL5rx7vLRTgFlqBZeNiOi7fUoZrjw yL34XeWnISa6+2hGzTKjbiLeNpfTi/ehQ/Rs73FtNZSwP7TK80OQtxMqbFre/mFHH7df1IF4j rt4jn6Y2eMwv3fvg0d2Gn1Ur/R883rh8ioZcyopZQbM/vDS8E+w386d89IQHs6U8w941vG2bF K84SYmlOCPRUIu5qDgRAC5a+yitAgAA X-Env-Sender: prvs=35088db86=owen.smith@citrix.com X-Msg-Ref: server-8.tower-206.messagelabs.com!1499087885!101032195!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 12037 invoked from network); 3 Jul 2017 13:18:06 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP; 3 Jul 2017 13:18:06 -0000 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 Cc: anthony.perard@citrix.com, sstabellini@kernel.org, kraxel@redhat.com, Owen Smith , xen-devel@lists.xen.org Subject: [Xen-devel] [PATCH 1/2 v2] xenfb: Use qemu_input_handler_* calls directly X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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" #include "hw/hw.h" +#include "ui/input.h" #include "ui/console.h" #include "hw/xen/xen_backend.h" @@ -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; }; #define UP_QUEUE 8 @@ -293,6 +301,21 @@ static void xenfb_key_event(void *opaque, int scancode) xenfb_send_key(xenfb, down, scancode2linux[scancode]); } +static void xenfb_legacy_key_event(DeviceState *dev, QemuConsole *src, + InputEvent *evt) +{ + struct XenInput *in = (struct XenInput *)dev; + int scancodes[3], i, count; + InputKeyEvent *key = evt->u.key.data; + + count = qemu_input_key_value_to_scancode(key->key, + key->down, + scancodes); + for (i = 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 = button_state; } +static void xenfb_legacy_mouse_event(DeviceState *dev, QemuConsole *src, + InputEvent *evt) +{ + static const int bmap[INPUT_BUTTON__MAX] = { + [INPUT_BUTTON_LEFT] = MOUSE_EVENT_LBUTTON, + [INPUT_BUTTON_MIDDLE] = MOUSE_EVENT_MBUTTON, + [INPUT_BUTTON_RIGHT] = MOUSE_EVENT_RBUTTON, + }; + struct XenInput *in = (struct XenInput *)dev; + InputBtnEvent *btn; + InputMoveEvent *move; + + switch (evt->type) { + case INPUT_EVENT_KIND_BTN: + btn = evt->u.btn.data; + if (btn->down) { + in->buttons |= bmap[btn->button]; + } else { + in->buttons &= ~bmap[btn->button]; + } + if (btn->down && btn->button == 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 == 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 = evt->u.abs.data; + in->axis[move->axis] = move->value; + break; + case INPUT_EVENT_KIND_REL: + move = evt->u.rel.data; + in->axis[move->axis] += move->value; + break; + default: + break; + } +} + +static void xenfb_legacy_mouse_sync(DeviceState *dev) +{ + struct XenInput *in = (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] = 0; + in->axis[INPUT_AXIS_Y] = 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 != 0) return rc; - qemu_add_kbd_event_handler(xenfb_key_event, in); return 0; } @@ -366,24 +452,43 @@ static void input_connected(struct XenDevice *xendev) in->abs_pointer_wanted = 0; } + 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 = qemu_add_mouse_event_handler(xenfb_mouse_event, in, - in->abs_pointer_wanted, - "Xen PVFB Mouse"); + + in->hkbd.name = "legacy-kbd"; + in->hkbd.mask = INPUT_EVENT_MASK_KEY; + in->hkbd.event = xenfb_legacy_key_event; + in->qkbd = qemu_input_handler_register((DeviceState *)in, + &in->hkbd); + qemu_input_handler_activate(in->qkbd); + + in->hmouse.name = "Xen PVFB Mouse"; + in->hmouse.mask = INPUT_EVENT_MASK_BTN | + (in->abs_pointer_wanted ? INPUT_EVENT_MASK_ABS : INPUT_EVENT_MASK_REL); + in->hmouse.event = xenfb_legacy_mouse_event; + in->hmouse.sync = xenfb_legacy_mouse_sync; + in->qmouse = qemu_input_handler_register((DeviceState *)in, + &in->hmouse); + qemu_input_handler_activate(in->qmouse); } static void input_disconnect(struct XenDevice *xendev) { struct XenInput *in = container_of(xendev, struct XenInput, c.xendev); + if (in->qkbd) { + qemu_input_handler_unregister(in->qkbd); + in->qkbd = NULL; + } if (in->qmouse) { - qemu_remove_mouse_event_handler(in->qmouse); + qemu_input_handler_unregister(in->qmouse); in->qmouse = NULL; } - qemu_add_kbd_event_handler(NULL, NULL); common_unbind(&in->c); }