Annotation of kernel/bsd/dev/ppc/drvUSBCMD/kbd/KeyIn.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: /*
        !            26:        File:           KeyIn.c
        !            27: 
        !            28:        Contains:       ADB keyboard simulation (non-shim based).
        !            29: 
        !            30:        Version:        xxx put version here xxx
        !            31: 
        !            32:        Copyright:      � 1998 by Apple Computer, Inc., all rights reserved.
        !            33: 
        !            34:        File Ownership:
        !            35: 
        !            36:                DRI:                            David Ferguson
        !            37: 
        !            38:                Other Contact:          xxx put other contact here xxx
        !            39: 
        !            40:                Technology:                     xxx put technology here xxx
        !            41: 
        !            42:        Writers:
        !            43: 
        !            44:                (TEB)   Ted Burge
        !            45:                (BWS)   Brent Schorsch
        !            46:                (BG)    Bill Galcher
        !            47:                (DKF)   David Ferguson
        !            48:                (CJK)   Craig Keithley
        !            49: 
        !            50:        Change History (most recent first):
        !            51: 
        !            52:         <USB24>         9/10/98        TEB             [2267641]  Changed the right shift, right option and right
        !            53:                                                                        control keys to use 0x38, 0x3A and 0x3B and not the type 3
        !            54:                                                                        keyboard virtual key codes: 0x3C, 0x3D, and 0x3E listed here
        !            55:                                                                        respectively.
        !            56:         <USB23>         6/29/98        CJK             correct numeric keypad = key so that it reports as keypad =, not
        !            57:                                                                        as keypad enter
        !            58:         <USB22>         6/22/98        CJK             change left & right modifier keys to be unique.  This change
        !            59:                                                                        only affects the DDK, not C1.
        !            60:         <USB21>         6/18/98        BWS             fix interrupt refcon support
        !            61:         <USB20>         6/10/98        CJK             make certain power key is sent twice (before keyup).
        !            62:         <USB19>         6/10/98        CJK             [2238229]  change applicatinon key to $6E
        !            63:         <USB18>         5/28/98        CJK             change to MPW type file
        !            64:         <USB17>         5/22/98        CJK             Fix for CodeWarrior
        !            65:         <USB16>         5/19/98        BG              Add include of LowMem.h to bring in needed prototype.
        !            66:         <USB15>         4/26/98        CJK             update to match reworked keyboard interface driver
        !            67:         <USB14>          4/9/98        CJK             replace include of USBHIDModules.h with include of USB.h
        !            68:                <13>      4/8/98        CJK             update selector name
        !            69:                <12>      4/8/98        CJK             rework PostUSBKeyToMac to work the same way as the standard interrupt
        !            70:                                                                        handler
        !            71:                <11>     3/26/98        CJK             remove debugstr
        !            72:                <10>     3/19/98        CJK             Remove numlock & capslock toggle/led handling
        !            73:                 <9>     3/17/98        CJK             change } to just }. MetroWerks has a problem with }.
        !            74:                 <8>     3/12/98        CJK             Re-work modifier key handling so that it only propagates key
        !            75:                                                                        state changes when the key is pressed, ignores modifier key up
        !            76:                                                                        key codes, and "simulates" modifier key up routines to the Mac
        !            77:                                                                        OS (when the keystate is toggled back to 'not pressed').
        !            78:                 <7>      3/2/98        CJK             remove include of KBDHIDEmulation.h
        !            79:                 <6>     2/27/98        CJK             disable call to HID Module control routine.
        !            80:                 <5>     2/27/98        CJK             Add include of USBHIDModules.h. Change keycode constants to be
        !            81:                                                                        kUSB...
        !            82:                 <4>     2/26/98        CJK             add capslock, scroll lock, and num lock LED support.
        !            83:          <USB3>         2/19/98        DKF             Fix keymapping for \, swap alt & command, update lowmem
        !            84:                                                                        accessors
        !            85:                 <2>     2/17/98        CJK             Add change history.
        !            86:                 <1>     2/17/98        CJK             First time check in.
        !            87: */
        !            88: 
        !            89: /*
        !            90:  USB Keyboard Translation to Macintosh 
        !            91:  */
        !            92: #include "../driverservices.h"
        !            93: //#include <Types.h>
        !            94: #include "Events.h"
        !            95: //#include <Resources.h>
        !            96: //#include <LowMem.h>
        !            97: #include "../USB.h"
        !            98: #include "KeyboardModule.h"
        !            99: 
        !           100: 
        !           101: #define DOWN           0
        !           102: #define UP                     1
        !           103: 
        !           104: #define TRUE           1
        !           105: #define FALSE          0
        !           106: 
        !           107: #define FakeADBAddr            16
        !           108: #define FakeKBDType            2               // this should be the same as the Apple extended keyboard for now
        !           109: 
        !           110: static UInt32  myKeyMAP[4];
        !           111: static UInt32  keyTransState;
        !           112: static Handle  handleKCHR;
        !           113: static UInt8*  KCHRptr;
        !           114: 
        !           115: typedef KeyMap * KeyMapPtr;
        !           116: 
        !           117: /* prototypes */
        !           118: Boolean KeyInArray(UInt8 key, UInt8 *array, UInt16 len);
        !           119: Boolean SetBit(UInt8 *bitmapArray, UInt16 index, Boolean value); 
        !           120: void  PostADBKeyToMac(UInt16 virtualKeycode, UInt8 state);
        !           121: 
        !           122: /* when we move to master interfaces we can get this stuff from LowMemPriv.h */
        !           123: /* be sure to turn on DIRECT_LOWMEM_ACCESSORS */
        !           124: #define LMSetKbdVars(value) ((*(short *)0x0216) = (value))
        !           125: #define LMSetKeyLast(value) ((*(short *)0x0184) = (value))
        !           126: #define LMSetKeyTime(value) ((*(long *)0x0186) = (value))
        !           127: #define LMSetKeyRepTime(value) ((*(long *)0x018A) = (value))
        !           128: #define LMSetKeyMap(KeyMapValue)       BlockMove((Ptr)(KeyMapValue), (Ptr)0x0174, sizeof(KeyMap))
        !           129: 
        !           130: 
        !           131: // index represents USB keyboard usage value, content is Mac virtual keycode
        !           132: static UInt8   USBKMAP[256] = {  
        !           133:        0xFF,   /* 00 no event */               
        !           134:        0xFF,   /* 01 ErrorRollOver */  
        !           135:        0xFF,   /* 02 POSTFail */       
        !           136:        0xFF,   /* 03 ErrorUndefined */ 
        !           137:        0x00,   /* 04 A */
        !           138:        0x0B,   /* 05 B */
        !           139:        0x08,   /* 06 C */
        !           140:        0x02,   /* 07 D */
        !           141:        0x0E,   /* 08 E */
        !           142:        0x03,   /* 09 F */
        !           143:        0x05,   /* 0A G */
        !           144:        0x04,   /* 0B H */
        !           145:        0x22,   /* 0C I */
        !           146:        0x26,   /* 0D J */
        !           147:        0x28,   /* 0E K */
        !           148:        0x25,   /* 0F L */
        !           149: 
        !           150:        0x2E,   /* 10 M */              
        !           151:        0x2D,   /* 11 N */      
        !           152:        0x1F,   /* 12 O */      
        !           153:        0x23,   /* 13 P */      
        !           154:        0x0C,   /* 14 Q */
        !           155:        0x0F,   /* 15 R */
        !           156:        0x01,   /* 16 S */
        !           157:        0x11,   /* 17 T */
        !           158:        0x20,   /* 18 U */
        !           159:        0x09,   /* 19 V */
        !           160:        0x0D,   /* 1A W */
        !           161:        0x07,   /* 1B X */
        !           162:        0x10,   /* 1C Y */
        !           163:        0x06,   /* 1D Z */
        !           164:        0x12,   /* 1E 1/! */
        !           165:        0x13,   /* 1F 2/@ */
        !           166: 
        !           167:        0x14,   /* 20 3 # */            
        !           168:        0x15,   /* 21 4 $ */    
        !           169:        0x17,   /* 22 5 % */    
        !           170:        0x16,   /* 23 6 ^ */    
        !           171:        0x1A,   /* 24 7 & */
        !           172:        0x1C,   /* 25 8 * */
        !           173:        0x19,   /* 26 9 ( */
        !           174:        0x1D,   /* 27 0 ) */
        !           175:        0x24,   /* 28 Return (Enter) */
        !           176:        0x35,   /* 29 ESC */
        !           177:        0x33,   /* 2A Delete (Backspace) */
        !           178:        0x30,   /* 2B Tab */
        !           179:        0x31,   /* 2C Spacebar */
        !           180:        0x1B,   /* 2D - _ */
        !           181:        0x18,   /* 2E = + */
        !           182:        0x21,   /* 2F [ { */
        !           183: 
        !           184:        0x1E,   /* 30 ] } */            
        !           185:        0x2A,   /* 31 \ | */    
        !           186:        0xFF,   /* 32 Non-US # and ~ (what?!!!) */      
        !           187:        0x29,   /* 33 ; : */    
        !           188:        0x27,   /* 34 ' " */
        !           189:        0x32,   /* 35 ` ~ */
        !           190:        0x2B,   /* 36 , < */
        !           191:        0x2F,   /* 37 . > */
        !           192:        0x2C,   /* 38 / ? */
        !           193:        0x39,   /* 39 Caps Lock */
        !           194:        0x7A,   /* 3A F1 */
        !           195:        0x78,   /* 3B F2 */
        !           196:        0x63,   /* 3C F3 */
        !           197:        0x76,   /* 3D F4 */
        !           198:        0x60,   /* 3E F5 */
        !           199:        0x61,   /* 3F F6 */
        !           200: 
        !           201:        0x62,   /* 40 F7 */             
        !           202:        0x64,   /* 41 F8 */     
        !           203:        0x65,   /* 42 F9 */     
        !           204:        0x6D,   /* 43 F10 */    
        !           205:        0x67,   /* 44 F11 */
        !           206:        0x6F,   /* 45 F12 */
        !           207:        0x69,   /* 46 F13/PrintScreen */
        !           208:        0x6B,   /* 47 F14/ScrollLock */
        !           209:        0x71,   /* 48 F15/Pause */                              
        !           210:        0x72,   /* 49 Insert */
        !           211:        0x73,   /* 4A Home */
        !           212:        0x74,   /* 4B PageUp */
        !           213:        0x75,   /* 4C Delete Forward */
        !           214:        0x77,   /* 4D End */
        !           215:        0x79,   /* 4E PageDown */
        !           216:        0x7C,   /* 4F RightArrow */
        !           217: 
        !           218:        0x7B,   /* 50 LeftArrow */              
        !           219:        0x7D,   /* 51 DownArrow */      
        !           220:        0x7E,   /* 52 UpArrow */        
        !           221:        0x47,   /* 53 NumLock/Clear */  
        !           222:        0x4B,   /* 54 Keypad / */
        !           223:        0x43,   /* 55 Keypad * */
        !           224:        0x4E,   /* 56 Keypad - */
        !           225:        0x45,   /* 57 Keypad + */
        !           226:        0x4C,   /* 58 Keypad Enter */
        !           227:        0x53,   /* 59 Keypad 1 */
        !           228:        0x54,   /* 5A Keypad 2 */
        !           229:        0x55,   /* 5B Keypad 3 */
        !           230:        0x56,   /* 5C Keypad 4 */
        !           231:        0x57,   /* 5D Keypad 5 */
        !           232:        0x58,   /* 5E Keypad 6 */
        !           233:        0x59,   /* 5F Keypad 7 */
        !           234: 
        !           235:        0x5B,   /* 60 Keypad 8 */               
        !           236:        0x5C,   /* 61 Keypad 9 */       
        !           237:        0x52,   /* 62 Keypad 0 */       
        !           238:        0x41,   /* 63 Keypad . */       
        !           239:        0xFF,   /* 64 Non-US \ and  | (what ??!!) */
        !           240:        0x6E,   /* 65 ApplicationKey (not on a mac!)*/
        !           241:        0x7F,   /* 66 PowerKey  */
        !           242:        0x51,   /* 67 Keypad = */
        !           243:        0x69,   /* 68 F13 */
        !           244:        0x6B,   /* 69 F14 */
        !           245:        0x71,   /* 6A F15 */
        !           246:        0xFF,   /* 6B F16 */
        !           247:        0xFF,   /* 6C F17 */
        !           248:        0xFF,   /* 6D F18 */
        !           249:        0xFF,   /* 6E F19 */
        !           250:        0xFF,   /* 6F F20 */
        !           251: 
        !           252:        0x5B,   /* 70 F21 */            
        !           253:        0x5C,   /* 71 F22 */    
        !           254:        0x52,   /* 72 F23 */    
        !           255:        0x41,   /* 73 F24 */    
        !           256:        0xFF,   /* 74 Execute */
        !           257:        0xFF,   /* 75 Help */
        !           258:        0x7F,   /* 76 Menu */
        !           259:        0x4C,   /* 77 Select */
        !           260:        0x69,   /* 78 Stop */
        !           261:        0x6B,   /* 79 Again */
        !           262:        0x71,   /* 7A Undo */
        !           263:        0xFF,   /* 7B Cut */
        !           264:        0xFF,   /* 7C Copy */
        !           265:        0xFF,   /* 7D Paste */
        !           266:        0xFF,   /* 7E Find */
        !           267:        0xFF,   /* 7F Mute */
        !           268:        
        !           269:        0xFF,   /* 80 no event */               
        !           270:        0xFF,   /* 81 no event */       
        !           271:        0xFF,   /* 82 no event */       
        !           272:        0xFF,   /* 83 no event */       
        !           273:        0xFF,   /* 84 no event */
        !           274:        0xFF,   /* 85 no event */
        !           275:        0xFF,   /* 86 no event */
        !           276:        0xFF,   /* 87 no event */
        !           277:        0xFF,   /* 88 no event */
        !           278:        0xFF,   /* 89 no event */
        !           279:        0xFF,   /* 8A no event */
        !           280:        0xFF,   /* 8B no event */
        !           281:        0xFF,   /* 8C no event */
        !           282:        0xFF,   /* 8D no event */
        !           283:        0xFF,   /* 8E no event */
        !           284:        0xFF,   /* 8F no event */
        !           285: 
        !           286:        0xFF,   /* 90 no event */               
        !           287:        0xFF,   /* 91 no event */       
        !           288:        0xFF,   /* 92 no event */       
        !           289:        0xFF,   /* 93 no event */       
        !           290:        0xFF,   /* 94 no event */
        !           291:        0xFF,   /* 95 no event */
        !           292:        0xFF,   /* 96 no event */
        !           293:        0xFF,   /* 97 no event */
        !           294:        0xFF,   /* 98 no event */
        !           295:        0xFF,   /* 99 no event */
        !           296:        0xFF,   /* 9A no event */
        !           297:        0xFF,   /* 9B no event */
        !           298:        0xFF,   /* 9C no event */
        !           299:        0xFF,   /* 9D no event */
        !           300:        0xFF,   /* 9E no event */
        !           301:        0xFF,   /* 9F no event */
        !           302: 
        !           303:        0xFF,   /* A0 no event */               
        !           304:        0xFF,   /* A1 no event */       
        !           305:        0xFF,   /* A2 no event */       
        !           306:        0xFF,   /* A3 no event */       
        !           307:        0xFF,   /* A4 no event */
        !           308:        0xFF,   /* A5 no event */
        !           309:        0xFF,   /* A6 no event */
        !           310:        0xFF,   /* A7 no event */
        !           311:        0xFF,   /* A8 no event */
        !           312:        0xFF,   /* A9 no event */
        !           313:        0xFF,   /* AA no event */
        !           314:        0xFF,   /* AB no event */
        !           315:        0xFF,   /* AC no event */
        !           316:        0xFF,   /* AD no event */
        !           317:        0xFF,   /* AE no event */
        !           318:        0xFF,   /* AF no event */
        !           319: 
        !           320:        0xFF,   /* B0 no event */               
        !           321:        0xFF,   /* B1 no event */       
        !           322:        0xFF,   /* B2 no event */       
        !           323:        0xFF,   /* B3 no event */       
        !           324:        0xFF,   /* B4 no event */
        !           325:        0xFF,   /* B5 no event */
        !           326:        0xFF,   /* B6 no event */
        !           327:        0xFF,   /* B7 no event */
        !           328:        0xFF,   /* B8 no event */
        !           329:        0xFF,   /* B9 no event */
        !           330:        0xFF,   /* BA no event */
        !           331:        0xFF,   /* BB no event */
        !           332:        0xFF,   /* BC no event */
        !           333:        0xFF,   /* BD no event */
        !           334:        0xFF,   /* BE no event */
        !           335:        0xFF,   /* BF no event */
        !           336: 
        !           337:        0xFF,   /* C0 no event */               
        !           338:        0xFF,   /* C1 no event */       
        !           339:        0xFF,   /* C2 no event */       
        !           340:        0xFF,   /* C3 no event */       
        !           341:        0xFF,   /* C4 no event */
        !           342:        0xFF,   /* C5 no event */
        !           343:        0xFF,   /* C6 no event */
        !           344:        0xFF,   /* C7 no event */
        !           345:        0xFF,   /* C8 no event */
        !           346:        0xFF,   /* C9 no event */
        !           347:        0xFF,   /* CA no event */
        !           348:        0xFF,   /* CB no event */
        !           349:        0xFF,   /* CC no event */
        !           350:        0xFF,   /* CD no event */
        !           351:        0xFF,   /* CE no event */
        !           352:        0xFF,   /* CF no event */
        !           353: 
        !           354:        0xFF,   /* D0 no event */               
        !           355:        0xFF,   /* D1 no event */       
        !           356:        0xFF,   /* D2 no event */       
        !           357:        0xFF,   /* D3 no event */       
        !           358:        0xFF,   /* D4 no event */
        !           359:        0xFF,   /* D5 no event */
        !           360:        0xFF,   /* D6 no event */
        !           361:        0xFF,   /* D7 no event */
        !           362:        0xFF,   /* D8 no event */
        !           363:        0xFF,   /* D9 no event */
        !           364:        0xFF,   /* DA no event */
        !           365:        0xFF,   /* DB no event */
        !           366:        0xFF,   /* DC no event */
        !           367:        0xFF,   /* DD no event */
        !           368:        0xFF,   /* DE no event */
        !           369:        0xFF,   /* DF no event */
        !           370: 
        !           371:        0x3B,   /* E0 left control key */               
        !           372:        0x38,   /* E1 left shift key key */     
        !           373:        0x3A,   /* E2 left alt/option key */    
        !           374:        0x37,   /* E3 left GUI (windows/cmd) key */     
        !           375:        
        !           376:        0x3B,   /* E4 right control key */ 
        !           377:        0x38,   /* E5 right shift key key */ 
        !           378:        0x3A,   /* E6 right alt/option key */ 
        !           379:        0x37,   /* E7 right GUI (windows/cmd) key */
        !           380:        0xFF,   /* E8 no event */
        !           381:        0xFF,   /* E9 no event */
        !           382:        0xFF,   /* EA no event */
        !           383:        0xFF,   /* EB no event */
        !           384:        0xFF,   /* EC no event */
        !           385:        0xFF,   /* ED no event */
        !           386:        0xFF,   /* EE no event */
        !           387:        0xFF,   /* EF no event */
        !           388:        
        !           389:        0xFF,   /* F0 no event */               
        !           390:        0xFF,   /* F1 no event */       
        !           391:        0xFF,   /* F2 no event */       
        !           392:        0xFF,   /* F3 no event */       
        !           393:        0xFF,   /* F4 no event */
        !           394:        0xFF,   /* F5 no event */
        !           395:        0xFF,   /* F6 no event */
        !           396:        0xFF,   /* F7 no event */
        !           397:        0xFF,   /* F8 no event */
        !           398:        0xFF,   /* F9 no event */
        !           399:        0xFF,   /* FA no event */
        !           400:        0xFF,   /* FB no event */
        !           401:        0xFF,   /* FC no event */
        !           402:        0xFF,   /* FD no event */
        !           403:        0xFF,   /* FE no event */
        !           404:        0xFF,   /* FF no event */
        !           405: };
        !           406:                
        !           407: void
        !           408: InitUSBKeyboard()
        !           409: {
        !           410:        handleKCHR = GetResource('KCHR',0);     // US keyboard mapping (handled differently by ADB Mgr)
        !           411:        HLock(handleKCHR);
        !           412:        KCHRptr = (UInt8 *)*handleKCHR;
        !           413: }
        !           414: 
        !           415: 
        !           416: 
        !           417: void PostUSBKeyToMac(UInt16 rawUSBkey)
        !           418: {
        !           419: static UInt8   oldLEDState = 0x00;
        !           420: static UInt8   newLEDState = 0x00;
        !           421: 
        !           422: static UInt8   capsLockState = 0x00;
        !           423: static UInt8   numLockState = 0x00;
        !           424: static UInt8   scrollLockState = 0x00;
        !           425: 
        !           426: register UInt8 virtualKeycode, keystate;
        !           427: 
        !           428:        
        !           429:        if (KCHRptr == 0)
        !           430:        {
        !           431:                InitUSBKeyboard();
        !           432:        }
        !           433:        
        !           434:        keystate = (rawUSBkey & 0x8000) ? UP : DOWN;
        !           435:        rawUSBkey &= 0x0FF;
        !           436:        
        !           437:        if (keystate == DOWN)
        !           438:        {
        !           439:                newLEDState = oldLEDState;
        !           440:                
        !           441:                switch (rawUSBkey)
        !           442:                {
        !           443: // Note:  This switch statement is being left it to make it easy to add "toggling" keys in the future.
        !           444: //        it used to support toggled numlock & scroll lock...  It doesn't anymore.
        !           445:                        case kUSBCapsLockKey:
        !           446:                                newLEDState ^= (1 << kCapsLockLED);
        !           447:                                keystate = (newLEDState & (1 << kCapsLockLED)) ? DOWN : UP;
        !           448:                                break;
        !           449:                }
        !           450:                
        !           451:                if (newLEDState != oldLEDState)
        !           452:                {
        !           453:                        oldLEDState = newLEDState;
        !           454:                        kbd_USBHIDControlDevice(kHIDSetLEDStateByBits, &newLEDState);
        !           455:                }
        !           456:        }
        !           457:        else
        !           458:        {
        !           459:                switch (rawUSBkey)
        !           460:                {
        !           461: // Note:  This switch statement is being left it to make it easy to add "toggling" keys in the future.
        !           462:                        case kUSBCapsLockKey:
        !           463:                                return;
        !           464:                                break;
        !           465:                }
        !           466:        }
        !           467:        
        !           468:        // look up rawUSBkey in KMAP resource to get virtual keycode
        !           469:        if (rawUSBkey < sizeof(USBKMAP))
        !           470:        {
        !           471:                virtualKeycode = USBKMAP[rawUSBkey];
        !           472:        } 
        !           473:        else 
        !           474:        {
        !           475: //             DebugStr("\pPostUSBKeyToMac: Need bigger KMAP table");
        !           476:                virtualKeycode = 0xFF;
        !           477:        }
        !           478: 
        !           479:        PostADBKeyToMac(virtualKeycode, keystate);
        !           480:        if (virtualKeycode == 0x7F)
        !           481:                PostADBKeyToMac(virtualKeycode, keystate);
        !           482: }
        !           483: 
        !           484: void 
        !           485: PostADBKeyToMac(UInt16 virtualKeycode, UInt8 state)
        !           486: {
        !           487:        UInt32  keyEventMsg;
        !           488:        
        !           489:        if (virtualKeycode > 127) return;  // not handled by MacOS!
        !           490:        
        !           491:        // stop repeating
        !           492:        LMSetKeyLast(0);
        !           493:        LMSetKbdVars(0);
        !           494:        
        !           495:        // update our keymap
        !           496:        SetBit((UInt8 *)myKeyMAP, virtualKeycode, state == DOWN ? 1 : 0);
        !           497:        LMSetKeyMap(&myKeyMAP);
        !           498: 
        !           499:        // set this keyboard as the last keyboard
        !           500:        LMSetKbdLast(FakeADBAddr);
        !           501:        LMSetKbdType(FakeKBDType);
        !           502:        
        !           503:        // call KeyTrans to get character code
        !           504:        virtualKeycode |= ((myKeyMAP[1]<<9) & 0x00FE00) | ((myKeyMAP[1]>>7) & 0x0100) | ((state==UP) ? 0x080 : 0);
        !           505:        keyEventMsg = KeyTranslate(KCHRptr, virtualKeycode , &keyTransState);
        !           506:        virtualKeycode &= 0x7F;
        !           507:        
        !           508:        if (keyEventMsg & 0xFFFF0000) {
        !           509:                // post event
        !           510:                UInt32 event =(keyEventMsg & 0xFF000000) | ((FakeADBAddr << 16) & 0x0FF0000) | ((virtualKeycode << 8) & 0x0FF00)  | ((keyEventMsg>>16) & 0x0FF);
        !           511:                if (state == DOWN){
        !           512:                        UInt32 ticks = TickCount();
        !           513:                        LMSetKeyTime(ticks);
        !           514:                        LMSetKeyRepTime(ticks);
        !           515:                        LMSetKeyLast(event & 0x0FFFF);
        !           516:                        LMSetKbdVars((event>>16) & 0x0FFFF);
        !           517:                }               
        !           518:                PostEvent((state == DOWN ? keyDown : keyUp), event);
        !           519:        }
        !           520:        if (keyEventMsg & 0x0000FFFF) {
        !           521:                // post event
        !           522:                UInt32 event =((keyEventMsg<<16) & 0xFF000000) | ((FakeADBAddr << 16) & 0x0FF0000) | ((virtualKeycode << 8) & 0x0FF00)  | (keyEventMsg & 0x0FF);
        !           523:                if (state == DOWN){
        !           524:                        UInt32 ticks = TickCount();
        !           525:                        LMSetKeyTime(ticks);
        !           526:                        LMSetKeyRepTime(ticks);
        !           527:                        LMSetKeyLast(event & 0x0FFFF);
        !           528:                        LMSetKbdVars((event>>16) & 0x0FFFF);
        !           529:                }               
        !           530:                PostEvent((state == DOWN ? keyDown : keyUp), event);
        !           531:        }
        !           532: }
        !           533: 
        !           534: // Sets the bitmapArray[index] to value
        !           535: // returns old value;
        !           536: Boolean
        !           537: SetBit(UInt8 *bitmapArray, UInt16 index, Boolean value)
        !           538: {      
        !           539:        UInt32  mask = 0x1 << (index % 8 );
        !           540:        Boolean oldVal;
        !           541:        
        !           542:        oldVal = (bitmapArray[index/8] & mask) ? TRUE : FALSE;
        !           543:        
        !           544:        if (value){
        !           545:                bitmapArray[index/8] |= mask;
        !           546:        }else{
        !           547:                bitmapArray[index/8] &= ~mask;
        !           548:        }
        !           549:        
        !           550:        return (oldVal);
        !           551: }
        !           552: 
        !           553: void USBDemoKeyIn(UInt32 refcon, void * theData)
        !           554: {
        !           555: #pragma unused (refcon)
        !           556: 
        !           557: USBHIDDataPtr  pTheKeyboardData;
        !           558: register               UInt8   i;
        !           559: 
        !           560:        pTheKeyboardData = (USBHIDDataPtr)theData;
        !           561:        for (i=0; i<pTheKeyboardData->kbd.keycount; i++)
        !           562:        {
        !           563:                // no shim installed, let's just post some Macintosh keyevents
        !           564:                PostUSBKeyToMac(pTheKeyboardData->kbd.usbkeycode[i]);
        !           565:        }
        !           566: 
        !           567: }
        !           568: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.