Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/hid/hidp.c | 31 ++++++++++++++++++++----------- dlls/hidparse.sys/main.c | 34 +++++++++++++++++----------------- include/wine/hid.h | 8 +++++--- 3 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c index a94e7b637ae..547f935f850 100644 --- a/dlls/hid/hidp.c +++ b/dlls/hid/hidp.c @@ -95,16 +95,17 @@ static NTSTATUS enum_value_caps( struct hid_preparsed_data *preparsed, HIDP_REPO enum_value_caps_callback callback, void *user, USHORT *count ) { const struct hid_value_caps *caps, *caps_end; - NTSTATUS status; - BOOL incompatible = FALSE; + BOOL is_range, incompatible = FALSE; LONG remaining = *count; + NTSTATUS status;
for (status = get_value_caps_range( preparsed, report_type, report_len, &caps, &caps_end ); status == HIDP_STATUS_SUCCESS && caps != caps_end; caps++) { + is_range = caps->flags & HID_VALUE_CAPS_IS_RANGE; if (!match_value_caps( caps, filter )) continue; if (filter->report_id && caps->report_id != filter->report_id) incompatible = TRUE; - else if (filter->array && (caps->is_range || caps->report_count <= 1)) return HIDP_STATUS_NOT_VALUE_ARRAY; + else if (filter->array && (is_range || caps->report_count <= 1)) return HIDP_STATUS_NOT_VALUE_ARRAY; else if (remaining-- > 0) status = callback( caps, user ); }
@@ -634,7 +635,8 @@ static NTSTATUS get_button_caps( const struct hid_value_caps *caps, void *user ) dst->BitField = caps->bit_field; dst->IsAlias = FALSE; dst->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( caps ); - if (!(dst->IsRange = caps->is_range)) + dst->IsRange = (caps->flags & HID_VALUE_CAPS_IS_RANGE) ? 1 : 0; + if (!dst->IsRange) { dst->NotRange.Usage = caps->usage_min; dst->NotRange.DataIndex = caps->data_index_min; @@ -646,14 +648,16 @@ static NTSTATUS get_button_caps( const struct hid_value_caps *caps, void *user ) dst->Range.DataIndexMin = caps->data_index_min; dst->Range.DataIndexMax = caps->data_index_max; } - if (!(dst->IsStringRange = caps->is_string_range)) + dst->IsStringRange = (caps->flags & HID_VALUE_CAPS_IS_STRING_RANGE) ? 1 : 0; + if (!dst->IsStringRange) dst->NotRange.StringIndex = caps->string_min; else { dst->Range.StringMin = caps->string_min; dst->Range.StringMax = caps->string_max; } - if ((dst->IsDesignatorRange = caps->is_designator_range)) + dst->IsDesignatorRange = (caps->flags & HID_VALUE_CAPS_IS_DESIGNATOR_RANGE) ? 1 : 0; + if (!dst->IsDesignatorRange) dst->NotRange.DesignatorIndex = caps->designator_min; else { @@ -690,33 +694,37 @@ static NTSTATUS get_value_caps( const struct hid_value_caps *caps, void *user ) dst->IsAbsolute = HID_VALUE_CAPS_IS_ABSOLUTE( caps ); dst->HasNull = HID_VALUE_CAPS_HAS_NULL( caps ); dst->BitSize = caps->bit_size; - dst->ReportCount = caps->is_range ? 1 : caps->report_count; dst->UnitsExp = caps->units_exp; dst->Units = caps->units; dst->LogicalMin = caps->logical_min; dst->LogicalMax = caps->logical_max; dst->PhysicalMin = caps->physical_min; dst->PhysicalMax = caps->physical_max; - if (!(dst->IsRange = caps->is_range)) + dst->IsRange = (caps->flags & HID_VALUE_CAPS_IS_RANGE) ? 1 : 0; + if (!dst->IsRange) { + dst->ReportCount = caps->report_count; dst->NotRange.Usage = caps->usage_min; dst->NotRange.DataIndex = caps->data_index_min; } else { + dst->ReportCount = 1; dst->Range.UsageMin = caps->usage_min; dst->Range.UsageMax = caps->usage_max; dst->Range.DataIndexMin = caps->data_index_min; dst->Range.DataIndexMax = caps->data_index_max; } - if (!(dst->IsStringRange = caps->is_string_range)) + dst->IsStringRange = (caps->flags & HID_VALUE_CAPS_IS_STRING_RANGE) ? 1 : 0; + if (!dst->IsStringRange) dst->NotRange.StringIndex = caps->string_min; else { dst->Range.StringMin = caps->string_min; dst->Range.StringMax = caps->string_max; } - if ((dst->IsDesignatorRange = caps->is_designator_range)) + dst->IsDesignatorRange = (caps->flags & HID_VALUE_CAPS_IS_DESIGNATOR_RANGE) ? 1 : 0; + if (!dst->IsDesignatorRange) dst->NotRange.DesignatorIndex = caps->designator_min; else { @@ -810,7 +818,8 @@ NTSTATUS WINAPI HidP_GetUsagesEx( HIDP_REPORT_TYPE report_type, USHORT collectio
static NTSTATUS count_data( const struct hid_value_caps *caps, void *user ) { - if (caps->is_range || HID_VALUE_CAPS_IS_BUTTON( caps )) *(ULONG *)user += caps->report_count; + BOOL is_range = caps->flags & HID_VALUE_CAPS_IS_RANGE; + if (is_range || HID_VALUE_CAPS_IS_BUTTON( caps )) *(ULONG *)user += caps->report_count; else *(ULONG *)user += 1; return HIDP_STATUS_SUCCESS; } diff --git a/dlls/hidparse.sys/main.c b/dlls/hidparse.sys/main.c index b7326f9fe4a..73b9858f741 100644 --- a/dlls/hidparse.sys/main.c +++ b/dlls/hidparse.sys/main.c @@ -102,11 +102,11 @@ enum static inline const char *debugstr_hid_value_caps( struct hid_value_caps *caps ) { if (!caps) return "(null)"; - return wine_dbg_sprintf( "RId %d, Usg %02x:%02x-%02x Dat %02x-%02x (%d), Str %d-%d (%d), Des %d-%d (%d), " - "Bits %02x, LCol %d LUsg %02x:%02x, BitSz %d, RCnt %d, Unit %x E%+d, Log %+d-%+d, Phy %+d-%+d", - caps->report_id, caps->usage_page, caps->usage_min, caps->usage_max, caps->data_index_min, caps->data_index_max, caps->is_range, - caps->string_min, caps->string_max, caps->is_string_range, caps->designator_min, caps->designator_max, caps->is_designator_range, - caps->bit_field, caps->link_collection, caps->link_usage_page, caps->link_usage, caps->bit_size, caps->report_count, + return wine_dbg_sprintf( "RId %d, Usg %02x:%02x-%02x Dat %02x-%02x, Str %d-%d, Des %d-%d, " + "Bits %02x Flags %#x, LCol %d LUsg %02x:%02x, BitSz %d, RCnt %d, Unit %x E%+d, Log %+d-%+d, Phy %+d-%+d", + caps->report_id, caps->usage_page, caps->usage_min, caps->usage_max, caps->data_index_min, caps->data_index_max, + caps->string_min, caps->string_max, caps->designator_min, caps->designator_max, caps->bit_field, caps->flags, + caps->link_collection, caps->link_usage_page, caps->link_usage, caps->bit_size, caps->report_count, caps->units, caps->units_exp, caps->logical_min, caps->logical_max, caps->physical_min, caps->physical_max ); }
@@ -243,13 +243,13 @@ static BOOL parse_global_pop( struct hid_parser_state *state ) static BOOL parse_local_usage( struct hid_parser_state *state, USAGE usage_page, USAGE usage ) { if (!usage_page) usage_page = state->items.usage_page; - if (state->items.is_range) state->usages_size = 0; + if (state->items.flags & HID_VALUE_CAPS_IS_RANGE) state->usages_size = 0; state->usages_page[state->usages_size] = usage_page; state->usages_min[state->usages_size] = usage; state->usages_max[state->usages_size] = usage; state->items.usage_min = usage; state->items.usage_max = usage; - state->items.is_range = FALSE; + state->items.flags &= ~HID_VALUE_CAPS_IS_RANGE; if (state->usages_size++ == 255) ERR( "HID parser usages stack overflow!\n" ); return state->usages_size <= 255; } @@ -257,22 +257,22 @@ static BOOL parse_local_usage( struct hid_parser_state *state, USAGE usage_page, static void parse_local_usage_min( struct hid_parser_state *state, USAGE usage_page, USAGE usage ) { if (!usage_page) usage_page = state->items.usage_page; - if (!state->items.is_range) state->usages_max[0] = 0; + if (!(state->items.flags & HID_VALUE_CAPS_IS_RANGE)) state->usages_max[0] = 0; state->usages_page[0] = usage_page; state->usages_min[0] = usage; state->items.usage_min = usage; - state->items.is_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_RANGE; state->usages_size = 1; }
static void parse_local_usage_max( struct hid_parser_state *state, USAGE usage_page, USAGE usage ) { if (!usage_page) usage_page = state->items.usage_page; - if (!state->items.is_range) state->usages_min[0] = 0; + if (!(state->items.flags & HID_VALUE_CAPS_IS_RANGE)) state->usages_min[0] = 0; state->usages_page[0] = usage_page; state->usages_max[0] = usage; state->items.usage_max = usage; - state->items.is_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_RANGE; state->usages_size = 1; }
@@ -579,27 +579,27 @@ struct hid_preparsed_data *parse_descriptor( BYTE *descriptor, unsigned int leng break; case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_INDEX, TAG_TYPE_LOCAL ): state->items.designator_min = state->items.designator_max = value; - state->items.is_designator_range = FALSE; + state->items.flags &= ~HID_VALUE_CAPS_IS_DESIGNATOR_RANGE; break; case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_MINIMUM, TAG_TYPE_LOCAL ): state->items.designator_min = value; - state->items.is_designator_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_DESIGNATOR_RANGE; break; case SHORT_ITEM( TAG_LOCAL_DESIGNATOR_MAXIMUM, TAG_TYPE_LOCAL ): state->items.designator_max = value; - state->items.is_designator_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_DESIGNATOR_RANGE; break; case SHORT_ITEM( TAG_LOCAL_STRING_INDEX, TAG_TYPE_LOCAL ): state->items.string_min = state->items.string_max = value; - state->items.is_string_range = FALSE; + state->items.flags &= ~HID_VALUE_CAPS_IS_STRING_RANGE; break; case SHORT_ITEM( TAG_LOCAL_STRING_MINIMUM, TAG_TYPE_LOCAL ): state->items.string_min = value; - state->items.is_string_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_STRING_RANGE; break; case SHORT_ITEM( TAG_LOCAL_STRING_MAXIMUM, TAG_TYPE_LOCAL ): state->items.string_max = value; - state->items.is_string_range = TRUE; + state->items.flags |= HID_VALUE_CAPS_IS_STRING_RANGE; break; case SHORT_ITEM( TAG_LOCAL_DELIMITER, TAG_TYPE_LOCAL ): FIXME( "delimiter %d not implemented!\n", value ); diff --git a/include/wine/hid.h b/include/wine/hid.h index 8e33745ddc4..4f388404885 100644 --- a/include/wine/hid.h +++ b/include/wine/hid.h @@ -42,9 +42,7 @@ struct hid_value_caps USHORT string_max; USHORT designator_min; USHORT designator_max; - BOOLEAN is_range; - BOOLEAN is_string_range; - BOOLEAN is_designator_range; + ULONG flags; UCHAR report_id; USHORT link_collection; USAGE link_usage_page; @@ -63,6 +61,10 @@ struct hid_value_caps ULONG units_exp; };
+#define HID_VALUE_CAPS_IS_RANGE 0x10 +#define HID_VALUE_CAPS_IS_STRING_RANGE 0x40 +#define HID_VALUE_CAPS_IS_DESIGNATOR_RANGE 0x80 + #define HID_VALUE_CAPS_IS_ABSOLUTE(x) (((x)->bit_field & 0x04) == 0) #define HID_VALUE_CAPS_HAS_NULL(x) (((x)->bit_field & 0x40) != 0) #define HID_VALUE_CAPS_IS_ARRAY(c) (((c)->bit_field & 2) == 0)