diff --git a/src/KeyboardTranslator.cpp b/src/KeyboardTranslator.cpp index 32d9a7a0f..dcf4e5620 100644 --- a/src/KeyboardTranslator.cpp +++ b/src/KeyboardTranslator.cpp @@ -312,6 +312,8 @@ bool KeyboardTranslatorReader::parseAsStateFlag(const QString& item , int& flag) flag = KeyboardTranslator::NewLineState; else if ( item == "appscreen" ) flag = KeyboardTranslator::AlternateScreenState; + else if ( item == "anymod" ) + flag = KeyboardTranslator::AnyModifierState; else return false; @@ -536,12 +538,25 @@ bool KeyboardTranslator::Entry::matches(int keyCode , Qt::KeyboardModifier modif if ( _keyCode != keyCode ) return false; - if ( modifiers != ( _modifiers & _modifierMask ) ) + if ( (modifiers & _modifierMask) != (_modifiers & _modifierMask) ) return false; - if ( state != ( _state & _stateMask ) ) + if ( (state & _stateMask) != (_state & _stateMask) ) return false; + // special handling for the 'Any Modifier' state, which checks for the presence of + // any or no modifiers + if ( _stateMask & KeyboardTranslator::AnyModifierState ) + { + // test fails if any modifier is required but none are set + if ( (_state & KeyboardTranslator::AnyModifierState) && modifiers == 0 ) + return false; + + // test fails if no modifier is allowed but one or more are set + if ( !(_state & KeyboardTranslator::AnyModifierState) && modifiers != 0 ) + return false; + } + return true; } void KeyboardTranslator::Entry::insertModifier( QString& item , int modifier ) const @@ -581,7 +596,8 @@ void KeyboardTranslator::Entry::insertState( QString& item , int state ) const item += "ansi"; else if ( state == KeyboardTranslator::CursorKeysState ) item += "AppCuKeys"; - + else if ( state == KeyboardTranslator::AnyModifierState ) + item += "AnyMod"; } QString KeyboardTranslator::Entry::conditionToString() const { @@ -598,6 +614,7 @@ QString KeyboardTranslator::Entry::conditionToString() const insertState( result , KeyboardTranslator::NewLineState ); insertState( result , KeyboardTranslator::AnsiState ); insertState( result , KeyboardTranslator::CursorKeysState ); + insertState( result , KeyboardTranslator::AnyModifierState ); return result; } diff --git a/src/KeyboardTranslator.h b/src/KeyboardTranslator.h index fc3f60dcd..085a55784 100644 --- a/src/KeyboardTranslator.h +++ b/src/KeyboardTranslator.h @@ -79,7 +79,9 @@ public: * Indicates that the alternate screen ( typically used by interactive programs * such as screen or vim ) is active */ - AlternateScreenState = 8 + AlternateScreenState = 8, + /** Indicates that any of the modifier keys is active. */ + AnyModifierState = 16 }; /**