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
// extended key then the entry is the virtual key code | 0x100.
// unmapped keys have a 0 entry.

View File

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

View File

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

View File

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

View File

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