From nobody Sun May 5 03:48:41 2024 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 From nobody Sun May 5 03:48:41 2024 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 1499087979597222.56145317434107; Mon, 3 Jul 2017 06:19:39 -0700 (PDT) Received: from localhost ([::1]:35206 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dS1GK-0008Fj-KX for importer@patchew.org; Mon, 03 Jul 2017 09:19:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50288) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dS1Ex-0006uG-VR for qemu-devel@nongnu.org; Mon, 03 Jul 2017 09:18:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dS1Es-0003ot-4n for qemu-devel@nongnu.org; Mon, 03 Jul 2017 09:18:11 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:57004) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1dS1Er-0003oX-Uk 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="438661910" From: Owen Smith To: Date: Mon, 3 Jul 2017 13:17:41 +0000 Message-ID: <1499087861-2132-3-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 2/2 v2] xenfb: Allow vkbd to connect without a DisplayState 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" If the vkbd device model is registered and the vfb device model is not registered, the backend will not transition to connected. If there is no DisplayState, then the absolute coordinates cannot be scaled, and will remain in the range [0, 0x7fff]. Backend writes "feature-raw-pointer" to indicate that the backend supports reporting absolute position without rescaling. The frontend uses "request-raw-pointer" to request raw unscaled pointer values. If there is no DisplayState, the absolute values are always raw unscaled values. Signed-off-by: Owen Smith --- hw/display/xenfb.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index 88815df..d40af6e 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -53,6 +53,7 @@ struct common { struct XenInput { struct common c; int abs_pointer_wanted; /* Whether guest supports absolute pointer */ + int raw_pointer_wanted; /* Whether guest supports unscaled pointer */ int button_state; /* Last seen pointer button state */ int extended; /* kbd */ @@ -329,18 +330,22 @@ static void xenfb_mouse_event(void *opaque, int dx, int dy, int dz, int button_state) { struct XenInput *xenfb =3D opaque; - DisplaySurface *surface =3D qemu_console_surface(xenfb->c.con); - int dw =3D surface_width(surface); - int dh =3D surface_height(surface); - int i; + int i, x, y; + if (xenfb->c.con && xenfb->raw_pointer_wanted !=3D 1) { + DisplaySurface *surface =3D qemu_console_surface(xenfb->c.con); + int dw =3D surface_width(surface); + int dh =3D surface_height(surface); + x =3D dx * (dw - 1) / 0x7fff; + y =3D dy * (dh - 1) / 0x7fff; + } else { + x =3D dx; + y =3D dy; + } =20 trace_xenfb_mouse_event(opaque, dx, dy, dz, button_state, xenfb->abs_pointer_wanted); if (xenfb->abs_pointer_wanted) - xenfb_send_position(xenfb, - dx * (dw - 1) / 0x7fff, - dy * (dh - 1) / 0x7fff, - dz); + xenfb_send_position(xenfb, x, y, dz); else xenfb_send_motion(xenfb, dx, dy, dz); =20 @@ -423,6 +428,7 @@ static void xenfb_legacy_mouse_sync(DeviceState *dev) static int input_init(struct XenDevice *xendev) { xenstore_write_be_int(xendev, "feature-abs-pointer", 1); + xenstore_write_be_int(xendev, "feature-raw-pointer", 1); return 0; } =20 @@ -432,8 +438,14 @@ static int input_initialise(struct XenDevice *xendev) int rc; =20 if (!in->c.con) { - xen_pv_printf(xendev, 1, "ds not set (yet)\n"); - return -1; + char *vfb =3D xenstore_read_str(NULL, "device/vfb"); + if (vfb =3D=3D NULL) { + /* there is no vfb, run vkbd on its own */ + } else { + free(vfb); + xen_pv_printf(xendev, 1, "ds not set (yet)\n"); + return -1; + } } =20 rc =3D common_bind(&in->c); @@ -451,6 +463,10 @@ static void input_connected(struct XenDevice *xendev) &in->abs_pointer_wanted) =3D=3D -1) { in->abs_pointer_wanted =3D 0; } + if (xenstore_read_fe_int(xendev, "request-raw-pointer", + &in->raw_pointer_wanted) =3D=3D -1) { + in->raw_pointer_wanted =3D 0; + } =20 if (in->qkbd) { qemu_input_handler_unregister(in->qkbd); --=20 2.1.4