diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec index 98f71db93fc..d5dd734b1c4 100644 --- a/dlls/hid/hid.spec +++ b/dlls/hid/hid.spec @@ -24,7 +24,7 @@ @ stub HidP_GetExtendedAttributes @ stub HidP_GetLinkCollectionNodes @ stdcall HidP_GetScaledUsageValue(long long long long ptr ptr ptr long) -@ stub HidP_GetSpecificButtonCaps +@ stdcall HidP_GetSpecificButtonCaps(long long long long ptr ptr ptr) @ stdcall HidP_GetSpecificValueCaps(long long long long ptr ptr ptr) @ stdcall HidP_GetUsageValue(long long long long ptr ptr ptr long) @ stub HidP_GetUsageValueArray diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c index c6b773b04a8..cac9d4ed550 100644 --- a/dlls/hid/hidp.c +++ b/dlls/hid/hidp.c @@ -536,6 +536,78 @@ NTSTATUS WINAPI HidP_TranslateUsagesToI8042ScanCodes(USAGE *ChangedUsageList, return STATUS_NOT_IMPLEMENTED; } +NTSTATUS WINAPI HidP_GetSpecificButtonCaps(HIDP_REPORT_TYPE ReportType, + USAGE UsagePage, USHORT LinkCollection, USAGE Usage, + HIDP_BUTTON_CAPS *ButtonCaps, USHORT *ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData) +{ + WINE_HIDP_PREPARSED_DATA *data = (WINE_HIDP_PREPARSED_DATA*)PreparsedData; + WINE_HID_REPORT *report = NULL; + USHORT b_count = 0, r_count = 0; + int i,j,u; + + TRACE("(%i, 0x%x, %i, 0x%x, %p %p %p)\n", ReportType, UsagePage, LinkCollection, + Usage, ButtonCaps, ButtonCapsLength, PreparsedData); + + if (data->magic != HID_MAGIC) + return HIDP_STATUS_INVALID_PREPARSED_DATA; + + switch(ReportType) + { + case HidP_Input: + b_count = data->caps.NumberInputButtonCaps; + r_count = data->dwInputReportCount; + report = HID_INPUT_REPORTS(data); + break; + case HidP_Output: + b_count = data->caps.NumberOutputButtonCaps; + r_count = data->dwOutputReportCount; + report = HID_OUTPUT_REPORTS(data); + break; + case HidP_Feature: + b_count = data->caps.NumberFeatureButtonCaps; + r_count = data->dwFeatureReportCount; + report = HID_FEATURE_REPORTS(data); + break; + default: + return HIDP_STATUS_INVALID_REPORT_TYPE; + } + + if (!r_count || !b_count || !report) + { + *ButtonCapsLength = 0; + return HIDP_STATUS_SUCCESS; + } + + b_count = min(b_count, *ButtonCapsLength); + + u = 0; + for (j = 0; j < r_count && u < b_count; j++) + { + for (i = 0; i < report->elementCount && u < b_count; i++) + { + if (report->Elements[i].ElementType == ButtonElement && + (UsagePage == 0 || UsagePage == report->Elements[i].caps.button.UsagePage) && + (LinkCollection == 0 || LinkCollection == report->Elements[i].caps.button.LinkCollection) && + (Usage == 0 || ( + (!report->Elements[i].caps.button.IsRange && + Usage == report->Elements[i].caps.button.u.NotRange.Usage)) || + (report->Elements[i].caps.button.IsRange && + Usage >=report->Elements[i].caps.button.u.Range.UsageMin && + Usage <= report->Elements[i].caps.button.u.Range.UsageMax))) + { + ButtonCaps[u++] = report->Elements[i].caps.button; + } + } + report = HID_NEXT_REPORT(data, report); + } + TRACE("Matched %i usages\n", u); + + *ButtonCapsLength = u; + + return HIDP_STATUS_SUCCESS; +} + + NTSTATUS WINAPI HidP_GetSpecificValueCaps(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection, USAGE Usage, HIDP_VALUE_CAPS *ValueCaps, USHORT *ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData) diff --git a/include/ddk/hidpi.h b/include/ddk/hidpi.h index 82bbc70ba53..9f0fd8fc13c 100644 --- a/include/ddk/hidpi.h +++ b/include/ddk/hidpi.h @@ -173,6 +173,7 @@ NTSTATUS WINAPI HidP_InitializeReportForID(HIDP_REPORT_TYPE ReportType, UCHAR Re ULONG WINAPI HidP_MaxUsageListLength(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, PHIDP_PREPARSED_DATA PreparsedData); NTSTATUS WINAPI HidP_GetScaledUsageValue(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection, USAGE Usage, PLONG UsageValue, PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report, ULONG ReportLength); NTSTATUS WINAPI HidP_TranslateUsagesToI8042ScanCodes(USAGE *ChangedUsageList, ULONG UsageListLength, HIDP_KEYBOARD_DIRECTION KeyAction, HIDP_KEYBOARD_MODIFIER_STATE *ModifierState, PHIDP_INSERT_SCANCODES InsertCodesProcedure, VOID *InsertCodesContext); +NTSTATUS WINAPI HidP_GetSpecificButtonCaps(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection, USAGE Usage, HIDP_BUTTON_CAPS *ButtonCaps, USHORT *ButtonCapsLength, PHIDP_PREPARSED_DATA PreparsedData); NTSTATUS WINAPI HidP_GetSpecificValueCaps(HIDP_REPORT_TYPE ReportType, USAGE UsagePage, USHORT LinkCollection, USAGE Usage, HIDP_VALUE_CAPS *ValueCaps, USHORT *ValueCapsLength, PHIDP_PREPARSED_DATA PreparsedData); #ifndef FACILITY_HID_ERROR_CODE