⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keytrans.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ 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 + -