Changeset 10012 for trunk/src/user32/oslibmsgtranslate.cpp
- Timestamp:
- Apr 11, 2003, 4:22:06 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/oslibmsgtranslate.cpp
r9950 r10012 1 /* $Id: oslibmsgtranslate.cpp,v 1.10 7 2003-03-28 11:49:01sandervl Exp $ */1 /* $Id: oslibmsgtranslate.cpp,v 1.108 2003-04-11 14:22:06 sandervl Exp $ */ 2 2 /* 3 3 * Window message translation functions for OS/2 … … 52 52 //PF Correction is different for different mouse drivers. For now no correction 53 53 //is ok because lots of Odin controls rely on minimum delta. However in future 54 //we will possibly detect mouse driver and use correction if speed will be 54 //we will possibly detect mouse driver and use correction if speed will be 55 55 //too high or too low. 56 56 57 57 //****************************************************************************** 58 58 //****************************************************************************** … … 90 90 ret = pmScan; 91 91 } 92 92 93 93 KeyTranslatePMScanToWinVKey(ret, FALSE, (PBYTE)&winKey, NULL, NULL); 94 94 return winKey; … … 127 127 } 128 128 //****************************************************************************** 129 130 131 /** 132 * Inter process/thread packet cleanup. 133 * See OSLibPackMessage() for details on the packing. 134 * 135 * @param pTeb Pointer to the thread environment block for the current thread. 136 * @param pPacket Pointer to the packet in question. 137 * @param pWinMsg Pointer to the window message corresponding to the packet. 138 */ 139 inline void OSLibCleanupPacket(TEB *pTeb, POSTMSG_PACKET *pPacket, MSG *pWinMsg) 140 { 141 switch (pWinMsg->message) 142 { 143 /* 144 * Place this in the TEB freeing any previous WM_COPYDATA packet. 145 * Note! Nested WM_COPYDATA isn't working. 146 */ 147 case WINWM_COPYDATA: 148 { 149 dprintf(("OSLibCleanupPacket: WM_COPYDATA: old %#p new %#p", pTeb->o.odin.pWM_COPYDATA, pPacket)); 150 if (pTeb->o.odin.pWM_COPYDATA) 151 _sfree(pTeb->o.odin.pWM_COPYDATA); 152 pTeb->o.odin.pWM_COPYDATA = pPacket; 153 break; 154 } 155 156 /* 157 * Default packing - free the shared memory here. 158 */ 159 default: 160 _sfree(pPacket); 161 break; 162 } 163 } 164 129 165 //****************************************************************************** 130 166 BOOL OS2ToWinMsgTranslate(void *pTeb, QMSG *os2Msg, MSG *winMsg, BOOL isUnicode, BOOL fMsgRemoved) … … 167 203 winMsg->wParam = packet->wParam; 168 204 winMsg->lParam = packet->lParam; 169 if(fMsgRemoved == MSG_REMOVE) free(packet); //free the shared memory here 205 if (fMsgRemoved == MSG_REMOVE) 206 OSLibCleanupPacket(teb, packet, winMsg); 170 207 if(win32wnd) RELEASE_WNDOBJ(win32wnd); 171 208 return TRUE; … … 407 444 (winMsg->message == WINWM_NCMBUTTONDOWN)) 408 445 { 409 if(fGenerateDoubleClick && doubleClickMsg.message == winMsg->message && 446 if(fGenerateDoubleClick && doubleClickMsg.message == winMsg->message && 410 447 winMsg->time - doubleClickMsg.time < GetDoubleClickTime() && 411 448 (abs(winMsg->pt.x - doubleClickMsg.pt.x) < GetSystemMetrics(SM_CXDOUBLECLK_W)/2) && 412 (abs(winMsg->pt.y - doubleClickMsg.pt.y) < GetSystemMetrics(SM_CYDOUBLECLK_W)/2)) 449 (abs(winMsg->pt.y - doubleClickMsg.pt.y) < GetSystemMetrics(SM_CYDOUBLECLK_W)/2)) 413 450 { 414 451 dprintf(("single -> double click")); … … 440 477 } 441 478 else msg = winMsg->message; 442 479 443 480 if(msg == WINWM_LBUTTONDBLCLK) { 444 481 msg = WINWM_LBUTTONDOWN; … … 589 626 //FALSE -> keyboard operation = user pressed Alt-F4 -> close app 590 627 //TRUE -> user clicked on close button -> close window 591 if(SHORT2FROMMP(os2Msg->mp2) == FALSE) 628 if(SHORT2FROMMP(os2Msg->mp2) == FALSE) 592 629 { 593 630 HWND hwnd = win32wnd->GetTopParent(); … … 655 692 // NO BREAK! FALLTHRU CASE! 656 693 } 657 694 658 695 case WM_CHAR_SPECIAL: 659 696 { … … 665 702 // NO BREAK! FALLTHRU CASE! 666 703 } 667 704 668 705 case WM_CHAR: 669 706 { … … 674 711 ULONG flags = SHORT1FROMMP(os2Msg->mp1); 675 712 BOOL keyWasPressed; 676 BOOL numPressed = (BOOL)(WinGetKeyState(HWND_DESKTOP,VK_NUMLOCK) & 1); 713 BOOL numPressed = (BOOL)(WinGetKeyState(HWND_DESKTOP,VK_NUMLOCK) & 1); 677 714 char c; 678 715 USHORT usPMScanCode = CHAR4FROMMP(os2Msg->mp1); … … 693 730 694 731 KeyTranslatePMScanToWinVKey(usPMScanCode, 695 FALSE, 732 FALSE, 696 733 &bWinVKey, 697 734 &wWinScan, … … 700 737 winMsg->lParam = repeatCount & 0x0FFFF; // bit 0-15, repeatcount 701 738 winMsg->lParam |= (wWinScan & 0x1FF) << 16; // bit 16-23, scancode + bit 15 extended 702 739 703 740 // Set the extended bit when appropriate 704 741 if (fWinExtended) 705 742 winMsg->lParam = winMsg->lParam | WIN_KEY_EXTENDED; 706 743 707 744 //PF When we press shift we enable non-numeric functions of Numpad 708 745 if ((!numPressed || (flags & KC_SHIFT)) && (scanCode >= PMSCAN_PAD7) && (scanCode <= PMSCAN_PADPERIOD)) 709 746 winMsg->wParam = ConvertNumPadKey(scanCode); … … 728 765 winMsg->lParam = 0x01460001; 729 766 } 730 767 731 768 if (!(flags & KC_ALT)) 732 769 { … … 745 782 // held ALT-key when current key is released 746 783 // generates additional flag 0x2000000 747 // Note: PM seems to do this differently, 784 // Note: PM seems to do this differently, 748 785 // KC_ALT is already reset 749 786 } … … 756 793 winMsg->lParam |= 1 << 31; // bit 31, transition state, always 1 for WM_KEYUP 757 794 } 758 else 795 else 759 796 { // send WM_KEYDOWN message 760 797 winMsg->message = WINWM_KEYDOWN; … … 762 799 if (keyWasPressed) 763 800 winMsg->lParam |= WIN_KEY_PREVSTATE; // bit 30, previous state, 1 means key was pressed 764 801 765 802 //Shift-Enter and possibly others need to have special handling 766 803 if (flags & KC_SHIFT) 767 804 { 768 805 if(fMsgRemoved && !(teb->o.odin.fTranslated)) 769 { 806 { 770 807 dprintf(("PM: KC_SHIFT: %x",winMsg->wParam)); 771 808 if (winMsg->wParam == VK_RETURN_W) … … 773 810 MSG extramsg; 774 811 memcpy(&extramsg, winMsg, sizeof(MSG)); 775 812 776 813 //After SetFocus(0), all keystrokes are converted in WM_SYS* 777 814 extramsg.message = (fIgnoreKeystrokes) ? WINWM_SYSCHAR : WINWM_CHAR; … … 791 828 MSG extramsg; 792 829 memcpy(&extramsg, winMsg, sizeof(MSG)); 793 830 794 831 //After SetFocus(0), all keystrokes are converted in WM_SYS* 795 832 extramsg.message = (fIgnoreKeystrokes) ? WINWM_SYSCHAR : WINWM_CHAR; … … 802 839 // if right alt is down, then we need to set the alt down bit too 803 840 // except for the fake Ctrl WM_CHAR sent for AltGr emulation 804 if (os2Msg->msg != WM_CHAR_SPECIAL_ALTGRCONTROL && 805 (WinGetKeyState(HWND_DESKTOP, VK_ALTGRAF) & 0x8000)) 841 if (os2Msg->msg != WM_CHAR_SPECIAL_ALTGRCONTROL && 842 (WinGetKeyState(HWND_DESKTOP, VK_ALTGRAF) & 0x8000)) 806 843 { 807 winMsg->lParam |= WIN_KEY_ALTHELD; 844 winMsg->lParam |= WIN_KEY_ALTHELD; 808 845 } 809 846 } 810 else 847 else 811 848 { 812 849 // … … 817 854 //@@PF Note that without pmkbdhook there will not be correct message for Alt-Enter 818 855 winMsg->message = WINWM_SYSKEYUP; 819 winMsg->lParam |= WIN_KEY_PREVSTATE; 856 winMsg->lParam |= WIN_KEY_PREVSTATE; 820 857 // No ALTHELD for Alt itself ;) 821 winMsg->lParam |= WIN_KEY_ALTHELD; 822 winMsg->lParam |= 1 << 31; // bit 31, transition state, always 1 for WM_KEYUP 858 winMsg->lParam |= WIN_KEY_ALTHELD; 859 winMsg->lParam |= 1 << 31; // bit 31, transition state, always 1 for WM_KEYUP 823 860 } 824 else 861 else 825 862 { 826 863 // send WM_SYSKEYDOWN message … … 838 875 // AltGr needs special handling 839 876 // 840 // AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU) 877 // AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU) 841 878 // WM_SYSKEYUP (VK_CONTROL) 842 879 // WM_KEYUP (VK_MENU) 843 880 // 844 // Ctrl+AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYUP (VK_CONTROL) 845 // WM_KEYDOWN (VK_MENU) 881 // Ctrl+AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYUP (VK_CONTROL) 882 // WM_KEYDOWN (VK_MENU) 846 883 // WM_KEYUP (VK_MENU) 847 // WM_KEYUP (VK_CONTROL) 884 // WM_KEYUP (VK_CONTROL) 848 885 // 849 // AltGr+Ctrl -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU) 850 // WM_KEYDOWN (VK_CONTROL) 851 // WM_SYSKEYUP (VK_CONTROL) 852 // WM_SYSKEYUP (VK_CONTROL) 886 // AltGr+Ctrl -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU) 887 // WM_KEYDOWN (VK_CONTROL) 888 // WM_SYSKEYUP (VK_CONTROL) 889 // WM_SYSKEYUP (VK_CONTROL) 853 890 // WM_KEYUP (VK_MENU) 854 891 // … … 861 898 // endif 862 899 // Send WM_KEYDOWN (VK_MENU) 863 // 864 if(winMsg->wParam == VK_MENU_W && (winMsg->lParam & WIN_KEY_EXTENDED)) 900 // 901 if(winMsg->wParam == VK_MENU_W && (winMsg->lParam & WIN_KEY_EXTENDED)) 865 902 {//AltGr 866 if(GetKeyState(VK_CONTROL_W) & 0x8000) 903 if(GetKeyState(VK_CONTROL_W) & 0x8000) 867 904 {//Ctrl key pressed, send WM_KEYUP 868 905 869 906 } 870 907 } … … 876 913 winMsg->message = WINWM_SYSKEYDOWN; 877 914 } 878 else 915 else 879 916 if(winMsg->message == WINWM_KEYUP) { 880 917 winMsg->message = WINWM_SYSKEYUP; … … 971 1008 if (os2Msg->msg == WM_VSCROLL) 972 1009 { 973 1010 POINT CursorPoint; 974 1011 winMsg->message = WINWM_MOUSEWHEEL; 975 1012 if (OSLibWinQueryPointerPos(&CursorPoint)) 976 1013 mapScreenPoint((OSLIBPOINT*)&CursorPoint); 977 1014 978 1015 if (SHORT2FROMMP(os2Msg->mp2) == SB_LINEDOWN) 979 winMsg->wParam = MAKELONG(GetMouseKeyState(), -WHEEL_DELTA/OS2_WHEEL_CORRECTION); 1016 winMsg->wParam = MAKELONG(GetMouseKeyState(), -WHEEL_DELTA/OS2_WHEEL_CORRECTION); 980 1017 else 981 1018 if (SHORT2FROMMP(os2Msg->mp2) == SB_LINEUP) 982 winMsg->wParam = MAKELONG(GetMouseKeyState(), WHEEL_DELTA/OS2_WHEEL_CORRECTION); 1019 winMsg->wParam = MAKELONG(GetMouseKeyState(), WHEEL_DELTA/OS2_WHEEL_CORRECTION); 983 1020 else 984 winMsg->wParam = MAKELONG(GetMouseKeyState(), 0); 985 986 winMsg->lParam = MAKELONG(CursorPoint.x, CursorPoint.y); 987 988 dprintf(("WM_MOUSEWHEEL message delta %d at (%d,%d)",HIWORD(winMsg->wParam),CursorPoint.x, CursorPoint.y)); 1021 winMsg->wParam = MAKELONG(GetMouseKeyState(), 0); 1022 1023 winMsg->lParam = MAKELONG(CursorPoint.x, CursorPoint.y); 1024 1025 dprintf(("WM_MOUSEWHEEL message delta %d at (%d,%d)",HIWORD(winMsg->wParam),CursorPoint.x, CursorPoint.y)); 989 1026 if (fMsgRemoved == MSG_REMOVE) 990 1027 { 991 992 993 994 995 996 hook.mouseData = MAKELONG(GetMouseKeyState(), -WHEEL_DELTA/OS2_WHEEL_CORRECTION); 997 998 999 hook.mouseData = MAKELONG(GetMouseKeyState(), WHEEL_DELTA/OS2_WHEEL_CORRECTION); 1000 1001 1002 1003 1004 1005 1006 1007 1028 MSLLHOOKSTRUCT hook; 1029 1030 hook.pt.x = os2Msg->ptl.x & 0xFFFF; 1031 hook.pt.y = mapScreenY(os2Msg->ptl.y); 1032 if (SHORT2FROMMP(os2Msg->mp2) == SB_LINEDOWN) 1033 hook.mouseData = MAKELONG(GetMouseKeyState(), -WHEEL_DELTA/OS2_WHEEL_CORRECTION); 1034 else 1035 if (SHORT2FROMMP(os2Msg->mp2) == SB_LINEUP) 1036 hook.mouseData = MAKELONG(GetMouseKeyState(), WHEEL_DELTA/OS2_WHEEL_CORRECTION); 1037 else goto dummymessage; // IBM driver produces other messages as well sometimes 1038 1039 hook.flags = LLMHF_INJECTED; 1040 hook.time = winMsg->time; 1041 hook.dwExtraInfo = 0; 1042 if(HOOK_CallHooksW( WH_MOUSE_LL, HC_ACTION, WINWM_MOUSEWHEEL, (LPARAM)&hook)) 1043 goto dummymessage; //hook swallowed message 1044 } 1008 1045 break; 1009 } 1046 } 1010 1047 goto dummymessage; //eat this message 1011 1048 break; … … 1054 1091 TEB *teb; 1055 1092 MSG extramsg; 1056 BOOL numPressed = (BOOL)(WinGetKeyState(HWND_DESKTOP,VK_NUMLOCK) & 1); 1093 BOOL numPressed = (BOOL)(WinGetKeyState(HWND_DESKTOP,VK_NUMLOCK) & 1); 1057 1094 teb = GetThreadTEB(); 1058 1095 if(!teb) … … 1061 1098 UCHAR ucPMScanCode = CHAR4FROMMP(teb->o.odin.os2msg.mp1); 1062 1099 ULONG fl = SHORT1FROMMP(teb->o.odin.os2msg.mp1); 1063 1064 1100 1101 1065 1102 //NOTE: These actually need to be posted so that the next message retrieved by GetMessage contains 1066 1103 // the newly generated WM_CHAR message. 1067 1104 if(!teb->o.odin.fTranslated && 1068 teb->o.odin.os2msg.msg == WM_CHAR && 1105 teb->o.odin.os2msg.msg == WM_CHAR && 1069 1106 !((SHORT1FROMMP(teb->o.odin.os2msg.mp1) & KC_KEYUP) == KC_KEYUP)) 1070 1107 { … … 1083 1120 break; 1084 1121 } 1085 1122 1086 1123 // PF With NumLock off do not generate any WM_CHAR messages at all 1087 1124 // PADMINUS,PADPLUS fall in range of PAD7..PADPERIOD but they should generate WM_CHAR … … 1089 1126 if (!numPressed && (ucPMScanCode != PMSCAN_PADMINUS) && (ucPMScanCode != PMSCAN_PADPLUS) && 1090 1127 (ucPMScanCode >= PMSCAN_PAD7) && (ucPMScanCode <= PMSCAN_PADPERIOD)) 1091 return FALSE; 1092 1093 if(!(fl & KC_CHAR) && msg->message < WINWM_SYSKEYDOWN) 1128 return FALSE; 1129 1130 if(!(fl & KC_CHAR) && msg->message < WINWM_SYSKEYDOWN) 1094 1131 { 1095 1132 return FALSE; … … 1103 1140 if(msg->wParam) 1104 1141 { 1105 if ((msg->wParam >= VK_NUMPAD0_W) && 1142 if ((msg->wParam >= VK_NUMPAD0_W) && 1106 1143 (msg->wParam <= VK_NUMPAD9_W)) 1107 1144 extramsg.wParam = msg->wParam - 0x30; … … 1114 1151 extramsg.wParam = msg->wParam; 1115 1152 } 1116 else 1153 else 1117 1154 extramsg.wParam = SHORT2FROMMP(teb->o.odin.os2msg.mp2); 1118 1155 } … … 1120 1157 1121 1158 //After SetFocus(0), all keystrokes are converted in WM_SYS* 1122 if(msg->message >= WINWM_SYSKEYDOWN || fIgnoreKeystrokes) 1159 if(msg->message >= WINWM_SYSKEYDOWN || fIgnoreKeystrokes) 1123 1160 extramsg.message = WINWM_SYSCHAR; 1124 else 1161 else 1125 1162 extramsg.message = WINWM_CHAR; 1126 1163
Note:
See TracChangeset
for help on using the changeset viewer.