Page MenuHomeFreeBSD

D47640.id146613.diff
No OneTemporary

D47640.id146613.diff

diff --git a/sys/dev/hid/hms.c b/sys/dev/hid/hms.c
--- a/sys/dev/hid/hms.c
+++ b/sys/dev/hid/hms.c
@@ -122,6 +122,7 @@
hid_size_t isize;
uint32_t drift_cnt;
uint32_t drift_thresh;
+ struct hid_location wheel_loc;
#endif
};
@@ -131,6 +132,7 @@
{
struct hidmap *hm = context;
struct hms_softc *sc = device_get_softc(hm->dev);
+ int32_t wheel;
if (len > sc->isize)
len = sc->isize;
@@ -140,8 +142,18 @@
* to return last report data in sampling mode even after touch has
* been ended. That results in cursor drift. Filter out such a
* reports through comparing with previous one.
+ *
+ * Except this results in dropping consecutive mouse wheel events,
+ * because differently from cursor movement they always move by the
+ * same amount. So, don't do it when there's mouse wheel movement.
*/
- if (len == sc->last_irsize && memcmp(buf, sc->last_ir, len) == 0) {
+ if (sc->wheel_loc.pos != 0)
+ wheel = hid_get_data(buf, len, &sc->wheel_loc);
+ else
+ wheel = 0;
+
+ if (len == sc->last_irsize && memcmp(buf, sc->last_ir, len) == 0 &&
+ wheel == 0) {
sc->drift_cnt++;
if (sc->drift_thresh != 0 && sc->drift_cnt >= sc->drift_thresh)
return;
@@ -285,9 +297,19 @@
/* Count number of input usages of variable type mapped to buttons */
for (hi = sc->hm.hid_items;
hi < sc->hm.hid_items + sc->hm.nhid_items;
- hi++)
+ hi++) {
if (hi->type == HIDMAP_TYPE_VARIABLE && hi->evtype == EV_KEY)
nbuttons++;
+#ifdef IICHID_SAMPLING
+ /*
+ * Make note of which part of the report descriptor is the wheel.
+ */
+ if (hi->type == HIDMAP_TYPE_VARIABLE &&
+ hi->evtype == EV_REL && hi->code == REL_HWHEEL)
+ sc->wheel_loc = hi->loc;
+#endif
+ }
+
/* announce information about the mouse */
device_printf(dev, "%d buttons and [%s%s%s%s%s] coordinates ID=%u\n",

File Metadata

Mime Type
text/plain
Expires
Fri, Jul 24, 2:53 AM (11 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35426611
Default Alt Text
D47640.id146613.diff (1 KB)

Event Timeline