• Skip to content
  • Skip to link menu
KDE 4.2 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,
00090         ApplicationKeypadState = 32
00091     };
00092     Q_DECLARE_FLAGS(States,State)
00093 
00094     
00097     enum Command
00098     {
00100         NoCommand = 0,
00102         SendCommand = 1,
00104         ScrollPageUpCommand = 2,
00106         ScrollPageDownCommand = 4,
00108         ScrollLineUpCommand = 8,
00110         ScrollLineDownCommand = 16,
00112         ScrollLockCommand = 32,
00114         EraseCommand = 64
00115     };
00116     Q_DECLARE_FLAGS(Commands,Command)
00117 
00118     
00123     class Entry
00124     {
00125     public:
00129         Entry();
00130 
00135         bool isNull() const;
00136 
00138         Command command() const;
00140         void setCommand(Command command);
00141 
00154         QByteArray text(bool expandWildCards = false,
00155                         Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00156 
00158         void setText(const QByteArray& text);
00159 
00169         QByteArray escapedText(bool expandWildCards = false,
00170                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00171 
00173         int keyCode() const;
00175         void setKeyCode(int keyCode);
00176 
00185         Qt::KeyboardModifiers modifiers() const;
00186 
00188         Qt::KeyboardModifiers modifierMask() const;
00189 
00191         void setModifiers( Qt::KeyboardModifiers modifiers );
00193         void setModifierMask( Qt::KeyboardModifiers modifiers );
00194 
00203         States state() const;
00204 
00206         States stateMask() const;
00207 
00209         void setState( States state );
00211         void setStateMask( States mask );
00212 
00217         //QKeySequence keySequence() const;
00218 
00223         QString conditionToString() const;
00224 
00232         QString resultToString(bool expandWildCards = false,
00233                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00234 
00239         bool matches( int keyCode , 
00240                       Qt::KeyboardModifiers modifiers , 
00241                       States flags ) const;
00242 
00243         bool operator==(const Entry& rhs) const;
00244        
00245     private:
00246         void insertModifier( QString& item , int modifier ) const;
00247         void insertState( QString& item , int state ) const;
00248         QByteArray unescape(const QByteArray& text) const;
00249 
00250         int _keyCode;
00251         Qt::KeyboardModifiers _modifiers;
00252         Qt::KeyboardModifiers _modifierMask;
00253         States _state;
00254         States _stateMask;
00255 
00256         Command _command;
00257         QByteArray _text;
00258     };
00259 
00261     KeyboardTranslator(const QString& name);
00262    
00263     //KeyboardTranslator(const KeyboardTranslator& other);
00264 
00266     QString name() const;
00267 
00269     void setName(const QString& name);
00270 
00272     QString description() const;
00273 
00275     void setDescription(const QString& description);
00276 
00288     Entry findEntry(int keyCode , 
00289                     Qt::KeyboardModifiers modifiers , 
00290                     States state = NoState) const;
00291 
00296     void addEntry(const Entry& entry);
00297 
00302     void replaceEntry(const Entry& existing , const Entry& replacement);
00303 
00307     void removeEntry(const Entry& entry);
00308 
00310     QList<Entry> entries() const;
00311 
00312 private:
00313 
00314     QMultiHash<int,Entry> _entries; // entries in this keyboard translation,
00315                                                  // entries are indexed according to
00316                                                  // their keycode
00317     QString _name;
00318     QString _description;
00319 };
00320 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00321 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00322 
00351 class KeyboardTranslatorReader
00352 {
00353 public:
00355     KeyboardTranslatorReader( QIODevice* source );
00356 
00361     QString description() const;
00362 
00364     bool hasNextEntry();
00366     KeyboardTranslator::Entry nextEntry(); 
00367 
00372     bool parseError();
00373 
00380     static KeyboardTranslator::Entry createEntry( const QString& condition ,
00381                                                   const QString& result );
00382 private:
00383     struct Token
00384     {
00385         enum Type
00386         {
00387             TitleKeyword,
00388             TitleText,
00389             KeyKeyword,
00390             KeySequence,
00391             Command,
00392             OutputText
00393         };
00394         Type type;
00395         QString text;
00396     };
00397     QList<Token> tokenize(const QString&);
00398     void readNext();
00399     bool decodeSequence(const QString& , 
00400                                 int& keyCode,
00401                                 Qt::KeyboardModifiers& modifiers,
00402                                 Qt::KeyboardModifiers& modifierMask,
00403                                 KeyboardTranslator::States& state,
00404                                 KeyboardTranslator::States& stateFlags);
00405 
00406     static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00407     static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00408     static bool parseAsKeyCode(const QString& item , int& keyCode);
00409        static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00410 
00411     QIODevice* _source;
00412     QString _description;
00413     KeyboardTranslator::Entry _nextEntry;
00414     bool _hasNext;
00415 };
00416 
00418 class KeyboardTranslatorWriter
00419 {
00420 public:
00425     KeyboardTranslatorWriter(QIODevice* destination);
00426     ~KeyboardTranslatorWriter();
00427 
00432     void writeHeader( const QString& description );
00434     void writeEntry( const KeyboardTranslator::Entry& entry ); 
00435 
00436 private:
00437     QIODevice* _destination;  
00438     QTextStream* _writer;
00439 };
00440 
00445 class KDE_EXPORT KeyboardTranslatorManager
00446 {
00447 public:
00455     KeyboardTranslatorManager();
00456     ~KeyboardTranslatorManager();
00457 
00464     void addTranslator(KeyboardTranslator* translator);
00465 
00471     bool deleteTranslator(const QString& name);
00472 
00474     const KeyboardTranslator* defaultTranslator();
00475 
00483     const KeyboardTranslator* findTranslator(const QString& name);
00490     QList<QString> allTranslators();
00491 
00493    static KeyboardTranslatorManager* instance();
00494 
00495 private:
00496     static const char* defaultTranslatorText;
00497     
00498     void findTranslators(); // locate the available translators
00499     KeyboardTranslator* loadTranslator(const QString& name); // loads the translator 
00500                                                              // with the given name
00501     KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00502 
00503     bool saveTranslator(const KeyboardTranslator* translator);
00504     QString findTranslatorPath(const QString& name);
00505     
00506     QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator
00507                                                      // instance
00508     bool _haveLoadedAll;
00509 };
00510 
00511 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00512 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00513 
00514 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier ) 
00515 { 
00516     _modifiers = modifier;
00517 }
00518 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00519 
00520 inline void  KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask ) 
00521 { 
00522    _modifierMask = mask; 
00523 }
00524 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00525 
00526 inline bool KeyboardTranslator::Entry::isNull() const
00527 {
00528     return ( *this == Entry() );
00529 }
00530 
00531 inline void KeyboardTranslator::Entry::setCommand( Command command )
00532 { 
00533     _command = command; 
00534 }
00535 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00536 
00537 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00538 { 
00539     _text = unescape(text);
00540 }
00541 inline int oneOrZero(int value)
00542 {
00543     return value ? 1 : 0;
00544 }
00545 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const 
00546 {
00547     QByteArray expandedText = _text;
00548     
00549     if (expandWildCards)
00550     {
00551         int modifierValue = 1;
00552         modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00553         modifierValue += oneOrZero(modifiers & Qt::AltModifier)     << 1;
00554         modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00555 
00556         for (int i=0;i<_text.length();i++) 
00557         {
00558             if (expandedText[i] == '*')
00559                 expandedText[i] = '0' + modifierValue;
00560         }
00561     }
00562 
00563     return expandedText; 
00564 }
00565 
00566 inline void KeyboardTranslator::Entry::setState( States state )
00567 { 
00568     _state = state; 
00569 }
00570 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00571 
00572 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00573 { 
00574     _stateMask = stateMask; 
00575 }
00576 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00577 
00578 }
00579 
00580 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00581 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00582 
00583 #endif // KEYBOARDTRANSLATOR_H
00584 

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.7
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