From 645d82ec1e9adcd380d600510cd8e23aee916bd7 Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Sat, 1 Dec 2007 03:25:14 +0000 Subject: [PATCH] Fix character sequences produced by + key inputs. Implement support for wild card '*' characters in the result string for keyboard translator entries. svn path=/trunk/KDE/kdebase/apps/konsole/; revision=743477 --- src/KeyBindingEditor.cpp | 2 +- src/KeyboardTranslator.cpp | 8 +++--- src/KeyboardTranslator.h | 54 ++++++++++++++++++++++++++++++++++---- src/Vt102Emulation.cpp | 2 +- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/KeyBindingEditor.cpp b/src/KeyBindingEditor.cpp index ac1571643..b3e95339e 100644 --- a/src/KeyBindingEditor.cpp +++ b/src/KeyBindingEditor.cpp @@ -130,7 +130,7 @@ bool KeyBindingEditor::eventFilter( QObject* watched , QEvent* event ) if ( !entry.isNull() ) { _ui->testAreaInputEdit->setText(entry.conditionToString()); - _ui->testAreaOutputEdit->setText(entry.resultToString()); + _ui->testAreaOutputEdit->setText(entry.resultToString(true,keyEvent->modifiers())); } else { diff --git a/src/KeyboardTranslator.cpp b/src/KeyboardTranslator.cpp index a7a641314..27b756a14 100644 --- a/src/KeyboardTranslator.cpp +++ b/src/KeyboardTranslator.cpp @@ -584,9 +584,9 @@ bool KeyboardTranslator::Entry::matches(int keyCode , return true; } -QByteArray KeyboardTranslator::Entry::escapedText() const +QByteArray KeyboardTranslator::Entry::escapedText(bool expandWildCards,Qt::KeyboardModifiers modifiers) const { - QByteArray result(_text); + QByteArray result(text(expandWildCards,modifiers)); for ( int i = 0 ; i < result.count() ; i++ ) { @@ -710,10 +710,10 @@ void KeyboardTranslator::Entry::insertState( QString& item , int state ) const else if ( state == KeyboardTranslator::AnyModifierState ) item += "AnyMod"; } -QString KeyboardTranslator::Entry::resultToString() const +QString KeyboardTranslator::Entry::resultToString(bool expandWildCards,Qt::KeyboardModifiers modifiers) const { if ( !_text.isEmpty() ) - return escapedText(); + return escapedText(expandWildCards,modifiers); else if ( _command == ScrollPageUpCommand ) return "ScrollPageUp"; else if ( _command == ScrollPageDownCommand ) diff --git a/src/KeyboardTranslator.h b/src/KeyboardTranslator.h index ff52cc115..f813241e8 100644 --- a/src/KeyboardTranslator.h +++ b/src/KeyboardTranslator.h @@ -132,8 +132,21 @@ public: /** Sets the command associated with this entry. */ void setCommand(Command command); - /** Returns the character sequence associated with this entry */ - QByteArray text() const; + /** + * Returns the character sequence associated with this entry, optionally replacing + * wildcard '*' characters with numbers to indicate the keyboard modifiers being pressed. + * + * TODO: The numbers used to replace '*' characters are taken from the Konsole/KDE 3 code. + * Document them. + * + * @param expandWildCards Specifies whether wild cards (occurrences of the '*' character) in + * the entry should be replaced with a number to indicate the modifier keys being pressed. + * + * @param modifiers The keyboard modifiers being pressed. + */ + QByteArray text(bool expandWildCards = false, + Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; + /** Sets the character sequence associated with this entry */ void setText(const QByteArray& text); @@ -142,8 +155,12 @@ public: * with any non-printable characters replaced with escape sequences. * * eg. \\E for Escape, \\t for tab, \\n for new line. + * + * @param expandWildCards See text() + * @param modifiers See text() */ - QByteArray escapedText() const; + QByteArray escapedText(bool expandWildCards = false, + Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; /** Returns the character code ( from the Qt::Key enum ) associated with this entry */ int keyCode() const; @@ -201,8 +218,12 @@ public: /** * Returns this entry's result ( ie. its command or character sequence ) * as a string. + * + * @param expandWildCards See text() + * @param modifiers See text() */ - QString resultToString() const; + QString resultToString(bool expandWildCards = false, + Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; /** * Returns true if this entry matches the given key sequence, specified @@ -507,7 +528,30 @@ inline void KeyboardTranslator::Entry::setText( const QByteArray& text ) { _text = unescape(text); } -inline QByteArray KeyboardTranslator::Entry::text() const { return _text; } +inline int oneOrZero(int value) +{ + return value ? 1 : 0; +} +inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const +{ + QByteArray expandedText = _text; + + if (expandWildCards) + { + int modifierValue = 1; + modifierValue += oneOrZero(modifiers & Qt::ShiftModifier); + modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1; + modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2; + + for (int i=0;i<_text.length();i++) + { + if (expandedText[i] == '*') + expandedText[i] = '0' + modifierValue; + } + } + + return expandedText; +} inline void KeyboardTranslator::Entry::setState( States state ) { diff --git a/src/Vt102Emulation.cpp b/src/Vt102Emulation.cpp index 6dfe6bae8..06680eb81 100644 --- a/src/Vt102Emulation.cpp +++ b/src/Vt102Emulation.cpp @@ -1002,7 +1002,7 @@ void Vt102Emulation::sendKeyEvent( QKeyEvent* event ) } else if ( !entry.text().isEmpty() ) { - textToSend += _codec->fromUnicode(entry.text()); + textToSend += _codec->fromUnicode(entry.text(true,modifiers)); } else textToSend += _codec->fromUnicode(event->text());