• Skip to content
  • Skip to link menu
KDE 4.0 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 (C) 2007 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 class QIODevice;
00033 class QTextStream;
00034 
00035 namespace Konsole
00036 {
00037 
00051 class KeyboardTranslator
00052 {
00053 public:
00062     enum State
00063     {
00065         NoState = 0,
00069         NewLineState = 1,
00074         AnsiState = 2,
00078         CursorKeysState = 4,
00083         AlternateScreenState = 8,
00085         AnyModifierState = 16
00086     };
00087     Q_DECLARE_FLAGS(States,State)
00088 
00089     
00092     enum Command
00093     {
00095         NoCommand = 0,
00097         SendCommand = 1,
00099         ScrollPageUpCommand = 2,
00101         ScrollPageDownCommand = 4,
00103         ScrollLineUpCommand = 8,
00105         ScrollLineDownCommand = 16,
00107         ScrollLockCommand = 32,
00109         EraseCommand = 64
00110     };
00111     Q_DECLARE_FLAGS(Commands,Command)
00112 
00113     
00118     class Entry
00119     {
00120     public:
00124         Entry();
00125 
00130         bool isNull() const;
00131 
00133         Command command() const;
00135         void setCommand(Command command);
00136 
00149         QByteArray text(bool expandWildCards = false,
00150                         Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00151 
00153         void setText(const QByteArray& text);
00154 
00164         QByteArray escapedText(bool expandWildCards = false,
00165                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00166 
00168         int keyCode() const;
00170         void setKeyCode(int keyCode);
00171 
00180         Qt::KeyboardModifiers modifiers() const;
00181 
00183         Qt::KeyboardModifiers modifierMask() const;
00184 
00186         void setModifiers( Qt::KeyboardModifiers modifiers );
00188         void setModifierMask( Qt::KeyboardModifiers modifiers );
00189 
00198         States state() const;
00199 
00201         States stateMask() const;
00202 
00204         void setState( States state );
00206         void setStateMask( States mask );
00207 
00212         //QKeySequence keySequence() const;
00213 
00218         QString conditionToString() const;
00219 
00227         QString resultToString(bool expandWildCards = false,
00228                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const;
00229 
00234         bool matches( int keyCode , 
00235                       Qt::KeyboardModifiers modifiers , 
00236                       States flags ) const;
00237 
00238         bool operator==(const Entry& rhs) const;
00239        
00240     private:
00241         void insertModifier( QString& item , int modifier ) const;
00242         void insertState( QString& item , int state ) const;
00243         QByteArray unescape(const QByteArray& text) const;
00244 
00245         int _keyCode;
00246         Qt::KeyboardModifiers _modifiers;
00247         Qt::KeyboardModifiers _modifierMask;
00248         States _state;
00249         States _stateMask;
00250 
00251         Command _command;
00252         QByteArray _text;
00253     };
00254 
00256     KeyboardTranslator(const QString& name);
00257    
00258     //KeyboardTranslator(const KeyboardTranslator& other);
00259 
00261     QString name() const;
00262 
00264     void setName(const QString& name);
00265 
00267     QString description() const;
00268 
00270     void setDescription(const QString& description);
00271 
00283     Entry findEntry(int keyCode , 
00284                     Qt::KeyboardModifiers modifiers , 
00285                     States state = NoState) const;
00286 
00291     void addEntry(const Entry& entry);
00292 
00297     void replaceEntry(const Entry& existing , const Entry& replacement);
00298 
00302     void removeEntry(const Entry& entry);
00303 
00305     QList<Entry> entries() const;
00306 
00307 private:
00308 
00309     QMultiHash<int,Entry> _entries; // entries in this keyboard translation,
00310                                                  // entries are indexed according to
00311                                                  // their keycode
00312     QString _name;
00313     QString _description;
00314 };
00315 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States)
00316 Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands)
00317 
00346 class KeyboardTranslatorReader
00347 {
00348 public:
00350     KeyboardTranslatorReader( QIODevice* source );
00351 
00356     QString description() const;
00357 
00359     bool hasNextEntry();
00361     KeyboardTranslator::Entry nextEntry(); 
00362 
00367     bool parseError();
00368 
00375     static KeyboardTranslator::Entry createEntry( const QString& condition ,
00376                                                   const QString& result );
00377 private:
00378     struct Token
00379     {
00380         enum Type
00381         {
00382             TitleKeyword,
00383             TitleText,
00384             KeyKeyword,
00385             KeySequence,
00386             Command,
00387             OutputText
00388         };
00389         Type type;
00390         QString text;
00391     };
00392     QList<Token> tokenize(const QString&);
00393     void readNext();
00394     bool decodeSequence(const QString& , 
00395                                 int& keyCode,
00396                                 Qt::KeyboardModifiers& modifiers,
00397                                 Qt::KeyboardModifiers& modifierMask,
00398                                 KeyboardTranslator::States& state,
00399                                 KeyboardTranslator::States& stateFlags);
00400 
00401     static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier);
00402     static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state);
00403     static bool parseAsKeyCode(const QString& item , int& keyCode);
00404     static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command);
00405 
00406     QIODevice* _source;
00407     QString _description;
00408     KeyboardTranslator::Entry _nextEntry;
00409     bool _hasNext;
00410 };
00411 
00413 class KeyboardTranslatorWriter
00414 {
00415 public:
00420     KeyboardTranslatorWriter(QIODevice* destination);
00421     ~KeyboardTranslatorWriter();
00422 
00427     void writeHeader( const QString& description );
00429     void writeEntry( const KeyboardTranslator::Entry& entry ); 
00430 
00431 private:
00432     QIODevice* _destination;  
00433     QTextStream* _writer;
00434 };
00435 
00440 class KeyboardTranslatorManager
00441 {
00442 public:
00450     KeyboardTranslatorManager();
00451     ~KeyboardTranslatorManager();
00452 
00459     void addTranslator(KeyboardTranslator* translator);
00460 
00466     bool deleteTranslator(const QString& name);
00467 
00469     const KeyboardTranslator* defaultTranslator();
00470 
00478     const KeyboardTranslator* findTranslator(const QString& name);
00485     QList<QString> allTranslators();
00486 
00488    static KeyboardTranslatorManager* instance();
00489 
00490 private:
00491     static const char* defaultTranslatorText;
00492     
00493     void findTranslators(); // locate the available translators
00494     KeyboardTranslator* loadTranslator(const QString& name); // loads the translator 
00495                                                              // with the given name
00496     KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name);
00497 
00498     bool saveTranslator(const KeyboardTranslator* translator);
00499     QString findTranslatorPath(const QString& name);
00500     
00501     QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator
00502                                                      // instance
00503     bool _haveLoadedAll;
00504 };
00505 
00506 inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; }
00507 inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; }
00508 
00509 inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier ) 
00510 { 
00511     _modifiers = modifier;
00512 }
00513 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; }
00514 
00515 inline void  KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask ) 
00516 { 
00517    _modifierMask = mask; 
00518 }
00519 inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; }
00520 
00521 inline bool KeyboardTranslator::Entry::isNull() const
00522 {
00523     return ( *this == Entry() );
00524 }
00525 
00526 inline void KeyboardTranslator::Entry::setCommand( Command command )
00527 { 
00528     _command = command; 
00529 }
00530 inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; }
00531 
00532 inline void KeyboardTranslator::Entry::setText( const QByteArray& text )
00533 { 
00534     _text = unescape(text);
00535 }
00536 inline int oneOrZero(int value)
00537 {
00538     return value ? 1 : 0;
00539 }
00540 inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const 
00541 {
00542     QByteArray expandedText = _text;
00543     
00544     if (expandWildCards)
00545     {
00546         int modifierValue = 1;
00547         modifierValue += oneOrZero(modifiers & Qt::ShiftModifier);
00548         modifierValue += oneOrZero(modifiers & Qt::AltModifier)     << 1;
00549         modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2;
00550 
00551         for (int i=0;i<_text.length();i++) 
00552         {
00553             if (expandedText[i] == '*')
00554                 expandedText[i] = '0' + modifierValue;
00555         }
00556     }
00557 
00558     return expandedText; 
00559 }
00560 
00561 inline void KeyboardTranslator::Entry::setState( States state )
00562 { 
00563     _state = state; 
00564 }
00565 inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; }
00566 
00567 inline void KeyboardTranslator::Entry::setStateMask( States stateMask )
00568 { 
00569     _stateMask = stateMask; 
00570 }
00571 inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; }
00572 
00573 }
00574 
00575 Q_DECLARE_METATYPE(Konsole::KeyboardTranslator::Entry)
00576 Q_DECLARE_METATYPE(const Konsole::KeyboardTranslator*)
00577 
00578 #endif // KEYBOARDTRANSLATOR_H
00579 

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