From f30042cc8c259a78a7f39f215bb15f0b084d0f25 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 19 Jul 2008 11:04:07 -0700 Subject: [PATCH 01/34] game-input vocab w/ iokit backend --- extra/game-input/backend/iokit/iokit.factor | 273 ++++++++++++++++++++ extra/game-input/game-input.factor | 39 +++ extra/iokit/hid/hid.factor | 11 +- 3 files changed, 318 insertions(+), 5 deletions(-) create mode 100644 extra/game-input/backend/iokit/iokit.factor create mode 100644 extra/game-input/game-input.factor diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor new file mode 100644 index 0000000000..cc4cc31ffa --- /dev/null +++ b/extra/game-input/backend/iokit/iokit.factor @@ -0,0 +1,273 @@ +USING: cocoa cocoa.plists core-foundation iokit iokit.hid +kernel cocoa.enumeration destructors math.parser cocoa.application +sequences locals combinators.short-circuit game-input threads +symbols namespaces assocs hashtables arrays combinators +core-foundation.run-loop accessors sequences.private +alien.c-types math ; +IN: game-input.backend.iokit + +SINGLETON: iokit-game-input-backend + +: hid-manager-matching ( matching-seq -- alien ) + f 0 IOHIDManagerCreate + [ swap >plist IOHIDManagerSetDeviceMatchingMultiple ] + keep ; + +: devices-from-hid-manager ( manager -- vector ) + [ + IOHIDManagerCopyDevices + [ &CFRelease NSFastEnumeration>vector ] [ f ] if* + ] with-destructors ; + +: game-devices-matching-seq + { + H{ { "DeviceUsage" 4 } { "DeviceUsagePage" 1 } } ! joysticks + H{ { "DeviceUsage" 5 } { "DeviceUsagePage" 1 } } ! gamepads + H{ { "DeviceUsage" 6 } { "DeviceUsagePage" 1 } } ! keyboards + } ; inline + +: buttons-matching-hash + H{ { "UsagePage" 9 } { "Type" 2 } } ; inline +: keys-matching-hash + H{ { "UsagePage" 7 } { "Type" 2 } } ; inline +: x-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 30 } { "Type" 1 } } ; inline +: y-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 31 } { "Type" 1 } } ; inline +: z-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 32 } { "Type" 1 } } ; inline +: rx-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 33 } { "Type" 1 } } ; inline +: ry-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 34 } { "Type" 1 } } ; inline +: rz-axis-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 35 } { "Type" 1 } } ; inline +: slider-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 36 } { "Type" 1 } } ; inline +: hat-switch-matching-hash + H{ { "UsagePage" 1 } { "Usage" HEX: 39 } { "Type" 1 } } ; inline + +: device-elements-matching ( device matching-hash -- vector ) + [ + >plist 0 IOHIDDeviceCopyMatchingElements + [ &CFRelease NSFastEnumeration>vector ] [ f ] if* + ] with-destructors ; + +: button-count ( device -- button-count ) + buttons-matching-hash device-elements-matching length ; + +: ?axis ( device hash -- axis/f ) + device-elements-matching dup empty? [ drop f ] [ first ] if ; + +: ?x-axis ( device -- ? ) + x-axis-matching-hash ?axis ; +: ?y-axis ( device -- ? ) + y-axis-matching-hash ?axis ; +: ?z-axis ( device -- ? ) + z-axis-matching-hash ?axis ; +: ?rx-axis ( device -- ? ) + rx-axis-matching-hash ?axis ; +: ?ry-axis ( device -- ? ) + ry-axis-matching-hash ?axis ; +: ?rz-axis ( device -- ? ) + rz-axis-matching-hash ?axis ; +: ?slider ( device -- ? ) + slider-matching-hash ?axis ; +: ?hat-switch ( device -- ? ) + hat-switch-matching-hash ?axis ; + +: hid-manager-matching-game-devices ( -- alien ) + game-devices-matching-seq hid-manager-matching ; + +: device-property ( device key -- value ) + [ + IOHIDDeviceGetProperty + [ &CFRelease plist> ] [ f ] if* + ] with-destructors ; +: element-property ( element key -- value ) + [ + IOHIDElementGetProperty + [ &CFRelease plist> ] [ f ] if* + ] with-destructors ; +: set-element-property ( element key value -- ) + [ ] [ >plist ] bi* IOHIDElementSetProperty drop ; +: transfer-element-property ( element from-key to-key -- ) + [ dupd element-property ] dip swap set-element-property ; + +: controller-device? ( device -- ? ) + { + [ 1 4 IOHIDDeviceConformsTo ] + [ 1 5 IOHIDDeviceConformsTo ] + } 1|| ; + +: element-usage ( element -- {usage-page,usage} ) + [ IOHIDElementGetUsagePage ] [ IOHIDElementGetUsage ] bi + 2array ; + +: button? ( {usage-page,usage} -- ? ) + first 9 = ; +: keyboard-key? ( {usage-page,usage} -- ? ) + first 7 = ; +: x-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 30 } = ; +: y-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 31 } = ; +: z-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 32 } = ; +: rx-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 33 } = ; +: ry-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 34 } = ; +: rz-axis? ( {usage-page,usage} -- ? ) + { 1 HEX: 35 } = ; +: slider? ( {usage-page,usage} -- ? ) + { 1 HEX: 36 } = ; +: hat-switch? ( {usage-page,usage} -- ? ) + { 1 HEX: 39 } = ; + +: button-value ( value -- f/(0,1] ) + IOHIDValueGetIntegerValue dup zero? [ drop f ] when ; +! XXX calibration +: axis-value ( value -- [-1,1] ) + kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue ; +: slider-value ( value -- [0,1] ) + kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue + 1.0 + 0.5 * ; +: pov-value ( value -- pov-direction ) + ! XXX + IOHIDValueGetIntegerValue ; + +: record-controller ( controller-state value -- ) + dup IOHIDValueGetElement element-usage { + { [ dup button? ] [ [ button-value ] [ second 1- ] bi* rot buttons>> set-nth ] } + { [ dup x-axis? ] [ drop axis-value >>x drop ] } + { [ dup y-axis? ] [ drop axis-value >>y drop ] } + { [ dup z-axis? ] [ drop axis-value >>z drop ] } + { [ dup rx-axis? ] [ drop axis-value >>rx drop ] } + { [ dup ry-axis? ] [ drop axis-value >>ry drop ] } + { [ dup rz-axis? ] [ drop axis-value >>rz drop ] } + { [ dup slider? ] [ drop slider-value >>slider drop ] } + { [ dup hat-switch? ] [ drop pov-value >>pov drop ] } + [ 3drop ] + } cond ; + +SYMBOLS: +hid-manager+ +keyboard-state+ +controller-states+ ; + +: ?set-nth ( value nth seq -- ) + 2dup bounds-check? [ set-nth-unsafe ] [ 3drop ] if ; + +: record-keyboard ( value -- ) + dup IOHIDValueGetElement element-usage keyboard-key? [ + [ IOHIDValueGetIntegerValue c-bool> ] + [ IOHIDValueGetElement IOHIDElementGetUsage ] bi + +keyboard-state+ get ?set-nth + ] [ drop ] if ; + +: default-calibrate-saturation ( element -- ) + [ kIOHIDElementMinKey kIOHIDElementCalibrationSaturationMinKey transfer-element-property ] + [ kIOHIDElementMaxKey kIOHIDElementCalibrationSaturationMaxKey transfer-element-property ] + bi ; + +: default-calibrate-axis ( element -- ) + [ kIOHIDElementCalibrationMinKey -1.0 set-element-property ] + [ kIOHIDElementCalibrationMaxKey 1.0 set-element-property ] + [ default-calibrate-saturation ] + tri ; + +: default-calibrate-slider ( element -- ) + [ kIOHIDElementCalibrationMinKey 0.0 set-element-property ] + [ kIOHIDElementCalibrationMaxKey 1.0 set-element-property ] + [ default-calibrate-saturation ] + tri ; + +: (default) ( ? quot -- ) + [ f ] if* ; inline + +: ( device -- controller-state ) + { + [ ?x-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?y-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?z-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?rx-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?ry-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?rz-axis [ default-calibrate-axis 0.0 ] (default) ] + [ ?slider [ default-calibrate-slider 0.0 ] (default) ] + [ ?hat-switch pov-neutral and ] + [ button-count f ] + } cleave controller-state boa ; + +: device-matched-callback ( -- alien ) + [| context result sender device | + device controller-device? [ + device + device +controller-states+ get set-at + ] when + ] IOHIDDeviceCallback ; + +: device-removed-callback ( -- alien ) + [| context result sender device | + device +controller-states+ get delete-at + ] IOHIDDeviceCallback ; + +: device-input-callback ( -- alien ) + [| context result sender value | + sender controller-device? + [ sender +controller-states+ get at value record-controller ] + [ value record-keyboard ] + if + ] IOHIDValueCallback ; + +: initialize-variables ( manager -- ) + +hid-manager+ set-global + 4 +controller-states+ set-global + 256 f +keyboard-state+ set-global ; + +M: iokit-game-input-backend open-game-input + hid-manager-matching-game-devices { + [ initialize-variables ] + [ device-matched-callback f IOHIDManagerRegisterDeviceMatchingCallback ] + [ device-removed-callback f IOHIDManagerRegisterDeviceRemovalCallback ] + [ device-input-callback f IOHIDManagerRegisterInputValueCallback ] + [ 0 IOHIDManagerOpen mach-error ] + [ + CFRunLoopGetMain CFRunLoopDefaultMode + IOHIDManagerScheduleWithRunLoop + ] + } cleave ; + +! XXX while game-input is open, we need to reset-game-input and open-game-input as a +! boot image hook +M: iokit-game-input-backend close-game-input + +hid-manager+ global [ + [ 0 IOHIDManagerClose drop ] + [ CFRelease ] bi + f + ] change-at + f +keyboard-state+ set-global + f +controller-states+ set-global ; + +M: iokit-game-input-backend get-controllers ( -- sequence ) + +controller-states+ get keys [ controller boa ] map ; + +M: iokit-game-input-backend manufacturer ( controller -- string ) + handle>> kIOHIDManufacturerKey device-property ; +M: iokit-game-input-backend product ( controller -- string ) + handle>> kIOHIDProductKey device-property ; +M: iokit-game-input-backend vendor-id ( controller -- integer ) + handle>> kIOHIDVendorIDKey device-property ; +M: iokit-game-input-backend product-id ( controller -- integer ) + handle>> kIOHIDProductIDKey device-property ; +M: iokit-game-input-backend location-id ( controller -- integer ) + handle>> kIOHIDLocationIDKey device-property ; + +M: iokit-game-input-backend read-controller ( controller -- controller-state ) + handle>> +controller-states+ get at clone ; + +M: iokit-game-input-backend read-keyboard ( -- keyboard-state ) + +keyboard-state+ get clone keyboard-state boa ; + +M: iokit-game-input-backend calibrate-controller ( controller -- ) + ! XXX + drop ; + +iokit-game-input-backend game-input-backend set-global diff --git a/extra/game-input/game-input.factor b/extra/game-input/game-input.factor new file mode 100644 index 0000000000..a2884b0746 --- /dev/null +++ b/extra/game-input/game-input.factor @@ -0,0 +1,39 @@ +USING: arrays accessors continuations kernel symbols ; +IN: game-input + +SYMBOL: game-input-backend + +HOOK: open-game-input game-input-backend ( -- ) +HOOK: close-game-input game-input-backend ( -- ) + +: with-game-input ( quot -- ) + open-game-input [ close-game-input ] [ ] cleanup ; + +TUPLE: controller handle ; +TUPLE: controller-state x y z rx ry rz slider pov buttons ; + +M: controller-state clone + call-next-method dup buttons>> clone >>buttons ; + +SYMBOLS: + pov-neutral + pov-up pov-up-left pov-left pov-down-left + pov-down pov-down-right pov-right pov-up-right ; + +HOOK: get-controllers game-input-backend ( -- sequence ) + +HOOK: manufacturer game-input-backend ( controller -- string ) +HOOK: product game-input-backend ( controller -- string ) +HOOK: vendor-id game-input-backend ( controller -- integer ) +HOOK: product-id game-input-backend ( controller -- integer ) +HOOK: location-id game-input-backend ( controller -- integer ) + +HOOK: read-controller game-input-backend ( controller -- controller-state ) +HOOK: calibrate-controller game-input-backend ( controller -- ) + +TUPLE: keyboard-state keys ; + +M: keyboard-state clone + call-next-method dup keys>> clone >>keys ; + +HOOK: read-keyboard game-input-backend ( -- keyboard-state ) diff --git a/extra/iokit/hid/hid.factor b/extra/iokit/hid/hid.factor index 79c3516b4e..11ba5d3687 100644 --- a/extra/iokit/hid/hid.factor +++ b/extra/iokit/hid/hid.factor @@ -20,8 +20,8 @@ IN: iokit.hid : kIOHIDPrimaryUsageKey "PrimaryUsage" ; inline : kIOHIDPrimaryUsagePageKey "PrimaryUsagePage" ; inline : kIOHIDMaxInputReportSizeKey "MaxInputReportSize" ; inline -: kIOHIDMaxOutputReportSizeKey "MaxOutputReportSize" ; inline -: kIOHIDMaxFeatureReportSizeKey "MaxFeatureReportSize" ; inline +: kIOHIDMaxOutputReportSizeKey "MaxOutputReportSize" ; inline +: kIOHIDMaxFeatureReportSizeKey "MaxFeatureReportSize" ; inline : kIOHIDReportIntervalKey "ReportInterval" ; inline : kIOHIDElementKey "Elements" ; inline @@ -77,7 +77,7 @@ IN: iokit.hid : kIOHIDElementTypeFeature 257 ; inline : kIOHIDElementTypeCollection 513 ; inline -: kIOHIDElementCollectionTypePhysical HEX: 00 ; inline +: kIOHIDElementCollectionTypePhysical HEX: 00 ; inline : kIOHIDElementCollectionTypeApplication HEX: 01 ; inline : kIOHIDElementCollectionTypeLogical HEX: 02 ; inline : kIOHIDElementCollectionTypeReport HEX: 03 ; inline @@ -90,10 +90,10 @@ IN: iokit.hid : kIOHIDReportTypeFeature 2 ; inline : kIOHIDReportTypeCount 3 ; inline -: kIOHIDOptionsTypeNone HEX: 00 ; inline +: kIOHIDOptionsTypeNone HEX: 00 ; inline : kIOHIDOptionsTypeSeizeDevice HEX: 01 ; inline -: kIOHIDQueueOptionsTypeNone HEX: 00 ; inline +: kIOHIDQueueOptionsTypeNone HEX: 00 ; inline : kIOHIDQueueOptionsTypeEnqueueAll HEX: 01 ; inline : kIOHIDElementFlagsConstantMask HEX: 0001 ; inline @@ -269,3 +269,4 @@ FUNCTION: IOHIDValueRef IOHIDTransactionGetValue ( IOHIDTransactionRef transacti FUNCTION: IOReturn IOHIDTransactionCommit ( IOHIDTransactionRef transaction ) ; FUNCTION: IOReturn IOHIDTransactionCommitWithCallback ( IOHIDTransactionRef transaction, CFTimeInterval timeout, IOHIDCallback callback, void* context ) ; FUNCTION: void IOHIDTransactionClear ( IOHIDTransactionRef transaction ) ; + From cad006719f3139657e7cf1cd1c44b79e7761ed82 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 19 Jul 2008 12:02:24 -0700 Subject: [PATCH 02/34] fix memory management bugs in game-input.backend.iokit --- extra/game-input/backend/iokit/iokit.factor | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index cc4cc31ffa..1c778c6bb9 100644 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -80,15 +80,9 @@ SINGLETON: iokit-game-input-backend game-devices-matching-seq hid-manager-matching ; : device-property ( device key -- value ) - [ - IOHIDDeviceGetProperty - [ &CFRelease plist> ] [ f ] if* - ] with-destructors ; + IOHIDDeviceGetProperty plist> ; : element-property ( element key -- value ) - [ - IOHIDElementGetProperty - [ &CFRelease plist> ] [ f ] if* - ] with-destructors ; + IOHIDElementGetProperty plist> ; : set-element-property ( element key value -- ) [ ] [ >plist ] bi* IOHIDElementSetProperty drop ; : transfer-element-property ( element from-key to-key -- ) From 42b3d01b949e12c24d02b95d30560abcdf6c3a45 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 19 Jul 2008 15:17:12 -0700 Subject: [PATCH 03/34] read-plist word for cocoa.plists --- extra/cocoa/cocoa.factor | 1 + extra/cocoa/plists/plists.factor | 16 +++++++++++++--- extra/core-foundation/core-foundation.factor | 5 +++++ extra/game-input/backend/iokit/iokit.factor | 15 +++++++++------ extra/game-input/game-input.factor | 4 ++-- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/extra/cocoa/cocoa.factor b/extra/cocoa/cocoa.factor index 907d75fd84..744d577c0d 100755 --- a/extra/cocoa/cocoa.factor +++ b/extra/cocoa/cocoa.factor @@ -61,6 +61,7 @@ SYMBOL: super-sent-messages "NSOpenGLView" "NSOpenPanel" "NSPasteboard" + "NSPropertyListSerialization" "NSResponder" "NSSavePanel" "NSScreen" diff --git a/extra/cocoa/plists/plists.factor b/extra/cocoa/plists/plists.factor index 139e0840e1..bb73b8fac3 100644 --- a/extra/cocoa/plists/plists.factor +++ b/extra/cocoa/plists/plists.factor @@ -3,7 +3,7 @@ USING: strings arrays hashtables assocs sequences cocoa.messages cocoa.classes cocoa.application cocoa kernel namespaces io.backend math cocoa.enumeration byte-arrays -combinators alien.c-types ; +combinators alien.c-types core-foundation ; IN: cocoa.plists GENERIC: >plist ( value -- plist ) @@ -24,8 +24,8 @@ M: sequence >plist [ >plist ] map ; : write-plist ( assoc path -- ) - >r >plist - r> normalize-path 0 -> writeToFile:atomically: + [ >plist ] [ normalize-path ] bi* 0 + -> writeToFile:atomically: [ "write-plist failed" throw ] unless ; DEFER: plist> @@ -57,3 +57,13 @@ DEFER: plist> { [ dup NSDictionary -> isKindOfClass: c-bool> ] [ (plist-NSDictionary>) ] } [ ] } cond ; + +: (read-plist) ( NSData -- id ) + NSPropertyListSerialization swap kCFPropertyListImmutable f f + [ -> propertyListFromData:mutabilityOption:format:errorDescription: ] keep + *void* [ -> release "read-plist failed" throw ] when* ; + +: read-plist ( path -- assoc ) + normalize-path + NSData swap -> dataWithContentsOfFile: + [ (read-plist) plist> ] [ "read-plist failed" throw ] if* ; diff --git a/extra/core-foundation/core-foundation.factor b/extra/core-foundation/core-foundation.factor index c511a24320..5c3ccf6c80 100644 --- a/extra/core-foundation/core-foundation.factor +++ b/extra/core-foundation/core-foundation.factor @@ -43,6 +43,11 @@ TYPEDEF: int CFNumberType : kCFNumberCGFloatType 16 ; inline : kCFNumberMaxType 16 ; inline +TYPEDEF: int CFPropertyListMutabilityOptions +: kCFPropertyListImmutable 0 ; inline +: kCFPropertyListMutableContainers 1 ; inline +: kCFPropertyListMutableContainersAndLeaves 2 ; inline + FUNCTION: CFArrayRef CFArrayCreateMutable ( CFAllocatorRef allocator, CFIndex capacity, void* callbacks ) ; FUNCTION: void* CFArrayGetValueAtIndex ( CFArrayRef array, CFIndex idx ) ; diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index 1c778c6bb9..10e3220b3d 100644 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -119,17 +119,20 @@ SINGLETON: iokit-game-input-backend : hat-switch? ( {usage-page,usage} -- ? ) { 1 HEX: 39 } = ; +: pov-values + { + pov-up pov-up-right pov-right pov-down-right + pov-down pov-down-left pov-left pov-up-left + pov-neutral + } ; + : button-value ( value -- f/(0,1] ) IOHIDValueGetIntegerValue dup zero? [ drop f ] when ; ! XXX calibration : axis-value ( value -- [-1,1] ) kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue ; -: slider-value ( value -- [0,1] ) - kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue - 1.0 + 0.5 * ; : pov-value ( value -- pov-direction ) - ! XXX - IOHIDValueGetIntegerValue ; + IOHIDValueGetIntegerValue pov-values ?nth [ pov-neutral ] unless* ; : record-controller ( controller-state value -- ) dup IOHIDValueGetElement element-usage { @@ -140,7 +143,7 @@ SINGLETON: iokit-game-input-backend { [ dup rx-axis? ] [ drop axis-value >>rx drop ] } { [ dup ry-axis? ] [ drop axis-value >>ry drop ] } { [ dup rz-axis? ] [ drop axis-value >>rz drop ] } - { [ dup slider? ] [ drop slider-value >>slider drop ] } + { [ dup slider? ] [ drop axis-value >>slider drop ] } { [ dup hat-switch? ] [ drop pov-value >>pov drop ] } [ 3drop ] } cond ; diff --git a/extra/game-input/game-input.factor b/extra/game-input/game-input.factor index a2884b0746..85a1e2e454 100644 --- a/extra/game-input/game-input.factor +++ b/extra/game-input/game-input.factor @@ -17,8 +17,8 @@ M: controller-state clone SYMBOLS: pov-neutral - pov-up pov-up-left pov-left pov-down-left - pov-down pov-down-right pov-right pov-up-right ; + pov-up pov-up-right pov-right pov-down-right + pov-down pov-down-left pov-left pov-up-left ; HOOK: get-controllers game-input-backend ( -- sequence ) From c28196abb2a1ded06c3e8fb6e2d516f13ac9ef56 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 19 Jul 2008 15:21:14 -0700 Subject: [PATCH 04/34] keyboard scancodes vocab --- extra/game-input/scancodes/scancodes.factor | 175 ++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 extra/game-input/scancodes/scancodes.factor diff --git a/extra/game-input/scancodes/scancodes.factor b/extra/game-input/scancodes/scancodes.factor new file mode 100644 index 0000000000..747d883822 --- /dev/null +++ b/extra/game-input/scancodes/scancodes.factor @@ -0,0 +1,175 @@ +IN: game-input.scancodes + +: key-undefined HEX: 0000 ; inline +: key-error-roll-over HEX: 0001 ; inline +: key-error-post-fail HEX: 0002 ; inline +: key-error-undefined HEX: 0003 ; inline +: key-a HEX: 0004 ; inline +: key-b HEX: 0005 ; inline +: key-c HEX: 0006 ; inline +: key-d HEX: 0007 ; inline +: key-e HEX: 0008 ; inline +: key-f HEX: 0009 ; inline +: key-g HEX: 000a ; inline +: key-h HEX: 000b ; inline +: key-i HEX: 000c ; inline +: key-j HEX: 000d ; inline +: key-k HEX: 000e ; inline +: key-l HEX: 000f ; inline +: key-m HEX: 0010 ; inline +: key-n HEX: 0011 ; inline +: key-o HEX: 0012 ; inline +: key-p HEX: 0013 ; inline +: key-q HEX: 0014 ; inline +: key-r HEX: 0015 ; inline +: key-s HEX: 0016 ; inline +: key-t HEX: 0017 ; inline +: key-u HEX: 0018 ; inline +: key-v HEX: 0019 ; inline +: key-w HEX: 001a ; inline +: key-x HEX: 001b ; inline +: key-y HEX: 001c ; inline +: key-z HEX: 001d ; inline +: key-1 HEX: 001e ; inline +: key-2 HEX: 001f ; inline +: key-3 HEX: 0020 ; inline +: key-4 HEX: 0021 ; inline +: key-5 HEX: 0022 ; inline +: key-6 HEX: 0023 ; inline +: key-7 HEX: 0024 ; inline +: key-8 HEX: 0025 ; inline +: key-9 HEX: 0026 ; inline +: key-0 HEX: 0027 ; inline +: key-return HEX: 0028 ; inline +: key-escape HEX: 0029 ; inline +: key-backspace HEX: 002a ; inline +: key-tab HEX: 002b ; inline +: key-space HEX: 002c ; inline +: key-- HEX: 002d ; inline +: key-= HEX: 002e ; inline +: key-[ HEX: 002f ; inline +: key-] HEX: 0030 ; inline +: key-/ HEX: 0031 ; inline +: key-# HEX: 0032 ; inline +: key-; HEX: 0033 ; inline +: key-' HEX: 0034 ; inline +: key-` HEX: 0035 ; inline +: key-, HEX: 0036 ; inline +: key-. HEX: 0037 ; inline +: key-/ HEX: 0038 ; inline +: key-caps-lock HEX: 0039 ; inline +: key-f1 HEX: 003a ; inline +: key-f2 HEX: 003b ; inline +: key-f3 HEX: 003c ; inline +: key-f4 HEX: 003d ; inline +: key-f5 HEX: 003e ; inline +: key-f6 HEX: 003f ; inline +: key-f7 HEX: 0040 ; inline +: key-f8 HEX: 0041 ; inline +: key-f9 HEX: 0042 ; inline +: key-f10 HEX: 0043 ; inline +: key-f11 HEX: 0044 ; inline +: key-f12 HEX: 0045 ; inline +: key-print-screen HEX: 0046 ; inline +: key-scroll-lock HEX: 0047 ; inline +: key-pause HEX: 0048 ; inline +: key-insert HEX: 0049 ; inline +: key-home HEX: 004a ; inline +: key-page-up HEX: 004b ; inline +: key-delete HEX: 004c ; inline +: key-end HEX: 004d ; inline +: key-page-down HEX: 004e ; inline +: key-right-arrow HEX: 004f ; inline +: key-left-arrow HEX: 0050 ; inline +: key-down-arrow HEX: 0051 ; inline +: key-up-arrow HEX: 0052 ; inline +: key-keypad-numlock HEX: 0053 ; inline +: key-keypad-slash HEX: 0054 ; inline +: key-keypad-asterisk HEX: 0055 ; inline +: key-keypad-dash HEX: 0056 ; inline +: key-keypad-plus HEX: 0057 ; inline +: key-keypad-enter HEX: 0058 ; inline +: key-keypad-1 HEX: 0059 ; inline +: key-keypad-2 HEX: 005a ; inline +: key-keypad-3 HEX: 005b ; inline +: key-keypad-4 HEX: 005c ; inline +: key-keypad-5 HEX: 005d ; inline +: key-keypad-6 HEX: 005e ; inline +: key-keypad-7 HEX: 005f ; inline +: key-keypad-8 HEX: 0060 ; inline +: key-keypad-9 HEX: 0061 ; inline +: key-keypad-0 HEX: 0062 ; inline +: key-keypad-. HEX: 0063 ; inline +: key-\-non-us HEX: 0064 ; inline +: key-application HEX: 0065 ; inline +: key-power HEX: 0066 ; inline +: key-keypad-= HEX: 0067 ; inline +: key-f13 HEX: 0068 ; inline +: key-f14 HEX: 0069 ; inline +: key-f15 HEX: 006a ; inline +: key-f16 HEX: 006b ; inline +: key-f17 HEX: 006c ; inline +: key-f18 HEX: 006d ; inline +: key-f19 HEX: 006e ; inline +: key-f20 HEX: 006f ; inline +: key-f21 HEX: 0070 ; inline +: key-f22 HEX: 0071 ; inline +: key-f23 HEX: 0072 ; inline +: key-f24 HEX: 0073 ; inline +: key-execute HEX: 0074 ; inline +: key-help HEX: 0075 ; inline +: key-menu HEX: 0076 ; inline +: key-select HEX: 0077 ; inline +: key-stop HEX: 0078 ; inline +: key-again HEX: 0079 ; inline +: key-undo HEX: 007a ; inline +: key-cut HEX: 007b ; inline +: key-copy HEX: 007c ; inline +: key-paste HEX: 007d ; inline +: key-find HEX: 007e ; inline +: key-mute HEX: 007f ; inline +: key-volume-up HEX: 0080 ; inline +: key-volume-down HEX: 0081 ; inline +: key-locking-caps-lock HEX: 0082 ; inline +: key-locking-num-lock HEX: 0083 ; inline +: key-locking-scroll-lock HEX: 0084 ; inline +: key-keypad-, HEX: 0085 ; inline +: key-keypad-=-as-400 HEX: 0086 ; inline +: key-international-1 HEX: 0087 ; inline +: key-international-2 HEX: 0088 ; inline +: key-international-3 HEX: 0089 ; inline +: key-international-4 HEX: 008a ; inline +: key-international-5 HEX: 008b ; inline +: key-international-6 HEX: 008c ; inline +: key-international-7 HEX: 008d ; inline +: key-international-8 HEX: 008e ; inline +: key-international-9 HEX: 008f ; inline +: key-lang-1 HEX: 0090 ; inline +: key-lang-2 HEX: 0091 ; inline +: key-lang-3 HEX: 0092 ; inline +: key-lang-4 HEX: 0093 ; inline +: key-lang-5 HEX: 0094 ; inline +: key-lang-6 HEX: 0095 ; inline +: key-lang-7 HEX: 0096 ; inline +: key-lang-8 HEX: 0097 ; inline +: key-lang-9 HEX: 0098 ; inline +: key-alternate-erase HEX: 0099 ; inline +: key-sysreq HEX: 009a ; inline +: key-cancel HEX: 009b ; inline +: key-clear HEX: 009c ; inline +: key-prior HEX: 009d ; inline +: key-return HEX: 009e ; inline +: key-separator HEX: 009f ; inline +: key-out HEX: 00a0 ; inline +: key-oper HEX: 00a1 ; inline +: key-clear HEX: 00a2 ; inline +: key-crsel HEX: 00a3 ; inline +: key-exsel HEX: 00a4 ; inline +: key-left-control HEX: 00e0 ; inline +: key-left-shift HEX: 00e1 ; inline +: key-left-alt HEX: 00e2 ; inline +: key-left-gui HEX: 00e3 ; inline +: key-right-control HEX: 00e4 ; inline +: key-right-shift HEX: 00e5 ; inline +: key-right-alt HEX: 00e6 ; inline +: key-right-gui HEX: 00e7 ; inline From 25ff0b3b1f918aa8185c0f5df1cdfb8ac91ddfc6 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 19 Jul 2008 19:10:30 -0700 Subject: [PATCH 05/34] game-input documentation. bugfixes in game-input.scancodes and game-input.backend.iokit --- extra/game-input/authors.txt | 1 + extra/game-input/backend/authors.txt | 1 + extra/game-input/backend/iokit/authors.txt | 1 + extra/game-input/backend/iokit/iokit.factor | 22 ++-- extra/game-input/backend/iokit/summary.txt | 1 + extra/game-input/backend/iokit/tags.txt | 4 + extra/game-input/backend/summary.txt | 1 + extra/game-input/backend/tags.txt | 3 + extra/game-input/game-input-docs.factor | 118 ++++++++++++++++++ extra/game-input/scancodes/scancodes.factor | 8 +- extra/game-input/summary.txt | 1 + extra/game-input/tags.txt | 3 + extra/math/blas/matrices/matrices-docs.factor | 11 +- 13 files changed, 162 insertions(+), 13 deletions(-) create mode 100644 extra/game-input/authors.txt create mode 100644 extra/game-input/backend/authors.txt create mode 100644 extra/game-input/backend/iokit/authors.txt create mode 100644 extra/game-input/backend/iokit/summary.txt create mode 100644 extra/game-input/backend/iokit/tags.txt create mode 100644 extra/game-input/backend/summary.txt create mode 100644 extra/game-input/backend/tags.txt create mode 100644 extra/game-input/game-input-docs.factor create mode 100644 extra/game-input/summary.txt create mode 100644 extra/game-input/tags.txt diff --git a/extra/game-input/authors.txt b/extra/game-input/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game-input/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game-input/backend/authors.txt b/extra/game-input/backend/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game-input/backend/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game-input/backend/iokit/authors.txt b/extra/game-input/backend/iokit/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game-input/backend/iokit/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index 10e3220b3d..600ab8f170 100644 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -128,7 +128,6 @@ SINGLETON: iokit-game-input-backend : button-value ( value -- f/(0,1] ) IOHIDValueGetIntegerValue dup zero? [ drop f ] when ; -! XXX calibration : axis-value ( value -- [-1,1] ) kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue ; : pov-value ( value -- pov-direction ) @@ -220,6 +219,7 @@ SYMBOLS: +hid-manager+ +keyboard-state+ +controller-states+ ; 256 f +keyboard-state+ set-global ; M: iokit-game-input-backend open-game-input + +hid-manager+ get-global [ "game-input already open" throw ] when hid-manager-matching-game-devices { [ initialize-variables ] [ device-matched-callback f IOHIDManagerRegisterDeviceMatchingCallback ] @@ -235,13 +235,19 @@ M: iokit-game-input-backend open-game-input ! XXX while game-input is open, we need to reset-game-input and open-game-input as a ! boot image hook M: iokit-game-input-backend close-game-input - +hid-manager+ global [ - [ 0 IOHIDManagerClose drop ] - [ CFRelease ] bi - f - ] change-at - f +keyboard-state+ set-global - f +controller-states+ set-global ; + +hid-manager+ get-global [ + +hid-manager+ global [ + [ + CFRunLoopGetMain CFRunLoopDefaultMode + IOHIDManagerUnscheduleFromRunLoop + ] + [ 0 IOHIDManagerClose drop ] + [ CFRelease ] tri + f + ] change-at + f +keyboard-state+ set-global + f +controller-states+ set-global + ] when ; M: iokit-game-input-backend get-controllers ( -- sequence ) +controller-states+ get keys [ controller boa ] map ; diff --git a/extra/game-input/backend/iokit/summary.txt b/extra/game-input/backend/iokit/summary.txt new file mode 100644 index 0000000000..8fc5d827d0 --- /dev/null +++ b/extra/game-input/backend/iokit/summary.txt @@ -0,0 +1 @@ +IOKit HID Manager backend for game-input diff --git a/extra/game-input/backend/iokit/tags.txt b/extra/game-input/backend/iokit/tags.txt new file mode 100644 index 0000000000..b3bc4f873b --- /dev/null +++ b/extra/game-input/backend/iokit/tags.txt @@ -0,0 +1,4 @@ +gamepads +joysticks +mac +input diff --git a/extra/game-input/backend/summary.txt b/extra/game-input/backend/summary.txt new file mode 100644 index 0000000000..6a77f8e1e0 --- /dev/null +++ b/extra/game-input/backend/summary.txt @@ -0,0 +1 @@ +Platform-specific backends for game-input diff --git a/extra/game-input/backend/tags.txt b/extra/game-input/backend/tags.txt new file mode 100644 index 0000000000..48ad1f6141 --- /dev/null +++ b/extra/game-input/backend/tags.txt @@ -0,0 +1,3 @@ +gamepads +joysticks +input diff --git a/extra/game-input/game-input-docs.factor b/extra/game-input/game-input-docs.factor new file mode 100644 index 0000000000..6dab99e948 --- /dev/null +++ b/extra/game-input/game-input-docs.factor @@ -0,0 +1,118 @@ +USING: help.markup help.syntax kernel ui.gestures quotations +sequences strings math ; +IN: game-input + +ARTICLE: "game-input" "Game controller input" +"The " { $vocab-link "game-input" } " vocabulary provides cross-platform access to game controller devices such as joysticks and gamepads. It also provides an interface to for polling raw keyboard input." $nl +"The game input interface must be initialized before being used:" +{ $subsection open-game-input } +{ $subsection close-game-input } +{ $subsection with-game-input } +"Once the game input interface is open, connected controller devices can be enumerated:" +{ $subsection get-controllers } +"These " { $link controller } " objects can be queried of their identity:" +{ $subsection manufacturer } +{ $subsection product } +{ $subsection vendor-id } +{ $subsection product-id } +{ $subsection location-id } +"A hook is provided for invoking the system calibration tool:" +{ $subsection calibrate-controller } +"The current state of a controller or the keyboard can be read:" +{ $subsection read-controller } +{ $subsection read-keyboard } +{ $subsection controller-state } +{ $subsection keyboard-state } ; + +HELP: open-game-input +{ $description "Initializes the game input interface. An exception will be thrown if the initialization fails." } ; + +HELP: close-game-input +{ $description "Closes the game input interface, releasing any allocated resources." } ; + +HELP: with-game-input +{ $values { "quot" quotation } } +{ $description "Initializes the game input interface for the dynamic extent of " { $snippet "quotation" } "." } ; + +{ open-game-input close-game-input with-game-input } related-words + +HELP: get-controllers +{ $values { "sequence" "A " { $link sequence } " of " { $link controller } "s" } } +{ $description "Returns a " { $link sequence } " of " { $link controller } " objects representing the currently connected game controllers." } ; + +HELP: controller +{ $class-description "Objects of this class represent game controller devices such as joysticks and gamepads. They should be treated as opaque by client code." } ; + +HELP: manufacturer +{ $values { "controller" controller } { "string" string } } +{ $description "Returns a human-readable string describing the manufacturer of the game controller device represented by " { $snippet "controller" } "." } ; + +HELP: product +{ $values { "controller" controller } { "string" string } } +{ $description "Returns a human-readable string describing the game controller device represented by " { $snippet "controller" } "." } ; + +HELP: vendor-id +{ $values { "controller" controller } { "integer" integer } } +{ $description "Returns an identifier uniquely representing the manufacturer of the game controller device represented by " { $snippet "controller" } "." } ; + +HELP: product-id +{ $values { "controller" controller } { "integer" integer } } +{ $description "Returns an identifier uniquely representing the kind of game controller device represented by " { $snippet "controller" } "." } ; + +HELP: location-id +{ $values { "controller" controller } { "integer" integer } } +{ $description "Returns an identifier uniquely representing the game controller device represented by " { $snippet "controller" } "'s location in the system." } ; + +{ manufacturer product-id vendor-id product-id location-id } related-words + +HELP: calibrate-controller +{ $values { "controller" controller } } +{ $description "Invokes the operating system's calibration tool for " { $snippet "controller" } ". If the operating system does not have a calibration tool, does nothing." } ; + +HELP: read-controller +{ $values { "controller" controller } { "controller-state" controller-state } } +{ $description "Reads the current state of " { $snippet "controller" } ". See the documentation for the " { $link controller-state } " class for details of the returned value's format." } ; + +{ controller-state controller read-controller } related-words + +HELP: read-keyboard +{ $values { "keyboard-state" keyboard-state } } +{ $description "Reads the current raw state of the keyboard. See the documentation for the " { $link keyboard-state } " class for details on the returned value's format." } +{ $warning "The keyboard state returned by this word is unprocessed by any keymaps, key repeat settings, or other operating environment postprocessing. Because of this, " { $snippet "read-keyboard" } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is necessary; see " { $link "keyboard-gestures" } "." } ; + +HELP: controller-state +{ $class-description "The " { $link read-controller } " word returns objects of this class. " { $snippet "controller-state" } " objects have the following slots:" +{ $list + { { $snippet "x" } " contains the position of the device's X axis." } + { { $snippet "y" } " contains the position of the device's Y axis." } + { { $snippet "z" } " contains the position of the device's Z axis, if any." } + { { $snippet "rx" } " contains the rotational position of the device's X axis, if available." } + { { $snippet "ry" } " contains the rotational position of the device's Y axis, if available." } + { { $snippet "rz" } " contains the rotational position of the device's Z axis, if available." } + { { $snippet "slider" } " contains the position of the device's throttle slider, if any." } + { { $snippet "pov" } " contains the state of the device's POV hat, if any." } + { { $snippet "buttons" } " contains a sequence of values indicating the state of every button on the device." } +} +"The values are formatted as follows:" +{ $list + { "For the axis slots (" { $snippet "x" } ", " { $snippet "y" } ", " { $snippet "z" } ", " { $snippet "rx" } ", " { $snippet "ry" } ", " { $snippet "rz" } "), a " { $link float } " value between -1.0 and 1.0 is returned." } + { "For the " { $snippet "slider" } " slot, a value between 0.0 and 1.0 is returned." } + { "For the " { $snippet "pov" } " slot, one of the following symbols is returned:" { $list + { { $link pov-neutral } } + { { $link pov-up } } + { { $link pov-up-right } } + { { $link pov-right } } + { { $link pov-down-right } } + { { $link pov-down } } + { { $link pov-down-left } } + { { $link pov-left } } + { { $link pov-up-left } } + } } + { "For each element of the " { $snippet "buttons" } " array, " { $link f } " indicates that the corresponding button is released. If the button is pressed, a value between 0.0 and 1.0 is returned indicating the pressure on the button (or simply 1.0 if the device's buttons are on/off only)." } + { "A value of " { $link f } " in any slot (besides the elements of " { $snippet "buttons" } ") indicates that the corresponding axis is not present on the device." } } } ; + +HELP: keyboard-state +{ $class-description "The " { $link read-keyboard } " word returns objects of this class. The " { $snippet "keys" } " slot of a " { $snippet "keyboard-state" } " object contains a " { $link sequence } " of 256 members representing the state of the keys on the keyboard. Each element is a boolean value indicating whether the corresponding key is pressed. The sequence is indexed by scancode as defined under usage page 7 of the USB HID standard. Named scancode constants are provided in the " { $vocab-link "game-input.scancodes" } " vocabulary." } +{ $warning "The scancodes used to index " { $snippet "keyboard-state" } " objects correspond to physical key positions on the keyboard--they are unaffected by keymaps or other operating environment postprocessing. The face value of the constants in " { $vocab-link "game-input.scancodes" } " do not necessarily correspond to what the user expects the key to type. Because of this, " { $link read-keyboard } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is necessary; see " { $link "keyboard-gestures" } "." } ; + +{ keyboard-state read-keyboard } related-words diff --git a/extra/game-input/scancodes/scancodes.factor b/extra/game-input/scancodes/scancodes.factor index 747d883822..5db11845c4 100644 --- a/extra/game-input/scancodes/scancodes.factor +++ b/extra/game-input/scancodes/scancodes.factor @@ -49,7 +49,7 @@ IN: game-input.scancodes : key-= HEX: 002e ; inline : key-[ HEX: 002f ; inline : key-] HEX: 0030 ; inline -: key-/ HEX: 0031 ; inline +: key-\ HEX: 0031 ; inline : key-# HEX: 0032 ; inline : key-; HEX: 0033 ; inline : key-' HEX: 0034 ; inline @@ -158,12 +158,12 @@ IN: game-input.scancodes : key-cancel HEX: 009b ; inline : key-clear HEX: 009c ; inline : key-prior HEX: 009d ; inline -: key-return HEX: 009e ; inline +: key-enter HEX: 009e ; inline : key-separator HEX: 009f ; inline : key-out HEX: 00a0 ; inline : key-oper HEX: 00a1 ; inline -: key-clear HEX: 00a2 ; inline -: key-crsel HEX: 00a3 ; inline +: key-clear-again HEX: 00a2 ; inline +: key-crsel-props HEX: 00a3 ; inline : key-exsel HEX: 00a4 ; inline : key-left-control HEX: 00e0 ; inline : key-left-shift HEX: 00e1 ; inline diff --git a/extra/game-input/summary.txt b/extra/game-input/summary.txt new file mode 100644 index 0000000000..ef479fee55 --- /dev/null +++ b/extra/game-input/summary.txt @@ -0,0 +1 @@ +Cross-platform joystick, gamepad, and raw keyboard input diff --git a/extra/game-input/tags.txt b/extra/game-input/tags.txt new file mode 100644 index 0000000000..ae360e1776 --- /dev/null +++ b/extra/game-input/tags.txt @@ -0,0 +1,3 @@ +joysticks +gamepads +input diff --git a/extra/math/blas/matrices/matrices-docs.factor b/extra/math/blas/matrices/matrices-docs.factor index 0d9ac69171..ddd72a4a39 100644 --- a/extra/math/blas/matrices/matrices-docs.factor +++ b/extra/math/blas/matrices/matrices-docs.factor @@ -34,7 +34,16 @@ ARTICLE: "math.blas-types" "BLAS interface types" { $subsection } "For the simple case of creating a dense, zero-filled vector or matrix, simple empty object constructors are provided:" { $subsection } -{ $subsection } ; +{ $subsection } +"BLAS vectors and matrices can also be constructed from other Factor sequences:" +{ $subsection >float-blas-vector } +{ $subsection >double-blas-vector } +{ $subsection >float-complex-blas-vector } +{ $subsection >double-complex-blas-vector } +{ $subsection >float-blas-matrix } +{ $subsection >double-blas-matrix } +{ $subsection >float-complex-blas-matrix } +{ $subsection >double-complex-blas-matrix } ; ARTICLE: "math.blas.matrices" "BLAS interface matrix operations" "Transposing and slicing matrices:" From 816294f4fcb592050d39ae6b6d436d56fb3723e0 Mon Sep 17 00:00:00 2001 From: "U-VICTORIA\\Administrator" Date: Sun, 20 Jul 2008 18:04:47 -0700 Subject: [PATCH 06/34] Seeds of DirectInput backend for game-input --- extra/combinators/lib/lib.factor | 9 ++ extra/game-input/backend/dinput/authors.txt | 1 + extra/game-input/backend/dinput/dinput.factor | 151 ++++++++++++++++++ extra/game-input/backend/dinput/summary.txt | 1 + extra/game-input/backend/dinput/tags.txt | 4 + extra/game-input/backend/iokit/iokit.factor | 16 +- extra/game-input/game-input-docs.factor | 58 +++---- extra/game-input/game-input.factor | 19 ++- .../windows/dinput/constants/constants.factor | 2 +- extra/windows/dinput/dinput.factor | 24 +-- extra/windows/user32/user32.factor | 28 +++- 11 files changed, 258 insertions(+), 55 deletions(-) create mode 100755 extra/game-input/backend/dinput/authors.txt create mode 100755 extra/game-input/backend/dinput/dinput.factor create mode 100755 extra/game-input/backend/dinput/summary.txt create mode 100755 extra/game-input/backend/dinput/tags.txt mode change 100644 => 100755 extra/game-input/backend/iokit/iokit.factor mode change 100644 => 100755 extra/game-input/game-input-docs.factor mode change 100644 => 100755 extra/game-input/game-input.factor diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index 4af12a9ad6..7262d77e87 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -8,6 +8,15 @@ generalizations macros continuations locals ; IN: combinators.lib +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Currying cleave combinators +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: bi+ ( obj quot quot -- quot' quot' ) + [ [ curry ] curry ] bi@ bi ; +: tri+ ( obj quot quot quot -- quot' quot' quot' ) + [ [ curry ] curry ] tri@ tri ; + ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Generalized versions of core combinators ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/extra/game-input/backend/dinput/authors.txt b/extra/game-input/backend/dinput/authors.txt new file mode 100755 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game-input/backend/dinput/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game-input/backend/dinput/dinput.factor b/extra/game-input/backend/dinput/dinput.factor new file mode 100755 index 0000000000..594d6ef123 --- /dev/null +++ b/extra/game-input/backend/dinput/dinput.factor @@ -0,0 +1,151 @@ +USING: windows.dinput windows.dinput.constants game-input +symbols alien.c-types windows.ole32 namespaces assocs kernel +arrays hashtables windows.kernel32 windows.com windows.dinput +shuffle windows.user32 windows.messages sequences combinators +math.geometry.rect ui.windows accessors math windows ; +IN: game-input.backend.dinput + +SINGLETON: dinput-game-input-backend + +SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ + +device-change-window+ +device-change-handle+ ; + +: create-dinput ( -- ) + f GetModuleHandle DIRECTINPUT_VERSION IDirectInput8W-iid + f [ f DirectInput8Create ole32-error ] keep *void* + +dinput+ set-global ; + +: delete-dinput ( -- ) + +dinput+ global [ com-release f ] change-at ; + +: device-for-guid ( guid -- device ) + +dinput+ get swap f + [ f IDirectInput8W::CreateDevice ole32-error ] keep *void* ; + +: configure-keyboard ( keyboard -- keyboard ) + ; +: configure-controller ( controller -- controller ) + ; + +: find-keyboard ( -- ) + GUID_SysKeyboard get device-for-guid + configure-keyboard + +keyboard-device+ set-global ; + +: controller-device? ( device -- ? ) + "DIDEVICEINSTANCEW" + "DIDEVICEINSTANCEW" heap-size over set-DIDEVICEINSTANCEW-dwSize + [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep + DIDEVICEINSTANCEW-dwDevType GET_DIDEVICE_TYPE + DI8DEVTYPE_KEYBOARD DI8DEVTYPE_MOUSE 2array member? not ; + +: device-attached? ( guid -- ? ) + +dinput+ get swap IDirectInput8W::GetDeviceStatus + [ ole32-error ] [ S_OK = ] bi ; + +: add-controller ( guid -- ) + [ device-for-guid configure-controller ] + [ "GUID" heap-size memory>byte-array ] bi + [ +controller-devices+ get set-at ] + [ drop com-release ] if ; + +: remove-controller ( guid -- ) + "GUID" heap-size memory>byte-array + +controller-devices+ get [ com-release f ] change-at ; + +: find-controller-callback ( -- alien ) + [ ! ( lpddi pvRef -- ? ) + drop DIDEVICEINSTANCEW-guidInstance add-controller + DIENUM_CONTINUE + ] LPDIENUMDEVICESCALLBACKW ; + +: find-controllers ( -- ) + 4 +controller-devices+ set-global + +dinput+ get DI8DEVCLASS_GAMECTRL find-controller-callback + f DIEDFL_ATTACHEDONLY IDirectInput8W::EnumDevices ole32-error ; + +: find-device ( DEV_BROADCAST_DEVICEW -- guid/f ) + +dinput+ get swap + [ DEV_BROADCAST_DEVICEW-dbcc_classguid ] + [ DEV_BROADCAST_DEVICEW-dbcc_name ] bi + f + [ IDirectInput8W::FindDevice ] keep *void* + swap succeeded? [ drop f ] unless ; + +: find-and-add-device ( DEV_BROADCAST_DEVICEW -- ) + find-device [ add-controller ] when* ; +: find-and-remove-detached-devices ( -- ) + +controller-devices+ get [ + drop dup device-attached? [ drop ] [ remove-controller ] if + ] assoc-each ; + +: device-interface? ( dbt-broadcast-hdr -- ? ) + DEV_BROADCAST_HDR-dbch_devicetype DBT_DEVTYP_DEVICEINTERFACE = ; + +: device-arrived ( dbt-broadcast-hdr -- ) + dup device-interface? [ find-and-add-device ] [ drop ] if ; + +: device-removed ( dbt-broadcast-hdr -- ) + device-interface? [ find-and-remove-detached-devices ] when ; + +: handle-wm-devicechange ( hWnd uMsg wParam lParam -- ) + [ 2drop ] 2dip swap { + { [ dup DBT_DEVICEARRIVAL = ] [ drop device-arrived ] } + { [ dup DBT_DEVICEREMOVECOMPLETE = ] [ drop device-removed ] } + [ 2drop ] + } cond ; + +TUPLE: window-rect < rect window-loc ; +: ( -- window-rect ) + window-rect new + { 0 0 } >>window-loc + { 0 0 } >>loc + { 0 0 } >>dim ; + +: (device-notification-filter) ( -- DEV_BROADCAST_DEVICEW ) + "DEV_BROADCAST_DEVICEW" + "DEV_BROADCAST_DEVICEW" heap-size over set-DEV_BROADCAST_DEVICEW-dbcc_size + DBT_DEVTYP_DEVICEINTERFACE over set-DEV_BROADCAST_DEVICEW-dbcc_devicetype ; + +: create-device-change-window ( -- ) + create-window + [ + (device-notification-filter) + DEVICE_NOTIFY_WINDOW_HANDLE DEVICE_NOTIFY_ALL_INTERFACE_CLASSES bitor + RegisterDeviceNotification + +device-change-handle+ set-global + ] + [ +device-change-window+ set-global ] bi ; + +: close-device-change-window ( -- ) + +device-change-handle+ global + [ UnregisterDeviceNotification drop f ] change-at + +device-change-window+ global + [ DestroyWindow win32-error=0/f f ] change-at ; + +: add-wm-devicechange ( -- ) + create-device-change-window + [ 4dup handle-wm-devicechange DefWindowProc ] WM_DEVICECHANGE add-wm-handler ; + +: remove-wm-devicechange ( -- ) + WM_DEVICECHANGE wm-handlers get-global delete-at + close-device-change-window ; + +: release-controllers ( -- ) + +controller-devices+ global [ + [ nip com-release ] assoc-each f + ] change-at ; + +: release-keyboard ( -- ) + +keyboard-device+ global [ com-release f ] change-at ; + +M: dinput-game-input-backend open-game-input + create-dinput + find-keyboard + find-controllers ; + +M: dinput-game-input-backend close-game-input + release-controllers + release-keyboard + delete-dinput ; + diff --git a/extra/game-input/backend/dinput/summary.txt b/extra/game-input/backend/dinput/summary.txt new file mode 100755 index 0000000000..f758a5f83a --- /dev/null +++ b/extra/game-input/backend/dinput/summary.txt @@ -0,0 +1 @@ +DirectInput backend for game-input diff --git a/extra/game-input/backend/dinput/tags.txt b/extra/game-input/backend/dinput/tags.txt new file mode 100755 index 0000000000..70912457cb --- /dev/null +++ b/extra/game-input/backend/dinput/tags.txt @@ -0,0 +1,4 @@ +input +gamepads +joysticks +windows diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor old mode 100644 new mode 100755 index 600ab8f170..2aa228a35c --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -252,15 +252,15 @@ M: iokit-game-input-backend close-game-input M: iokit-game-input-backend get-controllers ( -- sequence ) +controller-states+ get keys [ controller boa ] map ; -M: iokit-game-input-backend manufacturer ( controller -- string ) - handle>> kIOHIDManufacturerKey device-property ; -M: iokit-game-input-backend product ( controller -- string ) - handle>> kIOHIDProductKey device-property ; -M: iokit-game-input-backend vendor-id ( controller -- integer ) - handle>> kIOHIDVendorIDKey device-property ; +M: iokit-game-input-backend product-string ( controller -- string ) + handle>> + [ kIOHIDManufacturerKey device-property ] + [ kIOHIDProductKey device-property ] bi 2array " " join ; M: iokit-game-input-backend product-id ( controller -- integer ) - handle>> kIOHIDProductIDKey device-property ; -M: iokit-game-input-backend location-id ( controller -- integer ) + handle>> + [ kIOHIDVendorIDKey device-property ] + [ kIOHIDProductIDKey device-property ] bi 2array ; +M: iokit-game-input-backend instance-id ( controller -- integer ) handle>> kIOHIDLocationIDKey device-property ; M: iokit-game-input-backend read-controller ( controller -- controller-state ) diff --git a/extra/game-input/game-input-docs.factor b/extra/game-input/game-input-docs.factor old mode 100644 new mode 100755 index 6dab99e948..f74c135110 --- a/extra/game-input/game-input-docs.factor +++ b/extra/game-input/game-input-docs.factor @@ -3,19 +3,19 @@ sequences strings math ; IN: game-input ARTICLE: "game-input" "Game controller input" -"The " { $vocab-link "game-input" } " vocabulary provides cross-platform access to game controller devices such as joysticks and gamepads. It also provides an interface to for polling raw keyboard input." $nl +"The " { $vocab-link "game-input" } " vocabulary provides cross-platform access to game controller devices such as joysticks and gamepads. It also provides an interface for polling raw keyboard input." $nl "The game input interface must be initialized before being used:" { $subsection open-game-input } { $subsection close-game-input } { $subsection with-game-input } "Once the game input interface is open, connected controller devices can be enumerated:" { $subsection get-controllers } +{ $subsection find-controller-products } +{ $subsection find-controller-instance } "These " { $link controller } " objects can be queried of their identity:" -{ $subsection manufacturer } -{ $subsection product } -{ $subsection vendor-id } +{ $subsection product-string } { $subsection product-id } -{ $subsection location-id } +{ $subsection instance-id } "A hook is provided for invoking the system calibration tool:" { $subsection calibrate-controller } "The current state of a controller or the keyboard can be read:" @@ -28,7 +28,7 @@ HELP: open-game-input { $description "Initializes the game input interface. An exception will be thrown if the initialization fails." } ; HELP: close-game-input -{ $description "Closes the game input interface, releasing any allocated resources." } ; +{ $description "Closes the game input interface, releasing any allocated resources. Once this word is called, any remaining " { $link controller } " objects are invalid." } ; HELP: with-game-input { $values { "quot" quotation } } @@ -38,47 +38,47 @@ HELP: with-game-input HELP: get-controllers { $values { "sequence" "A " { $link sequence } " of " { $link controller } "s" } } -{ $description "Returns a " { $link sequence } " of " { $link controller } " objects representing the currently connected game controllers." } ; +{ $description "Returns a " { $link sequence } " of " { $link controller } " objects representing the currently connected game controllers. The order of the controller objects in the sequence is not significant or guaranteed to be stable between calls to " { $snippet "get-controllers" } "." } ; + +HELP: find-controller-products +{ $values { "product-id" "A product ID as returned by " { $link product-id } } { "sequence" "A " { $link sequence } " of " { $link controller } "s" } } +{ $description "Returns a " { $link sequence } " of " { $link controller } " objects representing the currently connected game controllers with the given " { $link product-id } ". The order of the controller objects in the sequence is not significant or guaranteed to be stable between calls to " { $snippet "find-controller-products" } "." } ; + +HELP: find-controller-instance +{ $values { "product-id" "A product ID as returned by " { $link product-id } } { "instance-id" "An instance ID as returned by " { $link instance-id } "." } { "controller/f" "A " { $link controller } " object, or " { $link f } } } +{ $description "Returns the " { $link controller } " instance identified by " { $snippet "product-id" } " and " { $snippet "instance-id" } ". If the identified device is not currently attached, " { $link f } " is returned." } ; HELP: controller { $class-description "Objects of this class represent game controller devices such as joysticks and gamepads. They should be treated as opaque by client code." } ; -HELP: manufacturer +HELP: product-string { $values { "controller" controller } { "string" string } } -{ $description "Returns a human-readable string describing the manufacturer of the game controller device represented by " { $snippet "controller" } "." } ; - -HELP: product -{ $values { "controller" controller } { "string" string } } -{ $description "Returns a human-readable string describing the game controller device represented by " { $snippet "controller" } "." } ; - -HELP: vendor-id -{ $values { "controller" controller } { "integer" integer } } -{ $description "Returns an identifier uniquely representing the manufacturer of the game controller device represented by " { $snippet "controller" } "." } ; +{ $description "Returns a human-readable string describing the game controller device represented by " { $snippet "controller" } ". This string is not necessarily unique to the product or instance; to uniquely identify the device, see " { $link product-id } " and " { $link instance-id } "." } ; HELP: product-id -{ $values { "controller" controller } { "integer" integer } } -{ $description "Returns an identifier uniquely representing the kind of game controller device represented by " { $snippet "controller" } "." } ; +{ $values { "controller" controller } { "id" "A unique identifier" } } +{ $description "Returns an identifier uniquely representing the kind of game controller device represented by " { $snippet "controller" } ". This identifier will be the same for devices of the same make and manufacturer. The type of the identifier value is platform-specific, but equivalent " { $snippet "product-id" } "s are guaranteed to be testable with the " { $link = } " word. The identifier can be used to find devices of the same kind with the " { $link find-controller-products } " word." } ; -HELP: location-id -{ $values { "controller" controller } { "integer" integer } } -{ $description "Returns an identifier uniquely representing the game controller device represented by " { $snippet "controller" } "'s location in the system." } ; +HELP: instance-id +{ $values { "controller" controller } { "id" "A unique identifier" } } +{ $description "Returns an identifier uniquely representing the game controller device represented by " { $snippet "controller" } ". This identifier paired with the device's " { $link product-id } " provides a unique identifier for a particular device that persists between reboots (but not necessarily between computers). This unique identifier can be used to find the same device again with the " { $snippet find-controller-instance } " word. Depending on the platform, the instance-id may change if the device is plugged into a different port. The type of the identifier value is platform-specific, but equivalent " { $snippet instance-id } "s are guaranteed to be testable with the " { $link = } " word." } ; -{ manufacturer product-id vendor-id product-id location-id } related-words +{ product-string product-id instance-id find-controller-products find-controller-instance } related-words HELP: calibrate-controller { $values { "controller" controller } } -{ $description "Invokes the operating system's calibration tool for " { $snippet "controller" } ". If the operating system does not have a calibration tool, does nothing." } ; +{ $description "Invokes the operating system's calibration tool for " { $snippet "controller" } ". If the operating system does not have a calibration tool, this word does nothing." } ; HELP: read-controller { $values { "controller" controller } { "controller-state" controller-state } } -{ $description "Reads the current state of " { $snippet "controller" } ". See the documentation for the " { $link controller-state } " class for details of the returned value's format." } ; +{ $description "Reads the current state of " { $snippet "controller" } ". See the documentation for the " { $link controller-state } " class for details of the returned value's format. If the device is no longer available, " { $link f } " is returned." } ; { controller-state controller read-controller } related-words HELP: read-keyboard { $values { "keyboard-state" keyboard-state } } { $description "Reads the current raw state of the keyboard. See the documentation for the " { $link keyboard-state } " class for details on the returned value's format." } -{ $warning "The keyboard state returned by this word is unprocessed by any keymaps, key repeat settings, or other operating environment postprocessing. Because of this, " { $snippet "read-keyboard" } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is necessary; see " { $link "keyboard-gestures" } "." } ; +{ $warning "The keyboard state returned by this word is unprocessed by any keymaps, modifier keys, key repeat settings, or other operating environment postprocessing. Because of this, " { $snippet "read-keyboard" } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is needed; see " { $link "keyboard-gestures" } "." } ; HELP: controller-state { $class-description "The " { $link read-controller } " word returns objects of this class. " { $snippet "controller-state" } " objects have the following slots:" @@ -109,10 +109,12 @@ HELP: controller-state { { $link pov-up-left } } } } { "For each element of the " { $snippet "buttons" } " array, " { $link f } " indicates that the corresponding button is released. If the button is pressed, a value between 0.0 and 1.0 is returned indicating the pressure on the button (or simply 1.0 if the device's buttons are on/off only)." } - { "A value of " { $link f } " in any slot (besides the elements of " { $snippet "buttons" } ") indicates that the corresponding axis is not present on the device." } } } ; + { "A value of " { $link f } " in any slot (besides the elements of " { $snippet "buttons" } ") indicates that the corresponding element is not present on the device." } } } ; HELP: keyboard-state { $class-description "The " { $link read-keyboard } " word returns objects of this class. The " { $snippet "keys" } " slot of a " { $snippet "keyboard-state" } " object contains a " { $link sequence } " of 256 members representing the state of the keys on the keyboard. Each element is a boolean value indicating whether the corresponding key is pressed. The sequence is indexed by scancode as defined under usage page 7 of the USB HID standard. Named scancode constants are provided in the " { $vocab-link "game-input.scancodes" } " vocabulary." } -{ $warning "The scancodes used to index " { $snippet "keyboard-state" } " objects correspond to physical key positions on the keyboard--they are unaffected by keymaps or other operating environment postprocessing. The face value of the constants in " { $vocab-link "game-input.scancodes" } " do not necessarily correspond to what the user expects the key to type. Because of this, " { $link read-keyboard } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is necessary; see " { $link "keyboard-gestures" } "." } ; +{ $warning "The scancodes used to index " { $snippet "keyboard-state" } " objects correspond to physical key positions on the keyboard--they are unaffected by keymaps, modifier keys, or other operating environment postprocessing. The face value of the constants in " { $vocab-link "game-input.scancodes" } " do not necessarily correspond to what the user expects the key to type. Because of this, " { $link read-keyboard } " should not be used for text entry purposes. The Factor UI's standard gesture mechanism should be used in cases where the logical meaning of keypresses is needed; see " { $link "keyboard-gestures" } "." } ; { keyboard-state read-keyboard } related-words + +ABOUT: "game-input" diff --git a/extra/game-input/game-input.factor b/extra/game-input/game-input.factor old mode 100644 new mode 100755 index 85a1e2e454..62de2c5a54 --- a/extra/game-input/game-input.factor +++ b/extra/game-input/game-input.factor @@ -1,4 +1,5 @@ -USING: arrays accessors continuations kernel symbols ; +USING: arrays accessors continuations kernel symbols +combinators.lib sequences ; IN: game-input SYMBOL: game-input-backend @@ -22,11 +23,17 @@ SYMBOLS: HOOK: get-controllers game-input-backend ( -- sequence ) -HOOK: manufacturer game-input-backend ( controller -- string ) -HOOK: product game-input-backend ( controller -- string ) -HOOK: vendor-id game-input-backend ( controller -- integer ) -HOOK: product-id game-input-backend ( controller -- integer ) -HOOK: location-id game-input-backend ( controller -- integer ) +HOOK: product-string game-input-backend ( controller -- string ) +HOOK: product-id game-input-backend ( controller -- id ) +HOOK: instance-id game-input-backend ( controller -- id ) + +: find-controller-products ( product-id -- sequence ) + get-controllers [ product-id = ] with filter ; +: find-controller-instance ( product-id instance-id -- controller/f ) + get-controllers [ + [ product-id = ] + [ instance-id = ] bi+ bi* and + ] 2with find nip ; HOOK: read-controller game-input-backend ( controller -- controller-state ) HOOK: calibrate-controller game-input-backend ( controller -- ) diff --git a/extra/windows/dinput/constants/constants.factor b/extra/windows/dinput/constants/constants.factor index f55406395a..2f68e2e5ba 100755 --- a/extra/windows/dinput/constants/constants.factor +++ b/extra/windows/dinput/constants/constants.factor @@ -1,7 +1,7 @@ USING: windows.dinput windows.kernel32 windows.ole32 windows.com windows.com.syntax alien alien.c-types alien.syntax kernel system namespaces combinators sequences symbols fry math accessors macros words quotations -libc continuations generalizations splitting locals assocs ; +libc continuations generalizations splitting locals assocs init ; IN: windows.dinput.constants ! Some global variables aren't provided by the DirectInput DLL (they're in the diff --git a/extra/windows/dinput/dinput.factor b/extra/windows/dinput/dinput.factor index a41f2ed80d..33113c71ee 100755 --- a/extra/windows/dinput/dinput.factor +++ b/extra/windows/dinput/dinput.factor @@ -31,9 +31,11 @@ TYPEDEF: void* LPDIENUMCREATEDEFFECTOBJECTSCALLBACK [ "BOOL" { "LPDIRECTINPUTEFFECT" "LPVOID" } "stdcall" ] dip alien-callback ; inline TYPEDEF: void* LPDIENUMEFFECTSINFILECALLBACK +: LPDIENUMEFFECTSINFILECALLBACK [ "BOOL" { "LPCDIFILEEFFECT" "LPVOID" } "stdcall" ] dip alien-callback ; inline TYPEDEF: void* LPDIENUMDEVICEOBJECTSCALLBACKW +: LPDIENUMDEVICEOBJECTSCALLBACKW [ "BOOL" { "LPCDIDEVICEOBJECTINSTANCE" "LPVOID" } "stdcall" ] dip alien-callback ; inline @@ -389,13 +391,17 @@ FUNCTION: HRESULT DirectInput8Create ( HINSTANCE hinst, DWORD dwVersion, REFIID : DISCL_BACKGROUND HEX: 00000008 ; inline : DISCL_NOWINKEY HEX: 00000010 ; inline -SYMBOL: +dinput+ - -: create-dinput ( -- ) - f GetModuleHandle DIRECTINPUT_VERSION IDirectInput8W-iid - f [ f DirectInput8Create ole32-error ] keep *void* - +dinput+ set ; - -: delete-dinput ( -- ) - +dinput+ [ com-release f ] change ; +: DI8DEVTYPE_DEVICE HEX: 11 ; inline +: DI8DEVTYPE_MOUSE HEX: 12 ; inline +: DI8DEVTYPE_KEYBOARD HEX: 13 ; inline +: DI8DEVTYPE_JOYSTICK HEX: 14 ; inline +: DI8DEVTYPE_GAMEPAD HEX: 15 ; inline +: DI8DEVTYPE_DRIVING HEX: 16 ; inline +: DI8DEVTYPE_FLIGHT HEX: 17 ; inline +: DI8DEVTYPE_1STPERSON HEX: 18 ; inline +: DI8DEVTYPE_DEVICECTRL HEX: 19 ; inline +: DI8DEVTYPE_SCREENPOINTER HEX: 1A ; inline +: DI8DEVTYPE_REMOTE HEX: 1B ; inline +: DI8DEVTYPE_SUPPLEMENTAL HEX: 1C ; inline +: GET_DIDEVICE_TYPE ( dwType -- type ) HEX: FF bitand ; inline diff --git a/extra/windows/user32/user32.factor b/extra/windows/user32/user32.factor index 241eddf9f0..481f00f36b 100755 --- a/extra/windows/user32/user32.factor +++ b/extra/windows/user32/user32.factor @@ -528,6 +528,27 @@ C-STRUCT: TRACKMOUSEEVENT { "DWORD" "dwHoverTime" } ; TYPEDEF: TRACKMOUSEEVENT* LPTRACKMOUSEEVENT +: DBT_DEVICEARRIVAL HEX: 8000 ; inline +: DBT_DEVICEREMOVECOMPLETE HEX: 8004 ; inline + +: DBT_DEVTYP_DEVICEINTERFACE 5 ; inline + +: DEVICE_NOTIFY_WINDOW_HANDLE 0 ; inline +: DEVICE_NOTIFY_SERVICE_HANDLE 1 ; inline + +: DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 4 ; inline + +C-STRUCT: DEV_BROADCAST_HDR + { "DWORD" "dbch_size" } + { "DWORD" "dbch_devicetype" } + { "DWORD" "dbch_reserved" } ; +C-STRUCT: DEV_BROADCAST_DEVICEW + { "DWORD" "dbcc_size" } + { "DWORD" "dbcc_devicetype" } + { "DWORD" "dbcc_reserved" } + { "GUID" "dbcc_classguid" } + { "WCHAR[1]" "dbcc_name" } ; + LIBRARY: user32 FUNCTION: HKL ActivateKeyboardLayout ( HKL hkl, UINT Flags ) ; @@ -1176,8 +1197,9 @@ ALIAS: RegisterClassEx RegisterClassExW ! FUNCTION: RegisterClipboardFormatA ! FUNCTION: RegisterClipboardFormatW -! FUNCTION: RegisterDeviceNotificationA -! FUNCTION: RegisterDeviceNotificationW +FUNCTION: HANDLE RegisterDeviceNotificationA ( HANDLE hRecipient, LPVOID NotificationFilter, DWORD Flags ) ; +FUNCTION: HANDLE RegisterDeviceNotificationW ( HANDLE hRecipient, LPVOID NotificationFilter, DWORD Flags ) ; +ALIAS: RegisterDeviceNotification RegisterDeviceNotificationW ! FUNCTION: RegisterHotKey ! FUNCTION: RegisterLogonProcess ! FUNCTION: RegisterMessagePumpHook @@ -1344,7 +1366,7 @@ FUNCTION: BOOL TranslateMessage ( MSG* lpMsg ) ; ! FUNCTION: UnpackDDElParam FUNCTION: BOOL UnregisterClassW ( LPCWSTR lpClassName, HINSTANCE hInstance ) ; ALIAS: UnregisterClass UnregisterClassW -! FUNCTION: UnregisterDeviceNotification +FUNCTION: BOOL UnregisterDeviceNotification ( HANDLE hDevNotify ) ; ! FUNCTION: UnregisterHotKey ! FUNCTION: UnregisterMessagePumpHook ! FUNCTION: UnregisterUserApiHook From 52fc2cc957cd920e2062db2ac6b48d1155de18dd Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 20 Jul 2008 20:18:03 -0700 Subject: [PATCH 07/34] HID-order keyboard format for DirectInput --- extra/game-input/scancodes/scancodes.factor | 2 +- .../windows/dinput/constants/constants.factor | 274 +++++++++++++++++- extra/windows/dinput/dinput.factor | 163 +++++++++++ 3 files changed, 435 insertions(+), 4 deletions(-) diff --git a/extra/game-input/scancodes/scancodes.factor b/extra/game-input/scancodes/scancodes.factor index 5db11845c4..36e816e376 100644 --- a/extra/game-input/scancodes/scancodes.factor +++ b/extra/game-input/scancodes/scancodes.factor @@ -50,7 +50,7 @@ IN: game-input.scancodes : key-[ HEX: 002f ; inline : key-] HEX: 0030 ; inline : key-\ HEX: 0031 ; inline -: key-# HEX: 0032 ; inline +: key-#-non-us HEX: 0032 ; inline : key-; HEX: 0033 ; inline : key-' HEX: 0034 ; inline : key-` HEX: 0035 ; inline diff --git a/extra/windows/dinput/constants/constants.factor b/extra/windows/dinput/constants/constants.factor index f55406395a..9c1035a31a 100755 --- a/extra/windows/dinput/constants/constants.factor +++ b/extra/windows/dinput/constants/constants.factor @@ -13,7 +13,7 @@ SYMBOLS: GUID_Slider GUID_Button GUID_Key GUID_POV GUID_Unknown GUID_SysMouse GUID_SysKeyboard GUID_Joystick GUID_SysMouseEm GUID_SysMouseEm2 GUID_SysKeyboardEm GUID_SysKeyboardEm2 - c_dfDIKeyboard c_dfDIMouse2 c_dfDIJoystick2 ; + c_dfDIKeyboard c_dfDIKeyboard_HID c_dfDIMouse2 c_dfDIJoystick2 ; ] unless* ] change-at ; +! Not a standard DirectInput format. Included for cross-platform niceness. +! This format returns the keyboard keys in USB HID order rather than Windows +! order +: define-hid-keyboard-format-constant ( -- ) + c_dfDIKeyboard_HID global [ [ + DIDF_RELAXIS + 256 + f { + { GUID_Key f 0 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 1 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 2 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 3 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 4 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_A DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 5 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_B DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 6 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_C DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 7 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_D DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 8 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_E DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 9 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 10 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_G DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 11 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_H DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 12 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_I DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 13 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_J DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 14 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_K DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 15 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_L DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 16 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_M DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 17 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_N DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 18 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_O DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 19 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_P DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 20 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Q DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 21 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_R DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 22 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_S DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 23 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_T DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 24 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_U DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 25 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_V DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 26 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_W DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 27 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_X DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 28 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Y DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 29 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Z DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 30 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 31 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 32 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 33 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 34 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 35 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 36 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 37 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 38 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 39 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 40 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RETURN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 41 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ESCAPE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 42 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACK DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 43 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_TAB DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 44 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SPACE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 45 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MINUS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 46 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_EQUALS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 47 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LBRACKET DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 48 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RBRACKET DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 49 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACKSLASH DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 50 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 51 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SEMICOLON DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 52 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APOSTROPHE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 53 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_GRAVE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 54 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_COMMA DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 55 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PERIOD DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 56 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SLASH DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 57 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CAPITAL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 58 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 59 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 60 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 61 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 62 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 63 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 64 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 65 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 66 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 67 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F10 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 68 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F11 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 69 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F12 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 70 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SYSRQ DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 71 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SCROLL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 72 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PAUSE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 73 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_INSERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 74 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_HOME DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 75 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PRIOR DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 76 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DELETE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 77 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_END DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 78 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NEXT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 79 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RIGHT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 80 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LEFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 81 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DOWN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 82 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_UP DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 83 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMLOCK DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 84 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DIVIDE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 85 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MULTIPLY DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 86 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SUBTRACT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 87 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ADD DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 88 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADENTER DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 89 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 90 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 91 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 92 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 93 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 94 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 95 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 96 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 97 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 98 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 99 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DECIMAL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 100 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_OEM_102 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 101 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APPS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 102 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_POWER DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 103 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADEQUALS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 104 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F13 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 105 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F14 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 106 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F15 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 107 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 108 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 109 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 110 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 111 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 112 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 113 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 114 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 115 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 116 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 117 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 118 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 119 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 120 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 121 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 122 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 123 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 124 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 125 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 126 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 127 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MUTE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 128 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEUP DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 129 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEDOWN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 130 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 131 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 132 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 133 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 134 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 135 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 136 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_KANA DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 137 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_YEN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 138 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CONVERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 139 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NOCONVERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 140 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 141 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 142 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 143 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 144 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 145 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 146 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 147 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 148 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 149 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 150 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 151 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 152 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 153 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 154 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 155 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 156 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 157 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 158 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 159 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 160 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 161 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 162 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 163 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 164 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 165 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 166 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 167 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 168 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 169 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 170 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 171 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 172 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 173 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 174 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 175 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 176 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 177 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 178 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 179 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 180 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 181 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 182 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 183 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 184 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 185 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 186 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 187 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 188 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 189 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 190 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 191 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 192 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 193 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 194 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 195 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 196 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 197 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 198 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 199 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 200 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 201 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 202 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 203 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 204 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 205 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 206 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 207 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 208 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 209 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 210 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 211 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 212 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 213 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 214 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 215 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 216 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 217 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 218 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 219 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 220 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 221 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 222 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 223 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 224 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LCONTROL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 225 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LSHIFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 226 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LMENU DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 227 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LWIN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 228 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RCONTROL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 229 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RSHIFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 230 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RMENU DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 231 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RWIN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 232 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 233 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 234 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 235 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 236 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 237 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 238 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 239 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 240 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 241 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 242 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 243 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 244 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 245 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 246 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 247 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 248 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 249 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 250 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 251 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 252 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 253 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 254 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key f 255 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + } + ] unless* ] change-at ; + : define-keyboard-format-constant ( -- ) c_dfDIKeyboard global [ [ DIDF_RELAXIS @@ -558,7 +825,8 @@ MACRO: (flags) ( array -- ) : define-format-constants ( -- ) define-joystick-format-constant define-mouse-format-constant - define-keyboard-format-constant ; + define-keyboard-format-constant + define-hid-keyboard-format-constant ; : define-constants define-guid-constants @@ -576,7 +844,7 @@ define-constants GUID_SysMouseEm2 GUID_SysKeyboardEm GUID_SysKeyboardEm2 } [ global [ [ free ] when* f ] change-at ] each { - c_dfDIKeyboard c_dfDIMouse2 c_dfDIJoystick2 + c_dfDIKeyboard c_dfDIKeyboard_HID c_dfDIMouse2 c_dfDIJoystick2 } [ global [ [ DIDATAFORMAT-rgodf free ] when* f ] change-at ] each ; PRIVATE> diff --git a/extra/windows/dinput/dinput.factor b/extra/windows/dinput/dinput.factor index a41f2ed80d..b1a26689ef 100755 --- a/extra/windows/dinput/dinput.factor +++ b/extra/windows/dinput/dinput.factor @@ -389,6 +389,169 @@ FUNCTION: HRESULT DirectInput8Create ( HINSTANCE hinst, DWORD dwVersion, REFIID : DISCL_BACKGROUND HEX: 00000008 ; inline : DISCL_NOWINKEY HEX: 00000010 ; inline +: DIK_ESCAPE HEX: 01 ; inline +: DIK_1 HEX: 02 ; inline +: DIK_2 HEX: 03 ; inline +: DIK_3 HEX: 04 ; inline +: DIK_4 HEX: 05 ; inline +: DIK_5 HEX: 06 ; inline +: DIK_6 HEX: 07 ; inline +: DIK_7 HEX: 08 ; inline +: DIK_8 HEX: 09 ; inline +: DIK_9 HEX: 0A ; inline +: DIK_0 HEX: 0B ; inline +: DIK_MINUS HEX: 0C ; inline +: DIK_EQUALS HEX: 0D ; inline +: DIK_BACK HEX: 0E ; inline +: DIK_TAB HEX: 0F ; inline +: DIK_Q HEX: 10 ; inline +: DIK_W HEX: 11 ; inline +: DIK_E HEX: 12 ; inline +: DIK_R HEX: 13 ; inline +: DIK_T HEX: 14 ; inline +: DIK_Y HEX: 15 ; inline +: DIK_U HEX: 16 ; inline +: DIK_I HEX: 17 ; inline +: DIK_O HEX: 18 ; inline +: DIK_P HEX: 19 ; inline +: DIK_LBRACKET HEX: 1A ; inline +: DIK_RBRACKET HEX: 1B ; inline +: DIK_RETURN HEX: 1C ; inline +: DIK_LCONTROL HEX: 1D ; inline +: DIK_A HEX: 1E ; inline +: DIK_S HEX: 1F ; inline +: DIK_D HEX: 20 ; inline +: DIK_F HEX: 21 ; inline +: DIK_G HEX: 22 ; inline +: DIK_H HEX: 23 ; inline +: DIK_J HEX: 24 ; inline +: DIK_K HEX: 25 ; inline +: DIK_L HEX: 26 ; inline +: DIK_SEMICOLON HEX: 27 ; inline +: DIK_APOSTROPHE HEX: 28 ; inline +: DIK_GRAVE HEX: 29 ; inline +: DIK_LSHIFT HEX: 2A ; inline +: DIK_BACKSLASH HEX: 2B ; inline +: DIK_Z HEX: 2C ; inline +: DIK_X HEX: 2D ; inline +: DIK_C HEX: 2E ; inline +: DIK_V HEX: 2F ; inline +: DIK_B HEX: 30 ; inline +: DIK_N HEX: 31 ; inline +: DIK_M HEX: 32 ; inline +: DIK_COMMA HEX: 33 ; inline +: DIK_PERIOD HEX: 34 ; inline +: DIK_SLASH HEX: 35 ; inline +: DIK_RSHIFT HEX: 36 ; inline +: DIK_MULTIPLY HEX: 37 ; inline +: DIK_LMENU HEX: 38 ; inline +: DIK_SPACE HEX: 39 ; inline +: DIK_CAPITAL HEX: 3A ; inline +: DIK_F1 HEX: 3B ; inline +: DIK_F2 HEX: 3C ; inline +: DIK_F3 HEX: 3D ; inline +: DIK_F4 HEX: 3E ; inline +: DIK_F5 HEX: 3F ; inline +: DIK_F6 HEX: 40 ; inline +: DIK_F7 HEX: 41 ; inline +: DIK_F8 HEX: 42 ; inline +: DIK_F9 HEX: 43 ; inline +: DIK_F10 HEX: 44 ; inline +: DIK_NUMLOCK HEX: 45 ; inline +: DIK_SCROLL HEX: 46 ; inline +: DIK_NUMPAD7 HEX: 47 ; inline +: DIK_NUMPAD8 HEX: 48 ; inline +: DIK_NUMPAD9 HEX: 49 ; inline +: DIK_SUBTRACT HEX: 4A ; inline +: DIK_NUMPAD4 HEX: 4B ; inline +: DIK_NUMPAD5 HEX: 4C ; inline +: DIK_NUMPAD6 HEX: 4D ; inline +: DIK_ADD HEX: 4E ; inline +: DIK_NUMPAD1 HEX: 4F ; inline +: DIK_NUMPAD2 HEX: 50 ; inline +: DIK_NUMPAD3 HEX: 51 ; inline +: DIK_NUMPAD0 HEX: 52 ; inline +: DIK_DECIMAL HEX: 53 ; inline +: DIK_OEM_102 HEX: 56 ; inline +: DIK_F11 HEX: 57 ; inline +: DIK_F12 HEX: 58 ; inline +: DIK_F13 HEX: 64 ; inline +: DIK_F14 HEX: 65 ; inline +: DIK_F15 HEX: 66 ; inline +: DIK_KANA HEX: 70 ; inline +: DIK_ABNT_C1 HEX: 73 ; inline +: DIK_CONVERT HEX: 79 ; inline +: DIK_NOCONVERT HEX: 7B ; inline +: DIK_YEN HEX: 7D ; inline +: DIK_ABNT_C2 HEX: 7E ; inline +: DIK_NUMPADEQUALS HEX: 8D ; inline +: DIK_PREVTRACK HEX: 90 ; inline +: DIK_AT HEX: 91 ; inline +: DIK_COLON HEX: 92 ; inline +: DIK_UNDERLINE HEX: 93 ; inline +: DIK_KANJI HEX: 94 ; inline +: DIK_STOP HEX: 95 ; inline +: DIK_AX HEX: 96 ; inline +: DIK_UNLABELED HEX: 97 ; inline +: DIK_NEXTTRACK HEX: 99 ; inline +: DIK_NUMPADENTER HEX: 9C ; inline +: DIK_RCONTROL HEX: 9D ; inline +: DIK_MUTE HEX: A0 ; inline +: DIK_CALCULATOR HEX: A1 ; inline +: DIK_PLAYPAUSE HEX: A2 ; inline +: DIK_MEDIASTOP HEX: A4 ; inline +: DIK_VOLUMEDOWN HEX: AE ; inline +: DIK_VOLUMEUP HEX: B0 ; inline +: DIK_WEBHOME HEX: B2 ; inline +: DIK_NUMPADCOMMA HEX: B3 ; inline +: DIK_DIVIDE HEX: B5 ; inline +: DIK_SYSRQ HEX: B7 ; inline +: DIK_RMENU HEX: B8 ; inline +: DIK_PAUSE HEX: C5 ; inline +: DIK_HOME HEX: C7 ; inline +: DIK_UP HEX: C8 ; inline +: DIK_PRIOR HEX: C9 ; inline +: DIK_LEFT HEX: CB ; inline +: DIK_RIGHT HEX: CD ; inline +: DIK_END HEX: CF ; inline +: DIK_DOWN HEX: D0 ; inline +: DIK_NEXT HEX: D1 ; inline +: DIK_INSERT HEX: D2 ; inline +: DIK_DELETE HEX: D3 ; inline +: DIK_LWIN HEX: DB ; inline +: DIK_RWIN HEX: DC ; inline +: DIK_APPS HEX: DD ; inline +: DIK_POWER HEX: DE ; inline +: DIK_SLEEP HEX: DF ; inline +: DIK_WAKE HEX: E3 ; inline +: DIK_WEBSEARCH HEX: E5 ; inline +: DIK_WEBFAVORITES HEX: E6 ; inline +: DIK_WEBREFRESH HEX: E7 ; inline +: DIK_WEBSTOP HEX: E8 ; inline +: DIK_WEBFORWARD HEX: E9 ; inline +: DIK_WEBBACK HEX: EA ; inline +: DIK_MYCOMPUTER HEX: EB ; inline +: DIK_MAIL HEX: EC ; inline +: DIK_MEDIASELECT HEX: ED ; inline + +: DIK_BACKSPACE DIK_BACK ; inline +: DIK_NUMPADSTAR DIK_MULTIPLY ; inline +: DIK_LALT DIK_LMENU ; inline +: DIK_CAPSLOCK DIK_CAPITAL ; inline +: DIK_NUMPADMINUS DIK_SUBTRACT ; inline +: DIK_NUMPADPLUS DIK_ADD ; inline +: DIK_NUMPADPERIOD DIK_DECIMAL ; inline +: DIK_NUMPADSLASH DIK_DIVIDE ; inline +: DIK_RALT DIK_RMENU ; inline +: DIK_UPARROW DIK_UP ; inline +: DIK_PGUP DIK_PRIOR ; inline +: DIK_LEFTARROW DIK_LEFT ; inline +: DIK_RIGHTARROW DIK_RIGHT ; inline +: DIK_DOWNARROW DIK_DOWN ; inline +: DIK_PGDN DIK_NEXT ; inline + +: DIK_CIRCUMFLEX DIK_PREVTRACK ; inline + SYMBOL: +dinput+ : create-dinput ( -- ) From 70d0ea470afb1c585bc273fa020c7fb59e9afb95 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Mon, 21 Jul 2008 21:14:06 -0700 Subject: [PATCH 08/34] dinput property structures --- extra/windows/dinput/dinput.factor | 103 ++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 10 deletions(-) diff --git a/extra/windows/dinput/dinput.factor b/extra/windows/dinput/dinput.factor index 9c8c32f5dd..9dcbb1e645 100755 --- a/extra/windows/dinput/dinput.factor +++ b/extra/windows/dinput/dinput.factor @@ -163,6 +163,49 @@ C-STRUCT: DIPROPHEADER { "DWORD" "dwHow" } ; TYPEDEF: DIPROPHEADER* LPDIPROPHEADER TYPEDEF: DIPROPHEADER* LPCDIPROPHEADER +C-STRUCT: DIPROPDWORD + { "DIPROPHEADER" "diph" } + { "DWORD" "dwData" } ; +TYPEDEF: DIPROPDWORD* LPDIPROPDWORD +TYPEDEF: DIPROPDWORD* LPCDIPROPDWORD +C-STRUCT: DIPROPPOINTER + { "DIPROPHEADER" "diph" } + { "UINT_PTR" "uData" } ; +TYPEDEF: DIPROPPOINTER* LPDIPROPPOINTER +TYPEDEF: DIPROPPOINTER* LPCDIPROPPOINTER +C-STRUCT: DIPROPRANGE + { "DIPROPHEADER" "diph" } + { "LONG" "lMin" } + { "LONG" "lMax" } ; +TYPEDEF: DIPROPRANGE* LPDIPROPRANGE +TYPEDEF: DIPROPRANGE* LPCDIPROPRANGE +C-STRUCT: DIPROPCAL + { "DIPROPHEADER" "diph" } + { "LONG" "lMin" } + { "LONG" "lCenter" } + { "LONG" "lMax" } ; +TYPEDEF: DIPROPCAL* LPDIPROPCAL +TYPEDEF: DIPROPCAL* LPCDIPROPCAL +C-STRUCT: DIPROPGUIDANDPATH + { "DIPROPHEADER" "diph" } + { "GUID" "guidClass" } + { "WCHAR[260]" "wszPath" } ; +TYPEDEF: DIPROPGUIDANDPATH* LPDIPROPGUIDANDPATH +TYPEDEF: DIPROPGUIDANDPATH* LPCDIPROPGUIDANDPATH +C-STRUCT: DIPROPSTRING + { "DIPROPHEADER" "diph" } + { "WCHAR[260]" "wsz" } ; +TYPEDEF: DIPROPSTRING* LPDIPROPSTRING +TYPEDEF: DIPROPSTRING* LPCDIPROPSTRING +C-STRUCT: CPOINT + { "LONG" "lP" } + { "DWORD" "dwLog" } ; +C-STRUCT: DIPROPCPOINTS + { "DIPROPHEADER" "diph" } + { "DWORD" "dwCPointsNum" } + { "CPOINT[8]" "cp" } ; +TYPEDEF: DIPROPCPOINTS* LPDIPROPCPOINTS +TYPEDEF: DIPROPCPOINTS* LPCDIPROPCPOINTS C-STRUCT: DIENVELOPE { "DWORD" "dwSize" } { "DWORD" "dwAttackLevel" } @@ -554,16 +597,6 @@ FUNCTION: HRESULT DirectInput8Create ( HINSTANCE hinst, DWORD dwVersion, REFIID : DIK_CIRCUMFLEX DIK_PREVTRACK ; inline -SYMBOL: +dinput+ - -: create-dinput ( -- ) - f GetModuleHandle DIRECTINPUT_VERSION IDirectInput8W-iid - f [ f DirectInput8Create ole32-error ] keep *void* - +dinput+ set ; - -: delete-dinput ( -- ) - +dinput+ [ com-release f ] change ; - : DI8DEVTYPE_DEVICE HEX: 11 ; inline : DI8DEVTYPE_MOUSE HEX: 12 ; inline : DI8DEVTYPE_KEYBOARD HEX: 13 ; inline @@ -578,3 +611,53 @@ SYMBOL: +dinput+ : DI8DEVTYPE_SUPPLEMENTAL HEX: 1C ; inline : GET_DIDEVICE_TYPE ( dwType -- type ) HEX: FF bitand ; inline + +: DIPROPRANGE_NOMIN HEX: 80000000 ; inline +: DIPROPRANGE_NOMAX HEX: 7FFFFFFF ; inline +: MAXCPOINTSNUM 8 ; inline + +: DIPH_DEVICE 0 ; inline +: DIPH_BYOFFSET 1 ; inline +: DIPH_BYID 2 ; inline +: DIPH_BYUSAGE 3 ; inline + +: DIMAKEUSAGEDWORD ( UsagePage Usage -- DWORD ) 16 shift bitor ; inline + +: DIPROP_BUFFERSIZE 1 ; inline +: DIPROP_AXISMODE 2 ; inline + +: DIPROPAXISMODE_ABS 0 ; inline +: DIPROPAXISMODE_REL 1 ; inline + +: DIPROP_GRANULARITY 3 ; inline +: DIPROP_RANGE 4 ; inline +: DIPROP_DEADZONE 5 ; inline +: DIPROP_SATURATION 6 ; inline +: DIPROP_FFGAIN 7 ; inline +: DIPROP_FFLOAD 8 ; inline +: DIPROP_AUTOCENTER 9 ; inline + +: DIPROPAUTOCENTER_OFF 0 ; inline +: DIPROPAUTOCENTER_ON 1 ; inline + +: DIPROP_CALIBRATIONMODE 10 ; inline + +: DIPROPCALIBRATIONMODE_COOKED 0 ; inline +: DIPROPCALIBRATIONMODE_RAW 1 ; inline + +: DIPROP_CALIBRATION 11 ; inline +: DIPROP_GUIDANDPATH 12 ; inline +: DIPROP_INSTANCENAME 13 ; inline +: DIPROP_PRODUCTNAME 14 ; inline +: DIPROP_JOYSTICKID 15 ; inline +: DIPROP_GETPORTDISPLAYNAME 16 ; inline +: DIPROP_PHYSICALRANGE 18 ; inline +: DIPROP_LOGICALRANGE 19 ; inline +: DIPROP_KEYNAME 20 ; inline +: DIPROP_CPOINTS 21 ; inline +: DIPROP_APPDATA 22 ; inline +: DIPROP_SCANCODE 23 ; inline +: DIPROP_VIDPID 24 ; inline +: DIPROP_USERNAME 25 ; inline +: DIPROP_TYPENAME 26 ; inline + From 045c1ecf7ee1c9b46d85a7868d52f6d9fb54bc52 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 22 Jul 2008 19:55:22 -0700 Subject: [PATCH 09/34] sketch out rest of game-input.backend.dinput --- extra/combinators/lib/lib.factor | 4 +- extra/game-input/backend/dinput/dinput.factor | 106 +++++++++++++++--- extra/game-input/scancodes/authors.txt | 1 + extra/game-input/scancodes/summary.txt | 1 + extra/game-input/scancodes/tags.txt | 2 + extra/iokit/hid/authors.txt | 1 + extra/iokit/hid/summary.txt | 1 + extra/iokit/hid/tags.txt | 3 + 8 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 extra/game-input/scancodes/authors.txt create mode 100644 extra/game-input/scancodes/summary.txt create mode 100644 extra/game-input/scancodes/tags.txt create mode 100644 extra/iokit/hid/authors.txt create mode 100644 extra/iokit/hid/summary.txt create mode 100644 extra/iokit/hid/tags.txt diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index 7262d77e87..34ef318b95 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -13,9 +13,9 @@ IN: combinators.lib ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : bi+ ( obj quot quot -- quot' quot' ) - [ [ curry ] curry ] bi@ bi ; + [ [ curry ] curry ] bi@ bi ; inline : tri+ ( obj quot quot quot -- quot' quot' quot' ) - [ [ curry ] curry ] tri@ tri ; + [ [ curry ] curry ] tri@ tri ; inline ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Generalized versions of core combinators diff --git a/extra/game-input/backend/dinput/dinput.factor b/extra/game-input/backend/dinput/dinput.factor index 594d6ef123..710ba49608 100755 --- a/extra/game-input/backend/dinput/dinput.factor +++ b/extra/game-input/backend/dinput/dinput.factor @@ -2,7 +2,8 @@ USING: windows.dinput windows.dinput.constants game-input symbols alien.c-types windows.ole32 namespaces assocs kernel arrays hashtables windows.kernel32 windows.com windows.dinput shuffle windows.user32 windows.messages sequences combinators -math.geometry.rect ui.windows accessors math windows ; +math.geometry.rect ui.windows accessors math windows +alien.strings io.encodings.utf16 ; IN: game-input.backend.dinput SINGLETON: dinput-game-input-backend @@ -22,20 +23,29 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ +dinput+ get swap f [ f IDirectInput8W::CreateDevice ole32-error ] keep *void* ; +: set-coop-level ( device -- device ) + dup +device-change-window+ get DISCL_BACKGROUND DISCL_NONEXCLUSIVE bitor + IDirectInputDevice8W::SetCooperativeLevel ole32-error ; + : configure-keyboard ( keyboard -- keyboard ) - ; + dup c_dfDIKeyboard_HID IDirectInputDevice8W::SetDataFormat + ole32-error set-coop-level ; : configure-controller ( controller -- controller ) - ; + dup c_dfDIJoystick2 IDirectInputDevice8W::SetDataFormat + ole32-error set-coop-level ; : find-keyboard ( -- ) GUID_SysKeyboard get device-for-guid configure-keyboard +keyboard-device+ set-global ; -: controller-device? ( device -- ? ) +: device-info ( device -- DIDEVICEIMAGEINFOW ) "DIDEVICEINSTANCEW" "DIDEVICEINSTANCEW" heap-size over set-DIDEVICEINSTANCEW-dwSize - [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep + [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep ; + +: controller-device? ( device -- ? ) + device-info DIDEVICEINSTANCEW-dwDevType GET_DIDEVICE_TYPE DI8DEVTYPE_KEYBOARD DI8DEVTYPE_MOUSE 2array member? not ; @@ -43,15 +53,17 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ +dinput+ get swap IDirectInput8W::GetDeviceStatus [ ole32-error ] [ S_OK = ] bi ; +: ( memory -- byte-array ) + "GUID" heap-size memory>byte-array ; + : add-controller ( guid -- ) - [ device-for-guid configure-controller ] - [ "GUID" heap-size memory>byte-array ] bi + [ device-for-guid configure-controller ] [ ] bi + over controller-device? [ +controller-devices+ get set-at ] [ drop com-release ] if ; : remove-controller ( guid -- ) - "GUID" heap-size memory>byte-array - +controller-devices+ get [ com-release f ] change-at ; + +controller-devices+ get [ com-release f ] change-at ; : find-controller-callback ( -- alien ) [ ! ( lpddi pvRef -- ? ) @@ -124,12 +136,11 @@ TUPLE: window-rect < rect window-loc ; [ DestroyWindow win32-error=0/f f ] change-at ; : add-wm-devicechange ( -- ) - create-device-change-window - [ 4dup handle-wm-devicechange DefWindowProc ] WM_DEVICECHANGE add-wm-handler ; + [ 4dup handle-wm-devicechange DefWindowProc ] + WM_DEVICECHANGE add-wm-handler ; : remove-wm-devicechange ( -- ) - WM_DEVICECHANGE wm-handlers get-global delete-at - close-device-change-window ; + WM_DEVICECHANGE wm-handlers get-global delete-at ; : release-controllers ( -- ) +controller-devices+ global [ @@ -137,15 +148,80 @@ TUPLE: window-rect < rect window-loc ; ] change-at ; : release-keyboard ( -- ) - +keyboard-device+ global [ com-release f ] change-at ; + +keyboard-device+ global + [ com-release f ] change-at ; M: dinput-game-input-backend open-game-input create-dinput + create-device-change-window find-keyboard - find-controllers ; + find-controllers + add-wm-devicechange ; M: dinput-game-input-backend close-game-input + remove-wm-devicechange release-controllers release-keyboard + close-device-change-window delete-dinput ; +M: dinput-game-input-backend get-controllers + +controller-devices+ get + [ nip controller boa ] { } assoc>map ; + +M: dinput-game-input-backend product-string + handle>> device-info DIDEVICEINSTANCEW-tszProductName + utf16le alien>string ; + +M: dinput-game-input-backend product-id + handle>> device-info DIDEVICEINSTANCEW-guidProduct ; +M: dinput-game-input-backend instance-id + handle>> device-info DIDEVICEINSTANCEW-guidInstance ; + +: with-acquisition ( device quot -- ) + over IDirectInputDevice8W::Acquire ole32-error + over [ IDirectInputDevice8W::Unacquire ole32-error ] curry + [ ] cleanup ; inline + +: >axis ( long -- float ) + ; +: >slider ( long -- float ) + ; +: >pov ( long -- float ) + ; +: >buttons ( alien -- array ) + 128 memory>byte-array [ HEX: 80 bitand c-bool> ] { } map-as ; + +: ( DIJOYSTATE2 -- controller-state ) + ! XXX only transfer elements that are present on device + { + [ DIJOYSTATE2-lX >axis ] + [ DIJOYSTATE2-lY >axis ] + [ DIJOYSTATE2-lZ >axis ] + [ DIJOYSTATE2-lRx >axis ] + [ DIJOYSTATE2-lRy >axis ] + [ DIJOYSTATE2-lRz >axis ] + [ DIJOYSTATE2-rglSlider *long >slider ] + [ DIJOYSTATE2-rgdwPOV *uint >pov ] + [ DIJOYSTATE2-rgbButtons >buttons ] + } cleave controller-state boa ; + +: ( byte-array -- keyboard-state ) + [ c-bool> ] { } map-as keyboard-state boa ; + +: get-device-state ( device state-size -- byte-array ) + dup + [ IDirectInputDevice8W::GetDeviceState ole32-error ] keep ; + +M: dinput-game-input-backend read-controller + handle>> [ + "DIJOYSTATE2" heap-size get-device-state + ] with-acquisition ; + +M: dinput-game-input-backend calibrate-controller + handle>> f 0 IDirectInputDevice8W::RunControlPanel ole32-error ; + +M: dinput-game-input-backend read-keyboard + +keyboard-device+ get [ + 256 get-device-state + ] with-acquisition ; diff --git a/extra/game-input/scancodes/authors.txt b/extra/game-input/scancodes/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/game-input/scancodes/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/game-input/scancodes/summary.txt b/extra/game-input/scancodes/summary.txt new file mode 100644 index 0000000000..b1bdefeb71 --- /dev/null +++ b/extra/game-input/scancodes/summary.txt @@ -0,0 +1 @@ +Scan code constants for HID keyboards diff --git a/extra/game-input/scancodes/tags.txt b/extra/game-input/scancodes/tags.txt new file mode 100644 index 0000000000..6f4814c59c --- /dev/null +++ b/extra/game-input/scancodes/tags.txt @@ -0,0 +1,2 @@ +keyboard +input diff --git a/extra/iokit/hid/authors.txt b/extra/iokit/hid/authors.txt new file mode 100644 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/iokit/hid/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/iokit/hid/summary.txt b/extra/iokit/hid/summary.txt new file mode 100644 index 0000000000..5b660488a4 --- /dev/null +++ b/extra/iokit/hid/summary.txt @@ -0,0 +1 @@ +HID Manager bindings diff --git a/extra/iokit/hid/tags.txt b/extra/iokit/hid/tags.txt new file mode 100644 index 0000000000..c83070b657 --- /dev/null +++ b/extra/iokit/hid/tags.txt @@ -0,0 +1,3 @@ +mac +bindings +system From 73758b10c19e8376d25889569bb8e8a525fcfc57 Mon Sep 17 00:00:00 2001 From: "U-VICTORIA\\Administrator" Date: Wed, 23 Jul 2008 21:07:47 -0700 Subject: [PATCH 10/34] DirectInput adding, removing, basic reading devices works --- extra/game-input/backend/dinput/dinput.factor | 163 ++- extra/game-input/backend/iokit/iokit.factor | 22 +- extra/iokit/iokit.factor | 0 .../windows/dinput/constants/constants.factor | 1176 ++++++++--------- extra/windows/dinput/dinput.factor | 66 +- extra/windows/ole32/ole32.factor | 12 +- 6 files changed, 759 insertions(+), 680 deletions(-) mode change 100644 => 100755 extra/iokit/iokit.factor diff --git a/extra/game-input/backend/dinput/dinput.factor b/extra/game-input/backend/dinput/dinput.factor index 710ba49608..033656b830 100755 --- a/extra/game-input/backend/dinput/dinput.factor +++ b/extra/game-input/backend/dinput/dinput.factor @@ -2,13 +2,14 @@ USING: windows.dinput windows.dinput.constants game-input symbols alien.c-types windows.ole32 namespaces assocs kernel arrays hashtables windows.kernel32 windows.com windows.dinput shuffle windows.user32 windows.messages sequences combinators -math.geometry.rect ui.windows accessors math windows -alien.strings io.encodings.utf16 ; +math.geometry.rect ui.windows accessors math windows alien +alien.strings io.encodings.utf16 continuations byte-arrays ; IN: game-input.backend.dinput SINGLETON: dinput-game-input-backend -SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ +SYMBOLS: +dinput+ +keyboard-device+ + +controller-devices+ +controller-guids+ +device-change-window+ +device-change-handle+ ; : create-dinput ( -- ) @@ -23,69 +24,104 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ +dinput+ get swap f [ f IDirectInput8W::CreateDevice ole32-error ] keep *void* ; -: set-coop-level ( device -- device ) - dup +device-change-window+ get DISCL_BACKGROUND DISCL_NONEXCLUSIVE bitor +: set-coop-level ( device -- ) + +device-change-window+ get DISCL_BACKGROUND DISCL_NONEXCLUSIVE bitor IDirectInputDevice8W::SetCooperativeLevel ole32-error ; -: configure-keyboard ( keyboard -- keyboard ) - dup c_dfDIKeyboard_HID IDirectInputDevice8W::SetDataFormat - ole32-error set-coop-level ; -: configure-controller ( controller -- controller ) - dup c_dfDIJoystick2 IDirectInputDevice8W::SetDataFormat - ole32-error set-coop-level ; +: set-data-format ( device format-symbol -- ) + get IDirectInputDevice8W::SetDataFormat ole32-error ; + +: configure-keyboard ( keyboard -- ) + [ c_dfDIKeyboard_HID set-data-format ] [ set-coop-level ] bi ; +: configure-controller ( controller -- ) + [ c_dfDIJoystick2 set-data-format ] [ set-coop-level ] bi ; : find-keyboard ( -- ) - GUID_SysKeyboard get device-for-guid - configure-keyboard - +keyboard-device+ set-global ; + GUID_SysKeyboard device-for-guid + [ configure-keyboard ] + [ +keyboard-device+ set-global ] bi ; : device-info ( device -- DIDEVICEIMAGEINFOW ) "DIDEVICEINSTANCEW" "DIDEVICEINSTANCEW" heap-size over set-DIDEVICEINSTANCEW-dwSize [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep ; - -: controller-device? ( device -- ? ) - device-info - DIDEVICEINSTANCEW-dwDevType GET_DIDEVICE_TYPE - DI8DEVTYPE_KEYBOARD DI8DEVTYPE_MOUSE 2array member? not ; - -: device-attached? ( guid -- ? ) - +dinput+ get swap IDirectInput8W::GetDeviceStatus - [ ole32-error ] [ S_OK = ] bi ; +: device-caps ( device -- DIDEVCAPS ) + "DIDEVCAPS" + "DIDEVCAPS" heap-size over set-DIDEVCAPS-dwSize + [ IDirectInputDevice8W::GetCapabilities ole32-error ] keep ; : ( memory -- byte-array ) "GUID" heap-size memory>byte-array ; -: add-controller ( guid -- ) - [ device-for-guid configure-controller ] [ ] bi - over controller-device? - [ +controller-devices+ get set-at ] - [ drop com-release ] if ; +: device-guid ( device -- guid ) + device-info DIDEVICEINSTANCEW-guidInstance ; -: remove-controller ( guid -- ) - +controller-devices+ get [ com-release f ] change-at ; +: device-attached? ( device -- ? ) + +dinput+ get swap device-guid + IDirectInput8W::GetDeviceStatus S_OK = ; + +: find-device-axes-callback ( -- alien ) + [ ! ( lpddoi pvRef -- BOOL ) + +controller-devices+ get at + swap DIDEVICEOBJECTINSTANCEW-guidType { + { [ dup GUID_XAxis = ] [ drop 0.0 >>x ] } + { [ dup GUID_YAxis = ] [ drop 0.0 >>y ] } + { [ dup GUID_ZAxis = ] [ drop 0.0 >>z ] } + { [ dup GUID_RxAxis = ] [ drop 0.0 >>rx ] } + { [ dup GUID_RyAxis = ] [ drop 0.0 >>ry ] } + { [ dup GUID_RzAxis = ] [ drop 0.0 >>rz ] } + { [ dup GUID_Slider = ] [ drop 0.0 >>slider ] } + [ drop ] + } cond drop + DIENUM_CONTINUE + ] LPDIENUMDEVICEOBJECTSCALLBACKW ; + +: find-device-axes ( device controller-state -- controller-state ) + swap [ +controller-devices+ get set-at ] 2keep + find-device-axes-callback over DIDFT_AXIS + IDirectInputDevice8W::EnumObjects ole32-error ; + +: controller-state-template ( device -- controller-state ) + controller-state new + over device-caps + [ DIDEVCAPS-dwButtons f >>buttons ] + [ DIDEVCAPS-dwPOVs zero? f pov-neutral ? >>pov ] bi + find-device-axes ; + +: device-known? ( guid -- ? ) + +controller-guids+ get key? ; inline + +: (add-controller) ( guid -- ) + device-for-guid { + [ configure-controller ] + [ controller-state-template ] + [ dup device-guid +controller-guids+ get set-at ] + [ +controller-devices+ get set-at ] + } cleave ; + +: add-controller ( guid -- ) + dup device-known? [ drop ] [ (add-controller) ] if ; + +: remove-controller ( device -- ) + [ +controller-devices+ get delete-at ] + [ device-guid +controller-guids+ get delete-at ] + [ com-release ] tri ; : find-controller-callback ( -- alien ) - [ ! ( lpddi pvRef -- ? ) + [ ! ( lpddi pvRef -- BOOL ) drop DIDEVICEINSTANCEW-guidInstance add-controller DIENUM_CONTINUE ] LPDIENUMDEVICESCALLBACKW ; : find-controllers ( -- ) - 4 +controller-devices+ set-global +dinput+ get DI8DEVCLASS_GAMECTRL find-controller-callback f DIEDFL_ATTACHEDONLY IDirectInput8W::EnumDevices ole32-error ; -: find-device ( DEV_BROADCAST_DEVICEW -- guid/f ) - +dinput+ get swap - [ DEV_BROADCAST_DEVICEW-dbcc_classguid ] - [ DEV_BROADCAST_DEVICEW-dbcc_name ] bi - f - [ IDirectInput8W::FindDevice ] keep *void* - swap succeeded? [ drop f ] unless ; +: set-up-controllers ( -- ) + 4 +controller-devices+ set-global + 4 +controller-guids+ set-global + find-controllers ; -: find-and-add-device ( DEV_BROADCAST_DEVICEW -- ) - find-device [ add-controller ] when* ; : find-and-remove-detached-devices ( -- ) +controller-devices+ get [ drop dup device-attached? [ drop ] [ remove-controller ] if @@ -95,15 +131,15 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+ DEV_BROADCAST_HDR-dbch_devicetype DBT_DEVTYP_DEVICEINTERFACE = ; : device-arrived ( dbt-broadcast-hdr -- ) - dup device-interface? [ find-and-add-device ] [ drop ] if ; + device-interface? [ find-controllers ] when ; : device-removed ( dbt-broadcast-hdr -- ) device-interface? [ find-and-remove-detached-devices ] when ; : handle-wm-devicechange ( hWnd uMsg wParam lParam -- ) [ 2drop ] 2dip swap { - { [ dup DBT_DEVICEARRIVAL = ] [ drop device-arrived ] } - { [ dup DBT_DEVICEREMOVECOMPLETE = ] [ drop device-removed ] } + { [ dup DBT_DEVICEARRIVAL = ] [ drop device-arrived ] } + { [ dup DBT_DEVICEREMOVECOMPLETE = ] [ drop device-removed ] } [ 2drop ] } cond ; @@ -144,8 +180,9 @@ TUPLE: window-rect < rect window-loc ; : release-controllers ( -- ) +controller-devices+ global [ - [ nip com-release ] assoc-each f - ] change-at ; + [ drop com-release ] assoc-each f + ] change-at + f +controller-guids+ set-global ; : release-keyboard ( -- ) +keyboard-device+ global @@ -155,7 +192,7 @@ M: dinput-game-input-backend open-game-input create-dinput create-device-change-window find-keyboard - find-controllers + set-up-controllers add-wm-devicechange ; M: dinput-game-input-backend close-game-input @@ -167,30 +204,41 @@ M: dinput-game-input-backend close-game-input M: dinput-game-input-backend get-controllers +controller-devices+ get - [ nip controller boa ] { } assoc>map ; + [ drop controller boa ] { } assoc>map ; M: dinput-game-input-backend product-string handle>> device-info DIDEVICEINSTANCEW-tszProductName - utf16le alien>string ; + utf16n alien>string ; M: dinput-game-input-backend product-id handle>> device-info DIDEVICEINSTANCEW-guidProduct ; M: dinput-game-input-backend instance-id - handle>> device-info DIDEVICEINSTANCEW-guidInstance ; + handle>> device-guid ; : with-acquisition ( device quot -- ) over IDirectInputDevice8W::Acquire ole32-error over [ IDirectInputDevice8W::Unacquire ole32-error ] curry [ ] cleanup ; inline +: pov-values + { + pov-up pov-up-right pov-right pov-down-right + pov-down pov-down-left pov-left pov-up-left + } ; inline + +: >keys ( byte-array -- array ) + [ HEX: 80 bitand c-bool> ] { } map-as ; + : >axis ( long -- float ) - ; + 32767 - 32767.0 /f ; : >slider ( long -- float ) - ; -: >pov ( long -- float ) - ; + 65535.0 /f ; +: >pov ( long -- symbol ) + dup HEX: FFFF and HEX: FFFF = + [ drop pov-neutral ] + [ 4500 + 9000 /i pov-values nth ] if ; : >buttons ( alien -- array ) - 128 memory>byte-array [ HEX: 80 bitand c-bool> ] { } map-as ; + 128 memory>byte-array >keys ; : ( DIJOYSTATE2 -- controller-state ) ! XXX only transfer elements that are present on device @@ -207,9 +255,10 @@ M: dinput-game-input-backend instance-id } cleave controller-state boa ; : ( byte-array -- keyboard-state ) - [ c-bool> ] { } map-as keyboard-state boa ; + >keys keyboard-state boa ; : get-device-state ( device state-size -- byte-array ) + [ dup IDirectInputDevice8W::Poll ole32-error ] dip dup [ IDirectInputDevice8W::GetDeviceState ole32-error ] keep ; @@ -225,3 +274,5 @@ M: dinput-game-input-backend read-keyboard +keyboard-device+ get [ 256 get-device-state ] with-acquisition ; + +dinput-game-input-backend game-input-backend set-global diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index 2aa228a35c..3ba6a0a691 100755 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -99,32 +99,32 @@ SINGLETON: iokit-game-input-backend 2array ; : button? ( {usage-page,usage} -- ? ) - first 9 = ; + first 9 = ; inline : keyboard-key? ( {usage-page,usage} -- ? ) - first 7 = ; + first 7 = ; inline : x-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 30 } = ; + { 1 HEX: 30 } = ; inline : y-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 31 } = ; + { 1 HEX: 31 } = ; inline : z-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 32 } = ; + { 1 HEX: 32 } = ; inline : rx-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 33 } = ; + { 1 HEX: 33 } = ; inline : ry-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 34 } = ; + { 1 HEX: 34 } = ; inline : rz-axis? ( {usage-page,usage} -- ? ) - { 1 HEX: 35 } = ; + { 1 HEX: 35 } = ; inline : slider? ( {usage-page,usage} -- ? ) - { 1 HEX: 36 } = ; + { 1 HEX: 36 } = ; inline : hat-switch? ( {usage-page,usage} -- ? ) - { 1 HEX: 39 } = ; + { 1 HEX: 39 } = ; inline : pov-values { pov-up pov-up-right pov-right pov-down-right pov-down pov-down-left pov-left pov-up-left pov-neutral - } ; + } ; inline : button-value ( value -- f/(0,1] ) IOHIDValueGetIntegerValue dup zero? [ drop f ] when ; diff --git a/extra/iokit/iokit.factor b/extra/iokit/iokit.factor old mode 100644 new mode 100755 diff --git a/extra/windows/dinput/constants/constants.factor b/extra/windows/dinput/constants/constants.factor index f0bef81cb0..bd8a0939d3 100755 --- a/extra/windows/dinput/constants/constants.factor +++ b/extra/windows/dinput/constants/constants.factor @@ -8,11 +8,11 @@ IN: windows.dinput.constants ! dinput8.lib import library), so we lovingly hand-craft equivalent values here SYMBOLS: - GUID_XAxis GUID_YAxis GUID_ZAxis - GUID_RxAxis GUID_RyAxis GUID_RzAxis - GUID_Slider GUID_Button GUID_Key GUID_POV GUID_Unknown - GUID_SysMouse GUID_SysKeyboard GUID_Joystick GUID_SysMouseEm - GUID_SysMouseEm2 GUID_SysKeyboardEm GUID_SysKeyboardEm2 + GUID_XAxis_malloced GUID_YAxis_malloced GUID_ZAxis_malloced + GUID_RxAxis_malloced GUID_RyAxis_malloced GUID_RzAxis_malloced + GUID_Slider_malloced GUID_Button_malloced GUID_Key_malloced GUID_POV_malloced GUID_Unknown_malloced + GUID_SysMouse_malloced GUID_SysKeyboard_malloced GUID_Joystick_malloced GUID_SysMouseEm_malloced + GUID_SysMouseEm2_malloced GUID_SysKeyboardEm_malloced GUID_SysKeyboardEm2_malloced c_dfDIKeyboard c_dfDIKeyboard_HID c_dfDIMouse2 c_dfDIJoystick2 ; memory ] bi + , execute [ byte-length malloc ] [ over byte-array>memory ] bi ] unless* ] change-at ; : define-guid-constants ( -- ) { - { GUID_XAxis GUID: {A36D02E0-C9F3-11CF-BFC7-444553540000} } - { GUID_YAxis GUID: {A36D02E1-C9F3-11CF-BFC7-444553540000} } - { GUID_ZAxis GUID: {A36D02E2-C9F3-11CF-BFC7-444553540000} } - { GUID_RxAxis GUID: {A36D02F4-C9F3-11CF-BFC7-444553540000} } - { GUID_RyAxis GUID: {A36D02F5-C9F3-11CF-BFC7-444553540000} } - { GUID_RzAxis GUID: {A36D02E3-C9F3-11CF-BFC7-444553540000} } - { GUID_Slider GUID: {A36D02E4-C9F3-11CF-BFC7-444553540000} } - { GUID_Button GUID: {A36D02F0-C9F3-11CF-BFC7-444553540000} } - { GUID_Key GUID: {55728220-D33C-11CF-BFC7-444553540000} } - { GUID_POV GUID: {A36D02F2-C9F3-11CF-BFC7-444553540000} } - { GUID_Unknown GUID: {A36D02F3-C9F3-11CF-BFC7-444553540000} } - { GUID_SysMouse GUID: {6F1D2B60-D5A0-11CF-BFC7-444553540000} } - { GUID_SysKeyboard GUID: {6F1D2B61-D5A0-11CF-BFC7-444553540000} } - { GUID_Joystick GUID: {6F1D2B70-D5A0-11CF-BFC7-444553540000} } - { GUID_SysMouseEm GUID: {6F1D2B80-D5A0-11CF-BFC7-444553540000} } - { GUID_SysMouseEm2 GUID: {6F1D2B81-D5A0-11CF-BFC7-444553540000} } - { GUID_SysKeyboardEm GUID: {6F1D2B82-D5A0-11CF-BFC7-444553540000} } - { GUID_SysKeyboardEm2 GUID: {6F1D2B83-D5A0-11CF-BFC7-444553540000} } + { GUID_XAxis_malloced GUID_XAxis } + { GUID_YAxis_malloced GUID_YAxis } + { GUID_ZAxis_malloced GUID_ZAxis } + { GUID_RxAxis_malloced GUID_RxAxis } + { GUID_RyAxis_malloced GUID_RyAxis } + { GUID_RzAxis_malloced GUID_RzAxis } + { GUID_Slider_malloced GUID_Slider } + { GUID_Button_malloced GUID_Button } + { GUID_Key_malloced GUID_Key } + { GUID_POV_malloced GUID_POV } + { GUID_Unknown_malloced GUID_Unknown } + { GUID_SysMouse_malloced GUID_SysMouse } + { GUID_SysKeyboard_malloced GUID_SysKeyboard } + { GUID_Joystick_malloced GUID_Joystick } + { GUID_SysMouseEm_malloced GUID_SysMouseEm } + { GUID_SysMouseEm2_malloced GUID_SysMouseEm2 } + { GUID_SysKeyboardEm_malloced GUID_SysKeyboardEm } + { GUID_SysKeyboardEm2_malloced GUID_SysKeyboardEm2 } } [ first2 (malloc-guid-symbol) ] each ; : define-joystick-format-constant ( -- ) @@ -105,18 +105,18 @@ MACRO: (flags) ( array -- ) DIDF_ABSAXIS "DIJOYSTATE2" heap-size "DIJOYSTATE2" { - { GUID_XAxis "lX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_YAxis "lY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_ZAxis "lZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RxAxis "lRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RyAxis "lRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RzAxis "lRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_POV "rgdwPOV" 0 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } - { GUID_POV "rgdwPOV" 1 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } - { GUID_POV "rgdwPOV" 2 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } - { GUID_POV "rgdwPOV" 3 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } + { GUID_XAxis_malloced "lX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_YAxis_malloced "lY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_ZAxis_malloced "lZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RxAxis_malloced "lRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RyAxis_malloced "lRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RzAxis_malloced "lRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_POV_malloced "rgdwPOV" 0 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } + { GUID_POV_malloced "rgdwPOV" 1 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } + { GUID_POV_malloced "rgdwPOV" 2 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } + { GUID_POV_malloced "rgdwPOV" 3 { DIDFT_OPTIONAL DIDFT_POV DIDFT_ANYINSTANCE } 0 } { f "rgbButtons" 0 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } { f "rgbButtons" 1 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } { f "rgbButtons" 2 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } @@ -245,30 +245,30 @@ MACRO: (flags) ( array -- ) { f "rgbButtons" 125 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } { f "rgbButtons" 126 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } { f "rgbButtons" 127 { DIDFT_OPTIONAL DIDFT_BUTTON DIDFT_ANYINSTANCE } 0 } - { GUID_XAxis "lVX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_YAxis "lVY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_ZAxis "lVZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RxAxis "lVRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RyAxis "lVRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RzAxis "lVRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglVSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglVSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_XAxis "lAX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_YAxis "lAY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_ZAxis "lAZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RxAxis "lARx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RyAxis "lARy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RzAxis "lARz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglASlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglASlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_XAxis "lFX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_YAxis "lFY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_ZAxis "lFZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RxAxis "lFRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RyAxis "lFRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_RzAxis "lFRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglFSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } - { GUID_Slider "rglFSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_XAxis_malloced "lVX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_YAxis_malloced "lVY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_ZAxis_malloced "lVZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RxAxis_malloced "lVRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RyAxis_malloced "lVRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RzAxis_malloced "lVRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglVSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglVSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_XAxis_malloced "lAX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_YAxis_malloced "lAY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_ZAxis_malloced "lAZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RxAxis_malloced "lARx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RyAxis_malloced "lARy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RzAxis_malloced "lARz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglASlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglASlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_XAxis_malloced "lFX" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_YAxis_malloced "lFY" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_ZAxis_malloced "lFZ" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RxAxis_malloced "lFRx" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RyAxis_malloced "lFRy" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_RzAxis_malloced "lFRz" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglFSlider" 0 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } + { GUID_Slider_malloced "rglFSlider" 1 { DIDFT_OPTIONAL DIDFT_AXIS DIDFT_ANYINSTANCE } 0 } } ] unless* ] change-at ; @@ -277,17 +277,17 @@ MACRO: (flags) ( array -- ) DIDF_RELAXIS "DIMOUSESTATE2" heap-size "DIMOUSESTATE2" { - { GUID_XAxis "lX" 0 { DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } - { GUID_YAxis "lY" 0 { DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } - { GUID_ZAxis "lZ" 0 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } - { GUID_Button "rgbButtons" 0 { DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 1 { DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 2 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 3 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 4 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 5 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 6 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } - { GUID_Button "rgbButtons" 7 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_XAxis_malloced "lX" 0 { DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } + { GUID_YAxis_malloced "lY" 0 { DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } + { GUID_ZAxis_malloced "lZ" 0 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_AXIS } 0 } + { GUID_Button_malloced "rgbButtons" 0 { DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 1 { DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 2 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 3 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 4 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 5 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 6 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } + { GUID_Button_malloced "rgbButtons" 7 { DIDFT_OPTIONAL DIDFT_ANYINSTANCE DIDFT_BUTTON } 0 } } ] unless* ] change-at ; @@ -299,262 +299,262 @@ MACRO: (flags) ( array -- ) DIDF_RELAXIS 256 f { - { GUID_Key f 0 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 1 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 2 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 3 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 4 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_A DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 5 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_B DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 6 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_C DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 7 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_D DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 8 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_E DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 9 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 10 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_G DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 11 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_H DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 12 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_I DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 13 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_J DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 14 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_K DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 15 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_L DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 16 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_M DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 17 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_N DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 18 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_O DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 19 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_P DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 20 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Q DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 21 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_R DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 22 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_S DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 23 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_T DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 24 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_U DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 25 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_V DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 26 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_W DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 27 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_X DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 28 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Y DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 29 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Z DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 30 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_1 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 31 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_2 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 32 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_3 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 33 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_4 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 34 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_5 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 35 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_6 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 36 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_7 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 37 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_8 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 38 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_9 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 39 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 40 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RETURN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 41 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ESCAPE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 42 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACK DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 43 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_TAB DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 44 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SPACE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 45 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MINUS DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 46 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_EQUALS DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 47 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LBRACKET DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 48 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RBRACKET DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 49 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACKSLASH DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 50 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 51 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SEMICOLON DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 52 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APOSTROPHE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 53 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_GRAVE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 54 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_COMMA DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 55 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PERIOD DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 56 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SLASH DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 57 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CAPITAL DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 58 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F1 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 59 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F2 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 60 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F3 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 61 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F4 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 62 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F5 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 63 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F6 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 64 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F7 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 65 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F8 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 66 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F9 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 67 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F10 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 68 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F11 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 69 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F12 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 70 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SYSRQ DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 71 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SCROLL DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 72 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PAUSE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 73 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_INSERT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 74 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_HOME DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 75 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PRIOR DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 76 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DELETE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 77 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_END DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 78 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NEXT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 79 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RIGHT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 80 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LEFT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 81 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DOWN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 82 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_UP DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 83 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMLOCK DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 84 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DIVIDE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 85 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MULTIPLY DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 86 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SUBTRACT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 87 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ADD DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 88 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADENTER DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 89 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD1 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 90 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD2 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 91 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD3 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 92 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD4 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 93 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD5 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 94 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD6 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 95 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD7 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 96 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD8 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 97 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD9 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 98 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 99 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DECIMAL DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 100 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_OEM_102 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 101 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APPS DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 102 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_POWER DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 103 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADEQUALS DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 104 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F13 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 105 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F14 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 106 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F15 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 107 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 108 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 109 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 110 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 111 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 112 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 113 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 114 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 115 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 116 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 117 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 118 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 119 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 120 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 121 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 122 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 123 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 124 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 125 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 126 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 127 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MUTE DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 128 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEUP DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 129 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEDOWN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 130 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 131 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 132 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 133 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C2 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 134 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 135 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C1 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 136 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_KANA DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 137 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_YEN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 138 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CONVERT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 139 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NOCONVERT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 140 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 141 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 142 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 143 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 144 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 145 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 146 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 147 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 148 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 149 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 150 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 151 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 152 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 153 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 154 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 155 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 156 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 157 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 158 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 159 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 160 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 161 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 162 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 163 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 164 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 165 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 166 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 167 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 168 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 169 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 170 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 171 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 172 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 173 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 174 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 175 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 176 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 177 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 178 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 179 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 180 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 181 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 182 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 183 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 184 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 185 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 186 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 187 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 188 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 189 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 190 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 191 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 192 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 193 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 194 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 195 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 196 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 197 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 198 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 199 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 200 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 201 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 202 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 203 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 204 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 205 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 206 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 207 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 208 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 209 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 210 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 211 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 212 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 213 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 214 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 215 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 216 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 217 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 218 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 219 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 220 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 221 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 222 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 223 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 224 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LCONTROL DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 225 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LSHIFT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 226 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LMENU DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 227 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LWIN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 228 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RCONTROL DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 229 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RSHIFT DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 230 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RMENU DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 231 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RWIN DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 232 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 233 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 234 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 235 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 236 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 237 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 238 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 239 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 240 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 241 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 242 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 243 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 244 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 245 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 246 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 247 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 248 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 249 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 250 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 251 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 252 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 253 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 254 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 255 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 0 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 1 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 2 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 3 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 4 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_A DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 5 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_B DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 6 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_C DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 7 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_D DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 8 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_E DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 9 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 10 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_G DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 11 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_H DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 12 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_I DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 13 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_J DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 14 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_K DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 15 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_L DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 16 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_M DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 17 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_N DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 18 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_O DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 19 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_P DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 20 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Q DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 21 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_R DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 22 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_S DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 23 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_T DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 24 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_U DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 25 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_V DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 26 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_W DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 27 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_X DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 28 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Y DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 29 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_Z DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 30 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 31 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 32 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 33 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 34 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 35 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 36 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 37 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 38 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 39 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 40 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RETURN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 41 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ESCAPE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 42 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACK DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 43 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_TAB DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 44 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SPACE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 45 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MINUS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 46 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_EQUALS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 47 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LBRACKET DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 48 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RBRACKET DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 49 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_BACKSLASH DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 50 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 51 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SEMICOLON DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 52 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APOSTROPHE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 53 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_GRAVE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 54 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_COMMA DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 55 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PERIOD DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 56 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SLASH DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 57 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CAPITAL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 58 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 59 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 60 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 61 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 62 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 63 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 64 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 65 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 66 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 67 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F10 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 68 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F11 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 69 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F12 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 70 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SYSRQ DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 71 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SCROLL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 72 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PAUSE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 73 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_INSERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 74 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_HOME DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 75 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_PRIOR DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 76 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DELETE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 77 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_END DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 78 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NEXT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 79 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RIGHT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 80 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LEFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 81 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DOWN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 82 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_UP DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 83 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMLOCK DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 84 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DIVIDE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 85 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MULTIPLY DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 86 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_SUBTRACT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 87 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ADD DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 88 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADENTER DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 89 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 90 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 91 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 92 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 93 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 94 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 95 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 96 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 97 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 98 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPAD0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 99 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_DECIMAL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 100 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_OEM_102 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 101 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_APPS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 102 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_POWER DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 103 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NUMPADEQUALS DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 104 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F13 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 105 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F14 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 106 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_F15 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 107 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 108 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 109 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 110 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 111 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 112 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 113 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 114 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 115 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 116 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 117 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 118 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 119 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 120 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 121 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 122 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 123 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 124 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 125 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 126 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 127 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_MUTE DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 128 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEUP DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 129 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_VOLUMEDOWN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 130 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 131 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 132 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 133 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 134 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 135 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_ABNT_C1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 136 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_KANA DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 137 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_YEN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 138 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_CONVERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 139 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_NOCONVERT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 140 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 141 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 142 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 143 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 144 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 145 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 146 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 147 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 148 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 149 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 150 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 151 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 152 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 153 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 154 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 155 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 156 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 157 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 158 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 159 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 160 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 161 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 162 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 163 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 164 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 165 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 166 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 167 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 168 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 169 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 170 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 171 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 172 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 173 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 174 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 175 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 176 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 177 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 178 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 179 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 180 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 181 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 182 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 183 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 184 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 185 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 186 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 187 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 188 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 189 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 190 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 191 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 192 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 193 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 194 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 195 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 196 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 197 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 198 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 199 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 200 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 201 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 202 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 203 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 204 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 205 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 206 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 207 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 208 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 209 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 210 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 211 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 212 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 213 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 214 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 215 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 216 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 217 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 218 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 219 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 220 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 221 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 222 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 223 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 224 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LCONTROL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 225 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LSHIFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 226 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LMENU DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 227 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_LWIN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 228 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RCONTROL DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 229 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RSHIFT DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 230 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RMENU DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 231 { DIDFT_OPTIONAL DIDFT_BUTTON [ DIK_RWIN DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 232 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 233 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 234 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 235 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 236 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 237 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 238 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 239 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 240 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 241 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 242 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 243 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 244 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 245 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 246 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 247 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 248 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 249 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 250 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 251 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 252 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 253 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 254 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 255 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } } ] unless* ] change-at ; @@ -563,262 +563,262 @@ MACRO: (flags) ( array -- ) DIDF_RELAXIS 256 f { - { GUID_Key f 0 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 1 { DIDFT_OPTIONAL DIDFT_BUTTON [ 1 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 2 { DIDFT_OPTIONAL DIDFT_BUTTON [ 2 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 3 { DIDFT_OPTIONAL DIDFT_BUTTON [ 3 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 4 { DIDFT_OPTIONAL DIDFT_BUTTON [ 4 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 5 { DIDFT_OPTIONAL DIDFT_BUTTON [ 5 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 6 { DIDFT_OPTIONAL DIDFT_BUTTON [ 6 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 7 { DIDFT_OPTIONAL DIDFT_BUTTON [ 7 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 8 { DIDFT_OPTIONAL DIDFT_BUTTON [ 8 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 9 { DIDFT_OPTIONAL DIDFT_BUTTON [ 9 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 10 { DIDFT_OPTIONAL DIDFT_BUTTON [ 10 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 11 { DIDFT_OPTIONAL DIDFT_BUTTON [ 11 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 12 { DIDFT_OPTIONAL DIDFT_BUTTON [ 12 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 13 { DIDFT_OPTIONAL DIDFT_BUTTON [ 13 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 14 { DIDFT_OPTIONAL DIDFT_BUTTON [ 14 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 15 { DIDFT_OPTIONAL DIDFT_BUTTON [ 15 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 16 { DIDFT_OPTIONAL DIDFT_BUTTON [ 16 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 17 { DIDFT_OPTIONAL DIDFT_BUTTON [ 17 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 18 { DIDFT_OPTIONAL DIDFT_BUTTON [ 18 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 19 { DIDFT_OPTIONAL DIDFT_BUTTON [ 19 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 20 { DIDFT_OPTIONAL DIDFT_BUTTON [ 20 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 21 { DIDFT_OPTIONAL DIDFT_BUTTON [ 21 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 22 { DIDFT_OPTIONAL DIDFT_BUTTON [ 22 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 23 { DIDFT_OPTIONAL DIDFT_BUTTON [ 23 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 24 { DIDFT_OPTIONAL DIDFT_BUTTON [ 24 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 25 { DIDFT_OPTIONAL DIDFT_BUTTON [ 25 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 26 { DIDFT_OPTIONAL DIDFT_BUTTON [ 26 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 27 { DIDFT_OPTIONAL DIDFT_BUTTON [ 27 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 28 { DIDFT_OPTIONAL DIDFT_BUTTON [ 28 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 29 { DIDFT_OPTIONAL DIDFT_BUTTON [ 29 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 30 { DIDFT_OPTIONAL DIDFT_BUTTON [ 30 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 31 { DIDFT_OPTIONAL DIDFT_BUTTON [ 31 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 32 { DIDFT_OPTIONAL DIDFT_BUTTON [ 32 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 33 { DIDFT_OPTIONAL DIDFT_BUTTON [ 33 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 34 { DIDFT_OPTIONAL DIDFT_BUTTON [ 34 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 35 { DIDFT_OPTIONAL DIDFT_BUTTON [ 35 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 36 { DIDFT_OPTIONAL DIDFT_BUTTON [ 36 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 37 { DIDFT_OPTIONAL DIDFT_BUTTON [ 37 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 38 { DIDFT_OPTIONAL DIDFT_BUTTON [ 38 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 39 { DIDFT_OPTIONAL DIDFT_BUTTON [ 39 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 40 { DIDFT_OPTIONAL DIDFT_BUTTON [ 40 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 41 { DIDFT_OPTIONAL DIDFT_BUTTON [ 41 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 42 { DIDFT_OPTIONAL DIDFT_BUTTON [ 42 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 43 { DIDFT_OPTIONAL DIDFT_BUTTON [ 43 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 44 { DIDFT_OPTIONAL DIDFT_BUTTON [ 44 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 45 { DIDFT_OPTIONAL DIDFT_BUTTON [ 45 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 46 { DIDFT_OPTIONAL DIDFT_BUTTON [ 46 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 47 { DIDFT_OPTIONAL DIDFT_BUTTON [ 47 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 48 { DIDFT_OPTIONAL DIDFT_BUTTON [ 48 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 49 { DIDFT_OPTIONAL DIDFT_BUTTON [ 49 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 50 { DIDFT_OPTIONAL DIDFT_BUTTON [ 50 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 51 { DIDFT_OPTIONAL DIDFT_BUTTON [ 51 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 52 { DIDFT_OPTIONAL DIDFT_BUTTON [ 52 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 53 { DIDFT_OPTIONAL DIDFT_BUTTON [ 53 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 54 { DIDFT_OPTIONAL DIDFT_BUTTON [ 54 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 55 { DIDFT_OPTIONAL DIDFT_BUTTON [ 55 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 56 { DIDFT_OPTIONAL DIDFT_BUTTON [ 56 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 57 { DIDFT_OPTIONAL DIDFT_BUTTON [ 57 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 58 { DIDFT_OPTIONAL DIDFT_BUTTON [ 58 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 59 { DIDFT_OPTIONAL DIDFT_BUTTON [ 59 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 60 { DIDFT_OPTIONAL DIDFT_BUTTON [ 60 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 61 { DIDFT_OPTIONAL DIDFT_BUTTON [ 61 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 62 { DIDFT_OPTIONAL DIDFT_BUTTON [ 62 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 63 { DIDFT_OPTIONAL DIDFT_BUTTON [ 63 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 64 { DIDFT_OPTIONAL DIDFT_BUTTON [ 64 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 65 { DIDFT_OPTIONAL DIDFT_BUTTON [ 65 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 66 { DIDFT_OPTIONAL DIDFT_BUTTON [ 66 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 67 { DIDFT_OPTIONAL DIDFT_BUTTON [ 67 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 68 { DIDFT_OPTIONAL DIDFT_BUTTON [ 68 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 69 { DIDFT_OPTIONAL DIDFT_BUTTON [ 69 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 70 { DIDFT_OPTIONAL DIDFT_BUTTON [ 70 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 71 { DIDFT_OPTIONAL DIDFT_BUTTON [ 71 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 72 { DIDFT_OPTIONAL DIDFT_BUTTON [ 72 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 73 { DIDFT_OPTIONAL DIDFT_BUTTON [ 73 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 74 { DIDFT_OPTIONAL DIDFT_BUTTON [ 74 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 75 { DIDFT_OPTIONAL DIDFT_BUTTON [ 75 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 76 { DIDFT_OPTIONAL DIDFT_BUTTON [ 76 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 77 { DIDFT_OPTIONAL DIDFT_BUTTON [ 77 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 78 { DIDFT_OPTIONAL DIDFT_BUTTON [ 78 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 79 { DIDFT_OPTIONAL DIDFT_BUTTON [ 79 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 80 { DIDFT_OPTIONAL DIDFT_BUTTON [ 80 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 81 { DIDFT_OPTIONAL DIDFT_BUTTON [ 81 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 82 { DIDFT_OPTIONAL DIDFT_BUTTON [ 82 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 83 { DIDFT_OPTIONAL DIDFT_BUTTON [ 83 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 84 { DIDFT_OPTIONAL DIDFT_BUTTON [ 84 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 85 { DIDFT_OPTIONAL DIDFT_BUTTON [ 85 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 86 { DIDFT_OPTIONAL DIDFT_BUTTON [ 86 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 87 { DIDFT_OPTIONAL DIDFT_BUTTON [ 87 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 88 { DIDFT_OPTIONAL DIDFT_BUTTON [ 88 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 89 { DIDFT_OPTIONAL DIDFT_BUTTON [ 89 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 90 { DIDFT_OPTIONAL DIDFT_BUTTON [ 90 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 91 { DIDFT_OPTIONAL DIDFT_BUTTON [ 91 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 92 { DIDFT_OPTIONAL DIDFT_BUTTON [ 92 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 93 { DIDFT_OPTIONAL DIDFT_BUTTON [ 93 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 94 { DIDFT_OPTIONAL DIDFT_BUTTON [ 94 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 95 { DIDFT_OPTIONAL DIDFT_BUTTON [ 95 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 96 { DIDFT_OPTIONAL DIDFT_BUTTON [ 96 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 97 { DIDFT_OPTIONAL DIDFT_BUTTON [ 97 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 98 { DIDFT_OPTIONAL DIDFT_BUTTON [ 98 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 99 { DIDFT_OPTIONAL DIDFT_BUTTON [ 99 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 100 { DIDFT_OPTIONAL DIDFT_BUTTON [ 100 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 101 { DIDFT_OPTIONAL DIDFT_BUTTON [ 101 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 102 { DIDFT_OPTIONAL DIDFT_BUTTON [ 102 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 103 { DIDFT_OPTIONAL DIDFT_BUTTON [ 103 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 104 { DIDFT_OPTIONAL DIDFT_BUTTON [ 104 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 105 { DIDFT_OPTIONAL DIDFT_BUTTON [ 105 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 106 { DIDFT_OPTIONAL DIDFT_BUTTON [ 106 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 107 { DIDFT_OPTIONAL DIDFT_BUTTON [ 107 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 108 { DIDFT_OPTIONAL DIDFT_BUTTON [ 108 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 109 { DIDFT_OPTIONAL DIDFT_BUTTON [ 109 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 110 { DIDFT_OPTIONAL DIDFT_BUTTON [ 110 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 111 { DIDFT_OPTIONAL DIDFT_BUTTON [ 111 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 112 { DIDFT_OPTIONAL DIDFT_BUTTON [ 112 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 113 { DIDFT_OPTIONAL DIDFT_BUTTON [ 113 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 114 { DIDFT_OPTIONAL DIDFT_BUTTON [ 114 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 115 { DIDFT_OPTIONAL DIDFT_BUTTON [ 115 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 116 { DIDFT_OPTIONAL DIDFT_BUTTON [ 116 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 117 { DIDFT_OPTIONAL DIDFT_BUTTON [ 117 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 118 { DIDFT_OPTIONAL DIDFT_BUTTON [ 118 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 119 { DIDFT_OPTIONAL DIDFT_BUTTON [ 119 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 120 { DIDFT_OPTIONAL DIDFT_BUTTON [ 120 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 121 { DIDFT_OPTIONAL DIDFT_BUTTON [ 121 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 122 { DIDFT_OPTIONAL DIDFT_BUTTON [ 122 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 123 { DIDFT_OPTIONAL DIDFT_BUTTON [ 123 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 124 { DIDFT_OPTIONAL DIDFT_BUTTON [ 124 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 125 { DIDFT_OPTIONAL DIDFT_BUTTON [ 125 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 126 { DIDFT_OPTIONAL DIDFT_BUTTON [ 126 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 127 { DIDFT_OPTIONAL DIDFT_BUTTON [ 127 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 128 { DIDFT_OPTIONAL DIDFT_BUTTON [ 128 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 129 { DIDFT_OPTIONAL DIDFT_BUTTON [ 129 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 130 { DIDFT_OPTIONAL DIDFT_BUTTON [ 130 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 131 { DIDFT_OPTIONAL DIDFT_BUTTON [ 131 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 132 { DIDFT_OPTIONAL DIDFT_BUTTON [ 132 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 133 { DIDFT_OPTIONAL DIDFT_BUTTON [ 133 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 134 { DIDFT_OPTIONAL DIDFT_BUTTON [ 134 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 135 { DIDFT_OPTIONAL DIDFT_BUTTON [ 135 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 136 { DIDFT_OPTIONAL DIDFT_BUTTON [ 136 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 137 { DIDFT_OPTIONAL DIDFT_BUTTON [ 137 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 138 { DIDFT_OPTIONAL DIDFT_BUTTON [ 138 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 139 { DIDFT_OPTIONAL DIDFT_BUTTON [ 139 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 140 { DIDFT_OPTIONAL DIDFT_BUTTON [ 140 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 141 { DIDFT_OPTIONAL DIDFT_BUTTON [ 141 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 142 { DIDFT_OPTIONAL DIDFT_BUTTON [ 142 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 143 { DIDFT_OPTIONAL DIDFT_BUTTON [ 143 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 144 { DIDFT_OPTIONAL DIDFT_BUTTON [ 144 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 145 { DIDFT_OPTIONAL DIDFT_BUTTON [ 145 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 146 { DIDFT_OPTIONAL DIDFT_BUTTON [ 146 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 147 { DIDFT_OPTIONAL DIDFT_BUTTON [ 147 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 148 { DIDFT_OPTIONAL DIDFT_BUTTON [ 148 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 149 { DIDFT_OPTIONAL DIDFT_BUTTON [ 149 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 150 { DIDFT_OPTIONAL DIDFT_BUTTON [ 150 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 151 { DIDFT_OPTIONAL DIDFT_BUTTON [ 151 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 152 { DIDFT_OPTIONAL DIDFT_BUTTON [ 152 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 153 { DIDFT_OPTIONAL DIDFT_BUTTON [ 153 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 154 { DIDFT_OPTIONAL DIDFT_BUTTON [ 154 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 155 { DIDFT_OPTIONAL DIDFT_BUTTON [ 155 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 156 { DIDFT_OPTIONAL DIDFT_BUTTON [ 156 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 157 { DIDFT_OPTIONAL DIDFT_BUTTON [ 157 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 158 { DIDFT_OPTIONAL DIDFT_BUTTON [ 158 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 159 { DIDFT_OPTIONAL DIDFT_BUTTON [ 159 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 160 { DIDFT_OPTIONAL DIDFT_BUTTON [ 160 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 161 { DIDFT_OPTIONAL DIDFT_BUTTON [ 161 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 162 { DIDFT_OPTIONAL DIDFT_BUTTON [ 162 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 163 { DIDFT_OPTIONAL DIDFT_BUTTON [ 163 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 164 { DIDFT_OPTIONAL DIDFT_BUTTON [ 164 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 165 { DIDFT_OPTIONAL DIDFT_BUTTON [ 165 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 166 { DIDFT_OPTIONAL DIDFT_BUTTON [ 166 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 167 { DIDFT_OPTIONAL DIDFT_BUTTON [ 167 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 168 { DIDFT_OPTIONAL DIDFT_BUTTON [ 168 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 169 { DIDFT_OPTIONAL DIDFT_BUTTON [ 169 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 170 { DIDFT_OPTIONAL DIDFT_BUTTON [ 170 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 171 { DIDFT_OPTIONAL DIDFT_BUTTON [ 171 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 172 { DIDFT_OPTIONAL DIDFT_BUTTON [ 172 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 173 { DIDFT_OPTIONAL DIDFT_BUTTON [ 173 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 174 { DIDFT_OPTIONAL DIDFT_BUTTON [ 174 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 175 { DIDFT_OPTIONAL DIDFT_BUTTON [ 175 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 176 { DIDFT_OPTIONAL DIDFT_BUTTON [ 176 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 177 { DIDFT_OPTIONAL DIDFT_BUTTON [ 177 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 178 { DIDFT_OPTIONAL DIDFT_BUTTON [ 178 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 179 { DIDFT_OPTIONAL DIDFT_BUTTON [ 179 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 180 { DIDFT_OPTIONAL DIDFT_BUTTON [ 180 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 181 { DIDFT_OPTIONAL DIDFT_BUTTON [ 181 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 182 { DIDFT_OPTIONAL DIDFT_BUTTON [ 182 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 183 { DIDFT_OPTIONAL DIDFT_BUTTON [ 183 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 184 { DIDFT_OPTIONAL DIDFT_BUTTON [ 184 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 185 { DIDFT_OPTIONAL DIDFT_BUTTON [ 185 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 186 { DIDFT_OPTIONAL DIDFT_BUTTON [ 186 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 187 { DIDFT_OPTIONAL DIDFT_BUTTON [ 187 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 188 { DIDFT_OPTIONAL DIDFT_BUTTON [ 188 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 189 { DIDFT_OPTIONAL DIDFT_BUTTON [ 189 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 190 { DIDFT_OPTIONAL DIDFT_BUTTON [ 190 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 191 { DIDFT_OPTIONAL DIDFT_BUTTON [ 191 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 192 { DIDFT_OPTIONAL DIDFT_BUTTON [ 192 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 193 { DIDFT_OPTIONAL DIDFT_BUTTON [ 193 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 194 { DIDFT_OPTIONAL DIDFT_BUTTON [ 194 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 195 { DIDFT_OPTIONAL DIDFT_BUTTON [ 195 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 196 { DIDFT_OPTIONAL DIDFT_BUTTON [ 196 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 197 { DIDFT_OPTIONAL DIDFT_BUTTON [ 197 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 198 { DIDFT_OPTIONAL DIDFT_BUTTON [ 198 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 199 { DIDFT_OPTIONAL DIDFT_BUTTON [ 199 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 200 { DIDFT_OPTIONAL DIDFT_BUTTON [ 200 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 201 { DIDFT_OPTIONAL DIDFT_BUTTON [ 201 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 202 { DIDFT_OPTIONAL DIDFT_BUTTON [ 202 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 203 { DIDFT_OPTIONAL DIDFT_BUTTON [ 203 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 204 { DIDFT_OPTIONAL DIDFT_BUTTON [ 204 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 205 { DIDFT_OPTIONAL DIDFT_BUTTON [ 205 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 206 { DIDFT_OPTIONAL DIDFT_BUTTON [ 206 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 207 { DIDFT_OPTIONAL DIDFT_BUTTON [ 207 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 208 { DIDFT_OPTIONAL DIDFT_BUTTON [ 208 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 209 { DIDFT_OPTIONAL DIDFT_BUTTON [ 209 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 210 { DIDFT_OPTIONAL DIDFT_BUTTON [ 210 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 211 { DIDFT_OPTIONAL DIDFT_BUTTON [ 211 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 212 { DIDFT_OPTIONAL DIDFT_BUTTON [ 212 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 213 { DIDFT_OPTIONAL DIDFT_BUTTON [ 213 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 214 { DIDFT_OPTIONAL DIDFT_BUTTON [ 214 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 215 { DIDFT_OPTIONAL DIDFT_BUTTON [ 215 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 216 { DIDFT_OPTIONAL DIDFT_BUTTON [ 216 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 217 { DIDFT_OPTIONAL DIDFT_BUTTON [ 217 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 218 { DIDFT_OPTIONAL DIDFT_BUTTON [ 218 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 219 { DIDFT_OPTIONAL DIDFT_BUTTON [ 219 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 220 { DIDFT_OPTIONAL DIDFT_BUTTON [ 220 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 221 { DIDFT_OPTIONAL DIDFT_BUTTON [ 221 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 222 { DIDFT_OPTIONAL DIDFT_BUTTON [ 222 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 223 { DIDFT_OPTIONAL DIDFT_BUTTON [ 223 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 224 { DIDFT_OPTIONAL DIDFT_BUTTON [ 224 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 225 { DIDFT_OPTIONAL DIDFT_BUTTON [ 225 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 226 { DIDFT_OPTIONAL DIDFT_BUTTON [ 226 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 227 { DIDFT_OPTIONAL DIDFT_BUTTON [ 227 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 228 { DIDFT_OPTIONAL DIDFT_BUTTON [ 228 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 229 { DIDFT_OPTIONAL DIDFT_BUTTON [ 229 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 230 { DIDFT_OPTIONAL DIDFT_BUTTON [ 230 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 231 { DIDFT_OPTIONAL DIDFT_BUTTON [ 231 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 232 { DIDFT_OPTIONAL DIDFT_BUTTON [ 232 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 233 { DIDFT_OPTIONAL DIDFT_BUTTON [ 233 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 234 { DIDFT_OPTIONAL DIDFT_BUTTON [ 234 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 235 { DIDFT_OPTIONAL DIDFT_BUTTON [ 235 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 236 { DIDFT_OPTIONAL DIDFT_BUTTON [ 236 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 237 { DIDFT_OPTIONAL DIDFT_BUTTON [ 237 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 238 { DIDFT_OPTIONAL DIDFT_BUTTON [ 238 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 239 { DIDFT_OPTIONAL DIDFT_BUTTON [ 239 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 240 { DIDFT_OPTIONAL DIDFT_BUTTON [ 240 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 241 { DIDFT_OPTIONAL DIDFT_BUTTON [ 241 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 242 { DIDFT_OPTIONAL DIDFT_BUTTON [ 242 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 243 { DIDFT_OPTIONAL DIDFT_BUTTON [ 243 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 244 { DIDFT_OPTIONAL DIDFT_BUTTON [ 244 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 245 { DIDFT_OPTIONAL DIDFT_BUTTON [ 245 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 246 { DIDFT_OPTIONAL DIDFT_BUTTON [ 246 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 247 { DIDFT_OPTIONAL DIDFT_BUTTON [ 247 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 248 { DIDFT_OPTIONAL DIDFT_BUTTON [ 248 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 249 { DIDFT_OPTIONAL DIDFT_BUTTON [ 249 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 250 { DIDFT_OPTIONAL DIDFT_BUTTON [ 250 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 251 { DIDFT_OPTIONAL DIDFT_BUTTON [ 251 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 252 { DIDFT_OPTIONAL DIDFT_BUTTON [ 252 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 253 { DIDFT_OPTIONAL DIDFT_BUTTON [ 253 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 254 { DIDFT_OPTIONAL DIDFT_BUTTON [ 254 DIDFT_MAKEINSTANCE ] } 0 } - { GUID_Key f 255 { DIDFT_OPTIONAL DIDFT_BUTTON [ 255 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 0 { DIDFT_OPTIONAL DIDFT_BUTTON [ 0 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 1 { DIDFT_OPTIONAL DIDFT_BUTTON [ 1 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 2 { DIDFT_OPTIONAL DIDFT_BUTTON [ 2 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 3 { DIDFT_OPTIONAL DIDFT_BUTTON [ 3 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 4 { DIDFT_OPTIONAL DIDFT_BUTTON [ 4 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 5 { DIDFT_OPTIONAL DIDFT_BUTTON [ 5 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 6 { DIDFT_OPTIONAL DIDFT_BUTTON [ 6 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 7 { DIDFT_OPTIONAL DIDFT_BUTTON [ 7 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 8 { DIDFT_OPTIONAL DIDFT_BUTTON [ 8 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 9 { DIDFT_OPTIONAL DIDFT_BUTTON [ 9 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 10 { DIDFT_OPTIONAL DIDFT_BUTTON [ 10 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 11 { DIDFT_OPTIONAL DIDFT_BUTTON [ 11 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 12 { DIDFT_OPTIONAL DIDFT_BUTTON [ 12 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 13 { DIDFT_OPTIONAL DIDFT_BUTTON [ 13 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 14 { DIDFT_OPTIONAL DIDFT_BUTTON [ 14 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 15 { DIDFT_OPTIONAL DIDFT_BUTTON [ 15 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 16 { DIDFT_OPTIONAL DIDFT_BUTTON [ 16 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 17 { DIDFT_OPTIONAL DIDFT_BUTTON [ 17 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 18 { DIDFT_OPTIONAL DIDFT_BUTTON [ 18 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 19 { DIDFT_OPTIONAL DIDFT_BUTTON [ 19 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 20 { DIDFT_OPTIONAL DIDFT_BUTTON [ 20 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 21 { DIDFT_OPTIONAL DIDFT_BUTTON [ 21 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 22 { DIDFT_OPTIONAL DIDFT_BUTTON [ 22 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 23 { DIDFT_OPTIONAL DIDFT_BUTTON [ 23 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 24 { DIDFT_OPTIONAL DIDFT_BUTTON [ 24 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 25 { DIDFT_OPTIONAL DIDFT_BUTTON [ 25 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 26 { DIDFT_OPTIONAL DIDFT_BUTTON [ 26 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 27 { DIDFT_OPTIONAL DIDFT_BUTTON [ 27 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 28 { DIDFT_OPTIONAL DIDFT_BUTTON [ 28 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 29 { DIDFT_OPTIONAL DIDFT_BUTTON [ 29 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 30 { DIDFT_OPTIONAL DIDFT_BUTTON [ 30 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 31 { DIDFT_OPTIONAL DIDFT_BUTTON [ 31 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 32 { DIDFT_OPTIONAL DIDFT_BUTTON [ 32 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 33 { DIDFT_OPTIONAL DIDFT_BUTTON [ 33 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 34 { DIDFT_OPTIONAL DIDFT_BUTTON [ 34 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 35 { DIDFT_OPTIONAL DIDFT_BUTTON [ 35 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 36 { DIDFT_OPTIONAL DIDFT_BUTTON [ 36 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 37 { DIDFT_OPTIONAL DIDFT_BUTTON [ 37 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 38 { DIDFT_OPTIONAL DIDFT_BUTTON [ 38 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 39 { DIDFT_OPTIONAL DIDFT_BUTTON [ 39 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 40 { DIDFT_OPTIONAL DIDFT_BUTTON [ 40 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 41 { DIDFT_OPTIONAL DIDFT_BUTTON [ 41 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 42 { DIDFT_OPTIONAL DIDFT_BUTTON [ 42 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 43 { DIDFT_OPTIONAL DIDFT_BUTTON [ 43 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 44 { DIDFT_OPTIONAL DIDFT_BUTTON [ 44 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 45 { DIDFT_OPTIONAL DIDFT_BUTTON [ 45 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 46 { DIDFT_OPTIONAL DIDFT_BUTTON [ 46 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 47 { DIDFT_OPTIONAL DIDFT_BUTTON [ 47 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 48 { DIDFT_OPTIONAL DIDFT_BUTTON [ 48 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 49 { DIDFT_OPTIONAL DIDFT_BUTTON [ 49 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 50 { DIDFT_OPTIONAL DIDFT_BUTTON [ 50 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 51 { DIDFT_OPTIONAL DIDFT_BUTTON [ 51 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 52 { DIDFT_OPTIONAL DIDFT_BUTTON [ 52 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 53 { DIDFT_OPTIONAL DIDFT_BUTTON [ 53 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 54 { DIDFT_OPTIONAL DIDFT_BUTTON [ 54 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 55 { DIDFT_OPTIONAL DIDFT_BUTTON [ 55 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 56 { DIDFT_OPTIONAL DIDFT_BUTTON [ 56 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 57 { DIDFT_OPTIONAL DIDFT_BUTTON [ 57 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 58 { DIDFT_OPTIONAL DIDFT_BUTTON [ 58 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 59 { DIDFT_OPTIONAL DIDFT_BUTTON [ 59 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 60 { DIDFT_OPTIONAL DIDFT_BUTTON [ 60 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 61 { DIDFT_OPTIONAL DIDFT_BUTTON [ 61 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 62 { DIDFT_OPTIONAL DIDFT_BUTTON [ 62 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 63 { DIDFT_OPTIONAL DIDFT_BUTTON [ 63 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 64 { DIDFT_OPTIONAL DIDFT_BUTTON [ 64 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 65 { DIDFT_OPTIONAL DIDFT_BUTTON [ 65 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 66 { DIDFT_OPTIONAL DIDFT_BUTTON [ 66 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 67 { DIDFT_OPTIONAL DIDFT_BUTTON [ 67 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 68 { DIDFT_OPTIONAL DIDFT_BUTTON [ 68 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 69 { DIDFT_OPTIONAL DIDFT_BUTTON [ 69 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 70 { DIDFT_OPTIONAL DIDFT_BUTTON [ 70 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 71 { DIDFT_OPTIONAL DIDFT_BUTTON [ 71 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 72 { DIDFT_OPTIONAL DIDFT_BUTTON [ 72 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 73 { DIDFT_OPTIONAL DIDFT_BUTTON [ 73 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 74 { DIDFT_OPTIONAL DIDFT_BUTTON [ 74 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 75 { DIDFT_OPTIONAL DIDFT_BUTTON [ 75 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 76 { DIDFT_OPTIONAL DIDFT_BUTTON [ 76 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 77 { DIDFT_OPTIONAL DIDFT_BUTTON [ 77 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 78 { DIDFT_OPTIONAL DIDFT_BUTTON [ 78 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 79 { DIDFT_OPTIONAL DIDFT_BUTTON [ 79 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 80 { DIDFT_OPTIONAL DIDFT_BUTTON [ 80 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 81 { DIDFT_OPTIONAL DIDFT_BUTTON [ 81 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 82 { DIDFT_OPTIONAL DIDFT_BUTTON [ 82 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 83 { DIDFT_OPTIONAL DIDFT_BUTTON [ 83 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 84 { DIDFT_OPTIONAL DIDFT_BUTTON [ 84 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 85 { DIDFT_OPTIONAL DIDFT_BUTTON [ 85 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 86 { DIDFT_OPTIONAL DIDFT_BUTTON [ 86 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 87 { DIDFT_OPTIONAL DIDFT_BUTTON [ 87 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 88 { DIDFT_OPTIONAL DIDFT_BUTTON [ 88 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 89 { DIDFT_OPTIONAL DIDFT_BUTTON [ 89 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 90 { DIDFT_OPTIONAL DIDFT_BUTTON [ 90 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 91 { DIDFT_OPTIONAL DIDFT_BUTTON [ 91 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 92 { DIDFT_OPTIONAL DIDFT_BUTTON [ 92 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 93 { DIDFT_OPTIONAL DIDFT_BUTTON [ 93 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 94 { DIDFT_OPTIONAL DIDFT_BUTTON [ 94 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 95 { DIDFT_OPTIONAL DIDFT_BUTTON [ 95 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 96 { DIDFT_OPTIONAL DIDFT_BUTTON [ 96 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 97 { DIDFT_OPTIONAL DIDFT_BUTTON [ 97 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 98 { DIDFT_OPTIONAL DIDFT_BUTTON [ 98 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 99 { DIDFT_OPTIONAL DIDFT_BUTTON [ 99 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 100 { DIDFT_OPTIONAL DIDFT_BUTTON [ 100 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 101 { DIDFT_OPTIONAL DIDFT_BUTTON [ 101 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 102 { DIDFT_OPTIONAL DIDFT_BUTTON [ 102 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 103 { DIDFT_OPTIONAL DIDFT_BUTTON [ 103 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 104 { DIDFT_OPTIONAL DIDFT_BUTTON [ 104 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 105 { DIDFT_OPTIONAL DIDFT_BUTTON [ 105 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 106 { DIDFT_OPTIONAL DIDFT_BUTTON [ 106 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 107 { DIDFT_OPTIONAL DIDFT_BUTTON [ 107 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 108 { DIDFT_OPTIONAL DIDFT_BUTTON [ 108 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 109 { DIDFT_OPTIONAL DIDFT_BUTTON [ 109 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 110 { DIDFT_OPTIONAL DIDFT_BUTTON [ 110 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 111 { DIDFT_OPTIONAL DIDFT_BUTTON [ 111 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 112 { DIDFT_OPTIONAL DIDFT_BUTTON [ 112 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 113 { DIDFT_OPTIONAL DIDFT_BUTTON [ 113 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 114 { DIDFT_OPTIONAL DIDFT_BUTTON [ 114 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 115 { DIDFT_OPTIONAL DIDFT_BUTTON [ 115 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 116 { DIDFT_OPTIONAL DIDFT_BUTTON [ 116 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 117 { DIDFT_OPTIONAL DIDFT_BUTTON [ 117 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 118 { DIDFT_OPTIONAL DIDFT_BUTTON [ 118 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 119 { DIDFT_OPTIONAL DIDFT_BUTTON [ 119 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 120 { DIDFT_OPTIONAL DIDFT_BUTTON [ 120 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 121 { DIDFT_OPTIONAL DIDFT_BUTTON [ 121 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 122 { DIDFT_OPTIONAL DIDFT_BUTTON [ 122 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 123 { DIDFT_OPTIONAL DIDFT_BUTTON [ 123 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 124 { DIDFT_OPTIONAL DIDFT_BUTTON [ 124 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 125 { DIDFT_OPTIONAL DIDFT_BUTTON [ 125 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 126 { DIDFT_OPTIONAL DIDFT_BUTTON [ 126 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 127 { DIDFT_OPTIONAL DIDFT_BUTTON [ 127 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 128 { DIDFT_OPTIONAL DIDFT_BUTTON [ 128 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 129 { DIDFT_OPTIONAL DIDFT_BUTTON [ 129 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 130 { DIDFT_OPTIONAL DIDFT_BUTTON [ 130 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 131 { DIDFT_OPTIONAL DIDFT_BUTTON [ 131 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 132 { DIDFT_OPTIONAL DIDFT_BUTTON [ 132 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 133 { DIDFT_OPTIONAL DIDFT_BUTTON [ 133 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 134 { DIDFT_OPTIONAL DIDFT_BUTTON [ 134 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 135 { DIDFT_OPTIONAL DIDFT_BUTTON [ 135 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 136 { DIDFT_OPTIONAL DIDFT_BUTTON [ 136 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 137 { DIDFT_OPTIONAL DIDFT_BUTTON [ 137 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 138 { DIDFT_OPTIONAL DIDFT_BUTTON [ 138 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 139 { DIDFT_OPTIONAL DIDFT_BUTTON [ 139 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 140 { DIDFT_OPTIONAL DIDFT_BUTTON [ 140 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 141 { DIDFT_OPTIONAL DIDFT_BUTTON [ 141 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 142 { DIDFT_OPTIONAL DIDFT_BUTTON [ 142 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 143 { DIDFT_OPTIONAL DIDFT_BUTTON [ 143 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 144 { DIDFT_OPTIONAL DIDFT_BUTTON [ 144 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 145 { DIDFT_OPTIONAL DIDFT_BUTTON [ 145 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 146 { DIDFT_OPTIONAL DIDFT_BUTTON [ 146 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 147 { DIDFT_OPTIONAL DIDFT_BUTTON [ 147 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 148 { DIDFT_OPTIONAL DIDFT_BUTTON [ 148 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 149 { DIDFT_OPTIONAL DIDFT_BUTTON [ 149 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 150 { DIDFT_OPTIONAL DIDFT_BUTTON [ 150 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 151 { DIDFT_OPTIONAL DIDFT_BUTTON [ 151 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 152 { DIDFT_OPTIONAL DIDFT_BUTTON [ 152 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 153 { DIDFT_OPTIONAL DIDFT_BUTTON [ 153 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 154 { DIDFT_OPTIONAL DIDFT_BUTTON [ 154 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 155 { DIDFT_OPTIONAL DIDFT_BUTTON [ 155 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 156 { DIDFT_OPTIONAL DIDFT_BUTTON [ 156 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 157 { DIDFT_OPTIONAL DIDFT_BUTTON [ 157 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 158 { DIDFT_OPTIONAL DIDFT_BUTTON [ 158 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 159 { DIDFT_OPTIONAL DIDFT_BUTTON [ 159 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 160 { DIDFT_OPTIONAL DIDFT_BUTTON [ 160 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 161 { DIDFT_OPTIONAL DIDFT_BUTTON [ 161 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 162 { DIDFT_OPTIONAL DIDFT_BUTTON [ 162 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 163 { DIDFT_OPTIONAL DIDFT_BUTTON [ 163 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 164 { DIDFT_OPTIONAL DIDFT_BUTTON [ 164 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 165 { DIDFT_OPTIONAL DIDFT_BUTTON [ 165 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 166 { DIDFT_OPTIONAL DIDFT_BUTTON [ 166 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 167 { DIDFT_OPTIONAL DIDFT_BUTTON [ 167 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 168 { DIDFT_OPTIONAL DIDFT_BUTTON [ 168 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 169 { DIDFT_OPTIONAL DIDFT_BUTTON [ 169 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 170 { DIDFT_OPTIONAL DIDFT_BUTTON [ 170 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 171 { DIDFT_OPTIONAL DIDFT_BUTTON [ 171 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 172 { DIDFT_OPTIONAL DIDFT_BUTTON [ 172 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 173 { DIDFT_OPTIONAL DIDFT_BUTTON [ 173 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 174 { DIDFT_OPTIONAL DIDFT_BUTTON [ 174 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 175 { DIDFT_OPTIONAL DIDFT_BUTTON [ 175 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 176 { DIDFT_OPTIONAL DIDFT_BUTTON [ 176 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 177 { DIDFT_OPTIONAL DIDFT_BUTTON [ 177 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 178 { DIDFT_OPTIONAL DIDFT_BUTTON [ 178 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 179 { DIDFT_OPTIONAL DIDFT_BUTTON [ 179 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 180 { DIDFT_OPTIONAL DIDFT_BUTTON [ 180 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 181 { DIDFT_OPTIONAL DIDFT_BUTTON [ 181 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 182 { DIDFT_OPTIONAL DIDFT_BUTTON [ 182 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 183 { DIDFT_OPTIONAL DIDFT_BUTTON [ 183 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 184 { DIDFT_OPTIONAL DIDFT_BUTTON [ 184 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 185 { DIDFT_OPTIONAL DIDFT_BUTTON [ 185 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 186 { DIDFT_OPTIONAL DIDFT_BUTTON [ 186 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 187 { DIDFT_OPTIONAL DIDFT_BUTTON [ 187 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 188 { DIDFT_OPTIONAL DIDFT_BUTTON [ 188 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 189 { DIDFT_OPTIONAL DIDFT_BUTTON [ 189 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 190 { DIDFT_OPTIONAL DIDFT_BUTTON [ 190 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 191 { DIDFT_OPTIONAL DIDFT_BUTTON [ 191 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 192 { DIDFT_OPTIONAL DIDFT_BUTTON [ 192 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 193 { DIDFT_OPTIONAL DIDFT_BUTTON [ 193 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 194 { DIDFT_OPTIONAL DIDFT_BUTTON [ 194 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 195 { DIDFT_OPTIONAL DIDFT_BUTTON [ 195 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 196 { DIDFT_OPTIONAL DIDFT_BUTTON [ 196 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 197 { DIDFT_OPTIONAL DIDFT_BUTTON [ 197 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 198 { DIDFT_OPTIONAL DIDFT_BUTTON [ 198 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 199 { DIDFT_OPTIONAL DIDFT_BUTTON [ 199 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 200 { DIDFT_OPTIONAL DIDFT_BUTTON [ 200 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 201 { DIDFT_OPTIONAL DIDFT_BUTTON [ 201 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 202 { DIDFT_OPTIONAL DIDFT_BUTTON [ 202 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 203 { DIDFT_OPTIONAL DIDFT_BUTTON [ 203 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 204 { DIDFT_OPTIONAL DIDFT_BUTTON [ 204 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 205 { DIDFT_OPTIONAL DIDFT_BUTTON [ 205 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 206 { DIDFT_OPTIONAL DIDFT_BUTTON [ 206 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 207 { DIDFT_OPTIONAL DIDFT_BUTTON [ 207 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 208 { DIDFT_OPTIONAL DIDFT_BUTTON [ 208 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 209 { DIDFT_OPTIONAL DIDFT_BUTTON [ 209 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 210 { DIDFT_OPTIONAL DIDFT_BUTTON [ 210 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 211 { DIDFT_OPTIONAL DIDFT_BUTTON [ 211 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 212 { DIDFT_OPTIONAL DIDFT_BUTTON [ 212 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 213 { DIDFT_OPTIONAL DIDFT_BUTTON [ 213 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 214 { DIDFT_OPTIONAL DIDFT_BUTTON [ 214 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 215 { DIDFT_OPTIONAL DIDFT_BUTTON [ 215 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 216 { DIDFT_OPTIONAL DIDFT_BUTTON [ 216 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 217 { DIDFT_OPTIONAL DIDFT_BUTTON [ 217 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 218 { DIDFT_OPTIONAL DIDFT_BUTTON [ 218 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 219 { DIDFT_OPTIONAL DIDFT_BUTTON [ 219 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 220 { DIDFT_OPTIONAL DIDFT_BUTTON [ 220 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 221 { DIDFT_OPTIONAL DIDFT_BUTTON [ 221 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 222 { DIDFT_OPTIONAL DIDFT_BUTTON [ 222 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 223 { DIDFT_OPTIONAL DIDFT_BUTTON [ 223 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 224 { DIDFT_OPTIONAL DIDFT_BUTTON [ 224 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 225 { DIDFT_OPTIONAL DIDFT_BUTTON [ 225 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 226 { DIDFT_OPTIONAL DIDFT_BUTTON [ 226 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 227 { DIDFT_OPTIONAL DIDFT_BUTTON [ 227 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 228 { DIDFT_OPTIONAL DIDFT_BUTTON [ 228 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 229 { DIDFT_OPTIONAL DIDFT_BUTTON [ 229 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 230 { DIDFT_OPTIONAL DIDFT_BUTTON [ 230 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 231 { DIDFT_OPTIONAL DIDFT_BUTTON [ 231 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 232 { DIDFT_OPTIONAL DIDFT_BUTTON [ 232 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 233 { DIDFT_OPTIONAL DIDFT_BUTTON [ 233 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 234 { DIDFT_OPTIONAL DIDFT_BUTTON [ 234 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 235 { DIDFT_OPTIONAL DIDFT_BUTTON [ 235 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 236 { DIDFT_OPTIONAL DIDFT_BUTTON [ 236 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 237 { DIDFT_OPTIONAL DIDFT_BUTTON [ 237 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 238 { DIDFT_OPTIONAL DIDFT_BUTTON [ 238 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 239 { DIDFT_OPTIONAL DIDFT_BUTTON [ 239 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 240 { DIDFT_OPTIONAL DIDFT_BUTTON [ 240 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 241 { DIDFT_OPTIONAL DIDFT_BUTTON [ 241 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 242 { DIDFT_OPTIONAL DIDFT_BUTTON [ 242 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 243 { DIDFT_OPTIONAL DIDFT_BUTTON [ 243 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 244 { DIDFT_OPTIONAL DIDFT_BUTTON [ 244 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 245 { DIDFT_OPTIONAL DIDFT_BUTTON [ 245 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 246 { DIDFT_OPTIONAL DIDFT_BUTTON [ 246 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 247 { DIDFT_OPTIONAL DIDFT_BUTTON [ 247 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 248 { DIDFT_OPTIONAL DIDFT_BUTTON [ 248 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 249 { DIDFT_OPTIONAL DIDFT_BUTTON [ 249 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 250 { DIDFT_OPTIONAL DIDFT_BUTTON [ 250 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 251 { DIDFT_OPTIONAL DIDFT_BUTTON [ 251 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 252 { DIDFT_OPTIONAL DIDFT_BUTTON [ 252 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 253 { DIDFT_OPTIONAL DIDFT_BUTTON [ 253 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 254 { DIDFT_OPTIONAL DIDFT_BUTTON [ 254 DIDFT_MAKEINSTANCE ] } 0 } + { GUID_Key_malloced f 255 { DIDFT_OPTIONAL DIDFT_BUTTON [ 255 DIDFT_MAKEINSTANCE ] } 0 } } ] unless* ] change-at ; @@ -837,11 +837,11 @@ define-constants : free-dinput-constants ( -- ) { - GUID_XAxis GUID_YAxis GUID_ZAxis - GUID_RxAxis GUID_RyAxis GUID_RzAxis - GUID_Slider GUID_Button GUID_Key GUID_POV GUID_Unknown - GUID_SysMouse GUID_SysKeyboard GUID_Joystick GUID_SysMouseEm - GUID_SysMouseEm2 GUID_SysKeyboardEm GUID_SysKeyboardEm2 + GUID_XAxis_malloced GUID_YAxis_malloced GUID_ZAxis_malloced + GUID_RxAxis_malloced GUID_RyAxis_malloced GUID_RzAxis_malloced + GUID_Slider_malloced GUID_Button_malloced GUID_Key_malloced GUID_POV_malloced GUID_Unknown_malloced + GUID_SysMouse_malloced GUID_SysKeyboard_malloced GUID_Joystick_malloced GUID_SysMouseEm_malloced + GUID_SysMouseEm2_malloced GUID_SysKeyboardEm_malloced GUID_SysKeyboardEm2_malloced } [ global [ [ free ] when* f ] change-at ] each { c_dfDIKeyboard c_dfDIKeyboard_HID c_dfDIMouse2 c_dfDIJoystick2 diff --git a/extra/windows/dinput/dinput.factor b/extra/windows/dinput/dinput.factor index 9dcbb1e645..bb9ba622d2 100755 --- a/extra/windows/dinput/dinput.factor +++ b/extra/windows/dinput/dinput.factor @@ -36,7 +36,7 @@ TYPEDEF: void* LPDIENUMEFFECTSINFILECALLBACK dip alien-callback ; inline TYPEDEF: void* LPDIENUMDEVICEOBJECTSCALLBACKW : LPDIENUMDEVICEOBJECTSCALLBACKW - [ "BOOL" { "LPCDIDEVICEOBJECTINSTANCE" "LPVOID" } "stdcall" ] + [ "BOOL" { "LPCDIDEVICEOBJECTINSTANCEW" "LPVOID" } "stdcall" ] dip alien-callback ; inline TYPEDEF: DWORD D3DCOLOR @@ -107,29 +107,35 @@ TYPEDEF: DICONFIGUREDEVICESPARAMSW* LPDICONFIGUREDEVICESPARAMSW TYPEDEF: DICONFIGUREDEVICESPARAMSW* LPDICONFIGUREDEVICESPARAMSW C-STRUCT: DIDEVCAPS - { "DWORD" "wSize" } - { "DWORD" "wFlags" } - { "DWORD" "wDevType" } - { "DWORD" "wAxes" } - { "DWORD" "wButtons" } - { "DWORD" "wPOVs" } - { "DWORD" "wFFSamplePeriod" } - { "DWORD" "wFFMinTimeResolution" } - { "DWORD" "wFirmwareRevision" } - { "DWORD" "wHardwareRevision" } - { "DWORD" "wFFDriverVersion" } ; + { "DWORD" "dwSize" } + { "DWORD" "dwFlags" } + { "DWORD" "dwDevType" } + { "DWORD" "dwAxes" } + { "DWORD" "dwButtons" } + { "DWORD" "dwPOVs" } + { "DWORD" "dwFFSamplePeriod" } + { "DWORD" "dwFFMinTimeResolution" } + { "DWORD" "dwFirmwareRevision" } + { "DWORD" "dwHardwareRevision" } + { "DWORD" "dwFFDriverVersion" } ; TYPEDEF: DIDEVCAPS* LPDIDEVCAPS TYPEDEF: DIDEVCAPS* LPCDIDEVCAPS C-STRUCT: DIDEVICEOBJECTINSTANCEW - { "DWORD" "dwSize" } - { "GUID" "guidInstance" } - { "GUID" "guidProduct" } - { "DWORD" "dwDevType" } - { "WCHAR[260]" "tszInstanceName" } - { "WCHAR[260]" "tszProductName" } - { "GUID" "guidFFDriver" } - { "WORD" "wUsagePage" } - { "WORD" "wUsage" } ; + { "DWORD" "dwSize" } + { "GUID" "guidType" } + { "DWORD" "dwOfs" } + { "DWORD" "dwType" } + { "DWORD" "dwFlags" } + { "WCHAR[260]" "tszName" } + { "DWORD" "dwFFMaxForce" } + { "DWORD" "dwFFForceResolution" } + { "WORD" "wCollectionNumber" } + { "WORD" "wDesignatorIndex" } + { "WORD" "wUsagePage" } + { "WORD" "wUsage" } + { "DWORD" "dwDimension" } + { "WORD" "wExponent" } + { "WORD" "wReportId" } ; TYPEDEF: DIDEVICEOBJECTINSTANCEW* LPDIDEVICEOBJECTINSTANCEW TYPEDEF: DIDEVICEOBJECTINSTANCEW* LPCDIDEVICEOBJECTINSTANCEW C-STRUCT: DIDEVICEOBJECTDATA @@ -661,3 +667,21 @@ FUNCTION: HRESULT DirectInput8Create ( HINSTANCE hinst, DWORD dwVersion, REFIID : DIPROP_USERNAME 25 ; inline : DIPROP_TYPENAME 26 ; inline +: GUID_XAxis GUID: {A36D02E0-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_YAxis GUID: {A36D02E1-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_ZAxis GUID: {A36D02E2-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_RxAxis GUID: {A36D02F4-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_RyAxis GUID: {A36D02F5-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_RzAxis GUID: {A36D02E3-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_Slider GUID: {A36D02E4-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_Button GUID: {A36D02F0-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_Key GUID: {55728220-D33C-11CF-BFC7-444553540000} ; inline +: GUID_POV GUID: {A36D02F2-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_Unknown GUID: {A36D02F3-C9F3-11CF-BFC7-444553540000} ; inline +: GUID_SysMouse GUID: {6F1D2B60-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_SysKeyboard GUID: {6F1D2B61-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_Joystick GUID: {6F1D2B70-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_SysMouseEm GUID: {6F1D2B80-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_SysMouseEm2 GUID: {6F1D2B81-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_SysKeyboardEm GUID: {6F1D2B82-D5A0-11CF-BFC7-444553540000} ; inline +: GUID_SysKeyboardEm2 GUID: {6F1D2B83-D5A0-11CF-BFC7-444553540000} ; inline diff --git a/extra/windows/ole32/ole32.factor b/extra/windows/ole32/ole32.factor index 0e74dcfca3..e33c2e2437 100755 --- a/extra/windows/ole32/ole32.factor +++ b/extra/windows/ole32/ole32.factor @@ -1,5 +1,5 @@ USING: alien alien.syntax alien.c-types alien.strings math -kernel sequences windows windows.types +kernel sequences windows windows.types debugger io accessors math.order ; IN: windows.ole32 @@ -115,10 +115,14 @@ FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ; : succeeded? ( hresult -- ? ) 0 HEX: 7FFFFFFF between? ; +TUPLE: ole32-error error-code ; +C: ole32-error + +M: ole32-error error. + "COM method failed: " print error-code>> (win32-error-string) print ; + : ole32-error ( hresult -- ) - dup succeeded? [ - drop - ] [ (win32-error-string) throw ] if ; + dup succeeded? [ drop ] [ throw ] if ; : ole-initialize ( -- ) f OleInitialize ole32-error ; From ce1eda2fcd946489bfe4314f90d0520fa64da4c0 Mon Sep 17 00:00:00 2001 From: "U-VICTORIA\\Administrator" Date: Wed, 23 Jul 2008 21:35:29 -0700 Subject: [PATCH 11/34] only report the axes actually on the device --- extra/game-input/backend/dinput/dinput.factor | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/extra/game-input/backend/dinput/dinput.factor b/extra/game-input/backend/dinput/dinput.factor index 033656b830..0be5a9832e 100755 --- a/extra/game-input/backend/dinput/dinput.factor +++ b/extra/game-input/backend/dinput/dinput.factor @@ -189,6 +189,7 @@ TUPLE: window-rect < rect window-loc ; [ com-release f ] change-at ; M: dinput-game-input-backend open-game-input + +dinput+ get-global [ "game-input already open" throw ] when create-dinput create-device-change-window find-keyboard @@ -234,25 +235,27 @@ M: dinput-game-input-backend instance-id : >slider ( long -- float ) 65535.0 /f ; : >pov ( long -- symbol ) - dup HEX: FFFF and HEX: FFFF = + dup HEX: FFFF bitand HEX: FFFF = [ drop pov-neutral ] [ 4500 + 9000 /i pov-values nth ] if ; -: >buttons ( alien -- array ) - 128 memory>byte-array >keys ; +: >buttons ( alien length -- array ) + memory>byte-array >keys ; -: ( DIJOYSTATE2 -- controller-state ) - ! XXX only transfer elements that are present on device +: (fill-if) ( controller-state DIJOYSTATE2 ? quot -- ) + [ drop ] compose [ 2drop ] if ; inline + +: fill-controller-state ( controller-state DIJOYSTATE2 -- controller-state ) { - [ DIJOYSTATE2-lX >axis ] - [ DIJOYSTATE2-lY >axis ] - [ DIJOYSTATE2-lZ >axis ] - [ DIJOYSTATE2-lRx >axis ] - [ DIJOYSTATE2-lRy >axis ] - [ DIJOYSTATE2-lRz >axis ] - [ DIJOYSTATE2-rglSlider *long >slider ] - [ DIJOYSTATE2-rgdwPOV *uint >pov ] - [ DIJOYSTATE2-rgbButtons >buttons ] - } cleave controller-state boa ; + [ over x>> [ DIJOYSTATE2-lX >axis >>x ] (fill-if) ] + [ over y>> [ DIJOYSTATE2-lY >axis >>y ] (fill-if) ] + [ over z>> [ DIJOYSTATE2-lZ >axis >>z ] (fill-if) ] + [ over rx>> [ DIJOYSTATE2-lRx >axis >>rx ] (fill-if) ] + [ over ry>> [ DIJOYSTATE2-lRy >axis >>ry ] (fill-if) ] + [ over rz>> [ DIJOYSTATE2-lRz >axis >>rz ] (fill-if) ] + [ over slider>> [ DIJOYSTATE2-rglSlider *long >slider >>slider ] (fill-if) ] + [ over pov>> [ DIJOYSTATE2-rgdwPOV *uint >pov >>pov ] (fill-if) ] + [ DIJOYSTATE2-rgbButtons over buttons>> length >buttons >>buttons ] + } 2cleave ; : ( byte-array -- keyboard-state ) >keys keyboard-state boa ; @@ -263,9 +266,10 @@ M: dinput-game-input-backend instance-id [ IDirectInputDevice8W::GetDeviceState ole32-error ] keep ; M: dinput-game-input-backend read-controller - handle>> [ - "DIJOYSTATE2" heap-size get-device-state - ] with-acquisition ; + handle>> [ +controller-devices+ get at clone ] [ + [ "DIJOYSTATE2" heap-size get-device-state ] + with-acquisition + ] bi fill-controller-state ; M: dinput-game-input-backend calibrate-controller handle>> f 0 IDirectInputDevice8W::RunControlPanel ole32-error ; From 9724ac4a13674f49f2f67cec5e8c8ba9d5bf3018 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Fri, 25 Jul 2008 20:31:37 -0700 Subject: [PATCH 12/34] Joystick demo. iokit product-string cleanup. vectors > hashtables for tiny assocs --- extra/game-input/backend/backend.factor | 8 ++ extra/game-input/backend/dinput/dinput.factor | 7 +- extra/game-input/backend/iokit/iokit.factor | 12 +-- extra/joystick-demo/joystick-demo.factor | 97 +++++++++++++++++++ 4 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 extra/game-input/backend/backend.factor create mode 100644 extra/joystick-demo/joystick-demo.factor diff --git a/extra/game-input/backend/backend.factor b/extra/game-input/backend/backend.factor new file mode 100644 index 0000000000..451bbf1c34 --- /dev/null +++ b/extra/game-input/backend/backend.factor @@ -0,0 +1,8 @@ +USING: kernel system combinators parser ; +IN: game-input.backend + +<< { + { [ os macosx? ] [ "game-input.backend.iokit" use+ ] } + { [ os windows? ] [ "game-input.backend.dinput" use+ ] } + { [ t ] [ ] } +} cond >> diff --git a/extra/game-input/backend/dinput/dinput.factor b/extra/game-input/backend/dinput/dinput.factor index 0be5a9832e..5744025d00 100755 --- a/extra/game-input/backend/dinput/dinput.factor +++ b/extra/game-input/backend/dinput/dinput.factor @@ -1,6 +1,6 @@ USING: windows.dinput windows.dinput.constants game-input symbols alien.c-types windows.ole32 namespaces assocs kernel -arrays hashtables windows.kernel32 windows.com windows.dinput +arrays vectors windows.kernel32 windows.com windows.dinput shuffle windows.user32 windows.messages sequences combinators math.geometry.rect ui.windows accessors math windows alien alien.strings io.encodings.utf16 continuations byte-arrays ; @@ -118,8 +118,8 @@ SYMBOLS: +dinput+ +keyboard-device+ f DIEDFL_ATTACHEDONLY IDirectInput8W::EnumDevices ole32-error ; : set-up-controllers ( -- ) - 4 +controller-devices+ set-global - 4 +controller-guids+ set-global + 4 +controller-devices+ set-global + 4 +controller-guids+ set-global find-controllers ; : find-and-remove-detached-devices ( -- ) @@ -266,6 +266,7 @@ M: dinput-game-input-backend instance-id [ IDirectInputDevice8W::GetDeviceState ole32-error ] keep ; M: dinput-game-input-backend read-controller + ! XXX return f if device was disconnected handle>> [ +controller-devices+ get at clone ] [ [ "DIJOYSTATE2" heap-size get-device-state ] with-acquisition diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index 3ba6a0a691..fe2ce66789 100755 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -1,7 +1,7 @@ USING: cocoa cocoa.plists core-foundation iokit iokit.hid kernel cocoa.enumeration destructors math.parser cocoa.application sequences locals combinators.short-circuit game-input threads -symbols namespaces assocs hashtables arrays combinators +symbols namespaces assocs vectors arrays combinators core-foundation.run-loop accessors sequences.private alien.c-types math ; IN: game-input.backend.iokit @@ -215,7 +215,7 @@ SYMBOLS: +hid-manager+ +keyboard-state+ +controller-states+ ; : initialize-variables ( manager -- ) +hid-manager+ set-global - 4 +controller-states+ set-global + 4 +controller-states+ set-global 256 f +keyboard-state+ set-global ; M: iokit-game-input-backend open-game-input @@ -232,8 +232,6 @@ M: iokit-game-input-backend open-game-input ] } cleave ; -! XXX while game-input is open, we need to reset-game-input and open-game-input as a -! boot image hook M: iokit-game-input-backend close-game-input +hid-manager+ get-global [ +hid-manager+ global [ @@ -252,10 +250,13 @@ M: iokit-game-input-backend close-game-input M: iokit-game-input-backend get-controllers ( -- sequence ) +controller-states+ get keys [ controller boa ] map ; +: ?join ( pre post sep -- string ) + 2over start [ swap 2nip ] [ [ 2array ] dip join ] if ; + M: iokit-game-input-backend product-string ( controller -- string ) handle>> [ kIOHIDManufacturerKey device-property ] - [ kIOHIDProductKey device-property ] bi 2array " " join ; + [ kIOHIDProductKey device-property ] bi " " ?join ; M: iokit-game-input-backend product-id ( controller -- integer ) handle>> [ kIOHIDVendorIDKey device-property ] @@ -270,7 +271,6 @@ M: iokit-game-input-backend read-keyboard ( -- keyboard-state ) +keyboard-state+ get clone keyboard-state boa ; M: iokit-game-input-backend calibrate-controller ( controller -- ) - ! XXX drop ; iokit-game-input-backend game-input-backend set-global diff --git a/extra/joystick-demo/joystick-demo.factor b/extra/joystick-demo/joystick-demo.factor new file mode 100644 index 0000000000..d8963862b7 --- /dev/null +++ b/extra/joystick-demo/joystick-demo.factor @@ -0,0 +1,97 @@ +USING: ui ui.gadgets sequences kernel arrays math colors +ui.render math.vectors accessors fry ui.gadgets.packs game-input +game-input.backend ui.gadgets.labels ui.gadgets.borders alarms +calendar locals combinators.lib strings ui.gadgets.buttons +combinators math.parser ; +IN: joystick-demo + +: SIZE { 151 151 } ; +: ZSIZE 75 ; +: INDICATOR-SIZE { 4 4 } ; +: FREQUENCY ( -- f ) 30 recip seconds ; + +TUPLE: axis-gadget < gadget indicator z-indicator ; + +M: axis-gadget pref-dim* drop SIZE ; + +: (rect-polygon) ( lo hi -- polygon ) + 2dup + [ [ second ] [ first ] bi* swap 2array ] + [ [ first ] [ second ] bi* 2array ] 2bi swapd 4array ; + +: indicator-polygon ( -- polygon ) + { 0 0 } INDICATOR-SIZE (rect-polygon) ; + +: ( color -- indicator ) + indicator-polygon ; + +: (xy>loc) ( x y -- xyloc ) + 2array 0.5 v*n { 0.5 0.5 } v+ SIZE v* [ >integer ] map + INDICATOR-SIZE 2 v/n v- ; + +: (z>loc) ( xyloc z -- xyloc zloc ) + ZSIZE * >integer 0 swap 2array dupd v+ ; + +: (xyz>loc) ( x y z -- xyloc zloc ) + [ [ 0.0 ] unless* ] tri@ + [ (xy>loc) ] dip (z>loc) ; + +: move-axis ( gadget x y z -- ) + (xyz>loc) rot + [ indicator>> (>>loc) ] + [ z-indicator>> (>>loc) ] bi+ bi* ; + +: ( -- gadget ) + axis-gadget new-gadget + gray [ >>indicator ] [ add-gadget ] bi + red [ >>z-indicator ] [ add-gadget ] bi + dup 0.0 0.0 0.0 move-axis ; + +TUPLE: joystick-demo-gadget < pack axis raxis controller buttons alarm ; + +: add-gadget-with-border ( parent child -- parent ) + 2 gray >>boundary add-gadget ; + +: add-controller-label ( gadget controller -- gadget ) + [ >>controller ] [ product-string