Author: mmlr Date: 2011-03-14 21:10:01 +0100 (Mon, 14 Mar 2011) New Revision: 40953 Changeset: http://dev.haiku-os.org/changeset/40953 Ticket: http://dev.haiku-os.org/ticket/7354 Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDParser.cpp Log: Do the usage preprocessing also for collections. While the collection handles the conversion, it makes it easier to do it for all items the same. This fixes the missing initialization of the usage stack as pointed out by caz_haiku in #7354, thanks for the pointer! Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDParser.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDParser.cpp 2011-03-14 19:03:42 UTC (rev 40952) +++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDParser.cpp 2011-03-14 20:10:01 UTC (rev 40953) @@ -103,6 +103,32 @@ switch (item->type) { case ITEM_TYPE_MAIN: { + // preprocess the local state if relevant (usages for + // collections and report items) + if (item->tag != ITEM_TAG_MAIN_END_COLLECTION) { + // make all usages extended for easier later processing + for (uint32 i = 0; i < usageStackUsed; i++) { + if (usageStack[i].is_extended) + continue; + usageStack[i].u.s.usage_page = globalState.usage_page; + usageStack[i].is_extended = true; + } + + if (!localState.usage_minimum.is_extended) { + // the specs say if one of them is extended they must + // both be extended, so if the minimum isn't, the + // maximum mustn't either. + localState.usage_minimum.u.s.usage_page + = localState.usage_maximum.u.s.usage_page + = globalState.usage_page; + localState.usage_minimum.is_extended + = localState.usage_maximum.is_extended = true; + } + + localState.usage_stack = usageStack; + localState.usage_stack_used = usageStackUsed; + } + if (item->tag == ITEM_TAG_MAIN_COLLECTION) { HIDCollection *newCollection = new(std::nothrow) HIDCollection(collection, @@ -154,28 +180,6 @@ if (target == NULL) break; - // make all usages extended for easier later processing - for (uint32 i = 0; i < usageStackUsed; i++) { - if (usageStack[i].is_extended) - continue; - usageStack[i].u.s.usage_page = globalState.usage_page; - usageStack[i].is_extended = true; - } - - if (!localState.usage_minimum.is_extended) { - // the specs say if one of them is extended they must - // both be extended, so if the minimum isn't, the - // maximum mustn't either. - localState.usage_minimum.u.s.usage_page - = localState.usage_maximum.u.s.usage_page - = globalState.usage_page; - localState.usage_minimum.is_extended - = localState.usage_maximum.is_extended = true; - } - - localState.usage_stack = usageStack; - localState.usage_stack_used = usageStackUsed; - // fill in a sensible default if the index isn't set if (!localState.designator_index_set) { localState.designator_index