• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

Konsole

KeyboardTranslator.h

Go to the documentation of this file.
00001 /*
00002     This source file is part of Konsole, a terminal emulator.
00003 
00004     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00019     02110-1301  USA.
00020 */
00021 
00022 #ifndef KEYBOARDTRANSLATOR_H
00023 #define KEYBOARDTRANSLATOR_H
00024 
00025 // Qt
00026 #include <QtCore/QHash>
00027 #include <QtCore/QList>
00028 #include <QtGui/QKeySequence>
00029 #include <QtCore/QMetaType>
00030 #include <QtCore/QVarLengthArray>
00031 
00032 // KDE
00033 #include <kdemacros.h>
00034 
00035 class QIODevice;
00036 class QTextStream;
00037 
00038 namespace Konsole
00039 {
00040 
00054 class KeyboardTranslator
00055 {
00056 public:
00065     enum State
00066     {
00068         NoState = 0,
00072         NewLineState = 1,
00077         AnsiState = 2,
00081         CursorKeysState = 4,
00086         AlternateScreenState = 8,
00088         AnyModifierState = 16
00089     };
00090     Q_DECLARE_FLAGS(States,State)
00091 
00092     
00095     enum Command
00096     {
00098         NoCommand = 0,
00100         SendCommand = 1,
00102         ScrollPageUpCommand = 2,
00104         ScrollPageDownCommand = 4,
00106         ScrollLineUpCommand = 8,
00108         ScrollLineDownCommand = 16,
00110         ScrollLockCommand = 32,
00112         EraseCommand = 64
00113     };
00114     Q_DECLARE_FLAGS(Commands,Command)
00115 
00116     
00121     class Entry
00122     {
00123     public:
00127         Entry();
00128 
00133         bool isNull() const;
00134 
00136         Command command() const;
00138         void setCommand(Command command);
00139 
00152         QByteArray text(bool expandWildCards = false,
00153                         Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00154 
00156         void setText(const QByteArray& text);
00157 
00167         QByteArray escapedText(bool expandWildCards = false,
00168                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00169 
00171         int keyCode() const;
00173         void setKeyCode(int keyCode);
00174 
00183         Qt::KeyboardModifiers modifiers() const;
00184 
00186         Qt::KeyboardModifiers modifierMask() const;
00187 
00189         void setModifiers( Qt::KeyboardModifiers modifiers );
00191         void setModifierMask( Qt::KeyboardModifiers modifiers );
00192 
00201         States state() const;
00202 
00204         States stateMask() const;
00205 
00207         void setState( States state );
00209         void setStateMask( States mask );
00210 
00215         //QKeySequence keySequence() const;
00216 
00221         QString conditionToString() const;
00222 
00230         QString resultToString(bool expandWildCards = false,
00231                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00232 
00237         bool matches( int keyCode , 
00238                       Qt::KeyboardModifiers modifiers , 
00239                       States flags ) const;
00240 
00241         bool operator==(const Entry& rhs) const;
00242        
00243     private:
00244         void insertModifier( QString& item , int modifier ) const;
00245         void insertState( QString& item , int state ) const;
00246         QByteArray unescape(const QByteArray& text) const;
00247 
00248         int _keyCode;
00249         Qt::KeyboardModifiers _modifiers;
00250         Qt::KeyboardModifiers _modifierMask;
00251         States _state;
00252         States _stateMask;
00253 
00254         Command _command;
00255         QByteArray _text;
00256     };
00257 
00259     KeyboardTranslator(const QString& name);
00260    
00261     //KeyboardTranslator(const KeyboardTranslator& other);
00262 
00264     QString name() const;
00265 
00267     void setName(const QString& name);
00268 
00270     QString description() const;
00271 
00273     void setDescription(const QString& description);
00274 
00286     Entry findEntry(int keyCode , 
00287                     Qt::KeyboardModifiers modifiers , 
00288                     States state = NoState) const;
00289 
00294     void addEntry(const Entry& entry);
00295 
00300     void replaceEntry(const Entry& existing , const Entry& replacement);
00301 
00305     void removeEntry(const Entry& entry);
00306 
00308     QList<Entry> entries() const;
00309 
00310 private:
00311 
00312     QMultiHash<int,Entry> _entries; // entries in this keyboard translation,
00313                                                  // entries are indexed according to
00314                                                  // their keycode
00315     QString _name;
00316     QString _description;
00317 };
00318 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00319 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00320 
00349 class KeyboardTranslatorReader
00350 {
00351 public:
00353     KeyboardTranslatorReader( QIODevice* source );
00354 
00359     QString description() const;
00360 
00362     bool hasNextEntry();
00364     KeyboardTranslator::Entry nextEntry(); 
00365 
00370     bool parseError();
00371 
00378     static KeyboardTranslator::Entry createEntry( const QString& condition ,
00379                                                   const QString& result );
00380 private:
00381     struct Token
00382     {
00383         enum Type
00384         {
00385             TitleKeyword,
00386             TitleText,
00387             KeyKeyword,
00388             KeySequence,
00389             Command,
00390             OutputText
00391         };
00392         Type type;
00393         QString text;
00394     };
00395     QList<Token> tokenize(const QString&);
00396     void readNext();
00397     bool decodeSequence(const QString& , 
00398                                 int& keyCode,
00399                                 Qt::KeyboardModifiers& modifiers,
00400                                 Qt::KeyboardModifiers& modifierMask,
00401                                 KeyboardTranslator::States& state,
00402                                 KeyboardTranslator::States& stateFlags);
00403 
00404     static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00405     static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00406     static bool parseAsKeyCode(const QString& item , int& keyCode);
00407     static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00408 
00409     QIODevice* _source;
00410     QString _description;
00411     KeyboardTranslator::Entry _nextEntry;
00412     bool _hasNext;
00413 };
00414 
00416 class KeyboardTranslatorWriter
00417 {
00418 public:
00423     KeyboardTranslatorWriter(QIODevice* destination);
00424     ~KeyboardTranslatorWriter();
00425 
00430     void writeHeader( const QString& description );
00432     void writeEntry( const KeyboardTranslator::Entry& entry ); 
00433 
00434 private:
00435     QIODevice* _destination;  
00436     QTextStream* _writer;
00437 };
00438 
00443 class KDE_EXPORT KeyboardTranslatorManager
00444 {
00445 public:
00453     KeyboardTranslatorManager();
00454     ~KeyboardTranslatorManager();
00455 
00462     void addTranslator(KeyboardTranslator* translator);
00463 
00469     bool deleteTranslator(const QString& name);
00470 
00472     const KeyboardTranslator* defaultTranslator();
00473 
00481     const KeyboardTranslator* findTranslator(const QString& name);
00488     QList<QString> allTranslators();
00489 
00491    static KeyboardTranslatorManager* instance();
00492 
00493 private:
00494     static const char* defaultTranslatorText;
00495     
00496     void findTranslators(); // locate the available translators
00497     KeyboardTranslator* loadTranslator(const QString& name); // loads the translator 
00498                                                              // with the given name
00499     KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00500 
00501     bool saveTranslator(const KeyboardTranslator* translator);
00502     QString findTranslatorPath(const QString& name);
00503     
00504     QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator
00505                                                      // instance
00506     bool _haveLoadedAll;
00507 };
00508 
00509 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00510 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00511 
00512 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier ) 
00513 { 
00514     _modifiers = modifier;
00515 }
00516 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00517 
00518 inline void  KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask ) 
00519 { 
00520    _modifierMask = mask; 
00521 }
00522 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00523 
00524 inline bool KeyboardTranslator::Entry::isNull() const
00525 {
00526     return ( *this == Entry() );
00527 }
00528 
00529 inline void KeyboardTranslator::Entry::setCommand( Command command )
00530 { 
00531     _command = command; 
00532 }
00533 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00534 
00535 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00536 { 
00537     _text = unescape(text);
00538 }
00539 inline int oneOrZero(int value)
00540 {
00541     return value ? 1 : 0;
00542 }
00543 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const 
00544 {
00545     QByteArray expandedText = _text;
00546     
00547     if (expandWildCards)
00548     {
00549         int modifierValue = 1;
00550         modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00551         modifierValue += oneOrZero(modifiers & Qt::AltModifier)     << 1;
00552         modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00553 
00554         for (int i=0;i<_text.length();i++) 
00555         {
00556             if (expandedText[i] == '*')
00557                 expandedText[i] = '0' + modifierValue;
00558         }
00559     }
00560 
00561     return expandedText; 
00562 }
00563 
00564 inline void KeyboardTranslator::Entry::setState( States state )
00565 { 
00566     _state = state; 
00567 }
00568 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00569 
00570 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00571 { 
00572     _stateMask = stateMask; 
00573 }
00574 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00575 
00576 }
00577 
00578 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00579 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00580 
00581 #endif // KEYBOARDTRANSLATOR_H
00582 

Konsole

Skip menu "Konsole"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • Konsole
  • Libraries
  •   libkonq
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal