[PATCH 6/6] hidclass.sys: Set BitField item to current value.
Rémi Bernon
rbernon at codeweavers.com
Thu Jun 17 03:20:21 CDT 2021
As documented on MSDN, and as testing shows.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/hidclass.sys/descriptor.c | 8 +++++---
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 4 ++--
include/wine/hid.h | 4 ++++
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/dlls/hidclass.sys/descriptor.c b/dlls/hidclass.sys/descriptor.c
index 19f12d77ded..86b68863308 100644
--- a/dlls/hidclass.sys/descriptor.c
+++ b/dlls/hidclass.sys/descriptor.c
@@ -147,7 +147,10 @@ static void copy_hidp_value_caps( HIDP_VALUE_CAPS *out, const struct hid_value_c
out->LinkCollection = in->link_collection;
out->LinkUsagePage = in->link_usage_page;
out->LinkUsage = in->link_usage;
+ out->BitField = in->bit_field;
out->IsAlias = FALSE;
+ out->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( in );
+ out->HasNull = HID_VALUE_CAPS_HAS_NULL( in );
out->BitSize = in->bit_size;
out->ReportCount = in->report_count;
out->UnitsExp = in->units_exp;
@@ -501,6 +504,8 @@ static int parse_descriptor( BYTE *descriptor, unsigned int index, unsigned int
}
i += size;
+ state->items.bit_field = value;
+
#define SHORT_ITEM(tag,type) (((tag)<<4)|((type)<<2))
switch (item & SHORT_ITEM(0xf,0x3))
{
@@ -660,9 +665,6 @@ static void build_elements(WINE_HID_REPORT *wine_report, WINE_HID_ELEMENT *elems
wine_report->bitSize += wine_element->bitCount;
wine_element->caps = feature->caps;
- wine_element->caps.BitField = feature->BitField;
- wine_element->caps.IsAbsolute = feature->IsAbsolute;
- wine_element->caps.HasNull = feature->HasNull;
if (wine_element->caps.IsRange)
{
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index ff1db96a06a..5453af8ff1c 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -1892,7 +1892,7 @@ static void test_hidp(HANDLE file, int report_id)
check_member(button_caps[i], expect_button_caps[i], "%04x", UsagePage);
check_member(button_caps[i], expect_button_caps[i], "%d", ReportID);
check_member(button_caps[i], expect_button_caps[i], "%d", IsAlias);
- todo_wine
+ todo_wine_if(i == 1 || i == 2)
check_member(button_caps[i], expect_button_caps[i], "%d", BitField);
todo_wine_if(i >= 2)
check_member(button_caps[i], expect_button_caps[i], "%d", LinkCollection);
@@ -1994,7 +1994,7 @@ static void test_hidp(HANDLE file, int report_id)
check_member(value_caps[i], expect_value_caps[i], "%04x", UsagePage);
check_member(value_caps[i], expect_value_caps[i], "%d", ReportID);
check_member(value_caps[i], expect_value_caps[i], "%d", IsAlias);
- todo_wine
+ todo_wine_if(i == 2)
check_member(value_caps[i], expect_value_caps[i], "%d", BitField);
check_member(value_caps[i], expect_value_caps[i], "%d", LinkCollection);
check_member(value_caps[i], expect_value_caps[i], "%04x", LinkUsage);
diff --git a/include/wine/hid.h b/include/wine/hid.h
index 47aeda5575c..185015a52d9 100644
--- a/include/wine/hid.h
+++ b/include/wine/hid.h
@@ -84,6 +84,7 @@ struct hid_value_caps
USHORT link_collection;
USAGE link_usage_page;
USAGE link_usage;
+ USHORT bit_field;
USHORT bit_size;
USHORT report_count;
LONG logical_min;
@@ -94,6 +95,9 @@ struct hid_value_caps
ULONG units_exp;
};
+#define HID_VALUE_CAPS_IS_ABSOLUTE(x) (((x)->bit_field & 0x04) == 0)
+#define HID_VALUE_CAPS_HAS_NULL(x) (((x)->bit_field & 0x40) != 0)
+
typedef struct __WINE_HID_REPORT
{
UCHAR reportID;
--
2.31.0
More information about the wine-devel
mailing list