Ignore:
Timestamp:
Jul 31, 2006, 5:21:38 AM (19 years ago)
Author:
bird
Message:

bedtime

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/synergy/lib/platform/CPMKeyState.cpp

    r2752 r2755  
    33 * Copyright (C) 2003 Chris Schoeneman
    44 * Copyright (C) 2006 Knut St. Osmundsen
    5  * 
     5 *
    66 * This package is free software; you can redistribute it and/or
    77 * modify it under the terms of the GNU General Public License
    88 * found in the file COPYING that should have accompanied this file.
    9  * 
     9 *
    1010 * This package is distributed in the hope that it will be useful,
    1111 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     
    3030{
    3131        /* 0x000 */ kKeyNone,           // reserved
    32         /* 0x001 */ kKeyNone,           // VK_BUTTON1              VK_BUTTON1          0x0001         
    33         /* 0x002 */ kKeyNone,           // VK_BUTTON2              VK_BUTTON2          0x0002         
    34         /* 0x003 */ kKeyNone,           // VK_BUTTON3              VK_BUTTON3          0x0003         
    35         /* 0x004 */ kKeyBreak,          // VK_BREAK                VK_BREAK            0x0004         
     32        /* 0x001 */ kKeyNone,           // VK_BUTTON1
     33        /* 0x002 */ kKeyNone,           // VK_BUTTON2
     34        /* 0x003 */ kKeyNone,           // VK_BUTTON3
     35        /* 0x004 */ kKeyBreak,          // VK_BREAK
    3636        /* 0x005 */ kKeyBackSpace,      // VK_BACKSPACE
    3737        /* 0x006 */ kKeyTab,            // VK_TAB
     
    3939        /* 0x008 */ kKeyReturn,         // VK_NEWLINE
    4040        /* 0x009 */ kKeyShift_L,        // VK_SHIFT
    41         /* 0x00a */ kKeyControl_L,      // VK_CTRL             0x000a         
    42         /* 0x00b */ kKeyAlt_L,          // VK_ALT              0x000b         
    43         /* 0x00c */ kKeyAltGr,          // VK_ALTGRAF          0x000c         
    44         /* 0x00d */ kKeyPause,          // VK_PAUSE            0x000d         
    45         /* 0x00e */ kKeyCapsLock,       // VK_CAPSLOCK         0x000e         
    46         /* 0x00f */ kKeyEscape,         // VK_ESC              0x000f         
    47         /* 0x010 */ kKeyNone,           // VK_SPACE            0x0010         
    48         /* 0x011 */ kKeyPageUp,         // VK_PAGEUP           0x0011         
    49         /* 0x012 */ kKeyPageDown,       // VK_PAGEDOWN         0x0012         
    50         /* 0x013 */ kKeyEnd,            // VK_END              0x0013         
    51         /* 0x014 */ kKeyHome,           // VK_HOME             0x0014         
    52         /* 0x015 */ kKeyLeft,           // VK_LEFT             0x0015         
    53         /* 0x016 */ kKeyUp,                     // VK_UP               0x0016         
    54         /* 0x017 */ kKeyRight,          // VK_RIGHT            0x0017         
    55         /* 0x018 */ kKeyDown,           // VK_DOWN             0x0018         
    56         /* 0x019 */ kKeyNone,           // VK_PRINTSCRN            0x0019     
    57         /* 0x01a */ kKeyInsert,         // VK_INSERT           0x001a         
    58         /* 0x01b */ kKeyDelete,         // VK_DELETE           0x001b         
    59         /* 0x01c */ kKeyScrollLock,     // VK_SCRLLOCK         0x001c         
    60         /* 0x01d */ kKeyNumLock,        // VK_NUMLOCK          0x001d         
    61         /* 0x01e */ kKeyKP_Enter,       // VK_ENTER            0x001e         
    62         /* 0x01f */ kKeySysReq,         // VK_SYSRQ            0x001f         
    63         /* 0x020 */ kKeyF1,                     // VK_F1               0x0020         
    64         /* 0x021 */ kKeyF2,                     // VK_F2               0x0021         
    65         /* 0x022 */ kKeyF3,                     // VK_F3               0x0022         
    66         /* 0x023 */ kKeyF4,                     // VK_F4               0x0023         
    67         /* 0x024 */ kKeyF5,                     // VK_F5               0x0024         
    68         /* 0x025 */ kKeyF6,                     // VK_F6               0x0025         
    69         /* 0x026 */ kKeyF7,                     // VK_F7               0x0026         
    70         /* 0x027 */ kKeyF8,                     // VK_F8               0x0027         
    71         /* 0x028 */ kKeyF9,                     // VK_F9               0x0028         
    72         /* 0x029 */ kKeyF10,            // VK_F10              0x0029         
    73         /* 0x02a */ kKeyF11,            // VK_F11              0x002a         
    74         /* 0x02b */ kKeyF12,            // VK_F12              0x002b         
    75         /* 0x02c */ kKeyF13,            // VK_F13              0x002c         
    76         /* 0x02d */ kKeyF14,            // VK_F14              0x002d         
    77         /* 0x02e */ kKeyF15,            // VK_F15              0x002e         
    78         /* 0x02f */ kKeyF16,            // VK_F16              0x002f         
    79         /* 0x030 */ kKeyF17,            // VK_F17              0x0030         
    80         /* 0x031 */ kKeyF18,            // VK_F18              0x0031         
    81         /* 0x032 */ kKeyF19,            // VK_F19              0x0032         
    82         /* 0x033 */ kKeyF20,            // VK_F20              0x0033         
    83         /* 0x034 */ kKeyF21,            // VK_F21              0x0034         
    84         /* 0x035 */ kKeyF22,            // VK_F22              0x0035         
    85         /* 0x036 */ kKeyF23,            // VK_F23              0x0036         
    86         /* 0x037 */ kKeyF24,            // VK_F24              0x0037         
    87         /* 0x038 */ kKeyNone,           // VK_ENDDRAG          0x0038         
    88         /* 0x039 */ kKeyClear,          // VK_CLEAR            0x0039         
    89         /* 0x03a */ kKeyNone,           // VK_EREOF            0x003a         
    90         /* 0x03b */ kKeyNone,           // VK_PA1              0x003b         
    91         /* 0x03c */ kKeyNone,           // VK_ATTN             0x003c         
    92         /* 0x03d */ kKeyNone,           // VK_CRSEL            0x003d         
    93         /* 0x03e */ kKeyNone,           // VK_EXSEL            0x003e         
    94         /* 0x03f */ kKeyNone,           // VK_COPY             0x003f         
    95         /* 0x040 */ kKeyNone,           // VK_BLK1             0x0040         
    96         /* 0x041 */ kKeyNone            // VK_BLK2             0x0041         
     41        /* 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
    9797};
    9898
     
    114114        m_eventTarget(eventTarget),
    115115        m_fixTimer(NULL),
    116         m_lastDown(0),
     116        m_lastDown(kKeyNone),
    117117        m_useSavedModifiers(false),
    118118        m_savedModifiers(0),
     
    135135                m_fixTimer = NULL;
    136136        }
    137         m_lastDown = 0;
     137        m_lastDown = kKeyNone;
    138138}
    139139
     
    147147CPMKeyState::testAutoRepeat(bool press, bool isRepeat, KeyButton button)
    148148{
    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;
    158152        return isRepeat;
    159153}
     
    174168                        // transfer any modifier state changes to CKeyState's state
    175169                        KeyModifierMask mask = m_originalSavedModifiers ^ m_savedModifiers;
    176                         getActiveModifiersRValue() =
    177                                 (getActiveModifiers() & ~mask) | (m_savedModifiers & mask);
     170                        getActiveModifiersRValue() = (getActiveModifiers() & ~mask) | (m_savedModifiers & mask);
    178171                }
    179172        }
     
    181174
    182175KeyID
    183 CPMKeyState::mapKeyFromEvent(MPARAM charAndVirtKey, MPARAM info, KeyModifierMask* maskOut) const
    184 {
     176CPMKeyState::mapKeyFromEvent(USHORT fsFlags, UCHAR ucRepeat, UCHAR ucScanCode, USHORT usch, USHORT usvk, KeyModifierMask* maskOut) const
     177{
     178#if 0 /** @todo */
    185179        static const KeyModifierMask s_controlAlt = KeyModifierControl | KeyModifierAlt;
    186180
     
    228222                *maskOut = active;
    229223        }
    230 
    231224        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
     230ULONG
    242231CPMKeyState::mapKeyToVirtualKey(KeyID key) const
    243232{
    244         if (key == kKeyNone) {
     233        if (key == kKeyNone)
    245234                return 0;
    246         }
    247235        KeyToVKMap::const_iterator i = m_keyToVKMap.find(key);
    248         if (i == m_keyToVKMap.end()) {
     236        if (i == m_keyToVKMap.end())
    249237                return 0;
    250         }
    251         else {
    252                 return i->second;
    253         }
     238        return i->second;
    254239}
    255240
     
    272257                // send key
    273258                if (press && !isAutoRepeat) {
    274                         CKeyState::sendKeyEvent(target, true, false,
    275                                                         key, mask, 1, button);
     259                        CKeyState::sendKeyEvent(target, true, false, key, mask, 1, button);
    276260                        if (count > 0) {
    277261                                --count;
     
    279263                }
    280264                if (count >= 1) {
    281                         CKeyState::sendKeyEvent(target, true, true,
    282                                                         key, mask, count, button);
     265                        CKeyState::sendKeyEvent(target, true, true, key, mask, count, button);
    283266                }
    284267        }
     
    290273
    291274void
    292 CPMKeyState::fakeKeyDown(KeyID id, KeyModifierMask mask,
    293                                 KeyButton button)
     275CPMKeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, KeyButton button)
    294276{
    295277        CKeyState::fakeKeyDown(id, mask, button);
     
    297279
    298280void
    299 CPMKeyState::fakeKeyRepeat(KeyID id, KeyModifierMask mask,
    300                                 SInt32 count, KeyButton button)
     281CPMKeyState::fakeKeyRepeat(KeyID id, KeyModifierMask mask, SInt32 count, KeyButton button)
    301282{
    302283        CKeyState::fakeKeyRepeat(id, mask, count, button);
     
    323304
    324305        // we can get toggle modifiers from the system
    325         if (WinGetKeyState(HWND_DESKTOP, VK_CAPITAL) & 1) {
     306        if (WinGetKeyState(HWND_DESKTOP, VK_CAPSLOCK) & 1)
    326307                state |= KeyModifierCapsLock;
    327         }
    328         if (WinGetKeyState(HWND_DESKTOP, VK_NUMLOCK) & 1) {
     308        if (WinGetKeyState(HWND_DESKTOP, VK_NUMLOCK) & 1)
    329309                state |= KeyModifierNumLock;
    330         }
    331         if (WinGetKeyState(HWND_DESKTOP, VK_SCROLL) & 1) {
     310        if (WinGetKeyState(HWND_DESKTOP, VK_SCRLLOCK) & 1)
    332311                state |= KeyModifierScrollLock;
    333         }
    334 
    335312        return state;
    336313}
     
    623600                                                        }
    624601                                                }
    625                                                
     602
    626603                                                // save each key.  the map will automatically discard
    627604                                                // duplicates, like an unshift and shifted version of
     
    742719}
    743720
    744 bool
    745 CPMKeyState::getGroups(GroupList& groups) const
    746 {
    747         // get keyboard layouts
    748         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 void
    768 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 system
    774         // 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 message
    780         // before it sees the keyboard events.  i'm not sure why this is
    781         // necessary since the messages should arrive in order.  if we don't
    782         // delay, though, some of our keyboard events may disappear.
    783         Sleep(100);
    784 }
    785 
    786721void
    787722CPMKeyState::fixKeys()
     
    822757                                LOG((CLOG_DEBUG1 "event: fake key release left windows key (0x%03x)", leftButton));
    823758                                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);
    826760                        }
    827761                        if (rightDown && !rightAsyncDown) {
    828762                                LOG((CLOG_DEBUG1 "event: fake key release right windows key (0x%03x)", rightButton));
    829763                                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);
    832765                        }
    833766                }
     
    910843        }
    911844}
     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.