Ignore:
Timestamp:
Jul 3, 2001, 3:23:32 PM (24 years ago)
Author:
sandervl
Message:

GetKeyboardState fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/winkeyboard.cpp

    r5196 r6149  
    1 /* $Id: winkeyboard.cpp,v 1.8 2001-02-19 21:43:18 sandervl Exp $ */
     1/* $Id: winkeyboard.cpp,v 1.9 2001-07-03 13:23:32 sandervl Exp $ */
    22/*
    33 * Win32 <-> PM key translation
     
    1414#include "oslibwin.h"
    1515#include <heapstring.h>
     16#include <pmscan.h>
    1617
    1718#define DBG_LOCALLOG    DBG_winkeyboard
    1819#include "dbglocal.h"
     20
     21BOOL OPEN32API _O32_GetKeyboardState( PBYTE lpKeyState );
     22
     23inline BOOL O32_GetKeyboardState(PBYTE lpKeyState)
     24{
     25 BOOL yyrc;
     26 USHORT sel = RestoreOS2FS();
     27
     28    yyrc = _O32_GetKeyboardState(lpKeyState);
     29    SetFS(sel);
     30
     31    return yyrc;
     32}
     33
    1934
    2035BYTE abPMScanToWinVKey[256] =
     
    5166/* 0x1B PMSCAN_BRACKETRIGHT */ , VK_BRACKETRIGHT
    5267/* 0x1C PMSCAN_ENTER        */ , VK_RETURN
    53 /* 0x1D PMSCAN_CTRLLEFT     */ , VK_CONTROL
     68/* 0x1D PMSCAN_CTRLLEFT     */ , VK_LCONTROL
    5469/* 0x1E PMSCAN_A            */ , VK_A
    5570/* 0x1F PMSCAN_S            */ , VK_S
     
    6479/* 0x28 PMSCAN_QUOTESINGLE  */ , VK_QUOTESINGLE
    6580/* 0x29 PMSCAN_GRAVE        */ , VK_GRAVE
    66 /* 0x2A PMSCAN_SHIFTLEFT    */ , VK_SHIFT
     81/* 0x2A PMSCAN_SHIFTLEFT    */ , VK_LSHIFT
    6782/* 0x2B PMSCAN_BACKSLASH    */ , VK_BACKSLASH
    6883/* 0x2C PMSCAN_Z            */ , VK_Z
     
    7691/* 0x34 PMSCAN_PERIOD       */ , VK_PERIOD
    7792/* 0x35 PMSCAN_SLASH        */ , VK_SLASH
    78 /* 0x36 PMSCAN_SHIFTRIGHT   */ , VK_SHIFT
     93/* 0x36 PMSCAN_SHIFTRIGHT   */ , VK_RSHIFT
    7994/* 0x37 PMSCAN_PADASTERISK  */ , VK_MULTIPLY
    80 /* 0x38 PMSCAN_ALTLEFT      */ , VK_MENU
     95/* 0x38 PMSCAN_ALTLEFT      */ , VK_LMENU
    8196/* 0x39 PMSCAN_SPACE        */ , VK_SPACE
    8297/* 0x3A PMSCAN_CAPSLOCK     */ , VK_CAPITAL
     
    116131/* 0x5C PMSCAN_PADSLASH     */ , VK_DIVIDE
    117132/* 0x5D PMSCAN_PRINT        */ , VK_PRINT
    118 /* 0x5E PMSCAN_ALTRIGHT     */ , VK_MENU
     133/* 0x5E PMSCAN_ALTRIGHT     */ , VK_RMENU
    119134/* 0x5F PMSCAN_PAUSE        */ , VK_PAUSE
    120135/* 0x60 PMSCAN_HOME         */ , VK_HOME
     
    280295                               };
    281296
    282 //******************************************************************************
    283 //******************************************************************************
    284 BYTE WIN32API KeyTranslatePMToWin(BYTE key)
    285 {
    286    return abPMScanToWinVKey[key];
    287 }
     297BYTE abWinVKeyToPMScan[256] =
     298/****************************************/
     299/* Vkey                   *    Scancode */
     300/****************************************/
     301/* 0x00                   */ { 0x00
     302/* 0x01 VK_LBUTTON        */ , 0x00
     303/* 0x02 VK_RBUTTON        */ , 0x00
     304/* 0x03 VK_CANCEL         */ , PMSCAN_BREAK
     305/* 0x04 VK_MBUTTON        */ , 0x00
     306/* 0x05                   */ , 0x00
     307/* 0x06                   */ , 0x00
     308/* 0x07                   */ , 0x00
     309/* 0x08 VK_BACK           */ , PMSCAN_BACKSPACE
     310/* 0x09 VK_TAB            */ , PMSCAN_TAB
     311/* 0x0A                   */ , 0x00
     312/* 0x0B                   */ , 0x00
     313/* 0x0C VK_CLEAR          */ , PMSCAN_PAD5
     314/* 0x0D VK_RETURN         */ , PMSCAN_ENTER
     315/* 0x0E                   */ , 0x00
     316/* 0x0F                   */ , 0x00
     317/* 0x10 VK_SHIFT          */ , PMSCAN_SHIFTLEFT
     318/* 0x11 VK_CONTROL        */ , PMSCAN_CTRLLEFT
     319/* 0x12 VK_MENU           */ , PMSCAN_ALTLEFT
     320/* 0x13 VK_PAUSE          */ , PMSCAN_PAUSE
     321/* 0x14 VK_CAPITAL        */ , PMSCAN_CAPSLOCK
     322/* 0x15                   */ , 0x00
     323/* 0x16                   */ , 0x00
     324/* 0x17                   */ , 0x00
     325/* 0x18                   */ , 0x00
     326/* 0x19                   */ , 0x00
     327/* 0x1A                   */ , 0x00
     328/* 0x1B VK_ESCAPE         */ , PMSCAN_ESC
     329/* 0x1C                   */ , 0x00
     330/* 0x1D                   */ , 0x00
     331/* 0x1E                   */ , 0x00
     332/* 0x1F                   */ , 0x00
     333/* 0x20 VK_SPACE          */ , PMSCAN_SPACE
     334/* 0x21 VK_PRIOR          */ , PMSCAN_PAGEUP
     335/* 0x22 VK_NEXT           */ , PMSCAN_PAGEDOWN
     336/* 0x23 VK_END            */ , PMSCAN_END
     337/* 0x24 VK_HOME           */ , PMSCAN_HOME
     338/* 0x25 VK_LEFT           */ , PMSCAN_LEFT
     339/* 0x26 VK_UP             */ , PMSCAN_UP
     340/* 0x27 VK_RIGHT          */ , PMSCAN_RIGHT
     341/* 0x28 VK_DOWN           */ , PMSCAN_DOWN
     342/* 0x29 VK_SELECT         */ , 0x00
     343/* 0x2A VK_PRINT          */ , PMSCAN_PRINT
     344/* 0x2B VK_EXECUTE        */ , 0x00
     345/* 0x2C VK_SNAPSHOT       */ , 0x00
     346/* 0x2D VK_INSERT         */ , PMSCAN_INSERT
     347/* 0x2E VK_DELETE         */ , PMSCAN_DELETE
     348/* 0x2F VK_HELP           */ , PMSCAN_HELP
     349/* 0x30 VK_0              */ , PMSCAN_ZERO
     350/* 0x31 VK_1              */ , PMSCAN_ONE
     351/* 0x32 VK_2              */ , PMSCAN_TWO
     352/* 0x33 VK_3              */ , PMSCAN_THREE
     353/* 0x34 VK_4              */ , PMSCAN_FOUR
     354/* 0x35 VK_5              */ , PMSCAN_FIVE
     355/* 0x36 VK_6              */ , PMSCAN_SIX
     356/* 0x37 VK_7              */ , PMSCAN_SEVEN
     357/* 0x38 VK_8              */ , PMSCAN_EIGHT
     358/* 0x39 VK_9              */ , PMSCAN_NINE
     359/* 0x3A                   */ , 0x00
     360/* 0x3B                   */ , 0x00
     361/* 0x3C                   */ , 0x00
     362/* 0x3D                   */ , 0x00
     363/* 0x3E                   */ , 0x00
     364/* 0x3F                   */ , 0x00
     365/* 0x40                   */ , 0x00
     366/* 0x41 VK_A              */ , PMSCAN_A
     367/* 0x42 VK_B              */ , PMSCAN_B
     368/* 0x43 VK_C              */ , PMSCAN_C
     369/* 0x44 VK_D              */ , PMSCAN_D
     370/* 0x45 VK_E              */ , PMSCAN_E
     371/* 0x46 VK_F              */ , PMSCAN_F
     372/* 0x47 VK_G              */ , PMSCAN_G
     373/* 0x48 VK_H              */ , PMSCAN_H
     374/* 0x49 VK_I              */ , PMSCAN_I
     375/* 0x4A VK_J              */ , PMSCAN_J
     376/* 0x4B VK_K              */ , PMSCAN_K
     377/* 0x4C VK_L              */ , PMSCAN_L
     378/* 0x4D VK_M              */ , PMSCAN_M
     379/* 0x4E VK_N              */ , PMSCAN_N
     380/* 0x4F VK_O              */ , PMSCAN_O
     381/* 0x50 VK_P              */ , PMSCAN_P
     382/* 0x51 VK_Q              */ , PMSCAN_Q
     383/* 0x52 VK_R              */ , PMSCAN_R
     384/* 0x53 VK_S              */ , PMSCAN_S
     385/* 0x54 VK_T              */ , PMSCAN_T
     386/* 0x55 VK_U              */ , PMSCAN_U
     387/* 0x56 VK_V              */ , PMSCAN_V
     388/* 0x57 VK                */ , PMSCAN_W
     389/* 0x58 VK_X              */ , PMSCAN_X
     390/* 0x59 VK_Y              */ , PMSCAN_Y
     391/* 0x5A VK_Z              */ , PMSCAN_Z
     392/* 0x5B VK_LWIN           */ , PMSCAN_WINLEFT
     393/* 0x5C VK_RWIN           */ , PMSCAN_WINRIGHT
     394/* 0x5D VK_APPS           */ , PMSCAN_APPLICATION
     395/* 0x5E                   */ , 0x00
     396/* 0x5F                   */ , 0x00
     397/* 0x60 VK_NUMPAD0        */ , PMSCAN_PAD0
     398/* 0x61 VK_NUMPAD1        */ , PMSCAN_PAD1
     399/* 0x62 VK_NUMPAD2        */ , PMSCAN_PAD2
     400/* 0x63 VK_NUMPAD3        */ , PMSCAN_PAD3
     401/* 0x64 VK_NUMPAD4        */ , PMSCAN_PAD4
     402/* 0x65 VK_NUMPAD5        */ , PMSCAN_PAD5
     403/* 0x66 VK_NUMPAD6        */ , PMSCAN_PAD6
     404/* 0x67 VK_NUMPAD7        */ , PMSCAN_PAD7
     405/* 0x68 VK_NUMPAD8        */ , PMSCAN_PAD8
     406/* 0x69 VK_NUMPAD9        */ , PMSCAN_PAD9
     407/* 0x6A VK_MULTIPLY       */ , PMSCAN_PADASTERISK
     408/* 0x6B VK_ADD            */ , PMSCAN_PADPLUS
     409/* 0x6C VK_SEPARATOR      */ , 0x00
     410/* 0x6D VK_SUBTRACT       */ , PMSCAN_PADMINUS
     411/* 0x6E VK_DECIMAL        */ , PMSCAN_PADPERIOD
     412/* 0x6F VK_DIVIDE         */ , PMSCAN_PADSLASH
     413/* 0x70 VK_F1             */ , PMSCAN_F1
     414/* 0x71 VK_F2             */ , PMSCAN_F2
     415/* 0x72 VK_F3             */ , PMSCAN_F3
     416/* 0x73 VK_F4             */ , PMSCAN_F4
     417/* 0x74 VK_F5             */ , PMSCAN_F5
     418/* 0x75 VK_F6             */ , PMSCAN_F6
     419/* 0x76 VK_F7             */ , PMSCAN_F7
     420/* 0x77 VK_F8             */ , PMSCAN_F8
     421/* 0x78 VK_F9             */ , PMSCAN_F9
     422/* 0x79 VK_F10            */ , PMSCAN_F10
     423/* 0x7A VK_F11            */ , PMSCAN_F11
     424/* 0x7B VK_F12            */ , PMSCAN_F12
     425/* 0x7C VK_F13            */ , PMSCAN_F13
     426/* 0x7D VK_F14            */ , PMSCAN_F14
     427/* 0x7E VK_F15            */ , PMSCAN_F15
     428/* 0x7F VK_F16            */ , PMSCAN_F16
     429/* 0x80 VK_F17            */ , PMSCAN_F17
     430/* 0x81 VK_F18            */ , PMSCAN_F18
     431/* 0x82 VK_F19            */ , PMSCAN_F19
     432/* 0x83 VK_F20            */ , PMSCAN_F20
     433/* 0x84 VK_F21            */ , PMSCAN_F21
     434/* 0x85 VK_F22            */ , PMSCAN_F22
     435/* 0x86 VK_F23            */ , PMSCAN_F23
     436/* 0x87 VK_F24            */ , PMSCAN_F24
     437/* 0x88                   */ , 0x00
     438/* 0x89                   */ , 0x00
     439/* 0x8A                   */ , 0x00
     440/* 0x8B                   */ , 0x00
     441/* 0x8C                   */ , 0x00
     442/* 0x8D                   */ , 0x00
     443/* 0x8E                   */ , 0x00
     444/* 0x8F                   */ , 0x00
     445/* 0x90 VK_NUMLOCK        */ , PMSCAN_NUMLOCK
     446/* 0x91 VK_SCROLL         */ , PMSCAN_SCROLLLOCK
     447/* 0x92                   */ , 0x00
     448/* 0x93                   */ , 0x00
     449/* 0x94                   */ , 0x00
     450/* 0x95                   */ , 0x00
     451/* 0x96                   */ , 0x00
     452/* 0x97                   */ , 0x00
     453/* 0x98                   */ , 0x00
     454/* 0x99                   */ , 0x00
     455/* 0x9A                   */ , 0x00
     456/* 0x9B                   */ , 0x00
     457/* 0x9C                   */ , 0x00
     458/* 0x9D                   */ , 0x00
     459/* 0x9E                   */ , 0x00
     460/* 0x9F                   */ , 0x00
     461/* 0xA0 VK_LSHIFT         */ , PMSCAN_SHIFTLEFT
     462/* 0xA1 VK_RSHIFT         */ , PMSCAN_SHIFTRIGHT
     463/* 0xA2 VK_LCONTROL       */ , PMSCAN_CTRLLEFT
     464/* 0xA3 VK_RCONTROL       */ , PMSCAN_CTRLRIGHT
     465/* 0xA4 VK_LMENU          */ , PMSCAN_ALTLEFT
     466/* 0xA5 VK_RMENU          */ , PMSCAN_ALTRIGHT
     467/* 0xA6                   */ , 0x00
     468/* 0xA7                   */ , 0x00
     469/* 0xA8                   */ , 0x00
     470/* 0xA9                   */ , 0x00
     471/* 0xAA                   */ , 0x00
     472/* 0xAB                   */ , 0x00
     473/* 0xAC                   */ , 0x00
     474/* 0xAD                   */ , 0x00
     475/* 0xAE                   */ , 0x00
     476/* 0xAF                   */ , 0x00
     477/* 0xB0                   */ , 0x00
     478/* 0xB1                   */ , 0x00
     479/* 0xB2                   */ , 0x00
     480/* 0xB3                   */ , 0x00
     481/* 0xB4                   */ , 0x00
     482/* 0xB5                   */ , 0x00
     483/* 0xB6                   */ , 0x00
     484/* 0xB7                   */ , 0x00
     485/* 0xB8                   */ , 0x00
     486/* 0xB9                   */ , 0x00
     487/* 0xBA VK_SEMICOLON      */ , PMSCAN_SEMICOLON
     488/* 0xBB VK_EQUAL          */ , PMSCAN_EQUAL
     489/* 0xBC VK_COMMA          */ , PMSCAN_COMMA
     490/* 0xBD VK_HYPHEN         */ , PMSCAN_HYPHEN
     491/* 0xBE VK_PERIOD         */ , PMSCAN_PERIOD
     492/* 0xBF VK_SLASH          */ , PMSCAN_SLASH
     493/* 0xC0 VK_GRAVE          */ , PMSCAN_GRAVE
     494/* 0xC1 VK_FFC1           */ , PMSCAN_JEXTRA
     495/* 0xC2 VK_YEN            */ , PMSCAN_YEN
     496/* 0xC3                   */ , 0x00
     497/* 0xC4                   */ , 0x00
     498/* 0xC5                   */ , 0x00
     499/* 0xC6                   */ , 0x00
     500/* 0xC7                   */ , 0x00
     501/* 0xC8                   */ , 0x00
     502/* 0xC9                   */ , 0x00
     503/* 0xCA                   */ , 0x00
     504/* 0xCB                   */ , 0x00
     505/* 0xCC                   */ , 0x00
     506/* 0xCD                   */ , 0x00
     507/* 0xCE                   */ , 0x00
     508/* 0xCF                   */ , 0x00
     509/* 0xD0                   */ , 0x00
     510/* 0xD1                   */ , 0x00
     511/* 0xD2                   */ , 0x00
     512/* 0xD3                   */ , 0x00
     513/* 0xD4                   */ , 0x00
     514/* 0xD5                   */ , 0x00
     515/* 0xD6                   */ , 0x00
     516/* 0xD7                   */ , 0x00
     517/* 0xD8                   */ , 0x00
     518/* 0xD9                   */ , 0x00
     519/* 0xDA                   */ , 0x00
     520/* 0xDB VK_BRACKETLEFT    */ , PMSCAN_BRACKETLEFT
     521/* 0xDC VK_BACKSLASH      */ , PMSCAN_BACKSLASH
     522/* 0xDD VK_BRACKETRIGHT   */ , PMSCAN_BRACKETRIGHT
     523/* 0xDE VK_QUOTESINGLE    */ , PMSCAN_QUOTESINGLE
     524/* 0xDF                   */ , 0x00
     525/* 0xE0                   */ , 0x00
     526/* 0xE1                   */ , 0x00
     527/* 0xE2 VK_EXTRA          */ , PMSCAN_EXTRA
     528/* 0xE3                   */ , 0x00
     529/* 0xE4                   */ , 0x00
     530/* 0xE5                   */ , 0x00
     531/* 0xE6                   */ , 0x00
     532/* 0xE7                   */ , 0x00
     533/* 0xE8                   */ , 0x00
     534/* 0xE9                   */ , 0x00
     535/* 0xEA                   */ , 0x00
     536/* 0xEB                   */ , 0x00
     537/* 0xEC                   */ , 0x00
     538/* 0xED                   */ , 0x00
     539/* 0xEE                   */ , 0x00
     540/* 0xEF                   */ , 0x00
     541/* 0xF0                   */ , 0x00
     542/* 0xF1                   */ , 0x00
     543/* 0xF2                   */ , 0x00
     544/* 0xF3                   */ , 0x00
     545/* 0xF4                   */ , 0x00
     546/* 0xF5                   */ , 0x00
     547/* 0xF6 VK_ATTN           */ , 0x00
     548/* 0xF7 VK_CRSEL          */ , 0x00
     549/* 0xF8 VK_EXSEL          */ , 0x00
     550/* 0xF9 VK_EREOF          */ , PMSCAN_ERASEEOF
     551/* 0xFA VK_PLAY           */ , 0x00
     552/* 0xFB VK_ZOOM           */ , 0x00
     553/* 0xFC VK_NONAME         */ , 0x00
     554/* 0xFD VK_PA1            */ , PMSCAN_PA1
     555/* 0xFE VK_OEM_CLEAR      */ , 0x00
     556/* 0xFF                   */ , 0x00
     557                             };
     558
    288559//******************************************************************************
    289560//******************************************************************************
    290561void WIN32API KeyTranslatePMToWinBuf(BYTE *pmkey, BYTE *winkey, int nrkeys)
    291562{
    292    for(int i=0;i<nrkeys;i++) {
    293         winkey[i] = abPMScanToWinVKey[pmkey[i]];
     563   for(int i=1;i<nrkeys;i++) {
     564       if(abWinVKeyToPMScan[i]) {
     565            winkey[i] = pmkey[OSLibWinTranslateChar(abWinVKeyToPMScan[i])];
     566       }
    294567   }
     568   winkey[VK_SHIFT]   = winkey[VK_LSHIFT] | winkey[VK_RSHIFT];
     569   winkey[VK_CONTROL] = winkey[VK_LCONTROL] | winkey[VK_RCONTROL];
     570   winkey[VK_MENU]    = winkey[VK_LMENU] | winkey[VK_RMENU];
    295571}
    296572//******************************************************************************
     
    298574int WIN32API GetKeyboardType( int nTypeFlag)
    299575{
    300     dprintf(("USER32:  GetKeyboardType\n"));
     576    dprintf(("USER32: GetKeyboardType %x", nTypeFlag));
    301577    return O32_GetKeyboardType(nTypeFlag);
    302578}
     
    309585
    310586  dprintf(("USER32: GetKeyboardState %x", lpKeyState));
    311   rc = OSLibWinGetKeyboardStateTable((PBYTE)&PMKeyState );
    312 
     587  memset(PMKeyState, 0, sizeof(PMKeyState));
     588  memset(lpKeyState, 0, 256);
     589  rc = OSLibWinGetKeyboardStateTable((PBYTE)&PMKeyState[0] );
     590////  rc = O32_GetKeyboardState(lpKeyState);
    313591  if(rc == TRUE)
    314592  {
    315         KeyTranslatePMToWinBuf((BYTE *)&PMKeyState, lpKeyState, 256);
     593        KeyTranslatePMToWinBuf((BYTE *)&PMKeyState[0], lpKeyState, 256);
     594#ifdef DEBUG
     595        for(int i=0;i<256;i++) {
     596            if(PMKeyState[i] & 0x80) {
     597                dprintf2(("PM  key 0x%0x = %x", i, PMKeyState[i]));
     598            }
     599        }
     600        for(i=0;i<256;i++) {
     601            if(lpKeyState[i] & 0x80) {
     602                dprintf2(("Win key 0x%0x = %x", i, lpKeyState[i]));
     603            }
     604        }
     605#endif
    316606        return TRUE;
    317607  }
     
    441731                     UINT   fuState)
    442732{
    443   dprintf(("USER32:ToAscii (%u,%u,%08xh,%08xh,%u) not implemented.\n",
    444          uVirtKey,
    445          uScanCode,
    446          lpbKeyState,
    447          lpwTransKey,
    448          fuState));
     733  dprintf(("USER32:ToAscii (%u,%u,%08xh,%08xh,%u) partially implemented",
     734           uVirtKey, uScanCode, lpbKeyState, lpwTransKey,  fuState));
    449735
    450736  INT ret;
     
    461747        return 0;
    462748  }
     749#if 0
    463750  /* We have a special case to handle : Shift + arrow, shift + home, ...
    464751     X returns a char for it, but Windows doesn't. Let's eat it. */
     
    471758  }
    472759  else       
     760#endif
    473761  /* We have another special case for delete key (XK_Delete) on an
    474762     extended keyboard. X returns a char for it, but Windows doesn't */
     
    479767  }
    480768  else {
    481        *(char*)lpwTransKey = uVirtKey;
     769       if(uVirtKey >= VK_A && uVirtKey <= VK_Z && !(lpbKeyState[VK_SHIFT] & 0x80)) {
     770             *(char*)lpwTransKey = uVirtKey + 32; //translate to lower case
     771       }
     772       else  *(char*)lpwTransKey = uVirtKey;
    482773       ret = 1;
    483774  }
Note: See TracChangeset for help on using the changeset viewer.