Now restoring toggle key states on leaving a client screen to

their state when the screen was entered.  Previously when
leaving a client screen the toggle keys kept their state so,
say, caps lock, would remain on.  This was inconvenient if
you then used the client's keyboard directly.
This commit is contained in:
crs 2002-12-15 22:14:49 +00:00
parent 2128302307
commit 7649afa00a
6 changed files with 44 additions and 1 deletions

View File

@ -510,6 +510,14 @@ CMSWindowsSecondaryScreen::setToggleState(KeyModifierMask mask)
} }
} }
KeyModifierMask
CMSWindowsSecondaryScreen::getToggleState() const
{
return (m_mask & (KeyModifierCapsLock |
KeyModifierNumLock |
KeyModifierScrollLock));
}
// map special KeyID keys to virtual key codes. if the key is an // map special KeyID keys to virtual key codes. if the key is an
// extended key then the entry is the virtual key code | 0x100. // extended key then the entry is the virtual key code | 0x100.
// unmapped keys have a 0 entry. // unmapped keys have a 0 entry.

View File

@ -68,6 +68,7 @@ protected:
virtual void warpCursor(SInt32 x, SInt32 y); virtual void warpCursor(SInt32 x, SInt32 y);
virtual void updateKeys(); virtual void updateKeys();
virtual void setToggleState(KeyModifierMask); virtual void setToggleState(KeyModifierMask);
virtual KeyModifierMask getToggleState() const;
private: private:
enum EKeyAction { kPress, kRelease, kRepeat }; enum EKeyAction { kPress, kRelease, kRepeat };

View File

@ -22,7 +22,9 @@
// CSecondaryScreen // CSecondaryScreen
// //
CSecondaryScreen::CSecondaryScreen() CSecondaryScreen::CSecondaryScreen() :
m_active(false),
m_toggleKeys(0)
{ {
// do nothing // do nothing
} }
@ -128,6 +130,9 @@ CSecondaryScreen::enter(SInt32 x, SInt32 y, KeyModifierMask mask)
// update our keyboard state to reflect the local state // update our keyboard state to reflect the local state
updateKeys(); updateKeys();
// remember toggle key state
m_toggleKeys = getToggleState();
// toggle modifiers that don't match the desired state // toggle modifiers that don't match the desired state
setToggleState(mask); setToggleState(mask);
@ -153,6 +158,9 @@ CSecondaryScreen::leave()
// subclass hook // subclass hook
onPreLeave(); onPreLeave();
// restore toggle key state
setToggleState(m_toggleKeys);
// hide mouse // hide mouse
showWindow(); showWindow();

View File

@ -324,11 +324,20 @@ protected:
*/ */
virtual void setToggleState(KeyModifierMask) = 0; virtual void setToggleState(KeyModifierMask) = 0;
//! Get the toggle key state
/*!
Returns the current state of the toggle keys.
*/
virtual KeyModifierMask getToggleState() const = 0;
private: private:
CMutex m_mutex; CMutex m_mutex;
// m_active is true if this screen has been entered // m_active is true if this screen has been entered
bool m_active; bool m_active;
// the toggle key state when this screen was last entered
KeyModifierMask m_toggleKeys;
}; };
#endif #endif

View File

@ -405,6 +405,22 @@ CXWindowsSecondaryScreen::setToggleState(KeyModifierMask mask)
} }
} }
KeyModifierMask
CXWindowsSecondaryScreen::getToggleState() const
{
KeyModifierMask mask = 0;
if ((m_mask & m_capsLockMask) != 0) {
mask |= KeyModifierCapsLock;
}
if ((m_mask & m_numLockMask) != 0) {
mask |= KeyModifierNumLock;
}
if ((m_mask & m_scrollLockMask) != 0) {
mask |= KeyModifierScrollLock;
}
return mask;
}
unsigned int unsigned int
CXWindowsSecondaryScreen::mapButton(ButtonID id) const CXWindowsSecondaryScreen::mapButton(ButtonID id) const
{ {

View File

@ -65,6 +65,7 @@ protected:
virtual void warpCursor(SInt32 x, SInt32 y); virtual void warpCursor(SInt32 x, SInt32 y);
virtual void updateKeys(); virtual void updateKeys();
virtual void setToggleState(KeyModifierMask); virtual void setToggleState(KeyModifierMask);
virtual KeyModifierMask getToggleState() const;
private: private:
enum EKeyAction { kPress, kRelease, kRepeat }; enum EKeyAction { kPress, kRelease, kRepeat };