[haiku-commits] r40953 - haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid

  • From: mmlr@xxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 14 Mar 2011 21:10:01 +0100 (CET)

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


Other related posts:

  • » [haiku-commits] r40953 - haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid - mmlr