From nobody Sat Apr 11 20:23:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774976946; cv=none; d=zohomail.com; s=zohoarc; b=aliCWxvdQAtEpd6v/kajFH8lfVIAbS39wkUoUM5wtPy7X8WiWPzxs+vjE55cfw6jgsku5vgTq2z3ZYynfYKFCU18Z050hXDTRlH/OYeWuyKIt4yBQV+N1KFTOXzUY2GZwgb9L8GtrjXtKqQOqHJs3RwXuDKcibDGYo1VX5sx7PA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774976946; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=t6Oeyhq61VM068HLUikqnd7NmAFwnBHXZU5fNxj+eTU=; b=EhjcoJec289rdZIfklUOSTurnN+/q8GFwwmcUaGoKzJWlq/iunPZL2c+WQY18pDjs1Y+kxMirUYzxo2FH24c/SXLqac0m8R0rdRdizbaOZG9uXVd764dDGMMKHfc7w4TBFF7M9pqCo+3vkCzU1gwl1xYV4RIwkiV/I5E08ac7RI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177497694617824.52068709634659; Tue, 31 Mar 2026 10:09:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7ca3-0003Zi-28; Tue, 31 Mar 2026 13:08:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7ca0-0003ZD-TN for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:40 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7cZz-0003BZ-Bc for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:40 -0400 Received: by mail-pf1-x442.google.com with SMTP id d2e1a72fcca58-82cd9d0eceaso829347b3a.3 for ; Tue, 31 Mar 2026 10:08:38 -0700 (PDT) Received: from fedora ([103.2.232.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82ca843b818sm13647889b3a.6.2026.03.31.10.08.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 10:08:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774976917; x=1775581717; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=t6Oeyhq61VM068HLUikqnd7NmAFwnBHXZU5fNxj+eTU=; b=V8Z6Wv4XUPaIzvGvJE9kvcLtRVXnpQ03FNvit33g4d8cH2HAXDds5UrU2VQ92w6CBg rDAhdyc/Li6OWaAgBhC73s0YNnfAEftKlGhGfU8pfMCrdE0Wd4XEJ6zzOvR8+O4AY+30 rFTj6VCE3ukztu+TK/npvEIwavCTENUz1c/HZWdO7VFMVQKZtJCsHWzXZ5rxkV8PRhMb 2IMFYF0nccpU4tARwLE4Fe+cbXUq6ZhrehiX7A/8U8GONFmZg0ggaIUo0dRt8POYJC61 d5Wm/sa36e/M5iEWCBWdLzoSdSYc+KTsh2/P5y2SRHB614HxFlQCp6NIFnH4Z6N59dBM CXNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774976917; x=1775581717; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=t6Oeyhq61VM068HLUikqnd7NmAFwnBHXZU5fNxj+eTU=; b=XI0IA6UZ/p1rl1lqoC4TrmDaNmzUXJ8+7vt9ORasPdGycsj1aPlux+gUUH1pR17ToQ pul0aQ4E9oD00J6Qii+TSdXC4RvrWQvmiFmaTCD4/VSB47r6luClsP/ClPK2Q3VBIb+o WykOdbMdBmZmZnsRt3D2D5BCyBQHqJhpsm1PKUC83VQFS5bJi8QUfkKyCRswOuNainYc zEyFEHsbMH2O+OzY5w6Gy37ieUJFz5jB33CTcenzY8ggfRbhWc33FsQls/xK4f3JtBRs GgLJXl/kEJb8DyWdDBPvwzlzO7zMCepdA8R91pC5mH5w0FiXH65tD59dNC2tw78H5neT JOXg== X-Gm-Message-State: AOJu0Ywiw4nfODSmX5GalzxhN2khLCEnOIyADgdueOoZ997TDOwoZA6Y e/a/Rhp97w4u/nXOFAnr9bnkL5JyN60PWb1Py01YI3c4BsR6Zqv/GNKTVm/KmSUJ X-Gm-Gg: ATEYQzwbmVjBXEt9GRU1Z9pDd/MeVOBY5/NLv2ziHbQ9LAkzXpvqpJ4j9jDUyhlboiR GYSXjSjN1XRC2q7AdTJbWyJUzazdHKHXrEmb1SfAIvv9XVAr4e6S4nmzw2Ip11Wyz1hsYjoTRKd rEgTGS09YMcqDgcn56NkXDQZdR72i1wJwGWui1KvfrdeJ/PNHq8CMocivZNGmLZfV30pu6UTRJw Pn1y7UPuWMc4jDQWsrkXm4xrvY7k0VX4w0OiDAw50zYzePD2HBSgrSenEvDfqhCU/BiFN3aZ5A7 SYzW3gZGRUFcpsPEqDwJUpIVmPoeu2K1VPW6BYBXS+3oHJWr2aP+9/6e+Hbgsa/5J0PqO1IW1ss glXriEv+NpCHmEuLPZPDVH7l6ZZwWfBinH5w2kDov1TmXx2ElT7lX9DAHSAZul3gZzlUdA8SpwD 5/qY8ULn70mu6ocLtbhzLEUBlxwMIAiO8/F1jXR4RReEZTpBbzG5DR08BfT1oUhvU3rsBYUpszG ZAoCXzK5ugmZbhkPJsEUm6kgKUezkNLkbLmE2lUHV/ttlAzCReP5Md8Zud+xuvBycrABdRpcw== X-Received: by 2002:a05:6a00:bd03:b0:82a:8865:6fe6 with SMTP id d2e1a72fcca58-82ce8af75f9mr335102b3a.28.1774976917084; Tue, 31 Mar 2026 10:08:37 -0700 (PDT) From: Soumyajyotii Ssarkar To: qemu-devel@nongnu.org Cc: Richard Henderson , Paolo Bonzini , Soumyajyotii Ssarkar , Michael Tokarev , Thomas Lambertz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Alex Golovko , ShengYi Hung , Soumyajyotii Ssarkar Subject: [RFC PATCH 1/5] input/hid: add horizontal pan to pointer event path Date: Tue, 31 Mar 2026 22:38:19 +0530 Message-ID: <20260331170823.72511-2-soumyajyotisarkar23@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> References: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::442; envelope-from=soumyajyotisarkar23@gmail.com; helo=mail-pf1-x442.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774976948382154100 Content-Type: text/plain; charset="utf-8" Add support for horizontal wheel scrolling (pan) in the HID mouse implementation. Extend the HIDPointerEvent structure with "pan" field to track horizontal scroll deltas, similar to the existing 'dz' field for vertical scrolling. Map INPUT_BUTTON_WHEEL_LEFT and INPUT_BUTTON_WHEEL_RIGHT to pan delta changes in the event handler. Integrate pan field handling into event compression logic and queue management to ensure consistent behavior with vertical wheel events. This changes enables subsequent patches to implement multiplier based scaling and protocol aware reporting for horizontal scrolling. Signed-off-by: Soumyajyotii Ssarkar --- hw/input/hid.c | 13 ++++++++++++- include/hw/input/hid.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/hw/input/hid.c b/hw/input/hid.c index de24cd0ef0..457dbb0096 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -152,6 +152,10 @@ static void hid_pointer_event(DeviceState *dev, QemuCo= nsole *src, e->dz--; } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_DOWN) { e->dz++; + } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_LEFT) { + e->pan--; + } else if (btn->button =3D=3D INPUT_BUTTON_WHEEL_RIGHT) { + e->pan++; } } else { e->buttons_state &=3D ~bmap[btn->button]; @@ -208,6 +212,8 @@ static void hid_pointer_sync(DeviceState *dev) } prev->dz +=3D curr->dz; curr->dz =3D 0; + prev->pan +=3D curr->pan; + curr->pan =3D 0; } else { /* prepare next (clear rel, copy abs + btns) */ if (hs->kind =3D=3D HID_MOUSE) { @@ -218,6 +224,7 @@ static void hid_pointer_sync(DeviceState *dev) next->ydy =3D curr->ydy; } next->dz =3D 0; + next->pan =3D 0; next->buttons_state =3D curr->buttons_state; /* make current guest visible, notify guest */ hs->n++; @@ -357,7 +364,7 @@ void hid_pointer_activate(HIDState *hs) int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len) { - int dx, dy, dz, l; + int dx, dy, dz, pan, l; int index; HIDPointerEvent *e; @@ -381,9 +388,13 @@ int hid_pointer_poll(HIDState *hs, uint8_t *buf, int l= en) } dz =3D int_clamp(e->dz, -127, 127); e->dz -=3D dz; + pan =3D int_clamp(e->pan, -127, 127); + e->pan -=3D pan; + if (hs->n && !e->dz && + !e->pan && (hs->kind =3D=3D HID_TABLET || (!e->xdx && !e->ydy))) { /* that deals with this event */ QUEUE_INCR(hs->head); diff --git a/include/hw/input/hid.h b/include/hw/input/hid.h index 6a9d7bf466..1bb1778ee7 100644 --- a/include/hw/input/hid.h +++ b/include/hw/input/hid.h @@ -10,6 +10,7 @@ typedef struct HIDPointerEvent { int32_t xdx, ydy; /* relative iff it's a mouse, otherwise absolute */ int32_t dz, buttons_state; + int32_t pan; } HIDPointerEvent; #define QUEUE_LENGTH 16 /* should be enough for a triple-click */ -- 2.53.0 From nobody Sat Apr 11 20:23:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774976934; cv=none; d=zohomail.com; s=zohoarc; b=hiTLjxt7uhw1nvs3NNhaKXLTogBaT6/0BJWYd/p8oLG5IeIsUMowAJdAFyopefW8nFHcuKXQVkDPHODfddZwiwoY5aTRtq/sL0MVjt2qdG4WwDYaGBw//zgSFuGDIgQP01Ln3SfJGCbF/Mrm0h6iI0FHBQHxuSarc23IE0x2hs4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774976934; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qK+TYXGeyXHMsmqfAHL+L670U9yf6uTftVNC0MvGN18=; b=HrLmaNbBjmQsth02rfwoOXfolR9s3NV073D8fmItb1XFk56EAqKHU84dWsoSvDnLzshDp6Uv80jmZQJI3Uie18yuKYNMryDJfoYMf/NoTMgLGZjrArTU1s416jDWIaYvKA5OqihotsdvFpY0bquBQGgF3hXVJLlYO9Vu5Mmrsxw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17749769342343.408528100314925; Tue, 31 Mar 2026 10:08:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7ca6-0003ce-UN; Tue, 31 Mar 2026 13:08:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7ca6-0003c2-7x for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:46 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7ca4-0003Bp-8S for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:46 -0400 Received: by mail-pf1-x443.google.com with SMTP id d2e1a72fcca58-8296dabef74so5683895b3a.1 for ; Tue, 31 Mar 2026 10:08:43 -0700 (PDT) Received: from fedora ([103.2.232.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82ca843b818sm13647889b3a.6.2026.03.31.10.08.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 10:08:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774976922; x=1775581722; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qK+TYXGeyXHMsmqfAHL+L670U9yf6uTftVNC0MvGN18=; b=U0afqVX533VURfpQkX6fUqKQA0AeAT7OdlFJFeels4z6dYYkQpMM2i6wiJCfsT8w/L NTGcyHy10wa0oaaMpdHPYtWsB+5UtfGUpqUkrWb4R9a4hJqWDHNBncFXXJDKxf0ZR7bj if/qbAQd9LOWzVL0Dj6+AoPoFnuUwM6wr7nl+yQl+IJ7N21DPyMgmiQsbv0/r8DZACnF lh7m/5kajZnLI24o1FcpvZRqS3t3I/UYCPGISSTv8rg8LDkpswnX+m9wS/Xbw/hDXG1F uGD7kfpHRGpfX1FUDApQ5avgjbBROqySn1bxlGj6BvKU2Dnx166jDzNVGyyLIxvQC1NP 6+BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774976922; x=1775581722; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qK+TYXGeyXHMsmqfAHL+L670U9yf6uTftVNC0MvGN18=; b=phOtZD+8RxKtXW7YPn7FON82btTAZtcM5CEOvbk3J7fxYuuCfQ+vyxcDtANNtZUIKr x1g872wBQpmYbICavKsXWtW34qKnHz8F5XC+JS1OYGryKpqOBteoqOlw5uXkvThIn3Jf t+0pMIU8Zfo2B8it8AXPUxtKZQiiBOcSxUEi32S6/rcaJsoqaDEHh53loa2RycXfV9Cq eLSrELm7u2swkutnD+OSBmp29U9bVDZmGfjPKUftLqFInTpdw5AYwx87Qx/+nfK2P7Oz Q7zuH8HFGgMzbItKIKUG1o8YA8QqM04sdU/lXTCb5bft73K9YUpasdMME/gpSGLei7ac YqPA== X-Gm-Message-State: AOJu0YyA7yYOcJibXkSOMsSXHgXgJOdoU/lx643jPx34+DLgzm6SlqvV W9ro+AXWRkh6LuDbfzu10JHqCeXnJZTwmZu9IOYfA+sjM1T76WFJj+MJbaftG78M X-Gm-Gg: ATEYQzzcF9z2SPrPIDRVWenGhmrsCjkAqqw0ffIlwZlfzXZphbWL5/0xvpiuLA/RsTj 6WWCQXUC7s4JmoIOohv1ICTV3o9yY8wxZutyqKMViG4/+RkgELewoKDFbIGt/eNmM0tI7wcHkm/ VCKdl0afMe/JL6ZU/y6y683UKLVlTNzVCxO+Ey4lRUAOl7sWp/iGQrPb5KwKyjRCZ7WJ9PZdOj5 Dtta05AhnKHJi9zKlqfqGwAyGzkNC679IUhCEwyc8nMmI2LMmhkVE6fp2N0EVZ6kntptyc76G15 mxRFSEsnf9EAssYq/PkXxZGKCECHfUnGnSfJU4KRztFvFGn5ywN2HKchmC+AiqZDZtfwQfAA0xd iEclG6ke874oqU/C6HqjsgLhYko6FhC6spUQCvQugdSWS/lVdtBxwRuOx2fTA5tW71YipzSw/Np bXE/qur5/VM431DRZw3rNu6TjBsAeNzAsx0UoC9Nn8zKlNMCbaYyrmSSgcePeyDmOSHsgGDII1c pKndeeSHJktOW1iofSV9Bj2x3YOwZlqrkg5jg2hUXhybLpHZh6zXUNbNv9dMOlSE+jAYIM11A== X-Received: by 2002:a05:6a00:a228:b0:82a:17b6:53ca with SMTP id d2e1a72fcca58-82ce8ad21c2mr376006b3a.38.1774976922035; Tue, 31 Mar 2026 10:08:42 -0700 (PDT) From: Soumyajyotii Ssarkar To: qemu-devel@nongnu.org Cc: Richard Henderson , Paolo Bonzini , Soumyajyotii Ssarkar , Michael Tokarev , Thomas Lambertz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Alex Golovko , ShengYi Hung , Soumyajyotii Ssarkar Subject: [RFC PATCH 2/5] usb/hid: add enhanced wheel mouse report descriptor and packet size Date: Tue, 31 Mar 2026 22:38:20 +0530 Message-ID: <20260331170823.72511-3-soumyajyotisarkar23@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> References: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::443; envelope-from=soumyajyotisarkar23@gmail.com; helo=mail-pf1-x443.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774976936147154100 Content-Type: text/plain; charset="utf-8" Build on top of the simple mouse HID report descriptor with an enhanced ver= sion that supports report IDs and feature reports for high resolution mouse wheel control. As per the documentation structure. Check: https://download.microsoft.com/download/b/d/1/bd1f7ef4-7d72-419e-bc5= c-9f79ad7bb66e/wheel.docx Changes: - Increase HID descriptor length from 52 to 144 bytes - Add report IDs (0x01 input, 0x02 feature) - Implement feature reports for wheel/pan resolution multipliers - Add AC Pan (horizontal scroll) usage - Increase endpoint packet size from 4 to 6 bytes for pan byte This enables guests to configure resolution multipliers (+-1, +-4, +-8, +-1= 6) to control scroll acceleration and precision. Signed-off-by: Soumyajyotii Ssarkar --- hw/usb/dev-hid.c | 126 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 31 deletions(-) diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c index ae19d60203..49e23c2319 100644 --- a/hw/usb/dev-hid.c +++ b/hw/usb/dev-hid.c @@ -93,7 +93,7 @@ static const USBDescIface desc_iface_mouse =3D { 0x00, /* u8 country_code */ 0x01, /* u8 num_descriptors */ USB_DT_REPORT, /* u8 type: Report */ - 52, 0, /* u16 len */ + 144, 0, /* u16 len */ }, }, }, @@ -101,7 +101,7 @@ static const USBDescIface desc_iface_mouse =3D { { .bEndpointAddress =3D USB_DIR_IN | 0x01, .bmAttributes =3D USB_ENDPOINT_XFER_INT, - .wMaxPacketSize =3D 4, + .wMaxPacketSize =3D 6, .bInterval =3D 0x0a, }, }, @@ -124,7 +124,7 @@ static const USBDescIface desc_iface_mouse2 =3D { 0x00, /* u8 country_code */ 0x01, /* u8 num_descriptors */ USB_DT_REPORT, /* u8 type: Report */ - 52, 0, /* u16 len */ + 144, 0, /* u16 len */ }, }, }, @@ -132,7 +132,7 @@ static const USBDescIface desc_iface_mouse2 =3D { { .bEndpointAddress =3D USB_DIR_IN | 0x01, .bmAttributes =3D USB_ENDPOINT_XFER_INT, - .wMaxPacketSize =3D 4, + .wMaxPacketSize =3D 6, .bInterval =3D 7, /* 2 ^ (8-1) * 125 usecs =3D 8 m= s */ }, }, @@ -454,33 +454,97 @@ static const USBDesc desc_keyboard2 =3D { }; static const uint8_t qemu_mouse_hid_report_descriptor[] =3D { - 0x05, 0x01, /* Usage Page (Generic Desktop) */ - 0x09, 0x02, /* Usage (Mouse) */ - 0xa1, 0x01, /* Collection (Application) */ - 0x09, 0x01, /* Usage (Pointer) */ - 0xa1, 0x00, /* Collection (Physical) */ - 0x05, 0x09, /* Usage Page (Button) */ - 0x19, 0x01, /* Usage Minimum (1) */ - 0x29, 0x05, /* Usage Maximum (5) */ - 0x15, 0x00, /* Logical Minimum (0) */ - 0x25, 0x01, /* Logical Maximum (1) */ - 0x95, 0x05, /* Report Count (5) */ - 0x75, 0x01, /* Report Size (1) */ - 0x81, 0x02, /* Input (Data, Variable, Absolute) */ - 0x95, 0x01, /* Report Count (1) */ - 0x75, 0x03, /* Report Size (3) */ - 0x81, 0x01, /* Input (Constant) */ - 0x05, 0x01, /* Usage Page (Generic Desktop) */ - 0x09, 0x30, /* Usage (X) */ - 0x09, 0x31, /* Usage (Y) */ - 0x09, 0x38, /* Usage (Wheel) */ - 0x15, 0x81, /* Logical Minimum (-0x7f) */ - 0x25, 0x7f, /* Logical Maximum (0x7f) */ - 0x75, 0x08, /* Report Size (8) */ - 0x95, 0x03, /* Report Count (3) */ - 0x81, 0x06, /* Input (Data, Variable, Relative) */ - 0xc0, /* End Collection */ - 0xc0, /* End Collection */ + 0x05, 0x01, /* Usage Page (Generic Desktop) */ + 0x09, 0x02, /* Usage (Mouse) */ + 0xA1, 0x01, /* Collection (Application) */ + + 0x09, 0x02, /* Usage (Mouse) */ + 0xA1, 0x02, /* Collection (Logical) */ + + 0x85, 0x01, /* Report ID (0x01) */ + 0x09, 0x01, /* Usage (Pointer) */ + 0xA1, 0x00, /* Collection (Physical) */ + + 0x05, 0x09, /* Usage Page (Button) */ + 0x19, 0x01, /* Usage Minimum (1) */ + 0x29, 0x05, /* Usage Maximum (5) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x95, 0x05, /* Report Count (5) */ + 0x75, 0x01, /* Report Size (1) */ + 0x81, 0x02, /* Input (Data,Var,Abs) */ + + 0x95, 0x01, /* Report Count (1) */ + 0x75, 0x03, /* Report Size (3) */ + 0x81, 0x01, /* Input (Const) */ + + 0x05, 0x01, /* Usage Page (Generic Desktop) */ + 0x09, 0x30, /* Usage (X) */ + 0x09, 0x31, /* Usage (Y) */ + 0x95, 0x02, /* Report Count (2) */ + 0x75, 0x08, /* Report Size (8) */ + 0x15, 0x81, /* Logical Minimum (-127) */ + 0x25, 0x7F, /* Logical Maximum (127) */ + 0x81, 0x06, /* Input (Data,Var,Rel) */ + + /* Vertical wheel logical collection */ + 0xA1, 0x02, /* Collection (Logical) */ + + 0x85, 0x02, /* Report ID (0x02) */ + 0x09, 0x48, /* Usage (Resolution Multiplier) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x35, 0x01, /* Physical Minimum (1) */ + 0x45, 0x04, /* Physical Maximum (4) */ + 0x75, 0x02, /* Report Size (2) */ + 0x95, 0x01, /* Report Count (1) */ + 0xB1, 0x02, /* Feature (Data,Var,Abs) */ + + 0x85, 0x01, /* Report ID (0x01) */ + 0x09, 0x38, /* Usage (Wheel) */ + 0x35, 0x00, /* Physical Minimum (0) */ + 0x45, 0x00, /* Physical Maximum (0) */ + 0x15, 0x81, /* Logical Minimum (-0x7f) */ + 0x25, 0x7F, /* Logical Maximum (0x7f) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x01, /* Report Count (1) */ + 0x81, 0x06, /* Input (Data,Var,Rel) */ + + 0xC0, /* End Collection */ + + /* Horizontal wheel logical collection */ + 0xA1, 0x02, /* Collection (Logical) */ + + 0x85, 0x02, /* Report ID (0x02) */ + 0x09, 0x48, /* Usage (Resolution Multiplier) */ + 0x15, 0x00, /* Logical Minimum (0) */ + 0x25, 0x01, /* Logical Maximum (1) */ + 0x35, 0x01, /* Physical Minimum (1) */ + 0x45, 0x04, /* Physical Maximum (4) */ + 0x75, 0x02, /* Report Size (2) */ + 0x95, 0x01, /* Report Count (1) */ + 0xB1, 0x02, /* Feature (Data,Var,Abs) */ + + 0x35, 0x00, /* Physical Minimum (0) */ + 0x45, 0x00, /* Physical Maximum (0) */ + 0x75, 0x04, /* Report Size (4) */ + 0x95, 0x01, /* Report Count (1) */ + 0xB1, 0x01, /* Feature (Const) */ + + 0x85, 0x01, /* Report ID (0x01) */ + 0x05, 0x0C, /* Usage Page (Consumer Devices) */ + 0x0A, 0x38, 0x02, /* Usage (AC Pan) */ + 0x15, 0x81, /* Logical Minimum (-0x7f) */ + 0x25, 0x7F, /* Logical Maximum (0x7f) */ + 0x75, 0x08, /* Report Size (8) */ + 0x95, 0x01, /* Report Count (1) */ + 0x81, 0x06, /* Input (Data,Var,Rel) */ + + 0xC0, /* End Collection */ + + 0xC0, /* End Collection (Physical) */ + 0xC0, /* End Collection (Logical) */ + 0xC0 /* End Collection (Application) */ }; static const uint8_t qemu_tablet_hid_report_descriptor[] =3D { -- 2.53.0 From nobody Sat Apr 11 20:23:52 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774976946; cv=none; d=zohomail.com; s=zohoarc; b=aO8mx2lD2srx+UtJxCtsowjnCesoDo+HT8Oa9Wkcpu9bYCw1q5GrqoSMyq9098NhHBY8TwuttqQeIC8YaApjUV0OQ0H883f3lEmjScJQ1MvA9FT8203FQ39ExkznPavyYhUGtyFt+1xbBqvxpLu/A09L/cRD6IIQ19fY5LfMXyk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774976946; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=J8ahBUFbg7fqe92Gw6f+jugDAsKFBZJ7p8mHe2Ycic4=; b=EhcwGBdW0hnq3joTmvqeTTZf9nIPnY1p7m6zNeGwiFi8i8ARwY/hlOBYU8EcU4/KCCa1hVwqpwZgM6DsCw22l8R1pU9JhqEICkmwjaSsnmjCE1hpOYaOjeW83A+EAhPyjBFFoknv3qyN9uN6RrbDyPJN9GhdhaFuT8WDqdWSykY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774976946961878.9850438085315; Tue, 31 Mar 2026 10:09:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7caG-0003oa-15; Tue, 31 Mar 2026 13:08:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7caA-0003hc-SB for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:53 -0400 Received: from mail-pf1-x441.google.com ([2607:f8b0:4864:20::441]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7ca9-0003CE-DH for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:50 -0400 Received: by mail-pf1-x441.google.com with SMTP id d2e1a72fcca58-82cd5c07f93so603160b3a.1 for ; Tue, 31 Mar 2026 10:08:49 -0700 (PDT) Received: from fedora ([103.2.232.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82ca843b818sm13647889b3a.6.2026.03.31.10.08.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 10:08:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774976927; x=1775581727; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=J8ahBUFbg7fqe92Gw6f+jugDAsKFBZJ7p8mHe2Ycic4=; b=JwsznwfbB8YkzGn8KdqRGUoeu7a/0ApAlZz9CnfNCIPMhujb8OJW4Ue6DGWsUYALow ovHtrZZgmDICbZxp6m45t3uFig8v2dfyJER8s8tvtG0jAKUB0IINlvVXBwF71e7E7xWC 00X+WljHK3I8MBQe4rbpyOojIAKlvZsATy6PlZU2eVI05x9LZyJCA3Fdq8y+OOOIub4J /Q6id811pzQjQ15+mbz6hbM36dMRL1v4Tj9tqJb2GY+rH4J1IgrLZN17Bsk+k9+5RlTx J8THBQeytU4+O2syvOADN+d3VyQavRwRIW1mN173w9KbYnSgDOWxcKReOjBLApEGo3of glRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774976927; x=1775581727; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=J8ahBUFbg7fqe92Gw6f+jugDAsKFBZJ7p8mHe2Ycic4=; b=Sb3/0jZzmm2e3dGkBC2ORFf2uCSd7NMxlq0AWFxmy7Z5nC6VXlAEq21McU+s4rfPk/ x9ThzaCclfvh4qOWy/xdi+5hqWWvpYT/QNCbJaN/tRsC9dZr1C2flWyNN6HR08T1UtwE WBNPlkMlPjd1ySO4Nh30XfhzCbwYlx1Uyf9P7jT6UIbsGq3BVMk3DG3LujIRYO7iYuw7 EK+L70M5x/emtIQy/9FS0UGojZaagqDYoxDdxKpVQQZ/4DiEjUDLfrKKTF7g/qg647hS YcNE8SNF+oj0lbNj8eNmKZZlv9v1nyEJb1GqtAAfy9uryNxGX3JEJIoiT+mmy11ozARZ esdQ== X-Gm-Message-State: AOJu0YxCyJ3OR8Kih6aVvqt9kQCEU+Sevzr/oaaWkWmMsGqZ051wm1VN 6fAYiSswCeoJdyAjS1yF5z7T7WDgaS3qLlaaDA1ZNNBs1judXzihvTifh1Ykd2ai X-Gm-Gg: ATEYQzyLCqzgVewUu6btsWqgeQf/qF4JAkKz3aaYAiil0+M+CqOcViqjm9Bun6WCW0M 6LAY2v6CdQp5KQAVFtplcQ1NRIEYzEf6wUamyc+/Vvgoy9TQBH92efVSOAcyNrv9CzFo8r9VP1E vmJZ1HVqgYMSsPCKZ3/EL579H851//UWPumGpr5bVaaAFe/E6nVHIqNhfSTKWLvmGsuweAo0loW 1VEgFPBGtnbKC4k8rfyH8WCDnxyWTqboUZgFEFis+0KTIkSAvnHYhQmn0QTiKGLOHNlC1P6TEtK +MNow347BIbFU9Spxx9aXwcAaOo9vW+JuCjuwSEVxROfDo+7tyVls1xpWXP5FBsDzx+4jfQ2A4t 9zVSptTrFxaO7GAjIsO9xXm6Bf6/mv01s7jucHXoVL/QVkE19SfDAbslllF35P88kCCk0r5iaQF 2EAVKPuIOHpPE3TZVUOKzISibXYOEALGDzVmAKIbr1E4Re/gKSorKOcEXZjTbK9yxombBoxY+Nh ogMxJzhYTyRcxbgdjwATk9APDIHibDXeq+slmCTXSh0r76PF3pAOU4twe1Rne++P2Tfshwl1gul M5pS/esx X-Received: by 2002:a05:6a00:4fd1:b0:823:3fd0:7a08 with SMTP id d2e1a72fcca58-82ce8b42ef2mr333552b3a.49.1774976927503; Tue, 31 Mar 2026 10:08:47 -0700 (PDT) From: Soumyajyotii Ssarkar To: qemu-devel@nongnu.org Cc: Richard Henderson , Paolo Bonzini , Soumyajyotii Ssarkar , Michael Tokarev , Thomas Lambertz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Alex Golovko , ShengYi Hung , Soumyajyotii Ssarkar Subject: [RFC PATCH 3/5] input/hid: emit protocol aware mouse reports with pan support Date: Tue, 31 Mar 2026 22:38:21 +0530 Message-ID: <20260331170823.72511-4-soumyajyotisarkar23@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> References: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::441; envelope-from=soumyajyotisarkar23@gmail.com; helo=mail-pf1-x441.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774976948945158500 Content-Type: text/plain; charset="utf-8" Implement protocol-aware mouse report output to support both boot protocol (protocol 0) and report protocol (protocol 1). Boot protocol: 4-byte reports (button, dx, dy, dz) Report protocol: 6-byte reports with report ID 0x01 + pan byte Both modes now support the 'pan' field for horizontal scrolling. The distinction ensures correct behavior across different guest operating systems and their HID implementations. Signed-off-by: Soumyajyotii Ssarkar --- hw/input/hid.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/hw/input/hid.c b/hw/input/hid.c index 457dbb0096..d0b7af7c13 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -403,20 +403,42 @@ int hid_pointer_poll(HIDState *hs, uint8_t *buf, int = len) /* Appears we have to invert the wheel direction */ dz =3D 0 - dz; + pan =3D 0 - pan; l =3D 0; switch (hs->kind) { case HID_MOUSE: - if (len > l) { - buf[l++] =3D e->buttons_state; - } - if (len > l) { - buf[l++] =3D dx; - } - if (len > l) { - buf[l++] =3D dy; - } - if (len > l) { - buf[l++] =3D dz; + if (hs->protocol =3D=3D 0) { + if (len > l) { + buf[l++] =3D e->buttons_state; + } + if (len > l) { + buf[l++] =3D dx; + } + if (len > l) { + buf[l++] =3D dy; + } + if (len > l) { + buf[l++] =3D dz; + } + } else { + if (len > l) { + buf[l++] =3D 0x01; + } + if (len > l) { + buf[l++] =3D e->buttons_state; + } + if (len > l) { + buf[l++] =3D dx; + } + if (len > l) { + buf[l++] =3D dy; + } + if (len > l) { + buf[l++] =3D dz; + } + if (len > l) { + buf[l++] =3D pan; + } } break; -- 2.53.0 From nobody Sat Apr 11 20:23:52 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774976966; cv=none; d=zohomail.com; s=zohoarc; b=fwxJ1lqMynVefUe6GfWO9L3Pvo2DrhlMOuEihmvXFIUY7SKJuLXSWraktH4kp0a6I4txlZz2gleyJbCx5OxAKMOiTxadUz3G1Bg/rlD7t/2mjCc4OUmf2WYDftjhfkOjFXe7aHm4s7FmsjcYib96r9cRixjDZbm4k3QX7UwLMUk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774976966; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=W/Vp9csjxDdP8UCdEEf84+/qxz8piPF+LrR8kcVgFz0=; b=B7wEqCG6ln9K8B03enojXTYY36TKXS/dWiC7r7OiMUsQ2n8kDHtBz8lS4sggzLKKVeUXTVN6BzlPa1g6kYz2y0tMCozYF8jQP9P7CpPSniXEwWFI7mrYJXIeIUajh7t/XEeaIywUoULo3HFKtpg8duuD24A7BwsB0R7oTVbk+bc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17749769661940.33107690475287654; Tue, 31 Mar 2026 10:09:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7caK-0003wa-So; Tue, 31 Mar 2026 13:09:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7caG-0003pT-Lj for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:56 -0400 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7caF-0003Cd-6u for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:08:56 -0400 Received: by mail-pf1-x442.google.com with SMTP id d2e1a72fcca58-829a9d08644so3156308b3a.1 for ; Tue, 31 Mar 2026 10:08:53 -0700 (PDT) Received: from fedora ([103.2.232.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82ca843b818sm13647889b3a.6.2026.03.31.10.08.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 10:08:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774976932; x=1775581732; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=W/Vp9csjxDdP8UCdEEf84+/qxz8piPF+LrR8kcVgFz0=; b=tBHGtJrAfydRqCBxljz5f9awSV+vffYEO8epUIv3pQSWh4tlvqPD8BG2CJ9vBYOihv Sp9fxnfh4BH76Jfto9CIOyRDZjq3O2F63UUA1wtU/4aMNUOp9zxECYv78Uvbg/1Wq7jO 6l8dplOSgnyuUcYvthFW3mjgWGATISK7VnT5qfwB68fdd/Yb4fK4iWe0wEko3IM3aQGN Nowcb4/dnm89ToqGlgMHCpGl1nRedsacw7cpvsNqkmUv0MZhaPkpQry46m0/S+p7Y6Jk W1NWrzWvJWEcVvA2nCn9SikpJIdNlFRDLZv8+DQhqoehKRBi7wOb52dg8K2dwzMTKgs4 Yi3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774976932; x=1775581732; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=W/Vp9csjxDdP8UCdEEf84+/qxz8piPF+LrR8kcVgFz0=; b=ZLNr5uqxuVWWuOibMClP0uGtCvCJT12X5IAOwqFLY6jstphPQ1+Uu4PIAR5FNMhJmQ iOOLml+ElWgkys93pMMipTAusNkYLV4+6w915AEcLaO0zuhS48mevuDBUkp+5O/Ti7Rb RVQijk8i1s2eBQnfnUI8EkFMH4nnvcBFzsmIu/KyTAGwLFfO7A7Npm4PW9LhaK+BKFh5 SOYFxGZbjLZ920gj4O8t6WQK5gMKdN/l0kLwMUV459XUPBZVZw3kwH8snB8mO1/KQPrf UfiCn+6z2Rmy/BNDZCKwiQdVeTQ9pZkKublkpobxwtCgC3gEsloP4nsHuL+S3wu5Eoom 49fQ== X-Gm-Message-State: AOJu0YxvwJKI2qrzrpcGqoeiaaXKfqUqPaiGQqN/ieaobtkDHRd5MPqR /CxubIsEQueAdOTurL+USoTrzbxzCBOio3Vm90oQ9WFkFrZpF3D2jIbVBFBG38OF X-Gm-Gg: ATEYQzx50VTOS8ULWpg/Gd191FCD0LsEuXl40yPrmc95DCxnNnxsE5lLsub6nCL5sQL 19uqe2dBVVW0gZzhnMGp0zrbjUOPtfbFUqS3mzDct4CJBr5yWu+6PRjt3H8XaPuw8vBAxGBxRNz 2aXVnLedFgQ7jiUCLBgEePA6F/D0ts2Wv4r6IXQ2Pnhq3tm7edtMNnzX2en0d8inrPta3GktS10 oPoqne7slySWb8tfWvoILaHjePwev7uJ6Tx+kChBeXdxgeH+xylMvF6WRhUNlC81/pM2e20QrX3 xr45vFjjrGKZyWmdLUrzLZcjgNU08h5vP9xfW3WoZIvPZor03QzvxKXYVAbBqueLTg7qpf44de5 WFKW6o2t22nLgmZEffCDlqsWV3IVFPSysOmZHpYOI3KIqTYqXCn1lNUDhKX5iLEFqlVJHxRc0qG VpZxXI0TD8OKIcMYnWZwkfs0RvMDd3F3drS10SOG4R5QzE3PiuPe/q2fs4p8b1nxjFZ+sQv091N 8lC7Ie9iA9QMHepClfAfa+nNwjWqmt0B8s0HwLvRF1QU2PEs4vSdaoEFEA2TOdXdiHUrXurdg== X-Received: by 2002:a05:6a00:a1b:b0:7aa:a2a8:9808 with SMTP id d2e1a72fcca58-82ce893ed22mr420788b3a.20.1774976932503; Tue, 31 Mar 2026 10:08:52 -0700 (PDT) From: Soumyajyotii Ssarkar To: qemu-devel@nongnu.org Cc: Richard Henderson , Paolo Bonzini , Soumyajyotii Ssarkar , Michael Tokarev , Thomas Lambertz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Alex Golovko , ShengYi Hung , Soumyajyotii Ssarkar Subject: [RFC PATCH 4/5] usb/hid: handle mouse feature report for wheel/pan multipliers Date: Tue, 31 Mar 2026 22:38:22 +0530 Message-ID: <20260331170823.72511-5-soumyajyotisarkar23@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> References: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::442; envelope-from=soumyajyotisarkar23@gmail.com; helo=mail-pf1-x442.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774976968589154100 Content-Type: text/plain; charset="utf-8" Implement HID feature report handlers (GET_REPORT/SET_REPORT) for report ID 0x02 to allow guests to configure wheel/pan resolution multipliers. Multiplier encoding: - Bits [1:0]: wheel_multiplier (0=3D+-1, 1=3D+-4, 2=3D+-8, 3=3D+-16) - Bits [3:2]: pan_multiplier (0=3D+-1, 1=3D+-4, 2=3D+-8, 3=3D+-16) Supports flexible payload formats (with/without report ID byte). Allows Windows guests to dynamically adjust scroll sensitivity without driver installation. Signed-off-by: Soumyajyotii Ssarkar --- hw/usb/dev-hid.c | 65 ++++++++++++++++++++++++++++++++++++------ include/hw/input/hid.h | 2 ++ 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/hw/usb/dev-hid.c b/hw/usb/dev-hid.c index 49e23c2319..cdcf2a4a0e 100644 --- a/hw/usb/dev-hid.c +++ b/hw/usb/dev-hid.c @@ -672,17 +672,66 @@ static void usb_hid_handle_control(USBDevice *dev, US= BPacket *p, } break; case HID_GET_REPORT: - if (hs->kind =3D=3D HID_MOUSE || hs->kind =3D=3D HID_TABLET) { - p->actual_length =3D hid_pointer_poll(hs, data, length); - } else if (hs->kind =3D=3D HID_KEYBOARD) { - p->actual_length =3D hid_keyboard_poll(hs, data, length); + { + uint8_t mult; + uint8_t report_type =3D (value >> 8) & 0xFF; + uint8_t report_id =3D value & 0xFF; + + if (report_type =3D=3D 0x03 && report_id =3D=3D 0x02 && + hs->kind =3D=3D HID_MOUSE) { + + if (length < 1) { + goto fail; + } + + mult =3D ((hs->ptr.pan_multiplier & 0x03) << 2) | + (hs->ptr.wheel_multiplier & 0x03); + if (length >=3D 2) { + data[0] =3D 0x02; + data[1] =3D mult; + p->actual_length =3D 2; + } else { + data[0] =3D mult; + p->actual_length =3D 1; + } + + } else if (hs->kind =3D=3D HID_MOUSE || hs->kind =3D=3D HID_TA= BLET) { + p->actual_length =3D hid_pointer_poll(hs, data, length); + } else if (hs->kind =3D=3D HID_KEYBOARD) { + p->actual_length =3D hid_keyboard_poll(hs, data, length); + } else { + goto fail; + } } break; case HID_SET_REPORT: - if (hs->kind =3D=3D HID_KEYBOARD) { - p->actual_length =3D hid_keyboard_write(hs, data, length); - } else { - goto fail; + { + uint8_t mult; + uint8_t report_type =3D (value >> 8) & 0xFF; + uint8_t report_id =3D value & 0xFF; + + if (report_type =3D=3D 0x03 && report_id =3D=3D 0x02 && + hs->kind =3D=3D HID_MOUSE) { + + if (length < 1) { + goto fail; + } + + if (length >=3D 2 && data[0] =3D=3D 0x02) { + mult =3D data[1]; + } else { + mult =3D data[0]; + } + + hs->ptr.wheel_multiplier =3D mult & 0x03; + hs->ptr.pan_multiplier =3D (mult >> 2) & 0x03; + p->actual_length =3D length; + + } else if (hs->kind =3D=3D HID_KEYBOARD) { + p->actual_length =3D hid_keyboard_write(hs, data, length); + } else { + goto fail; + } } break; case HID_GET_PROTOCOL: diff --git a/include/hw/input/hid.h b/include/hw/input/hid.h index 1bb1778ee7..1a1941d371 100644 --- a/include/hw/input/hid.h +++ b/include/hw/input/hid.h @@ -23,6 +23,8 @@ typedef void (*HIDEventFunc)(HIDState *s); typedef struct HIDMouseState { HIDPointerEvent queue[QUEUE_LENGTH]; int mouse_grabbed; + uint8_t wheel_multiplier; + uint8_t pan_multiplier; } HIDMouseState; typedef struct HIDKeyboardState { -- 2.53.0 From nobody Sat Apr 11 20:23:52 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1774976964; cv=none; d=zohomail.com; s=zohoarc; b=EFS7IjSAA+gF5ym150ZYhN7Mgx6klAk7rbfwz7jlGm7dETNt8ySuHeoL6HNHrF6Exm4DQjMLd68WoaVjkh+f0D8T63f07NgNreCxxHITAP06Vv8EJaj+esGRoQQry5nAGD6lCVsl/Z+YygpgRL4k+jmpgTR5wudk8I+jp4RVa5Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774976964; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=r6LmsEgjBpvDaeps0oORvh1u7wQKk8Q2dxRBNItGx1w=; b=lMgL6iR5vOwQ6utqORsqhN/R0MB/JI6zTXTMZ17GtRfObP0GanjspstIP3FRcHlMw6WIYSf9CLw1+A8yfqUwHLJcqzzrF3tbbSqkUMahB50D34pXMs6RVA81WSAHinTLiGZJloxsjXd75iWFT29Zrej6tO+c8ENuYmgO/OV6jWk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1774976964219428.37933686195856; Tue, 31 Mar 2026 10:09:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w7caN-0004EK-Rc; Tue, 31 Mar 2026 13:09:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w7caL-00041X-0Q for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:09:01 -0400 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1w7caJ-0003Cw-7v for qemu-devel@nongnu.org; Tue, 31 Mar 2026 13:09:00 -0400 Received: by mail-pf1-x444.google.com with SMTP id d2e1a72fcca58-82cd5c07f93so603224b3a.1 for ; Tue, 31 Mar 2026 10:08:58 -0700 (PDT) Received: from fedora ([103.2.232.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82ca843b818sm13647889b3a.6.2026.03.31.10.08.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 10:08:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774976937; x=1775581737; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r6LmsEgjBpvDaeps0oORvh1u7wQKk8Q2dxRBNItGx1w=; b=lB9+2sk7LMfrC1aNV+yH3ljBXh2kiENduHNH1eAEV+ZukviyPwjWrClGXM2gqluTEZ 6fTu3lvA9+yZA9NABSTzamhSzNjuHNVzu1YIkasY2/BPxIcWS0uvPvwmL4XK6fn97gac +U+WOVkSNFxHYmnEjp3XMg5LW8PefIiDAOz4vY7wMNORCLxdOLnPt7dix7vJJkDyIWPC W+kuoRZMeFVvCQJWGyIcdxqLDxZzIgAN+gb3/3X4d26i3STK+c5sFSsGxHRvEgyJKQtI 8f3LTg16cbNTzcXodlRLEdLs4RHWraLOPBSU4Ez42u5U5wI7KCRDNVEaNSpNAQ2H7JMB yAfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774976937; x=1775581737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=r6LmsEgjBpvDaeps0oORvh1u7wQKk8Q2dxRBNItGx1w=; b=aMDBeB65CIXFu/ClWhQGjqRT6mzFCRFwEmO6WnG/2f9a8jZAIlDB0cb4UwEcoSiSwM 6SzhFhOW7VAAOw3L+T5QDI883jBHtrZ8nrvsg+YaEEUX1boTYsczK5y3z2ONkxAc2Oxz rrDAlyZgNqAZscjw1NJ63pW+unPcsHnfY6gl6SvnmLBdP8tvmTrmxJXFOBcvbP5HfByA jXvk8dyyewb+Ws70hksIa460fXPTPxv4EW3tgfTmenTiQs5Oq87sPfjUXnbkhqTssrnq 3w6SQT/T/eL00+1192OR5bePRvKH3nmoafDlmyVRVChXD+75GHwj1lsgo06Tn6QLp6UK iQeA== X-Gm-Message-State: AOJu0YypnOU3Z3zD8og79jKwst2Lo5LIL8+l7z8NsTdOZqs/Uz/F1B9M eDBbl9u8j8QKkPQfD3p7WkLJn0I1sgo7EUn5zvGG5sbqp0ZiAVC2emxSCxB/DTeR X-Gm-Gg: ATEYQzyMJZtpWZ/pY5AuQrgNNKaiXIEAdVu5aAhCwL9/f8xGD7fbbI7XuqEgKO+PPss o5skH/aEzagiL+1lKql5MYlzZU2TMlI3ipQSXMJVOhYpFzV095FVdVs2dVzK1RoUagesj5ruUpa hyagq8eSX2Xp17u5u8EU9K2/ga6kWN5ujurqse5a6sr3VjUKCz5czY+fHtZ3kGchUgkKn23e0mJ Jzzv8pct2Hgs0GoO3xcIa1am8YIuwqzFxEOkcBXBpJ5LhpZ7FE0+0V9wsRV4bCe7uWnoSpdnvtQ r4YxJ4zlLtWnIEWpYxj4MuTy6wdN2PP8tPIYyUivna9KDffMopfss9HWcmklPP/vRcXrhiYHJah R+YvAwWl6427TgQYvNo+MX3mPRhUr78qw1Dc/JsjfaAMHlADXbPBzI45gAtGiVBT7VAyk7isMqp n0lFkehP/ZKWsmbQTNCQGiyZYXrmLv4wZzMHDM73DtCwMxZggpmf5x7oOWhNZp+hAORgjXDV//2 t8YQk+Vxh4So38SZ9S9mwd5whiDardVj0CH0WFT5lfz6WCIhroi5JwizwtrBg93DWsLFBzDoo28 X5L5Vv1+ X-Received: by 2002:a05:6a00:4505:b0:82c:7f08:8826 with SMTP id d2e1a72fcca58-82ce892c23emr342082b3a.17.1774976937342; Tue, 31 Mar 2026 10:08:57 -0700 (PDT) From: Soumyajyotii Ssarkar To: qemu-devel@nongnu.org Cc: Richard Henderson , Paolo Bonzini , Soumyajyotii Ssarkar , Michael Tokarev , Thomas Lambertz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Alex Golovko , ShengYi Hung , Soumyajyotii Ssarkar Subject: [RFC PATCH 5/5] input/hid: apply multiplier scaling with residual accumulation Date: Tue, 31 Mar 2026 22:38:23 +0530 Message-ID: <20260331170823.72511-6-soumyajyotisarkar23@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> References: <20260331170823.72511-1-soumyajyotisarkar23@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::444; envelope-from=soumyajyotisarkar23@gmail.com; helo=mail-pf1-x444.google.com X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1774976965058158500 Content-Type: text/plain; charset="utf-8" Implement multiplier-based scaling with residual accumulation for fine-grained mouse wheel and pan sensitivity control in report mode. Applies divisor based scaling (1, 4, 8, 16) based on negotiated multiplier values. Then uses residual based approach to prevent precision loss: residual +=3D delta output =3D residual / divisor residual -=3D output * divisor Residual state preserved across VM migrations via VMState. Signed-off-by: Soumyajyotii Ssarkar --- hw/input/hid.c | 60 ++++++++++++++++++++++++++++++++++++++++++ include/hw/input/hid.h | 2 ++ 2 files changed, 62 insertions(+) diff --git a/hw/input/hid.c b/hw/input/hid.c index d0b7af7c13..9b800faeb0 100644 --- a/hw/input/hid.c +++ b/hw/input/hid.c @@ -365,6 +365,7 @@ void hid_pointer_activate(HIDState *hs) int hid_pointer_poll(HIDState *hs, uint8_t *buf, int len) { int dx, dy, dz, pan, l; + int wheel_divisor, pan_divisor; int index; HIDPointerEvent *e; @@ -392,6 +393,54 @@ int hid_pointer_poll(HIDState *hs, uint8_t *buf, int l= en) e->pan -=3D pan; + if (hs->kind =3D=3D HID_MOUSE && hs->protocol !=3D 0) { + switch (hs->ptr.wheel_multiplier & 0x03) { + case 0: + wheel_divisor =3D 1; + break; + case 1: + wheel_divisor =3D 4; + break; + case 2: + wheel_divisor =3D 8; + break; + default: + wheel_divisor =3D 16; + break; + } + + switch (hs->ptr.pan_multiplier & 0x03) { + case 0: + pan_divisor =3D 1; + break; + case 1: + pan_divisor =3D 4; + break; + case 2: + pan_divisor =3D 8; + break; + default: + pan_divisor =3D 16; + break; + } + + if (wheel_divisor > 1) { + hs->ptr.wheel_residual +=3D dz; + dz =3D hs->ptr.wheel_residual / wheel_divisor; + hs->ptr.wheel_residual -=3D dz * wheel_divisor; + } else { + hs->ptr.wheel_residual =3D 0; + } + + if (pan_divisor > 1) { + hs->ptr.pan_residual +=3D pan; + pan =3D hs->ptr.pan_residual / pan_divisor; + hs->ptr.pan_residual -=3D pan * pan_divisor; + } else { + hs->ptr.pan_residual =3D 0; + } + } + if (hs->n && !e->dz && !e->pan && @@ -405,6 +454,7 @@ int hid_pointer_poll(HIDState *hs, uint8_t *buf, int le= n) dz =3D 0 - dz; pan =3D 0 - pan; l =3D 0; + switch (hs->kind) { case HID_MOUSE: if (hs->protocol =3D=3D 0) { @@ -528,6 +578,11 @@ void hid_reset(HIDState *hs) case HID_MOUSE: case HID_TABLET: memset(hs->ptr.queue, 0, sizeof(hs->ptr.queue)); + hs->ptr.mouse_grabbed =3D 0; + hs->ptr.wheel_multiplier =3D 0; + hs->ptr.pan_multiplier =3D 0; + hs->ptr.wheel_residual =3D 0; + hs->ptr.pan_residual =3D 0; break; } hs->head =3D 0; @@ -619,6 +674,7 @@ static const VMStateDescription vmstate_hid_ptr_queue = =3D { VMSTATE_INT32(xdx, HIDPointerEvent), VMSTATE_INT32(ydy, HIDPointerEvent), VMSTATE_INT32(dz, HIDPointerEvent), + VMSTATE_INT32(pan, HIDPointerEvent), VMSTATE_INT32(buttons_state, HIDPointerEvent), VMSTATE_END_OF_LIST() } @@ -636,6 +692,10 @@ const VMStateDescription vmstate_hid_ptr_device =3D { VMSTATE_UINT32(n, HIDState), VMSTATE_INT32(protocol, HIDState), VMSTATE_UINT8(idle, HIDState), + VMSTATE_UINT8(ptr.wheel_multiplier, HIDState), + VMSTATE_UINT8(ptr.pan_multiplier, HIDState), + VMSTATE_INT32(ptr.wheel_residual, HIDState), + VMSTATE_INT32(ptr.pan_residual, HIDState), VMSTATE_END_OF_LIST(), } }; diff --git a/include/hw/input/hid.h b/include/hw/input/hid.h index 1a1941d371..db902fa023 100644 --- a/include/hw/input/hid.h +++ b/include/hw/input/hid.h @@ -25,6 +25,8 @@ typedef struct HIDMouseState { int mouse_grabbed; uint8_t wheel_multiplier; uint8_t pan_multiplier; + int32_t wheel_residual; + int32_t pan_residual; } HIDMouseState; typedef struct HIDKeyboardState { -- 2.53.0