Now suppressing shift key when caps-lock is enabled on OSX. This
fixes handling of, say, Command+N with caps-lock enabled which was being synthesized as Command+Shift+N.
This commit is contained in:
parent
014578b875
commit
ee7dcc1e83
|
@ -197,8 +197,8 @@ COSXKeyState::doUpdateKeys()
|
||||||
{
|
{
|
||||||
// save key mapping
|
// save key mapping
|
||||||
m_keyMap.clear();
|
m_keyMap.clear();
|
||||||
if (!filluchrKeysMap(m_keyMap)) {
|
if (!filluchrKeysMap(m_keyMap, m_capsLockSet)) {
|
||||||
fillKCHRKeysMap(m_keyMap);
|
fillKCHRKeysMap(m_keyMap, m_capsLockSet);
|
||||||
}
|
}
|
||||||
fillSpecialKeys(m_keyMap, m_virtualKeyMap);
|
fillSpecialKeys(m_keyMap, m_virtualKeyMap);
|
||||||
|
|
||||||
|
@ -254,6 +254,12 @@ COSXKeyState::mapKey(Keystrokes& keys, KeyID id,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the virtual key is caps-lock sensitive then suppress shift
|
||||||
|
KeyModifierMask mask = ~0;
|
||||||
|
if (m_capsLockSet.count(id) != 0) {
|
||||||
|
mask &= ~KeyModifierShift;
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME -- for both calls to addKeystrokes below we'd prefer to use
|
// FIXME -- for both calls to addKeystrokes below we'd prefer to use
|
||||||
// a required mask that generates the same character but matches
|
// a required mask that generates the same character but matches
|
||||||
// the desiredMask as closely as possible.
|
// the desiredMask as closely as possible.
|
||||||
|
@ -283,7 +289,7 @@ COSXKeyState::mapKey(Keystrokes& keys, KeyID id,
|
||||||
// add final key
|
// add final key
|
||||||
return addKeystrokes(keys, sequence.back().m_button,
|
return addKeystrokes(keys, sequence.back().m_button,
|
||||||
sequence.back().m_requiredState,
|
sequence.back().m_requiredState,
|
||||||
sequence.back().m_requiredMask,
|
sequence.back().m_requiredMask & mask,
|
||||||
isAutoRepeat);
|
isAutoRepeat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,12 +526,23 @@ COSXKeyState::fillSpecialKeys(CKeyIDMap& keyMap,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
COSXKeyState::fillKCHRKeysMap(CKeyIDMap& keyMap) const
|
COSXKeyState::fillKCHRKeysMap(CKeyIDMap& keyMap, CKeySet& capsLockSet) const
|
||||||
{
|
{
|
||||||
assert(m_KCHRResource != NULL);
|
assert(m_KCHRResource != NULL);
|
||||||
|
|
||||||
CKCHRResource* r = m_KCHRResource;
|
CKCHRResource* r = m_KCHRResource;
|
||||||
|
|
||||||
|
// note caps-lock sensitive keys
|
||||||
|
SInt32 uIndex = r->m_tableSelectionIndex[0];
|
||||||
|
SInt32 clIndex = r->m_tableSelectionIndex[alphaLock >> 8];
|
||||||
|
for (SInt32 j = 0; j < 128; ++j) {
|
||||||
|
UInt8 c = r->m_characterTables[clIndex][j];
|
||||||
|
if (r->m_characterTables[uIndex][j] != c) {
|
||||||
|
KeyID keyID = charToKeyID(c);
|
||||||
|
capsLockSet.insert(keyID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// build non-composed keys to virtual keys mapping
|
// build non-composed keys to virtual keys mapping
|
||||||
std::map<UInt8, CKeyEventInfo> vkMap;
|
std::map<UInt8, CKeyEventInfo> vkMap;
|
||||||
for (SInt32 i = 0; i < r->m_numTables; ++i) {
|
for (SInt32 i = 0; i < r->m_numTables; ++i) {
|
||||||
|
@ -548,7 +565,7 @@ COSXKeyState::fillKCHRKeysMap(CKeyIDMap& keyMap) const
|
||||||
info.m_requiredState = mask;
|
info.m_requiredState = mask;
|
||||||
|
|
||||||
// save character to virtual key mapping
|
// save character to virtual key mapping
|
||||||
if (keyMap.count(c) == 0) {
|
if (vkMap.count(c) == 0) {
|
||||||
vkMap[c] = info;
|
vkMap[c] = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,7 +645,7 @@ COSXKeyState::fillKCHRKeysMap(CKeyIDMap& keyMap) const
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
COSXKeyState::filluchrKeysMap(CKeyIDMap&) const
|
COSXKeyState::filluchrKeysMap(CKeyIDMap&, CKeySet&) const
|
||||||
{
|
{
|
||||||
// FIXME -- implement this
|
// FIXME -- implement this
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "CKeyState.h"
|
#include "CKeyState.h"
|
||||||
#include "stdmap.h"
|
#include "stdmap.h"
|
||||||
|
#include "stdset.h"
|
||||||
#include "stdvector.h"
|
#include "stdvector.h"
|
||||||
#include <Carbon/Carbon.h>
|
#include <Carbon/Carbon.h>
|
||||||
|
|
||||||
|
@ -78,6 +79,7 @@ private:
|
||||||
typedef std::vector<CKeyEventInfo> CKeySequence;
|
typedef std::vector<CKeyEventInfo> CKeySequence;
|
||||||
typedef std::map<KeyID, CKeySequence> CKeyIDMap;
|
typedef std::map<KeyID, CKeySequence> CKeyIDMap;
|
||||||
typedef std::map<UInt32, KeyID> CVirtualKeyMap;
|
typedef std::map<UInt32, KeyID> CVirtualKeyMap;
|
||||||
|
typedef std::set<KeyID> CKeySet;
|
||||||
|
|
||||||
KeyButton addKeystrokes(Keystrokes& keys,
|
KeyButton addKeystrokes(Keystrokes& keys,
|
||||||
KeyButton keyButton,
|
KeyButton keyButton,
|
||||||
|
@ -107,13 +109,15 @@ private:
|
||||||
// map maps each KeyID to the sequence of keys (with modifiers)
|
// map maps each KeyID to the sequence of keys (with modifiers)
|
||||||
// that would have to be synthesized to generate the KeyID character.
|
// that would have to be synthesized to generate the KeyID character.
|
||||||
// Returns false iff no KCHR resource was found.
|
// Returns false iff no KCHR resource was found.
|
||||||
bool fillKCHRKeysMap(CKeyIDMap& keyMap) const;
|
bool fillKCHRKeysMap(CKeyIDMap& keyMap,
|
||||||
|
CKeySet& capsLockSet) const;
|
||||||
|
|
||||||
// Convert the uchr resource to a KeyID to key sequence map. the
|
// Convert the uchr resource to a KeyID to key sequence map. the
|
||||||
// map maps each KeyID to the sequence of keys (with modifiers)
|
// map maps each KeyID to the sequence of keys (with modifiers)
|
||||||
// that would have to be synthesized to generate the KeyID character.
|
// that would have to be synthesized to generate the KeyID character.
|
||||||
// Returns false iff no uchr resource was found.
|
// Returns false iff no uchr resource was found.
|
||||||
bool filluchrKeysMap(CKeyIDMap& keyMap) const;
|
bool filluchrKeysMap(CKeyIDMap& keyMap,
|
||||||
|
CKeySet& capsLockSet) const;
|
||||||
|
|
||||||
// Maps an OS X virtual key id to a KeyButton. This simply remaps
|
// Maps an OS X virtual key id to a KeyButton. This simply remaps
|
||||||
// the ids so we don't use KeyButton 0.
|
// the ids so we don't use KeyButton 0.
|
||||||
|
@ -160,6 +164,7 @@ private:
|
||||||
UCKeyboardLayout* m_uchrResource;
|
UCKeyboardLayout* m_uchrResource;
|
||||||
CKeyIDMap m_keyMap;
|
CKeyIDMap m_keyMap;
|
||||||
CVirtualKeyMap m_virtualKeyMap;
|
CVirtualKeyMap m_virtualKeyMap;
|
||||||
|
CKeySet m_capsLockSet;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue