📄 keytrans.cpp
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS and its licensors.** All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.** See below for additional copyright and license information**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************//* -------------------------------------------------------------------------- *//* *//* [keytrans.C] Keyboard Translation *//* *//* -------------------------------------------------------------------------- *//* *//* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> *//* *//* This file is part of Konsole - an X terminal for KDE *//* *//* -------------------------------------------------------------------------- *//* *//* Konsole ported to Qt/Embedded by Trolltech *//* *//* -------------------------------------------------------------------------- *//* The keyboard translation table allows to configure konsoles behavior on key strokes. FIXME: some bug crept in, disallowing '\0' to be emitted.*/#include "keytrans.h"#include <qtopia/qpeapplication.h>#include <qnamespace.h>#include <qbuffer.h>#include <qobject.h>#include <qdict.h>#include <qintdict.h>#include <qfile.h>#include <qglobal.h>#include <qdir.h>//#include <kstddirs.h>//nclude <klocale.h>#include <stdio.h>#undef USE_APPDATA_DIR#define HERE printf("%s(%d): here\n",__FILE__,__LINE__)/* KeyEntry instances represent the individual assignments*/KeyTrans::KeyEntry::KeyEntry(int _ref, int _key, int _bits, int _mask, int _cmd, QString _txt): ref(_ref), key(_key), bits(_bits), mask(_mask), cmd(_cmd), txt(_txt){}KeyTrans::KeyEntry::~KeyEntry(){}bool KeyTrans::KeyEntry::matches(int _key, int _bits, int _mask){ int m = mask & _mask; return _key == key && (bits & m) == (_bits & m);}QString KeyTrans::KeyEntry::text(){ return txt;}/* KeyTrans combines the individual assignments into a proper map, and takes part in a collection.*/KeyTrans::KeyTrans(){ path = ""; numb = 0;}KeyTrans::~KeyTrans(){}KeyTrans::KeyEntry* KeyTrans::addEntry(int ref, int key, int bits, int mask, int cmd, QString txt)// returns conflicting entry{ for (QListIterator<KeyEntry> it(table); it.current(); ++it) { if (it.current()->matches(key,bits,mask)) { return it.current(); } } table.append(new KeyEntry(ref,key,bits,mask,cmd,txt)); return (KeyEntry*)NULL;}bool KeyTrans::findEntry(int key, int bits, int* cmd, const char** txt, int* len){ for (QListIterator<KeyEntry> it(table); it.current(); ++it) if (it.current()->matches(key,bits,0xffff)) { *cmd = it.current()->cmd; *txt = it.current()->txt.ascii(); *len = it.current()->txt.length(); return TRUE; } return FALSE;}/* ------------------------------------------------------------------------- *//* *//* Scanner for keyboard configuration *//* *//* ------------------------------------------------------------------------- */// regular tokenizer/* Tokens - Spaces - Name (A-Za-z0-9)+ - String - Opr on of +-:*/#define SYMName 0#define SYMString 1#define SYMEol 2#define SYMEof 3#define SYMOpr 4#define SYMError 5#define inRange(L,X,H) ((L <= X) && (X <= H))#define isNibble(X) (inRange('A',X,'F')||inRange('a',X,'f')||inRange('0',X,'9'))#define convNibble(X) (inRange('0',X,'9')?X-'0':X+10-(inRange('A',X,'F')?'A':'a'))class KeytabReader{public: KeytabReader(QString p, QIODevice &d);public: void getCc(); void getSymbol(); void parseTo(KeyTrans* kt); void ReportError(const char* msg); void ReportToken(); // diagnosticprivate: int sym; QString res; int len; int slinno; int scolno;private: int cc; int linno; int colno; QIODevice* buf; QString path;};KeytabReader::KeytabReader(QString p, QIODevice &d){ path = p; buf = &d; cc = 0;}void KeytabReader::getCc(){ if (cc == '\n') { linno += 1; colno = 0; } if (cc < 0) return; cc = buf->getch(); colno += 1;}void KeytabReader::getSymbol(){ res = ""; len = 0; sym = SYMError; while (cc == ' ') getCc(); // skip spaces if (cc == '#') // skip comment { while (cc != '\n' && cc > 0) getCc(); } slinno = linno; scolno = colno; if (cc <= 0) { sym = SYMEof; return; // eos } if (cc == '\n') { getCc(); sym = SYMEol; return; // eol } if (inRange('A',cc,'Z')||inRange('a',cc,'z')||inRange('0',cc,'9')) { while (inRange('A',cc,'Z') || inRange('a',cc,'z') || inRange('0',cc,'9')) { res = res + (char)cc; getCc(); } sym = SYMName; return; } if (strchr("+-:",cc)) { res = ""; res = res + (char)cc; getCc(); sym = SYMOpr; return; } if (cc == '"') { getCc(); while (cc >= ' ' && cc != '"') { int sc; if (cc == '\\') // handle quotation { getCc(); switch (cc) { case 'E' : sc = 27; getCc(); break; case 'b' : sc = 8; getCc(); break; case 'f' : sc = 12; getCc(); break; case 't' : sc = 9; getCc(); break; case 'r' : sc = 13; getCc(); break; case 'n' : sc = 10; getCc(); break; case '\\' : // fall thru case '"' : sc = cc; getCc(); break; case 'x' : getCc(); sc = 0; if (!isNibble(cc)) return; sc = 16*sc + convNibble(cc); getCc(); if (!isNibble(cc)) return; sc = 16*sc + convNibble(cc); getCc(); break; default : return; } } else { // regular char sc = cc; getCc(); } res = res + (char)sc; len = len + 1; } if (cc != '"') return; getCc(); sym = SYMString; return; }}void KeytabReader::ReportToken() // diagnostic{ printf("sym(%d): ",slinno); switch(sym) { case SYMEol : printf("End of line"); break; case SYMEof : printf("End of file"); break; case SYMName : printf("Name: %s",res.latin1()); break; case SYMOpr : printf("Opr : %s",res.latin1()); break; case SYMString : printf("String len %d,%d ",res.length(),len); for (unsigned i = 0; i < res.length(); i++) printf(" %02x(%c)",res.latin1()[i],res.latin1()[i]>=' '?res.latin1()[i]:'?'); break; } printf("\n");}void KeytabReader::ReportError(const char* msg) // diagnostic{ fprintf(stderr,"%s(%d,%d):error: %s.\n",path.ascii(),slinno,scolno,msg);}// local symbol tables ---------------------------------------------------------------------class KeyTransSymbols{public: KeyTransSymbols();protected: void defOprSyms(); void defModSyms(); void defKeySyms(); void defKeySym(const char* key, int val); void defOprSym(const char* key, int val); void defModSym(const char* key, int val);public: QDict<QObject> keysyms; QDict<QObject> modsyms; QDict<QObject> oprsyms;};static KeyTransSymbols * syms = 0L;// parser ----------------------------------------------------------------------------------/* Syntax - Line :: [KeyName { ("+" | "-") ModeName } ":" (String|CommandName)] "\n" - Comment :: '#' (any but \n)**/KeyTrans* KeyTrans::fromDevice(QString path, QIODevice &buf){ KeyTrans* kt = new KeyTrans; kt->path = path; KeytabReader ktr(path,buf); ktr.parseTo(kt); return kt;}#define assertSyntax(Cond,Message) if (!(Cond)) { ReportError(Message); goto ERROR; }void KeytabReader::parseTo(KeyTrans* kt){ // Opening sequence buf->open(IO_ReadOnly); getCc(); linno = 1; colno = 1; getSymbol();Loop: // syntax: ["key" KeyName { ("+" | "-") ModeName } ":" String/CommandName] ["#" Comment] if (sym == SYMName && !strcmp(res.latin1(),"keyboard")) // No tr { getSymbol(); assertSyntax(sym == SYMString, "Header expected") // No tr kt->hdr = res.latin1(); getSymbol(); assertSyntax(sym == SYMEol, "Text unexpected") // No tr getSymbol(); // eoln goto Loop; } if (sym == SYMName && !strcmp(res.latin1(),"key")) // No tr {//printf("line %3d: ",startofsym); getSymbol(); assertSyntax(sym == SYMName, "Name expected") // No tr assertSyntax(syms->keysyms[res], "Unknown key name") // No tr int key = (int)syms->keysyms[res]-1;//printf(" key %s (%04x)",res.latin1(),(int)syms->keysyms[res]-1); getSymbol(); // + - :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -