Rewrote key handling on X11 client. This should fix problems
with applying the incorrect shift and mode switch modifiers to some keycodes, such as getting Pointer_EnableKeys when pressing shift with NumLock enabled.
This commit is contained in:
		
							parent
							
								
									1eab99d70c
								
							
						
					
					
						commit
						24fc257b3c
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -77,48 +77,87 @@ protected: | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	enum EKeyAction { kPress, kRelease, kRepeat }; | 	enum EKeyAction { kPress, kRelease, kRepeat }; | ||||||
| 	class KeyCodeMask { | 	typedef unsigned int ModifierIndex; | ||||||
| 	public: | 	typedef unsigned int ModifierMask; | ||||||
| 		KeyCodeMask(); |  | ||||||
| 	public: |  | ||||||
| 		KeyCode			m_keycode[4]; |  | ||||||
| 	}; |  | ||||||
| 	class Keystroke { | 	class Keystroke { | ||||||
| 	public: | 	public: | ||||||
| 		KeyCode			m_keycode; | 		KeyCode			m_keycode; | ||||||
| 		Bool			m_press; | 		Bool			m_press; | ||||||
| 		bool			m_repeat; | 		bool			m_repeat; | ||||||
| 	}; | 	}; | ||||||
| 	typedef std::vector<Keystroke> Keystrokes; | 	class KeyMapping { | ||||||
|  | 	public: | ||||||
|  | 		KeyMapping(); | ||||||
|  | 
 | ||||||
|  | 	public: | ||||||
|  | 		// KeyCode to generate keysym and whether keycode[i] is
 | ||||||
|  | 		// sensitive to shift and mode switch.
 | ||||||
|  | 		KeyCode			m_keycode[4]; | ||||||
|  | 		bool			m_shiftSensitive[4]; | ||||||
|  | 		bool			m_modeSwitchSensitive[4]; | ||||||
|  | 
 | ||||||
|  | 		// the modifier mask of keysym or 0 if not a modifier
 | ||||||
|  | 		ModifierMask	m_modifierMask; | ||||||
|  | 
 | ||||||
|  | 		// whether keysym is sensitive to caps and num lock
 | ||||||
|  | 		bool			m_numLockSensitive; | ||||||
|  | 		bool			m_capsLockSensitive; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	typedef std::vector<KeyCode> KeyCodes; | 	typedef std::vector<KeyCode> KeyCodes; | ||||||
| 	typedef std::map<KeySym, KeyCodeMask> KeyCodeMap; | 	typedef std::map<KeyCode, ModifierIndex> KeyCodeToModifierMap; | ||||||
| 	typedef KeyCodeMap::const_iterator KeyCodeIndex; | 	typedef std::map<KeySym, KeyMapping> KeySymMap; | ||||||
|  | 	typedef KeySymMap::const_iterator KeySymIndex; | ||||||
|  | 	typedef std::vector<Keystroke> Keystrokes; | ||||||
|  | 	typedef std::vector<KeySym> KeySyms; | ||||||
|  | 	typedef std::map<KeySym, KeySyms> KeySymsMap; | ||||||
| 	typedef std::map<KeyButton, KeyCode> ServerKeyMap; | 	typedef std::map<KeyButton, KeyCode> ServerKeyMap; | ||||||
| 
 | 
 | ||||||
| 	unsigned int		mapButton(ButtonID button) const; | 	unsigned int		mapButton(ButtonID button) const; | ||||||
| 
 | 
 | ||||||
| 	unsigned int		mapKey(Keystrokes&, KeyCode&, KeyID, | 	ModifierMask		mapKey(Keystrokes&, KeyCode&, KeyID, | ||||||
| 							KeyModifierMask, EKeyAction) const; | 							KeyModifierMask, EKeyAction) const; | ||||||
|  | 	ModifierMask		mapKeyRelease(Keystrokes&, KeyCode) const; | ||||||
|  | 	bool				mapToKeystrokes(Keystrokes& keys, | ||||||
|  | 							KeyCode& keycode, | ||||||
|  | 							ModifierMask& finalMask, | ||||||
|  | 							KeySymIndex keyIndex, | ||||||
|  | 							ModifierMask currentMask, | ||||||
|  | 							EKeyAction action) const; | ||||||
|  | 	bool				adjustModifiers(Keystrokes& keys, | ||||||
|  | 							Keystrokes& undo, | ||||||
|  | 							ModifierMask& inOutMask, | ||||||
|  | 							ModifierMask desiredMask) const; | ||||||
|  | 	bool				adjustModifier(Keystrokes& keys, | ||||||
|  | 							Keystrokes& undo, | ||||||
|  | 							KeySym keysym, | ||||||
|  | 							bool desireActive) const; | ||||||
| 	void				doKeystrokes(const Keystrokes&, SInt32 count); | 	void				doKeystrokes(const Keystrokes&, SInt32 count); | ||||||
| 	unsigned int		maskToX(KeyModifierMask) const; | 	ModifierMask		maskToX(KeyModifierMask) const; | ||||||
|  | 
 | ||||||
|  | 	unsigned int		findBestKeyIndex(KeySymIndex keyIndex, | ||||||
|  | 							ModifierMask currentMask) const; | ||||||
|  | 	bool				isShiftInverted(KeySymIndex keyIndex, | ||||||
|  | 							ModifierMask currentMask) const; | ||||||
|  | 	ModifierMask		getModifierMask(KeySym) const; | ||||||
| 
 | 
 | ||||||
| 	void				doUpdateKeys(Display*); | 	void				doUpdateKeys(Display*); | ||||||
| 	void				doReleaseKeys(Display*); | 	void				doReleaseKeys(Display*); | ||||||
| 	void				updateKeycodeMap(Display* display); | 	void				updateKeysymMap(Display* display); | ||||||
| 	void				updateModifiers(Display* display); | 	void				updateModifiers(Display* display); | ||||||
| 	void				updateModifierMap(Display* display); | 	ModifierIndex		keySymToModifierIndex(KeySym) const; | ||||||
| 	unsigned int		keySymToModifierIndex(KeySym) const; | 	void				toggleKey(Display*, KeySym, ModifierMask mask); | ||||||
| 	void				toggleKey(Display*, KeySym, unsigned int mask); |  | ||||||
| 	static bool			isToggleKeysym(KeySym); | 	static bool			isToggleKeysym(KeySym); | ||||||
| 
 | 
 | ||||||
| 	KeyCodeIndex		findKey(KeyID keysym, KeyModifierMask mask) const; | 	KeySym				keyIDToKeySym(KeyID id, ModifierMask mask) const; | ||||||
| 	KeyCodeIndex		noKey() const; |  | ||||||
| 	bool				adjustForNumLock(KeySym) const; | 	bool				adjustForNumLock(KeySym) const; | ||||||
| 	bool				adjustForCapsLock(KeySym) const; | 	bool				adjustForCapsLock(KeySym) const; | ||||||
| 
 | 
 | ||||||
| private: | 	bool				decomposeKeySym(KeySym keysym, | ||||||
| 	enum { kNONE, kSHIFT, kALTGR, kSHIFT_ALTGR }; | 							KeySyms& decomposed) const; | ||||||
|  | 	static const KeySymsMap&	getDecomposedKeySymTable(); | ||||||
| 
 | 
 | ||||||
|  | private: | ||||||
| 	CXWindowsScreen*	m_screen; | 	CXWindowsScreen*	m_screen; | ||||||
| 	Window				m_window; | 	Window				m_window; | ||||||
| 
 | 
 | ||||||
|  | @ -140,40 +179,44 @@ private: | ||||||
| 	std::vector<unsigned char>	m_buttons; | 	std::vector<unsigned char>	m_buttons; | ||||||
| 
 | 
 | ||||||
| 	// current active modifiers (X key masks)
 | 	// current active modifiers (X key masks)
 | ||||||
| 	unsigned int		m_mask; | 	ModifierMask		m_mask; | ||||||
| 
 |  | ||||||
| 	// maps key IDs to X keycodes and the X modifier key mask needed
 |  | ||||||
| 	// to generate the right keysym
 |  | ||||||
| 	KeyCodeMap			m_keycodeMap; |  | ||||||
| 
 | 
 | ||||||
| 	// the modifiers that have keys bound to them
 | 	// the modifiers that have keys bound to them
 | ||||||
| 	unsigned int		m_modifierMask; | 	ModifierMask		m_modifierMask; | ||||||
| 
 | 
 | ||||||
| 	// set bits indicate modifiers that toggle (e.g. caps-lock)
 | 	// set bits indicate modifiers that toggle (e.g. caps-lock)
 | ||||||
| 	unsigned int		m_toggleModifierMask; | 	ModifierMask		m_toggleModifierMask; | ||||||
|  | 
 | ||||||
|  | 	// keysym to keycode mapping
 | ||||||
|  | 	KeySymMap			m_keysymMap; | ||||||
|  | 
 | ||||||
|  | 	// modifier index to keycodes
 | ||||||
|  | 	KeyCodes			m_modifierKeycodes[8]; | ||||||
|  | 
 | ||||||
|  | 	// keycode to modifier index
 | ||||||
|  | 	KeyCodeToModifierMap	m_keycodeToModifier; | ||||||
|  | 
 | ||||||
|  | 	// modifier keysyms
 | ||||||
|  | 	KeySym				m_shiftKeysym; | ||||||
|  | 	KeySym				m_ctrlKeysym; | ||||||
|  | 	KeySym				m_altKeysym; | ||||||
|  | 	KeySym				m_metaKeysym; | ||||||
|  | 	KeySym				m_superKeysym; | ||||||
|  | 	KeySym				m_modeSwitchKeysym; | ||||||
|  | 	KeySym				m_numLockKeysym; | ||||||
|  | 	KeySym				m_capsLockKeysym; | ||||||
|  | 	KeySym				m_scrollLockKeysym; | ||||||
| 
 | 
 | ||||||
| 	// modifier masks
 | 	// modifier masks
 | ||||||
| 	unsigned int		m_altMask; | 	ModifierMask		m_shiftMask; | ||||||
| 	unsigned int		m_metaMask; | 	ModifierMask		m_ctrlMask; | ||||||
| 	unsigned int		m_superMask; | 	ModifierMask		m_altMask; | ||||||
| 	unsigned int		m_modeSwitchMask; | 	ModifierMask		m_metaMask; | ||||||
| 	unsigned int		m_numLockMask; | 	ModifierMask		m_superMask; | ||||||
| 	unsigned int		m_capsLockMask; | 	ModifierMask		m_modeSwitchMask; | ||||||
| 	unsigned int		m_scrollLockMask; | 	ModifierMask		m_numLockMask; | ||||||
| 
 | 	ModifierMask		m_capsLockMask; | ||||||
| 	// modifier indices
 | 	ModifierMask		m_scrollLockMask; | ||||||
| 	unsigned int		m_altIndex; |  | ||||||
| 	unsigned int		m_metaIndex; |  | ||||||
| 	unsigned int		m_superIndex; |  | ||||||
| 	unsigned int		m_modeSwitchIndex; |  | ||||||
| 	unsigned int		m_numLockIndex; |  | ||||||
| 	unsigned int		m_capsLockIndex; |  | ||||||
| 	unsigned int		m_scrollLockIndex; |  | ||||||
| 
 |  | ||||||
| 	// map X modifier key indices to the key codes bound to them
 |  | ||||||
| 	unsigned int		m_keysPerModifier; |  | ||||||
| 	KeyCodes			m_modifierToKeycode; |  | ||||||
| 	KeyCodes			m_modifierToKeycodes; |  | ||||||
| 
 | 
 | ||||||
| 	// map server key buttons to local keycodes
 | 	// map server key buttons to local keycodes
 | ||||||
| 	ServerKeyMap		m_serverKeyMap; | 	ServerKeyMap		m_serverKeyMap; | ||||||
|  | @ -187,6 +230,9 @@ private: | ||||||
| 	// a screen other than screen 0.
 | 	// a screen other than screen 0.
 | ||||||
| 	bool				m_xtestIsXineramaUnaware; | 	bool				m_xtestIsXineramaUnaware; | ||||||
| 	bool				m_xinerama; | 	bool				m_xinerama; | ||||||
|  | 
 | ||||||
|  | 	// a table of keysym decompositions
 | ||||||
|  | 	static KeySymsMap	s_decomposedKeySyms; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue