/*===========================================================================*/ /* Copyright (c) 1987 - 1988, Future Soft Engineering, Inc. */ /* Houston, Texas */ /*===========================================================================*/ #define NOLSTRING TRUE /* jtf win3 mod */ #include #include "port1632.h" #include "dcrc.h" #include "dynacomm.h" #include "task.h" /*---------------------------------------------------------------------------*/ /* KEYBOARD REMAPPING ROUTINES (and DATA) [mbb] */ /*---------------------------------------------------------------------------*/ #define KEYMAP struct tagKeyMap #define LPKEYMAP KEYMAP FAR * struct tagKeyMap { BYTE scanCode[256]; INT virtKey[8][256]; WORD dataBytes; }; HANDLE hKeyMap; VOID keyMapInit() /* mbbx 1.04: all new... */ { hKeyMap = NULL; keyMapState = 0; } VOID keyMapCancel() { if(hKeyMap != NULL) hKeyMap = GlobalFree(hKeyMap); } BOOL NEAR keyMapSetState(WPARAM wParam) { keyMapState = 0; if(GetKeyState(VK_SHIFT) & 0x8000) keyMapState |= VKS_SHIFT; if(GetKeyState(VK_CONTROL) & 0x8000) keyMapState |= VKS_CTRL; if(GetKeyState(VK_MENU) & 0x8000) keyMapState |= VKS_ALT; keyMapState |= (keyMapState >> 8); return(((wParam >= VK_SHIFT) && (wParam <= VK_MENU)) ? TRUE : FALSE); } BOOL keyMapTranslate(WPARAM *wParam, LPARAM *lParam, STRING *mapStr) { BOOL keyMapTranslate = FALSE; LPKEYMAP lpKeyMap; WORD wVirtKey; LPINT lpVirtKey; LPSTR lpKeyData; if(hKeyMap == NULL) { keyMapSetState(*wParam); return(FALSE); } if((lpKeyMap = (LPKEYMAP) GlobalLock(hKeyMap)) == NULL) { return(FALSE); } if((wVirtKey = lpKeyMap->scanCode[(*lParam >> 16) & 0x00FF]) != 0) *wParam = wVirtKey; if(keyMapSetState(*wParam)) return(FALSE); lpVirtKey = &lpKeyMap->virtKey[keyMapState >> 8][*wParam & 0x00FF]; if(*lpVirtKey != -1) { if((*lpVirtKey & 0xF000) == 0xF000) { keyMapState = (*lpVirtKey & 0x0700) | (keyMapState & 0x00FF); *wParam = (*lpVirtKey & 0x00FF); } else { if(mapStr != NULL) { if(*lpVirtKey & 0x8000) { *mapStr = 1; mapStr[1] = (BYTE) *lpVirtKey; } else { lpKeyData = ((LPSTR) lpKeyMap) + sizeof(KEYMAP) + *lpVirtKey; lmovmem(lpKeyData, (LPSTR) mapStr, *lpKeyData+1); } mapStr[*mapStr+1] = 0; } keyMapTranslate = TRUE; } } GlobalUnlock(hKeyMap); return(keyMapTranslate); } // // Brain Dead mucking with our lParam values or CHARS // Causes TranslateMessage to fail. -JohnHall for WLO // VOID NEAR keyMapSendMsg(MSG *msg, WPARAM wParam, BOOL bKeyDown) { /* msg->message = (bKeyDown ? WM_KEYDOWN : WM_KEYUP); if(keyMapState & VKS_ALT) { msg->message += (WM_SYSKEYDOWN - WM_KEYDOWN); } TranslateMessage(msg); DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam); */ if (bKeyDown) { msg->message &= ~0x0001; } else { msg->message |= 0x0001; } TranslateMessage(msg); //DbgPrint("msg.msg %x msg.wparam %x msg.lparam %lx\n", // msg->message, msg->wParam, msg->lParam); DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam); } VOID keyMapKeyProc(HWND hWnd, WORD message, WPARAM wParam, LPARAM lParam) // sdj: AltGr { BOOL bSetState; BYTE keyState[256], newKeyState[256]; MSG msg; if(bSetState = ((keyMapState & (VKS_SHIFT | VKS_CTRL | VKS_ALT)) != ((keyMapState << 8) & (VKS_SHIFT | VKS_CTRL | VKS_ALT)))) { GetKeyboardState((LPSTR) keyState); memcpy(newKeyState, keyState, 256); newKeyState[VK_SHIFT] = (keyMapState & VKS_SHIFT) ? 0x81 : 0x00; newKeyState[VK_CONTROL] = (keyMapState & VKS_CTRL) ? 0x81 : 0x00; newKeyState[VK_MENU] = (keyMapState & VKS_ALT) ? 0x81 : 0x00; SetKeyboardState((LPSTR) newKeyState); } msg.hwnd = hWnd; msg.wParam = wParam; msg.lParam = lParam; msg.message = message; //sdj AltGr keyMapSendMsg(&msg, wParam, (lParam & (1L << 31)) ? FALSE : TRUE); if(bSetState) SetKeyboardState((LPSTR) keyState); } BOOL keyMapSysKey(HWND hWnd, WORD message, WPARAM *wParam, LPARAM lParam) //sdj: AltGr { MSG msg; if((*wParam >= VK_SHIFT) && (*wParam <= VK_MENU)) { msg.hwnd = hItWnd; msg.wParam = *wParam; msg.lParam = lParam; msg.message = message; //sdj: AltGr keyMapSendMsg(&msg, *wParam, (lParam & (1L << 31)) ? FALSE : TRUE); return(TRUE); } if(keyMapState & VKS_CTRL) { /* jtf 3.30 if(*wParam == VK_TAB) { return(TRUE); } else */ if((*wParam >= VK_F1) && (*wParam <= VK_F10)) { if(!(lParam & (1L << 31))) { if(keyMapState & VKS_ALT) selectFKey(IDFK1+((UINT)*wParam-VK_F1)); /* jtf 3.30 else if(hWnd != hItWnd) { switch(*wParam) { case VK_F4: *wParam = SC_CLOSE; break; case VK_F5: *wParam = SC_RESTORE; break; case VK_F6: makeActiveNext(keyMapState & VKS_SHIFT); return(TRUE); case VK_F7: *wParam = SC_MOVE; break; case VK_F8: *wParam = SC_SIZE; break; case VK_F10: *wParam = SC_MAXIMIZE; break; } SendMessage(hWnd, WM_SYSCOMMAND, *wParam, 0L); } */ } return(TRUE); } } else if(keyMapState & VKS_ALT) { switch(*wParam) { case VK_BACK: /* ALT BACK -> UNDO */ keyMapKeyProc(hWnd, message , *wParam, lParam); //sdj: AltGr return(TRUE); case VK_F1: case VK_F2: *wParam += 10; keyMapState &= ~VKS_ALT; break; case VK_F4: case VK_F5: case VK_F6: case VK_F7: case VK_F8: case VK_F9: case VK_F10: DefWindowProc(hItWnd, !(lParam & (1L << 31)) ? WM_SYSKEYDOWN : WM_SYSKEYUP, *wParam, lParam); return(TRUE); default: keyMapKeyProc(hItWnd, message, *wParam, lParam); // sdj: AltGr return(TRUE); } } return(FALSE); } /*---------------------------------------------------------------------------*/ /* classifyKey() - [mbb] */ /*---------------------------------------------------------------------------*/ #define TKS_IDPGUP 0 /* mbbx 2.00 ... */ #define TKS_IDLEFT 4 #define TKS_IDINSERT 8 #define TKS_IDNUMERIC0 10 #define TKS_IDF1 26 #define TKS_IDSHIFTF1 38 INT classifyKey(WORD vrtKey) { INT classifyKey = TERMINALFKEY; switch(vrtKey) { case VK_CANCEL: if(keyMapState & VKS_CTRL) classifyKey = ((keyMapState & VKS_SHIFT) ? LONGBREAK : SHORTBREAK); else classifyKey = STANDARDKEY; break; case VK_PRIOR: case VK_NEXT: case VK_END: case VK_HOME: case VK_LEFT: case VK_UP: case VK_RIGHT: case VK_DOWN: /* rjs - add test for trmParams.useWinCtrl */ if(!((GetKeyState(0x91) & 0x0001) || trmParams.useWinCtrl)) seqTableNdx = (vrtKey - VK_PRIOR) + TKS_IDPGUP; else classifyKey = SCROLLKEY; break; case VK_SELECT: seqTableNdx = (VK_END - VK_PRIOR) + TKS_IDPGUP; break; case VK_INSERT: classifyKey = (!(keyMapState & (VKS_CTRL | VKS_SHIFT)) ? TERMINALFKEY : STANDARDKEY); seqTableNdx = TKS_IDINSERT; break; case VK_DELETE: classifyKey = (!(keyMapState & VKS_SHIFT) ? TERMINALFKEY : STANDARDKEY); seqTableNdx = (VK_DELETE - VK_INSERT) + TKS_IDINSERT; break; case VK_NUMPAD0: case VK_NUMPAD1: case VK_NUMPAD2: case VK_NUMPAD3: case VK_NUMPAD4: case VK_NUMPAD5: case VK_NUMPAD6: case VK_NUMPAD7: case VK_NUMPAD8: case VK_NUMPAD9: case VK_MULTIPLY: case VK_ADD: case VK_SEPARATOR: case VK_SUBTRACT: case VK_DECIMAL: case VK_DIVIDE: seqTableNdx = (vrtKey - VK_NUMPAD0) + TKS_IDNUMERIC0; break; case VK_F1: case VK_F2: case VK_F3: case VK_F4: case VK_F5: case VK_F6: case VK_F7: case VK_F8: case VK_F9: case VK_F10: case VK_F11: case VK_F12: /* rjs - add test for trmParams.useWinCtrl */ if(!((GetKeyState(0x91) & 0x0001) || trmParams.useWinCtrl)) { if (vrtKey==VK_F1) doCommand(hTermWnd, HMINDEX, 0); classifyKey = STANDARDKEY; break; } seqTableNdx = (vrtKey - VK_F1) + (!(keyMapState & VKS_SHIFT) ? TKS_IDF1 : TKS_IDSHIFTF1); break; case VK_F13: case VK_F14: case VK_F15: case VK_F16: seqTableNdx = (vrtKey - VK_F13) + TKS_IDSHIFTF1; break; default: classifyKey = STANDARDKEY; break; } return(classifyKey); } /*---------------------------------------------------------------------------*/ /* keyPadSequence() - [mbb] */ /*---------------------------------------------------------------------------*/ BOOL keyPadSequence() { INT ndx; LPBYTE emulKeyBase; BYTE keyPadByte; if(!(emulKeyBase = GlobalLock(hemulKeyInfo))) return(FALSE); emulKeyBase += (seqTableNdx * KEYSEQLEN); *keyPadString = 0; for(ndx = 0; *(emulKeyBase + ndx) != 0; ndx++) keyPadString[++(*keyPadString)] = *(emulKeyBase + ndx); GlobalUnlock(hemulKeyInfo); if((trmParams.emulate >= ITMVT52) && (trmParams.emulate <= ITMVT220)) { if(((seqTableNdx >= TKS_IDLEFT) && (seqTableNdx < TKS_IDINSERT)) && cursorKeyMode) { switch(trmParams.emulate) { case ITMVT100: keyPadString[2] = 0x4F; break; } } else if(((seqTableNdx >= TKS_IDNUMERIC0) && (seqTableNdx < TKS_IDF1)) && !keyPadAppMode) { switch(seqTableNdx) { case TKS_IDNUMERIC0+10: keyPadByte = '-'; break; case TKS_IDNUMERIC0+11: keyPadByte = CR; break; case TKS_IDNUMERIC0+12: keyPadByte = ' '; break; case TKS_IDNUMERIC0+13: keyPadByte = ','; break; case TKS_IDNUMERIC0+14: keyPadByte = '.'; break; case TKS_IDNUMERIC0+15: keyPadByte = ' '; break; default: keyPadByte = (seqTableNdx - TKS_IDNUMERIC0) + '0'; break; } keyPadString[*keyPadString = 1] = keyPadByte; } } return(TRUE); } /*---------------------------------------------------------------------------*/ /* sendKeyInput() - [mbb] */ /*---------------------------------------------------------------------------*/ BOOL sendKeyInput(BYTE theByte) { switch(kbdLock) { case KBD_ECHO: modemInp(theByte, FALSE); /* mbbx 1.10 */ break; default: modemWr(theByte); break; } return(TRUE); }