Changeset 2755 for trunk/synergy/lib/platform/CPMKeyState.cpp
- Timestamp:
- Jul 31, 2006, 5:21:38 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/synergy/lib/platform/CPMKeyState.cpp
r2752 r2755 3 3 * Copyright (C) 2003 Chris Schoeneman 4 4 * Copyright (C) 2006 Knut St. Osmundsen 5 * 5 * 6 6 * This package is free software; you can redistribute it and/or 7 7 * modify it under the terms of the GNU General Public License 8 8 * found in the file COPYING that should have accompanied this file. 9 * 9 * 10 10 * This package is distributed in the hope that it will be useful, 11 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of … … 30 30 { 31 31 /* 0x000 */ kKeyNone, // reserved 32 /* 0x001 */ kKeyNone, // VK_BUTTON1 VK_BUTTON1 0x000133 /* 0x002 */ kKeyNone, // VK_BUTTON2 VK_BUTTON2 0x000234 /* 0x003 */ kKeyNone, // VK_BUTTON3 VK_BUTTON3 0x000335 /* 0x004 */ kKeyBreak, // VK_BREAK VK_BREAK 0x000432 /* 0x001 */ kKeyNone, // VK_BUTTON1 33 /* 0x002 */ kKeyNone, // VK_BUTTON2 34 /* 0x003 */ kKeyNone, // VK_BUTTON3 35 /* 0x004 */ kKeyBreak, // VK_BREAK 36 36 /* 0x005 */ kKeyBackSpace, // VK_BACKSPACE 37 37 /* 0x006 */ kKeyTab, // VK_TAB … … 39 39 /* 0x008 */ kKeyReturn, // VK_NEWLINE 40 40 /* 0x009 */ kKeyShift_L, // VK_SHIFT 41 /* 0x00a */ kKeyControl_L, // VK_CTRL 0x000a42 /* 0x00b */ kKeyAlt_L, // VK_ALT 0x000b43 /* 0x00c */ kKeyAltGr, // VK_ALTGRAF 0x000c44 /* 0x00d */ kKeyPause, // VK_PAUSE 0x000d45 /* 0x00e */ kKeyCapsLock, // VK_CAPSLOCK 0x000e46 /* 0x00f */ kKeyEscape, // VK_ESC 0x000f47 /* 0x010 */ kKeyNone, // VK_SPACE 0x001048 /* 0x011 */ kKeyPageUp, // VK_PAGEUP 0x001149 /* 0x012 */ kKeyPageDown, // VK_PAGEDOWN 0x001250 /* 0x013 */ kKeyEnd, // VK_END 0x001351 /* 0x014 */ kKeyHome, // VK_HOME 0x001452 /* 0x015 */ kKeyLeft, // VK_LEFT 0x001553 /* 0x016 */ kKeyUp, // VK_UP 0x001654 /* 0x017 */ kKeyRight, // VK_RIGHT 0x001755 /* 0x018 */ kKeyDown, // VK_DOWN 0x001856 /* 0x019 */ kKeyNone, // VK_PRINTSCRN 0x001957 /* 0x01a */ kKeyInsert, // VK_INSERT 0x001a58 /* 0x01b */ kKeyDelete, // VK_DELETE 0x001b59 /* 0x01c */ kKeyScrollLock, // VK_SCRLLOCK 0x001c60 /* 0x01d */ kKeyNumLock, // VK_NUMLOCK 0x001d61 /* 0x01e */ kKeyKP_Enter, // VK_ENTER 0x001e62 /* 0x01f */ kKeySysReq, // VK_SYSRQ 0x001f63 /* 0x020 */ kKeyF1, // VK_F1 0x002064 /* 0x021 */ kKeyF2, // VK_F2 0x002165 /* 0x022 */ kKeyF3, // VK_F3 0x002266 /* 0x023 */ kKeyF4, // VK_F4 0x002367 /* 0x024 */ kKeyF5, // VK_F5 0x002468 /* 0x025 */ kKeyF6, // VK_F6 0x002569 /* 0x026 */ kKeyF7, // VK_F7 0x002670 /* 0x027 */ kKeyF8, // VK_F8 0x002771 /* 0x028 */ kKeyF9, // VK_F9 0x002872 /* 0x029 */ kKeyF10, // VK_F10 0x002973 /* 0x02a */ kKeyF11, // VK_F11 0x002a74 /* 0x02b */ kKeyF12, // VK_F12 0x002b75 /* 0x02c */ kKeyF13, // VK_F13 0x002c76 /* 0x02d */ kKeyF14, // VK_F14 0x002d77 /* 0x02e */ kKeyF15, // VK_F15 0x002e78 /* 0x02f */ kKeyF16, // VK_F16 0x002f79 /* 0x030 */ kKeyF17, // VK_F17 0x003080 /* 0x031 */ kKeyF18, // VK_F18 0x003181 /* 0x032 */ kKeyF19, // VK_F19 0x003282 /* 0x033 */ kKeyF20, // VK_F20 0x003383 /* 0x034 */ kKeyF21, // VK_F21 0x003484 /* 0x035 */ kKeyF22, // VK_F22 0x003585 /* 0x036 */ kKeyF23, // VK_F23 0x003686 /* 0x037 */ kKeyF24, // VK_F24 0x003787 /* 0x038 */ kKeyNone, // VK_ENDDRAG 0x003888 /* 0x039 */ kKeyClear, // VK_CLEAR 0x003989 /* 0x03a */ kKeyNone, // VK_EREOF 0x003a90 /* 0x03b */ kKeyNone, // VK_PA1 0x003b91 /* 0x03c */ kKeyNone, // VK_ATTN 0x003c92 /* 0x03d */ kKeyNone, // VK_CRSEL 0x003d93 /* 0x03e */ kKeyNone, // VK_EXSEL 0x003e94 /* 0x03f */ kKeyNone, // VK_COPY 0x003f95 /* 0x040 */ kKeyNone, // VK_BLK1 0x004096 /* 0x041 */ kKeyNone // VK_BLK2 0x004141 /* 0x00a */ kKeyControl_L, // VK_CTRL 42 /* 0x00b */ kKeyAlt_L, // VK_ALT 43 /* 0x00c */ kKeyAltGr, // VK_ALTGRAF 44 /* 0x00d */ kKeyPause, // VK_PAUSE 45 /* 0x00e */ kKeyCapsLock, // VK_CAPSLOCK 46 /* 0x00f */ kKeyEscape, // VK_ESC 47 /* 0x010 */ kKeyNone, // VK_SPACE 48 /* 0x011 */ kKeyPageUp, // VK_PAGEUP 49 /* 0x012 */ kKeyPageDown, // VK_PAGEDOWN 50 /* 0x013 */ kKeyEnd, // VK_END 51 /* 0x014 */ kKeyHome, // VK_HOME 52 /* 0x015 */ kKeyLeft, // VK_LEFT 53 /* 0x016 */ kKeyUp, // VK_UP 54 /* 0x017 */ kKeyRight, // VK_RIGHT 55 /* 0x018 */ kKeyDown, // VK_DOWN 56 /* 0x019 */ kKeyNone, // VK_PRINTSCRN 57 /* 0x01a */ kKeyInsert, // VK_INSERT 58 /* 0x01b */ kKeyDelete, // VK_DELETE 59 /* 0x01c */ kKeyScrollLock, // VK_SCRLLOCK 60 /* 0x01d */ kKeyNumLock, // VK_NUMLOCK 61 /* 0x01e */ kKeyKP_Enter, // VK_ENTER 62 /* 0x01f */ kKeySysReq, // VK_SYSRQ 63 /* 0x020 */ kKeyF1, // VK_F1 64 /* 0x021 */ kKeyF2, // VK_F2 65 /* 0x022 */ kKeyF3, // VK_F3 66 /* 0x023 */ kKeyF4, // VK_F4 67 /* 0x024 */ kKeyF5, // VK_F5 68 /* 0x025 */ kKeyF6, // VK_F6 69 /* 0x026 */ kKeyF7, // VK_F7 70 /* 0x027 */ kKeyF8, // VK_F8 71 /* 0x028 */ kKeyF9, // VK_F9 72 /* 0x029 */ kKeyF10, // VK_F10 73 /* 0x02a */ kKeyF11, // VK_F11 74 /* 0x02b */ kKeyF12, // VK_F12 75 /* 0x02c */ kKeyF13, // VK_F13 76 /* 0x02d */ kKeyF14, // VK_F14 77 /* 0x02e */ kKeyF15, // VK_F15 78 /* 0x02f */ kKeyF16, // VK_F16 79 /* 0x030 */ kKeyF17, // VK_F17 80 /* 0x031 */ kKeyF18, // VK_F18 81 /* 0x032 */ kKeyF19, // VK_F19 82 /* 0x033 */ kKeyF20, // VK_F20 83 /* 0x034 */ kKeyF21, // VK_F21 84 /* 0x035 */ kKeyF22, // VK_F22 85 /* 0x036 */ kKeyF23, // VK_F23 86 /* 0x037 */ kKeyF24, // VK_F24 87 /* 0x038 */ kKeyNone, // VK_ENDDRAG 88 /* 0x039 */ kKeyClear, // VK_CLEAR 89 /* 0x03a */ kKeyNone, // VK_EREOF 90 /* 0x03b */ kKeyNone, // VK_PA1 91 /* 0x03c */ kKeyNone, // VK_ATTN 92 /* 0x03d */ kKeyNone, // VK_CRSEL 93 /* 0x03e */ kKeyNone, // VK_EXSEL 94 /* 0x03f */ kKeyNone, // VK_COPY 95 /* 0x040 */ kKeyNone, // VK_BLK1 96 /* 0x041 */ kKeyNone // VK_BLK2 97 97 }; 98 98 … … 114 114 m_eventTarget(eventTarget), 115 115 m_fixTimer(NULL), 116 m_lastDown( 0),116 m_lastDown(kKeyNone), 117 117 m_useSavedModifiers(false), 118 118 m_savedModifiers(0), … … 135 135 m_fixTimer = NULL; 136 136 } 137 m_lastDown = 0;137 m_lastDown = kKeyNone; 138 138 } 139 139 … … 147 147 CPMKeyState::testAutoRepeat(bool press, bool isRepeat, KeyButton button) 148 148 { 149 if (!isRepeat) { 150 isRepeat = (press && m_lastDown != 0 && button == m_lastDown); 151 } 152 if (press) { 153 m_lastDown = button; 154 } 155 else { 156 m_lastDown = 0; 157 } 149 if (!isRepeat) 150 isRepeat = press && button == m_lastDown && button != kKeyNone; 151 m_lastDown = press ? button : kKeyNone; 158 152 return isRepeat; 159 153 } … … 174 168 // transfer any modifier state changes to CKeyState's state 175 169 KeyModifierMask mask = m_originalSavedModifiers ^ m_savedModifiers; 176 getActiveModifiersRValue() = 177 (getActiveModifiers() & ~mask) | (m_savedModifiers & mask); 170 getActiveModifiersRValue() = (getActiveModifiers() & ~mask) | (m_savedModifiers & mask); 178 171 } 179 172 } … … 181 174 182 175 KeyID 183 CPMKeyState::mapKeyFromEvent(MPARAM charAndVirtKey, MPARAM info, KeyModifierMask* maskOut) const 184 { 176 CPMKeyState::mapKeyFromEvent(USHORT fsFlags, UCHAR ucRepeat, UCHAR ucScanCode, USHORT usch, USHORT usvk, KeyModifierMask* maskOut) const 177 { 178 #if 0 /** @todo */ 185 179 static const KeyModifierMask s_controlAlt = KeyModifierControl | KeyModifierAlt; 186 180 … … 228 222 *maskOut = active; 229 223 } 230 231 224 return id; 232 } 233 234 bool 235 CPMKeyState::didGroupsChange() const 236 { 237 GroupList groups; 238 return (getGroups(groups) && groups != m_groups); 239 } 240 241 UINT 225 #else 226 return kKeyNone; 227 #endif 228 } 229 230 ULONG 242 231 CPMKeyState::mapKeyToVirtualKey(KeyID key) const 243 232 { 244 if (key == kKeyNone) {233 if (key == kKeyNone) 245 234 return 0; 246 }247 235 KeyToVKMap::const_iterator i = m_keyToVKMap.find(key); 248 if (i == m_keyToVKMap.end()) {236 if (i == m_keyToVKMap.end()) 249 237 return 0; 250 } 251 else { 252 return i->second; 253 } 238 return i->second; 254 239 } 255 240 … … 272 257 // send key 273 258 if (press && !isAutoRepeat) { 274 CKeyState::sendKeyEvent(target, true, false, 275 key, mask, 1, button); 259 CKeyState::sendKeyEvent(target, true, false, key, mask, 1, button); 276 260 if (count > 0) { 277 261 --count; … … 279 263 } 280 264 if (count >= 1) { 281 CKeyState::sendKeyEvent(target, true, true, 282 key, mask, count, button); 265 CKeyState::sendKeyEvent(target, true, true, key, mask, count, button); 283 266 } 284 267 } … … 290 273 291 274 void 292 CPMKeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, 293 KeyButton button) 275 CPMKeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, KeyButton button) 294 276 { 295 277 CKeyState::fakeKeyDown(id, mask, button); … … 297 279 298 280 void 299 CPMKeyState::fakeKeyRepeat(KeyID id, KeyModifierMask mask, 300 SInt32 count, KeyButton button) 281 CPMKeyState::fakeKeyRepeat(KeyID id, KeyModifierMask mask, SInt32 count, KeyButton button) 301 282 { 302 283 CKeyState::fakeKeyRepeat(id, mask, count, button); … … 323 304 324 305 // we can get toggle modifiers from the system 325 if (WinGetKeyState(HWND_DESKTOP, VK_CAP ITAL) & 1) {306 if (WinGetKeyState(HWND_DESKTOP, VK_CAPSLOCK) & 1) 326 307 state |= KeyModifierCapsLock; 327 } 328 if (WinGetKeyState(HWND_DESKTOP, VK_NUMLOCK) & 1) { 308 if (WinGetKeyState(HWND_DESKTOP, VK_NUMLOCK) & 1) 329 309 state |= KeyModifierNumLock; 330 } 331 if (WinGetKeyState(HWND_DESKTOP, VK_SCROLL) & 1) { 310 if (WinGetKeyState(HWND_DESKTOP, VK_SCRLLOCK) & 1) 332 311 state |= KeyModifierScrollLock; 333 }334 335 312 return state; 336 313 } … … 623 600 } 624 601 } 625 602 626 603 // save each key. the map will automatically discard 627 604 // duplicates, like an unshift and shifted version of … … 742 719 } 743 720 744 bool745 CPMKeyState::getGroups(GroupList& groups) const746 {747 // get keyboard layouts748 UInt32 newNumLayouts = GetKeyboardLayoutList(0, NULL);749 if (newNumLayouts == 0) {750 LOG((CLOG_DEBUG1 "can't get keyboard layouts"));751 return false;752 }753 HKL* newLayouts = new HKL[newNumLayouts];754 newNumLayouts = GetKeyboardLayoutList(newNumLayouts, newLayouts);755 if (newNumLayouts == 0) {756 LOG((CLOG_DEBUG1 "can't get keyboard layouts"));757 delete[] newLayouts;758 return false;759 }760 761 groups.clear();762 groups.insert(groups.end(), newLayouts, newLayouts + newNumLayouts);763 delete[] newLayouts;764 return true;765 }766 767 void768 CPMKeyState::setWindowGroup(SInt32 group)769 {770 HWND targetWindow = GetForegroundWindow();771 772 bool sysCharSet = true;773 // XXX -- determine if m_groups[group] can be used with the system774 // character set.775 776 PostMessage(targetWindow, WM_INPUTLANGCHANGEREQUEST,777 sysCharSet ? 1 : 0, (LPARAM)m_groups[group]);778 779 // XXX -- use a short delay to let the target window process the message780 // before it sees the keyboard events. i'm not sure why this is781 // necessary since the messages should arrive in order. if we don't782 // delay, though, some of our keyboard events may disappear.783 Sleep(100);784 }785 786 721 void 787 722 CPMKeyState::fixKeys() … … 822 757 LOG((CLOG_DEBUG1 "event: fake key release left windows key (0x%03x)", leftButton)); 823 758 CKeyState::onKey(leftButton, false, state); 824 CKeyState::sendKeyEvent(m_eventTarget, false, false, 825 kKeySuper_L, state, 1, leftButton); 759 CKeyState::sendKeyEvent(m_eventTarget, false, false, kKeySuper_L, state, 1, leftButton); 826 760 } 827 761 if (rightDown && !rightAsyncDown) { 828 762 LOG((CLOG_DEBUG1 "event: fake key release right windows key (0x%03x)", rightButton)); 829 763 CKeyState::onKey(rightButton, false, state); 830 CKeyState::sendKeyEvent(m_eventTarget, false, false, 831 kKeySuper_R, state, 1, rightButton); 764 CKeyState::sendKeyEvent(m_eventTarget, false, false, kKeySuper_R, state, 1, rightButton); 832 765 } 833 766 } … … 910 843 } 911 844 } 845 846 /* 847 * Local Variables: 848 * mode: c 849 * c-file-style: "k&r" 850 * c-basic-offset: 4 851 * tab-width: 4 852 * indent-tabs-mode: t 853 * End: 854 */ 855
Note:
See TracChangeset
for help on using the changeset viewer.