break;
 
                case 0x32: /* InRange */
-                       switch (field->physical & 0xff) {
-                       case 0x21: map_key(BTN_TOOL_MOUSE); break;
-                       case 0x22: map_key(BTN_TOOL_FINGER); break;
-                       default: map_key(BTN_TOOL_PEN); break;
+                       switch (field->physical) {
+                       case HID_DG_PUCK:
+                               map_key(BTN_TOOL_MOUSE);
+                               break;
+                       case HID_DG_FINGER:
+                               map_key(BTN_TOOL_FINGER);
+                               break;
+                       default:
+                               /*
+                                * If the physical is not given,
+                                * rely on the application.
+                                */
+                               if (!field->physical) {
+                                       switch (field->application) {
+                                       case HID_DG_TOUCHSCREEN:
+                                       case HID_DG_TOUCHPAD:
+                                               map_key_clear(BTN_TOOL_FINGER);
+                                               break;
+                                       default:
+                                               map_key_clear(BTN_TOOL_PEN);
+                                       }
+                               } else {
+                                       map_key(BTN_TOOL_PEN);
+                               }
+                               break;
                        }
                        break;