-rw-r--r-- | inputmethods/dvorak/dvorak.cpp | 2 | ||||
-rw-r--r-- | inputmethods/dvorak/dvorak.h | 4 | ||||
-rw-r--r-- | inputmethods/dvorak/dvorakimpl.cpp | 6 | ||||
-rw-r--r-- | inputmethods/dvorak/dvorakimpl.h | 13 | ||||
-rw-r--r-- | inputmethods/jumpx/keyboard.cpp | 1 | ||||
-rw-r--r-- | inputmethods/jumpx/keyboard.h | 5 | ||||
-rw-r--r-- | inputmethods/jumpx/keyboardimpl.cpp | 4 | ||||
-rw-r--r-- | inputmethods/jumpx/keyboardimpl.h | 12 | ||||
-rw-r--r-- | inputmethods/keyboard/keyboard.cpp | 1 | ||||
-rw-r--r-- | inputmethods/keyboard/keyboard.h | 5 | ||||
-rw-r--r-- | inputmethods/keyboard/keyboardimpl.cpp | 8 | ||||
-rw-r--r-- | inputmethods/keyboard/keyboardimpl.h | 13 | ||||
-rw-r--r-- | inputmethods/kjumpx/keyboard.cpp | 1 | ||||
-rw-r--r-- | inputmethods/kjumpx/keyboard.h | 5 | ||||
-rw-r--r-- | inputmethods/kjumpx/keyboardimpl.cpp | 4 | ||||
-rw-r--r-- | inputmethods/kjumpx/keyboardimpl.h | 12 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 1 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.h | 5 | ||||
-rw-r--r-- | inputmethods/multikey/keyboardimpl.cpp | 4 | ||||
-rw-r--r-- | inputmethods/multikey/keyboardimpl.h | 13 |
20 files changed, 94 insertions, 25 deletions
diff --git a/inputmethods/dvorak/dvorak.cpp b/inputmethods/dvorak/dvorak.cpp index 29b5bd0..97afa0a 100644 --- a/inputmethods/dvorak/dvorak.cpp +++ b/inputmethods/dvorak/dvorak.cpp @@ -1,417 +1,419 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "dvorak.h" #include <qpe/global.h> #include <qwindowsystem_qws.h> #include <qpainter.h> #include <qfontmetrics.h> #include <qtimer.h> #include <ctype.h> #define USE_SMALL_BACKSPACE +using namespace Dvorak; + Keyboard::Keyboard(QWidget* parent, const char* name, WFlags f) : QFrame(parent, name, f), shift(FALSE), lock(FALSE), ctrl(FALSE), alt(FALSE), useLargeKeys(TRUE), useOptiKeys(0), pressedKey(-1), unicode(-1), qkeycode(0), modifiers(0) { // setPalette(QPalette(QColor(240,240,230))); // Beige! // setFont( QFont( "Helvetica", 8 ) ); // setPalette(QPalette(QColor(200,200,200))); // Gray setPalette(QPalette(QColor(220,220,220))); // Gray picks = new KeyboardPicks( this ); picks->setFont( QFont( "smallsmooth", 9 ) ); setFont( QFont( "smallsmooth", 9 ) ); picks->initialise(); QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); repeatTimer = new QTimer( this ); connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); } void Keyboard::resizeEvent(QResizeEvent*) { int ph = picks->sizeHint().height(); picks->setGeometry( 0, 0, width(), ph ); keyHeight = (height()-ph)/5; int nk; if ( useOptiKeys ) { nk = 15; } else if ( useLargeKeys ) { nk = 15; } else { nk = 19; } defaultKeyWidth = width()/nk; xoffs = (width()-defaultKeyWidth*nk)/2; } void KeyboardPicks::initialise() { setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); mode = 0; dc = new KeyboardConfig(this); configs.append(dc); } QSize KeyboardPicks::sizeHint() const { return QSize(240,fontMetrics().lineSpacing()); } void KeyboardConfig::generateText(const QString &s) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) for (int i=0; i<(int)backspaces; i++) { parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); } for (int i=0; i<(int)s.length(); i++) { parent->emitKey( s[i].unicode(), 0, 0, true, false ); parent->emitKey( s[i].unicode(), 0, 0, false, false ); } parent->emitKey( 0, Qt::Key_Space, 0, true, false ); parent->emitKey( 0, Qt::Key_Space, 0, false, false ); backspaces = 0; #endif } //PC keyboard layout and scancodes /* Format: length, code, length, code, ..., 0 length is measured in half the width of a standard key. If code < 0x80 we have length/2 consecutive standard keys, starting with scancode code. Special keys are hardcoded, one at a time, with length of key and code >= 0x80, these are NOT standard PC scancodes, but are looked up in specialM[]. (The special keys are not keymappable.) */ static const uchar * const keyboard_opti[5] = { (const uchar *const) "\001\223\003\240\002\20\002\41\002\26\002\62\002\56\002\45\002\54\003\200\001\223\002\226\002\235\002\234\002\236", (const uchar *const) "\001\223\003\201\004\207\002\30\002\24\002\43\004\207\003\203\001\223\006\002\002\065", (const uchar *const) "\001\223\003\202\002\60\002\37\002\23\002\22\002\36\002\21\002\55\003\203\001\223\006\005\002\055", (const uchar *const) "\001\223\003\205\004\207\002\27\002\61\002\40\004\207\003\204\001\223\006\010\002\014", (const uchar *const) "\001\223\003\206\002\44\002\31\002\57\002\42\002\46\002\25\002\207\003\204\001\223\002\013\002\064\002\015\002\230" }; static const uchar * const keyboard_standard[5] = { #ifdef USE_SMALL_BACKSPACE (const uchar *const)"\002\240\002`\0021\0022\0023\0024\0025\0026\0027\0028\0029\0020\002[\002]\002\200\002\223\002\215\002\216\002\217", #else (const uchar *const)"\002\051\0021\0022\0023\0024\0025\0026\0027\0028\0029\0020\002[\002]\004\200\002\223\002\215\002\216\002\217", #endif //~ + 123...+ BACKSPACE //+ INSERT + HOME + PGUP (const uchar *const)"\003\201\002'\002,\002.\002p\002y\002f\002g\002c\002r\002l\002/\002=\002\\\001\224\002\223\002\221\002\220\002\222", //TAB + qwerty.. + backslash //+ DEL + END + PGDN (const uchar *const)"\004\202\002a\002o\002e\002u\002i\002d\002h\002t\002n\002s\002-\004\203", //CAPS + asdf.. + RETURN (const uchar *const)"\005\204\002;\002q\002j\002k\002x\002b\002m\002w\002v\002z\005\204\002\223\002\223\002\211", //SHIFT + zxcv... //+ UP (const uchar *const)"\003\205\003\206\022\207\003\206\003\205\002\223\002\212\002\213\002\214" //CTRL + ALT + SPACE //+ LEFT + DOWN + RIGHT }; struct ShiftMap { char normal; char shifted; }; static const ShiftMap shiftMap[] = { { '`', '~' }, { '1', '!' }, { '2', '@' }, { '3', '#' }, { '4', '$' }, { '5', '%' }, { '6', '^' }, { '7', '&' }, { '8', '*' }, { '9', '(' }, { '0', ')' }, { '-', '_' }, { '=', '+' }, { '\\', '|' }, { '[', '{' }, { ']', '}' }, { ';', ':' }, { '\'', '"' }, { ',', '<' }, { '.', '>' }, { '/', '?' } }; /* XPM */ static const char * const uparrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "....a....", "...aaa...", "..aaaaa..", "....a....", "....a....", "....a....", "....a....", "........."}; /* XPM */ static const char * const leftarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", "...a.....", "..aa.....", ".aaaaaaa.", "..aa.....", "...a.....", ".........", "........."}; /* XPM */ static const char * const downarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "....a....", "....a....", "....a....", "....a....", "..aaaaa..", "...aaa...", "....a....", "........."}; /* XPM */ static const char * const rightarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", ".....a...", ".....aa..", ".aaaaaaa.", ".....aa..", ".....a...", ".........", "........."}; /* XPM */ static const char * const insert_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "a........", "a.aaa.aaa", "a.a.a.a..", "a.a.a..a.", "a.a.a...a", "a.a.a.aaa", ".........", "........."}; /* XPM */ static const char * const delete_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "aa......a", "a.a.aaa.a", "a.a.a.a.a", "a.a.aaa.a.", "a.a.a...a", "aaa.aaa.a", ".........", "........."}; /* XPM */ static const char * const home_xpm[]={ "9 9 2 1", "a c #000000", ". c None", "....a....", "...a.a...", "..a...a..", ".a.....a.", "aa.aaa.aa", ".a.a.a.a.", ".a.a.a.a.", ".aaaaaaa.", "........."}; /* XPM */ static const char * const end_xpm[]={ "10 9 2 1", "a c #000000", ". c None", "..........", "aa.......a", "a..aaa.aaa", "aa.a.a.a.a", "a..a.a.a.a", "a..a.a.a.a", "aa.a.a.aaa", "..........", ".........."}; /* XPM */ static const char * const pageup_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".aaa.aaa.", ".a.a.a.a.", ".aaa..aa.", ".a...aaa.", ".........", ".a.a.aaa.", ".a.a.a.a.", ".aaa.aaa.", ".....a..."}; /* XPM */ static const char * const pagedown_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".aaa.aaa.", ".a.a.a.a.", ".aaa..aa.", ".a...aaa.", ".........", "...a.....", ".aaa.aaa.", ".a.a.a.a.", ".aaa.a.a."}; /* XPM */ static const char * const expand_xpm[]={ "4 9 2 1", "a c #408040", ". c None", "a...", "aa..", "aaa.", "aaaa", "aaaa", "aaaa", "aaa.", "aa..", "a..."}; /* XPM */ #ifdef USE_SMALL_BACKSPACE static const char * const backspace_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", "...a.....", "..aa.....", ".aaaaaaaa", "..aa.....", "...a.....", ".........", "........."}; #else static const char * const backspace_xpm[]={ "21 9 2 1", "a c #000000", ". c None", ".....................", ".....................", ".....aaa..a..........", ".a...a..a.a.a.aaa.aaa", "aaaa.aaa..aa..aa..a.a", ".a...a..a.aaa..aa.a.a", ".....aaaa.a.a.aaa.aa.", "..................a..", "....................."}; #endif /* XPM */ static const char * const escape_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", ".aa.aa.aa", ".a..a..a.", ".aa.aa.a.", ".a...a.a.", ".aa.aa.aa", ".........", "........."}; enum { BSCode = 0x80, TabCode, CapsCode, RetCode, ShiftCode, CtrlCode, AltCode, SpaceCode, BackSlash, UpCode, LeftCode, DownCode, RightCode, Blank, Expand, Opti, ResetDict, Divide, Multiply, Add, Subtract, Decimal, Equal, Percent, Sqrt, Inverse, Escape }; typedef struct SpecialMap { int qcode; ushort unicode; const char * label; const char * const * xpm; }; static const SpecialMap specialM[] = { { Qt::Key_Backspace, 8, "<", backspace_xpm }, { Qt::Key_Tab, 9, "Tab", NULL }, { Qt::Key_CapsLock, 0, "Caps", NULL }, { Qt::Key_Return, 13, "Ret", NULL }, { Qt::Key_Shift, 0, "Shift", NULL }, { Qt::Key_Control, 0, "Ctrl", NULL }, { Qt::Key_Alt, 0, "Alt", NULL }, { Qt::Key_Space, ' ', "", NULL }, { BackSlash, 43, "\\", NULL }, // Need images? { Qt::Key_Up, 0, "^", uparrow_xpm }, { Qt::Key_Left, 0, "<", leftarrow_xpm }, { Qt::Key_Down, 0, "v", downarrow_xpm }, { Qt::Key_Right, 0, ">", rightarrow_xpm }, { Qt::Key_Insert, 0, "I", insert_xpm }, { Qt::Key_Home, 0, "H", home_xpm }, { Qt::Key_PageUp, 0, "U", pageup_xpm }, { Qt::Key_End, 0, "E", end_xpm }, { Qt::Key_Delete, 0, "X", delete_xpm }, diff --git a/inputmethods/dvorak/dvorak.h b/inputmethods/dvorak/dvorak.h index 38ae338..216b5e5 100644 --- a/inputmethods/dvorak/dvorak.h +++ b/inputmethods/dvorak/dvorak.h @@ -1,103 +1,107 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qframe.h> #include "../pickboard/pickboardcfg.h" #include "../pickboard/pickboardpicks.h" class QTimer; +namespace Dvorak +{ + class KeyboardConfig : public DictFilterConfig { public: KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } virtual void generateText(const QString &s); void decBackspaces() { if (backspaces) backspaces--; } void incBackspaces() { backspaces++; } void resetBackspaces() { backspaces = 0; } private: int backspaces; }; class KeyboardPicks : public PickboardPicks { Q_OBJECT public: KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) : PickboardPicks(parent, name, f) { } void initialise(); virtual QSize sizeHint() const; KeyboardConfig *dc; }; class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); void timerEvent(QTimerEvent* e); void drawKeyboard( QPainter &p, int key = -1 ); void setMode(int mode) { useOptiKeys = mode; } QSize sizeHint() const; signals: void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); private slots: void repeat(); private: int getKey( int &w, int j = -1 ); void clearHighlight(); uint shift:1; uint lock:1; uint ctrl:1; uint alt:1; uint useLargeKeys:1; uint useOptiKeys:1; int pressedKey; KeyboardPicks *picks; int keyHeight; int defaultKeyWidth; int xoffs; int unicode; int qkeycode; int modifiers; int pressTid; bool pressed; QTimer *repeatTimer; }; +} // namespace Dvorak diff --git a/inputmethods/dvorak/dvorakimpl.cpp b/inputmethods/dvorak/dvorakimpl.cpp index 3c83464..8050ce1 100644 --- a/inputmethods/dvorak/dvorakimpl.cpp +++ b/inputmethods/dvorak/dvorakimpl.cpp @@ -1,130 +1,130 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qapplication.h> #include <qpixmap.h> #include "dvorak.h" #include "dvorakimpl.h" /* XPM */ -static const char * kb_xpm[] = { +static const char * const kb_xpm[] = { "28 13 4 1", " c None", ". c #4C4C4C", "+ c #FFF7DD", "@ c #D6CFBA", " .......................... ", " .+++.+++.+++.+++.+++.++++. ", " .+@@.+@@.+@@.+@@.+@@.+@@@. ", " .......................... ", " .+++++.+++.+++.+++.++++++. ", " .+@@@@.+@@.+@@.+@@.+@@@@@. ", " .......................... ", " .++++++.+++.+++.+++.+++++. ", " .+@@@@@.+@@.+@@.+@@.+@@@@. ", " .......................... ", " .++++.++++++++++++++.++++. ", " .+@@@.+@@@@@@@@@@@@@.+@@@. ", " .......................... "}; /* XPM */ -static char * opti_xpm[] = { +static const char * const opti_xpm[] = { "28 13 4 1", " c None", ". c #4C4C4C", "+ c #FFF7DD", "@ c #D6CFBA", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... "}; KeyboardImpl::KeyboardImpl() : input(0), icn(0), ref(0) { } KeyboardImpl::~KeyboardImpl() { delete input; delete icn; } QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) { if ( !input ) - input = new Keyboard( parent, "Keyboard", f ); + input = new Dvorak::Keyboard( parent, "Keyboard", f ); return input; } void KeyboardImpl::resetState() { if ( input ) input->resetState(); } QPixmap *KeyboardImpl::icon() { if ( !icn ) icn = new QPixmap( (const char **)kb_xpm ); return icn; } QString KeyboardImpl::name() { return qApp->translate( "InputMethods", "Dvorak" ); } void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) { if ( input ) QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); } #ifndef QT_NO_COMPONENT QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_InputMethod ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( KeyboardImpl ) } #endif diff --git a/inputmethods/dvorak/dvorakimpl.h b/inputmethods/dvorak/dvorakimpl.h index e756364..bd9fa88 100644 --- a/inputmethods/dvorak/dvorakimpl.h +++ b/inputmethods/dvorak/dvorakimpl.h @@ -1,51 +1,60 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef KEYBOARDIMPL_H #define KEYBOARDIMPL_H #include <qpe/inputmethodinterface.h> -class Keyboard; +namespace Dvorak +{ + class Keyboard; +} + class QPixmap; +namespace +{ + class KeyboardImpl : public InputMethodInterface { public: KeyboardImpl(); virtual ~KeyboardImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); virtual void resetState(); virtual QPixmap *icon(); virtual QString name(); virtual void onKeyPress( QObject *receiver, const char *slot ); private: - Keyboard *input; + Dvorak::Keyboard *input; QPixmap *icn; ulong ref; }; +} // anonymous namespace + #endif diff --git a/inputmethods/jumpx/keyboard.cpp b/inputmethods/jumpx/keyboard.cpp index 0b8fc14..0cfb4be 100644 --- a/inputmethods/jumpx/keyboard.cpp +++ b/inputmethods/jumpx/keyboard.cpp @@ -1,510 +1,511 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include "keyboard.h" #include <qpe/resource.h> //#include <iostream.h> static const int autorepeatDelaytime = 500; // ms static const int autorepeatRate = 20; // chars per second static const int mod1x1 = 0; static const int mod1x2 = 23; static const int mod1w = mod1x2 - mod1x1; static const int letterx1 = 27; static const int letterx2 = 129; static const int letterw = 17; static const int letterh = 14; static const int num1x1 = 130; static const int num1x2 = 137; static const int num1w = num1x2 - num1x1; static const int specialx1 = 138; static const int specialx2 = 170; static const int specialw = 16; static const int num2x1 = 171; static const int num2x2 = 178; static const int num2w = num2x2 - num2x1; static const int mod2x1 = 179; static const int mod2x2 = 203; static const int mod2w = mod2x2 - mod2x1; static const int cursorx1 = 207; static const int cursorw = 16; static const int myParenID = -10; typedef struct mapElement { int qcode; ushort unicode; }; static const mapElement mod1Map[] = { { Qt::Key_Escape, 27 }, { Qt::Key_Tab, 9 }, { Qt::Key_Return, 13 }, { Qt::Key_Alt, 0 }, { Qt::Key_Control, 0 }, }; static const uchar *const letterMap[] = { (const uchar *const)"zvchwk", (const uchar *const)"fitaly", (const uchar *const)" ne ", (const uchar *const)"gdorsb", (const uchar *const)"qjumpx", }; static const uchar *const letterMapShift[] = { (const uchar *const)"ZVCHWK", (const uchar *const)"FITALY", (const uchar *const)" NE ", (const uchar *const)"GDORSB", (const uchar *const)"QJUMPX", }; static const uchar *const num1Map = (const uchar *const)"12345"; static const uchar *const specialMap[] = { (const uchar *const)"-+", (const uchar *const)"*!", (const uchar *const)",'", (const uchar *const)".%", (const uchar *const)"/$", }; static const uchar *const specialMapShift[] = { (const uchar *const)"_=", (const uchar *const)"#?", (const uchar *const)";\"", (const uchar *const)":|", (const uchar *const)"\\&", }; static const uchar *const specialMapParen[] = { (const uchar *const)"()", (const uchar *const)"[]", (const uchar *const)"{}", (const uchar *const)"<>", (const uchar *const)"@~", }; static const uchar *const num2Map = (const uchar *const)"67890"; static const mapElement mod2Map[] = { { Qt::Key_Backspace, 8 }, { Qt::Key_Delete, 0 }, { Qt::Key_Return, 13 }, { Qt::Key_Shift, 0 }, { myParenID, 0 }, }; static const int cursorMap[][2] = { { Qt::Key_Home, Qt::Key_PageUp }, { Qt::Key_End, Qt::Key_PageDown }, { Qt::Key_Up, Qt::Key_Up }, { Qt::Key_Left, Qt::Key_Right }, { Qt::Key_Down, Qt::Key_Down }, }; +using namespace JumpX; Keyboard::Keyboard(QWidget* parent, const char* name, WFlags f) : QFrame(parent, name, f), shift(0), paren(0), ctrl(0), alt(0), pressedKeyUnicode(0), pressedKeyQcode(0), pressedMod(0), isnoncont(false), slideKeyUnicodeH(0), slideKeyQcodeH(0), slideKeyUnicodeV(0), slideKeyQcodeV(0), enableMouseTracking(false), slidePix(NULL), slidePixH(NULL), slidePixV(NULL), releasedPix(NULL), pressedPix(NULL) { //setPalette(QPalette(QColor(240,240,230))); // Beige! releasedPlain = releasedShift = releasedParen = Resource::loadPixmap("jumpx/released"); pressedPlain = pressedShift = pressedParen = Resource::loadPixmap("jumpx/pressed"); pressedDigit = Resource::loadPixmap("jumpx/pressed"); QPixmap tmp; tmp = Resource::loadPixmap("jumpx/releasedShift"); bitBlt(&releasedShift, letterx1, 0, &tmp); tmp = Resource::loadPixmap("jumpx/releasedParen"); bitBlt(&releasedParen, specialx1, 0, &tmp); tmp = Resource::loadPixmap("jumpx/pressedShift"); bitBlt(&pressedShift, letterx1, 0, &tmp); tmp = Resource::loadPixmap("jumpx/pressedParen"); bitBlt(&pressedParen, specialx1, 0, &tmp); tmp = Resource::loadPixmap("jumpx/pressedDigit"); bitBlt(&pressedDigit, specialx1, 0, &tmp); offscreen = QPixmap( releasedPlain ); releasedPix = &releasedPlain; pressedPix = &pressedPlain; slidePix = &pressedPlain; delayTimer = new QTimer(this); rateTimer = new QTimer(this); connect( delayTimer, SIGNAL( timeout() ), this, SLOT( delayTimerDone() ) ); connect( rateTimer, SIGNAL( timeout() ), this, SLOT( rateTimerDone() ) ); } void Keyboard::resizeEvent(QResizeEvent*) { //cout << "resizeEvent()" << endl; } void Keyboard::paintEvent(QPaintEvent*) { bitBlt(this, 0, 0, &offscreen); } void Keyboard::mousePressEvent(QMouseEvent *e) { pressedx = -1; pressedKeyUnicode = pressedKeyQcode = pressedMod = 0; int x = e->x(); int y = e->y(); int row = (y - 1) / letterh; if ( x <= mod1x2 ) // mod1 { pressedx = mod1x1; pressedy = row * letterh; pressedw = mod1w + 1; pressedh = letterh + 1; if ( row == 2 ) // return { pressed2x = mod2x1; pressed2y = 2 * letterh; pressed2w = mod2w + 1; pressed2h = letterh + 1; isnoncont = true; } else if ( row == 3 ) // alt alt = 1; else if ( row == 4 ) // ctrl ctrl = 1; pressedKeyUnicode = mod1Map[row].unicode; pressedKeyQcode = mod1Map[row].qcode; } else if ( x >= letterx1 && x <= letterx2 ) // letter { int column = (x - letterx1 - 1) / letterw; QChar temp; if ( shift ) temp = QChar( letterMapShift[row][column] ); else temp = QChar( letterMap[row][column] ); if ( temp == ' ' ) // space { if ( column < 3 ) { pressedx = letterx1; pressed2x = letterx1 + letterw * 4; } else { pressedx = letterx1 + letterw * 4; pressed2x = letterx1; } pressedy = pressed2y = row * letterh; pressedw = pressed2w = letterw * 2 + 1; pressedh = pressed2h = letterh + 1; isnoncont = true; } else { pressedx = letterx1 + column * letterw; pressedy = row * letterh; pressedw = letterw + 1; pressedh = letterh + 1; } pressedKeyUnicode = temp.unicode(); pressedKeyQcode = slideKeyQcodeH = slideKeyQcodeV = temp.upper().unicode(); if ( temp == ' ' ) { slideKeyUnicodeH = slideKeyUnicodeV = 8; slideKeyQcodeH = slideKeyQcodeV = Qt::Key_Backspace; } else if ( temp == temp.lower() ) { slideKeyUnicodeH = slideKeyUnicodeV = temp.upper().unicode(); slidePixH = slidePixV = &pressedShift; } else { slideKeyUnicodeH = slideKeyUnicodeV = temp.lower().unicode(); slidePixH = slidePixV = &pressedPlain; } enableMouseTracking = true; } else if ( x >= num1x1 && x <= num1x2 ) // num1 { pressedx = num1x1; pressedy = row * letterh; pressedw = num1w + 1; pressedh = letterh + 1; QChar temp = QChar( num1Map[row] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); } else if ( x >= specialx1 && x <= specialx2 ) // special { int column = (x - specialx1 - 1) / specialw; pressedx = specialx1 + column * specialw; pressedy = row * letterh; pressedw = specialw + 1; pressedh = letterh + 1; QChar temp; if ( shift ) temp = QChar( specialMapShift[row][column] ); else if ( paren ) temp = QChar( specialMapParen[row][column] ); else temp = QChar( specialMap[row][column] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); slideKeyUnicodeH = slideKeyQcodeH = slideKeyUnicodeV = slideKeyQcodeV = QChar('0').unicode() + ( 5 * column + row + 1 ) % 10; slidePixH = slidePixV = &pressedDigit; if ( shift ) { slideKeyUnicodeV = slideKeyQcodeV = QChar( specialMap[row][column] ).unicode(); slidePixV = &pressedPlain; } else if ( !(shift || paren) ) { slideKeyUnicodeV = slideKeyQcodeV = QChar( specialMapShift[row][column] ).unicode(); slidePixV = &pressedShift; } enableMouseTracking = true; } else if ( x >= num2x1 && x <= num2x2 ) // num2 { pressedx = num2x1; pressedy = row * letterh; pressedw = num2w + 1; pressedh = letterh + 1; QChar temp = QChar( num2Map[row] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); } else if ( x >= mod2x1 && x <= mod2x2 ) // mod2 { pressedx = mod2x1; pressedy = row * letterh; pressedw = mod2w + 1; pressedh = letterh + 1; if ( row == 2 ) // return { pressed2x = mod1x1; pressed2y = 2 * letterh; pressed2w = mod2w + 1; pressed2h = letterh + 1; isnoncont = true; } pressedKeyUnicode = mod2Map[row].unicode; pressedKeyQcode = mod2Map[row].qcode; if ( row == 3 ) // shift { paren = 0; switch ( shift ) { case 0: { shift = 1; releasedPix = &releasedShift; pressedPix = &pressedShift; bitBlt( &offscreen, 0, 0, releasedPix ); break; } case 1: { shift = 2; break; } case 2: { shift = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); break; } } } else if ( row == 4 ) // parenthesis { shift = 0; switch ( paren ) { case 0: { paren = 1; releasedPix = &releasedParen; pressedPix = &pressedParen; bitBlt( &offscreen, 0, 0, releasedPix ); break; } case 1: { paren = 2; break; } case 2: { paren = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); break; } } } } else if ( x >= cursorx1 ) // cursor { int column = (x - cursorx1 - 1) / cursorw; if ( row == 2 || row == 4 ) pressedx = cursorx1 + cursorw / 2; else pressedx = cursorx1 + column * cursorw; pressedy = row * letterh; pressedw = cursorw + 1; pressedh = letterh + 1; pressedKeyQcode = cursorMap[row][column]; } pressedMod = ( shift ? Qt::ShiftButton : 0 ) | ( ctrl ? Qt::ControlButton : 0 ) | ( alt ? Qt::AltButton : 0 ); emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false ); delayTimer->start( autorepeatDelaytime, true ); if ( pressedx == -1 ) return; bitBlt( &offscreen, pressedx, pressedy, pressedPix, pressedx, pressedy, pressedw, pressedh ); if ( isnoncont ) bitBlt( &offscreen, pressed2x, pressed2y, pressedPix, pressed2x, pressed2y, pressed2w, pressed2h ); repaint( false ); } void Keyboard::mouseReleaseEvent(QMouseEvent*) { //cout << pressedx << " " << pressedy << " " << pressedw << " " << pressedh << endl; delayTimer->stop(); rateTimer->stop(); enableMouseTracking = false; if ( pressedx == -1 ) return; if ( shift == 2 && pressedKeyQcode == Qt::Key_Shift ) return; if ( paren == 2 && pressedKeyQcode == myParenID ) return; if ( shift == 1 && pressedKeyQcode != Qt::Key_Shift ) { shift = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); } if ( paren == 1 && pressedKeyQcode != myParenID ) { paren = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); } if ( alt && pressedKeyQcode != Qt::Key_Alt ) alt = 0; if ( ctrl && pressedKeyQcode != Qt::Key_Control ) ctrl = 0; bitBlt( &offscreen, pressedx, pressedy, releasedPix, pressedx, pressedy, pressedw, pressedh ); if ( isnoncont ) { isnoncont = false; bitBlt( &offscreen, pressed2x, pressed2y, releasedPix, pressed2x, pressed2y, pressed2w, pressed2h ); } repaint( false ); } void Keyboard::mouseMoveEvent(QMouseEvent *e) { if ( !enableMouseTracking ) return; if ( e->x() < pressedx || e->x() >= pressedx + pressedw ) { pressedKeyUnicode = slideKeyUnicodeH; pressedKeyQcode = slideKeyQcodeH; slidePix = slidePixH; } else if ( e->y() < pressedy || e->y() >= pressedy + pressedh ) { pressedKeyUnicode = slideKeyUnicodeV; pressedKeyQcode = slideKeyQcodeV; slidePix = slidePixV; } else return; enableMouseTracking = false; delayTimer->stop(); rateTimer->stop(); bitBlt( &offscreen, pressedx, pressedy, slidePix, pressedx, pressedy, pressedw, pressedh ); emit key( 8, Qt::Key_Backspace, pressedMod, true, false ); emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false ); delayTimer->start( autorepeatDelaytime, true ); repaint( false ); } void Keyboard::delayTimerDone() { emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, true ); rateTimer->start( 1000/autorepeatRate, false ); } diff --git a/inputmethods/jumpx/keyboard.h b/inputmethods/jumpx/keyboard.h index 1be095d..689d95a 100644 --- a/inputmethods/jumpx/keyboard.h +++ b/inputmethods/jumpx/keyboard.h @@ -1,71 +1,76 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include <qframe.h> #include <qpixmap.h> #include <qtimer.h> +namespace JumpX +{ + class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); //void timerEvent(QTimerEvent* e); QSize sizeHint() const; signals: void key( ushort unicode, ushort qcode, ushort modifiers, bool, bool ); private slots: void delayTimerDone(); void rateTimerDone(); private: int shift; // 0, 1, 2 int paren; // 0, 1, 2 int ctrl; // 0, 1 int alt; // 0, 1 int pressedKeyUnicode, pressedKeyQcode, pressedMod; int pressedx, pressedy, pressedw, pressedh; bool isnoncont; int pressed2x, pressed2y, pressed2w, pressed2h; int slideKeyUnicodeH, slideKeyQcodeH, slideKeyUnicodeV, slideKeyQcodeV; bool enableMouseTracking; QPixmap *slidePix, *slidePixH, *slidePixV; QPixmap releasedPlain; QPixmap releasedShift; QPixmap releasedParen; QPixmap pressedPlain; QPixmap pressedShift; QPixmap pressedParen; QPixmap pressedDigit; QPixmap offscreen; QPixmap *releasedPix; QPixmap *pressedPix; QTimer *delayTimer; QTimer *rateTimer; }; + +} // namespace JumpX diff --git a/inputmethods/jumpx/keyboardimpl.cpp b/inputmethods/jumpx/keyboardimpl.cpp index 92abb09..34c227f 100644 --- a/inputmethods/jumpx/keyboardimpl.cpp +++ b/inputmethods/jumpx/keyboardimpl.cpp @@ -1,97 +1,97 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include <qapplication.h> #include <qpixmap.h> #include "keyboard.h" #include "keyboardimpl.h" /* XPM */ -static const char * icon_xpm[] = { +static const char * const icon_xpm[] = { "26 13 2 1", " c None", ". c #000000", " ... ... ... ... ... ... ", ". . . . . . . ", ". . . . . . . ", ". . . . . . . ", " ....... ... ... ....... ", ". . . . . ", ". . . . . ", ". . . . . ", " ....... ... ... ....... ", ". . . . . . . ", ". . . . . . . ", ". . . . . . . ", " ... ... ... ... ... ... "}; KeyboardImpl::KeyboardImpl() : input(0), icn(0), ref(0) { } KeyboardImpl::~KeyboardImpl() { delete input; delete icn; } QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) { if ( !input ) - input = new Keyboard( parent, "Keyboard", f ); + input = new JumpX::Keyboard( parent, "Keyboard", f ); return input; } void KeyboardImpl::resetState() { if ( input ) input->resetState(); } QPixmap *KeyboardImpl::icon() { if ( !icn ) icn = new QPixmap( (const char **)icon_xpm ); return icn; } QString KeyboardImpl::name() { return qApp->translate( "InputMethods", "JumpX" ); } void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) { if ( input ) QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); } #ifndef QT_NO_COMPONENT QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_InputMethod ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( KeyboardImpl ) } #endif diff --git a/inputmethods/jumpx/keyboardimpl.h b/inputmethods/jumpx/keyboardimpl.h index a82ec4a..087781f 100644 --- a/inputmethods/jumpx/keyboardimpl.h +++ b/inputmethods/jumpx/keyboardimpl.h @@ -1,43 +1,51 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #ifndef KEYBOARDIMPL_H #define KEYBOARDIMPL_H #include <qpe/inputmethodinterface.h> -class Keyboard; +namespace JumpX +{ + class Keyboard; +}; class QPixmap; +namespace +{ + class KeyboardImpl : public InputMethodInterface { public: KeyboardImpl(); virtual ~KeyboardImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); virtual void resetState(); virtual QPixmap *icon(); virtual QString name(); virtual void onKeyPress( QObject *receiver, const char *slot ); private: - Keyboard *input; + JumpX::Keyboard *input; QPixmap *icn; ulong ref; }; +} // anonymous namespace + #endif diff --git a/inputmethods/keyboard/keyboard.cpp b/inputmethods/keyboard/keyboard.cpp index 0f0b188..a85a7b1 100644 --- a/inputmethods/keyboard/keyboard.cpp +++ b/inputmethods/keyboard/keyboard.cpp @@ -1,416 +1,417 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "keyboard.h" #include <qpe/global.h> #include <qwindowsystem_qws.h> #include <qpainter.h> #include <qfontmetrics.h> #include <qtimer.h> #include <ctype.h> #include <sys/utsname.h> +using namespace KeyboardInput; #define USE_SMALL_BACKSPACE Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : QFrame(parent, _name, f), shift(FALSE), lock(FALSE), ctrl(FALSE), alt(FALSE), useLargeKeys(TRUE), useOptiKeys(0), pressedKey(-1), unicode(-1), qkeycode(0), modifiers(0) { // setPalette(QPalette(QColor(240,240,230))); // Beige! // setFont( QFont( "Helvetica", 8 ) ); // setPalette(QPalette(QColor(200,200,200))); // Gray setPalette(QPalette(QColor(220,220,220))); // Gray picks = new KeyboardPicks( this ); picks->setFont( QFont( "smallsmooth", 9 ) ); setFont( QFont( "smallsmooth", 9 ) ); picks->initialise(); QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); repeatTimer = new QTimer( this ); // temporary quick and dirty fix for the "sticky keyboard bug" // on ipaq. // struct utsname name; // if (uname(&name) != -1) // { // QString release=name.release; // qWarning("System release: %s\n", name.release); // if(release.find("embedix",0,TRUE) !=-1) // { connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); // } // } } void Keyboard::resizeEvent(QResizeEvent*) { int ph = picks->sizeHint().height(); picks->setGeometry( 0, 0, width(), ph ); keyHeight = (height()-ph)/5; int nk; if ( useOptiKeys ) { nk = 15; } else if ( useLargeKeys ) { nk = 15; } else { nk = 19; } defaultKeyWidth = width()/nk; xoffs = (width()-defaultKeyWidth*nk)/2; } void KeyboardPicks::initialise() { setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); mode = 0; dc = new KeyboardConfig(this); configs.append(dc); } QSize KeyboardPicks::sizeHint() const { return QSize(240,fontMetrics().lineSpacing()); } void KeyboardConfig::generateText(const QString &s) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) for (int i=0; i<(int)backspaces; i++) { parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); } for (int i=0; i<(int)s.length(); i++) { parent->emitKey( s[i].unicode(), 0, 0, true, false ); parent->emitKey( s[i].unicode(), 0, 0, false, false ); } parent->emitKey( 0, Qt::Key_Space, 0, true, false ); parent->emitKey( 0, Qt::Key_Space, 0, false, false ); backspaces = 0; #endif } //PC keyboard layout and scancodes /* Format: length, code, length, code, ..., 0 length is measured in half the width of a standard key. If code < 0x80 we have length/2 consecutive standard keys, starting with scancode code. Special keys are hardcoded, one at a time, with length of key and code >= 0x80, these are NOT standard PC scancodes, but are looked up in specialM[]. (The special keys are not keymappable.) */ static const uchar * const keyboard_opti[5] = { (const uchar *const) "\001\223\003\240\002\20\002\41\002\26\002\62\002\56\002\45\002\54\003\200\001\223\002\226\002\235\002\234\002\236", (const uchar *const) "\001\223\003\201\004\207\002\30\002\24\002\43\004\207\003\203\001\223\006\002\002\065", (const uchar *const) "\001\223\003\202\002\60\002\37\002\23\002\22\002\36\002\21\002\55\003\203\001\223\006\005\002\055", (const uchar *const) "\001\223\003\205\004\207\002\27\002\61\002\40\004\207\003\204\001\223\006\010\002\014", (const uchar *const) "\001\223\003\206\002\44\002\31\002\57\002\42\002\46\002\25\002\207\003\204\001\223\002\013\002\064\002\015\002\230" }; static const uchar * const keyboard_standard[5] = { #ifdef USE_SMALL_BACKSPACE (const uchar *const)"\002\240\002`\0021\0022\0023\0024\0025\0026\0027\0028\0029\0020\002-\002=\002\200\002\223\002\215\002\216\002\217", #else (const uchar *const)"\002\051\0021\0022\0023\0024\0025\0026\0027\0028\0029\0020\002-\002=\004\200\002\223\002\215\002\216\002\217", #endif //~ + 123...+ BACKSPACE //+ INSERT + HOME + PGUP (const uchar *const)"\003\201\002q\002w\002e\002r\002t\002y\002u\002i\002o\002p\002[\002]\002\\\001\224\002\223\002\221\002\220\002\222", //TAB + qwerty.. + backslash //+ DEL + END + PGDN (const uchar *const)"\004\202\002a\002s\002d\002f\002g\002h\002j\002k\002l\002;\002'\004\203", //CAPS + asdf.. + RETURN (const uchar *const)"\005\204\002z\002x\002c\002v\002b\002n\002m\002,\002.\002/\005\204\002\223\002\223\002\211", //SHIFT + zxcv... //+ UP (const uchar *const)"\003\205\003\206\022\207\003\206\003\205\002\223\002\212\002\213\002\214" //CTRL + ALT + SPACE //+ LEFT + DOWN + RIGHT }; struct ShiftMap { char normal; char shifted; }; static const ShiftMap shiftMap[] = { { '`', '~' }, { '1', '!' }, { '2', '@' }, { '3', '#' }, { '4', '$' }, { '5', '%' }, { '6', '^' }, { '7', '&' }, { '8', '*' }, { '9', '(' }, { '0', ')' }, { '-', '_' }, { '=', '+' }, { '\\', '|' }, { '[', '{' }, { ']', '}' }, { ';', ':' }, { '\'', '"' }, { ',', '<' }, { '.', '>' }, { '/', '?' } }; /* XPM */ static const char * const uparrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "....a....", "...aaa...", "..aaaaa..", "....a....", "....a....", "....a....", "....a....", "........."}; /* XPM */ static const char * const leftarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", "...a.....", "..aa.....", ".aaaaaaa.", "..aa.....", "...a.....", ".........", "........."}; /* XPM */ static const char * const downarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "....a....", "....a....", "....a....", "....a....", "..aaaaa..", "...aaa...", "....a....", "........."}; /* XPM */ static const char * const rightarrow_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", ".....a...", ".....aa..", ".aaaaaaa.", ".....aa..", ".....a...", ".........", "........."}; /* XPM */ static const char * const insert_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "a........", "a.aaa.aaa", "a.a.a.a..", "a.a.a..a.", "a.a.a...a", "a.a.a.aaa", ".........", "........."}; /* XPM */ static const char * const delete_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", "aa......a", "a.a.aaa.a", "a.a.a.a.a", "a.a.aaa.a.", "a.a.a...a", "aaa.aaa.a", ".........", "........."}; /* XPM */ static const char * const home_xpm[]={ "9 9 2 1", "a c #000000", ". c None", "....a....", "...a.a...", "..a...a..", ".a.....a.", "aa.aaa.aa", ".a.a.a.a.", ".a.a.a.a.", ".aaaaaaa.", "........."}; /* XPM */ static const char * const end_xpm[]={ "10 9 2 1", "a c #000000", ". c None", "..........", "aa.......a", "a..aaa.aaa", "aa.a.a.a.a", "a..a.a.a.a", "a..a.a.a.a", "aa.a.a.aaa", "..........", ".........."}; /* XPM */ static const char * const pageup_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".aaa.aaa.", ".a.a.a.a.", ".aaa..aa.", ".a...aaa.", ".........", ".a.a.aaa.", ".a.a.a.a.", ".aaa.aaa.", ".....a..."}; /* XPM */ static const char * const pagedown_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".aaa.aaa.", ".a.a.a.a.", ".aaa..aa.", ".a...aaa.", ".........", "...a.....", ".aaa.aaa.", ".a.a.a.a.", ".aaa.a.a."}; /* XPM */ static const char * const expand_xpm[]={ "4 9 2 1", "a c #408040", ". c None", "a...", "aa..", "aaa.", "aaaa", "aaaa", "aaaa", "aaa.", "aa..", "a..."}; /* XPM */ #ifdef USE_SMALL_BACKSPACE static const char * const backspace_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", "...a.....", "..aa.....", ".aaaaaaaa", "..aa.....", "...a.....", ".........", "........."}; #else static const char * const backspace_xpm[]={ "21 9 2 1", "a c #000000", ". c None", ".....................", ".....................", ".....aaa..a..........", ".a...a..a.a.a.aaa.aaa", "aaaa.aaa..aa..aa..a.a", ".a...a..a.aaa..aa.a.a", ".....aaaa.a.a.aaa.aa.", "..................a..", "....................."}; #endif /* XPM */ static const char * const escape_xpm[]={ "9 9 2 1", "a c #000000", ". c None", ".........", ".........", ".aa.aa.aa", ".a..a..a.", ".aa.aa.a.", ".a...a.a.", ".aa.aa.aa", ".........", "........."}; enum { BSCode = 0x80, TabCode, CapsCode, RetCode, ShiftCode, CtrlCode, AltCode, SpaceCode, BackSlash, UpCode, LeftCode, DownCode, RightCode, Blank, Expand, Opti, ResetDict, Divide, Multiply, Add, Subtract, Decimal, Equal, Percent, Sqrt, Inverse, Escape }; typedef struct SpecialMap { int qcode; ushort unicode; const char * label; const char * const * xpm; }; static const SpecialMap specialM[] = { { Qt::Key_Backspace, 8, "<", backspace_xpm }, { Qt::Key_Tab, 9, "Tab", NULL }, { Qt::Key_CapsLock, 0, "Caps", NULL }, { Qt::Key_Return, 13, "Ret", NULL }, diff --git a/inputmethods/keyboard/keyboard.h b/inputmethods/keyboard/keyboard.h index 38ae338..cc7f3f5 100644 --- a/inputmethods/keyboard/keyboard.h +++ b/inputmethods/keyboard/keyboard.h @@ -1,103 +1,108 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qframe.h> #include "../pickboard/pickboardcfg.h" #include "../pickboard/pickboardpicks.h" class QTimer; +namespace KeyboardInput +{ + class KeyboardConfig : public DictFilterConfig { public: KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } virtual void generateText(const QString &s); void decBackspaces() { if (backspaces) backspaces--; } void incBackspaces() { backspaces++; } void resetBackspaces() { backspaces = 0; } private: int backspaces; }; class KeyboardPicks : public PickboardPicks { Q_OBJECT public: KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) : PickboardPicks(parent, name, f) { } void initialise(); virtual QSize sizeHint() const; KeyboardConfig *dc; }; class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); void timerEvent(QTimerEvent* e); void drawKeyboard( QPainter &p, int key = -1 ); void setMode(int mode) { useOptiKeys = mode; } QSize sizeHint() const; signals: void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); private slots: void repeat(); private: int getKey( int &w, int j = -1 ); void clearHighlight(); uint shift:1; uint lock:1; uint ctrl:1; uint alt:1; uint useLargeKeys:1; uint useOptiKeys:1; int pressedKey; KeyboardPicks *picks; int keyHeight; int defaultKeyWidth; int xoffs; int unicode; int qkeycode; int modifiers; int pressTid; bool pressed; QTimer *repeatTimer; }; +} // namespace KeyboardInput + diff --git a/inputmethods/keyboard/keyboardimpl.cpp b/inputmethods/keyboard/keyboardimpl.cpp index bc96402..3c77fe6 100644 --- a/inputmethods/keyboard/keyboardimpl.cpp +++ b/inputmethods/keyboard/keyboardimpl.cpp @@ -1,130 +1,128 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qapplication.h> #include <qpixmap.h> #include "keyboard.h" #include "keyboardimpl.h" /* XPM */ -static const char * kb_xpm[] = { +static const char * const kb_xpm[] = { "28 13 4 1", " c None", ". c #4C4C4C", "+ c #FFF7DD", "@ c #D6CFBA", " .......................... ", " .+++.+++.+++.+++.+++.++++. ", " .+@@.+@@.+@@.+@@.+@@.+@@@. ", " .......................... ", " .+++++.+++.+++.+++.++++++. ", " .+@@@@.+@@.+@@.+@@.+@@@@@. ", " .......................... ", " .++++++.+++.+++.+++.+++++. ", " .+@@@@@.+@@.+@@.+@@.+@@@@. ", " .......................... ", " .++++.++++++++++++++.++++. ", " .+@@@.+@@@@@@@@@@@@@.+@@@. ", " .......................... "}; /* XPM */ -static char * opti_xpm[] = { +static const char * const ipti_xpm[] = { "28 13 4 1", " c None", ". c #4C4C4C", "+ c #FFF7DD", "@ c #D6CFBA", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... ", " .+++.+++.+++.+++.+++.+++. ", " .+@@.+@@.+@@.+@@.+@@.+@@. ", " ......................... "}; - - KeyboardImpl::KeyboardImpl() : input(0), icn(0), ref(0) { } KeyboardImpl::~KeyboardImpl() { delete input; delete icn; } QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) { if ( !input ) - input = new Keyboard( parent, "Keyboard", f ); + input = new KeyboardInput::Keyboard( parent, "Keyboard", f ); return input; } void KeyboardImpl::resetState() { if ( input ) input->resetState(); } QPixmap *KeyboardImpl::icon() { if ( !icn ) icn = new QPixmap( (const char **)kb_xpm ); return icn; } QString KeyboardImpl::name() { return qApp->translate( "InputMethods", "Keyboard" ); } void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) { if ( input ) QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); } #ifndef QT_NO_COMPONENT QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_InputMethod ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( KeyboardImpl ) } #endif diff --git a/inputmethods/keyboard/keyboardimpl.h b/inputmethods/keyboard/keyboardimpl.h index e756364..d33a822 100644 --- a/inputmethods/keyboard/keyboardimpl.h +++ b/inputmethods/keyboard/keyboardimpl.h @@ -1,51 +1,60 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef KEYBOARDIMPL_H #define KEYBOARDIMPL_H #include <qpe/inputmethodinterface.h> -class Keyboard; +namespace KeyboardInput +{ + class Keyboard; +} + class QPixmap; +namespace +{ + class KeyboardImpl : public InputMethodInterface { public: KeyboardImpl(); virtual ~KeyboardImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); virtual void resetState(); virtual QPixmap *icon(); virtual QString name(); virtual void onKeyPress( QObject *receiver, const char *slot ); private: - Keyboard *input; + KeyboardInput::Keyboard *input; QPixmap *icn; ulong ref; }; +} // anonymous namespace + #endif diff --git a/inputmethods/kjumpx/keyboard.cpp b/inputmethods/kjumpx/keyboard.cpp index 3af6a78..dc44805 100644 --- a/inputmethods/kjumpx/keyboard.cpp +++ b/inputmethods/kjumpx/keyboard.cpp @@ -1,526 +1,527 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include "keyboard.h" #include <qpe/resource.h> //#include <iostream.h> static const int autorepeatDelaytime = 500; // ms static const int autorepeatRate = 20; // chars per second static const int mod1x1 = 0; static const int mod1x2 = 23; static const int mod1w = mod1x2 - mod1x1; static const int letterx1 = 27; static const int letterx2 = 129; static const int letterw = 17; static const int letterh = 14; static const int num1x1 = 130; static const int num1x2 = 137; static const int num1w = num1x2 - num1x1; static const int specialx1 = 138; static const int specialx2 = 170; static const int specialw = 16; static const int num2x1 = 171; static const int num2x2 = 178; static const int num2w = num2x2 - num2x1; static const int mod2x1 = 179; static const int mod2x2 = 203; static const int mod2w = mod2x2 - mod2x1; static const int cursorx1 = 207; static const int cursorw = 16; static const int myParenID = -10; typedef struct mapElement { int qcode; ushort unicode; }; static const mapElement mod1Map[] = { { Qt::Key_Escape, 27 }, { Qt::Key_Tab, 9 }, { Qt::Key_Return, 13 }, { Qt::Key_Alt, 0 }, { Qt::Key_Control, 0 }, }; static const uchar *const letterMap[] = { (const uchar *const)"zvchwk", (const uchar *const)"fitaly", (const uchar *const)" ne ", (const uchar *const)"gdorsb", (const uchar *const)"qjumpx", }; static const ushort kletterMap[][6] = { { 0x110c, 0x1112, 0x1109, 0x116d, 0x1167, 0x1163 }, { 0x110f, 0x1105, 0x1100, 0x1161, 0x1175, 0x1162 }, { ' ', ' ', 0x110b, 0x1165, ' ', ' ' }, { 0x1110, 0x1103, 0x1102, 0x1169, 0x1173, 0x1166 }, { 0x110e, 0x1107, 0x1106, 0x1111, 0x116e, 0x1172 }, }; static const uchar *const letterMapShift[] = { (const uchar *const)"ZVCHWK", (const uchar *const)"FITALY", (const uchar *const)" NE ", (const uchar *const)"GDORSB", (const uchar *const)"QJUMPX", }; static const ushort kletterMapShift[][6] = { { 0x110d, 0x1112, 0x110a, 0x116d, 0x1167, 0x1163 }, { 0x110f, 0x1105, 0x1101, 0x1161, 0x1175, 0x1164 }, { ' ', ' ', 0x110b, 0x1165, ' ', ' ' }, { 0x1110, 0x1104, 0x1102, 0x1169, 0x1173, 0x1168 }, { 0x110e, 0x1108, 0x1106, 0x1111, 0x116e, 0x1172 }, }; static const uchar *const num1Map = (const uchar *const)"12345"; static const uchar *const specialMap[] = { (const uchar *const)"-+", (const uchar *const)"*!", (const uchar *const)",'", (const uchar *const)".%", (const uchar *const)"/$", }; static const uchar *const specialMapShift[] = { (const uchar *const)"_=", (const uchar *const)"#?", (const uchar *const)";\"", (const uchar *const)":|", (const uchar *const)"\\&", }; static const uchar *const specialMapParen[] = { (const uchar *const)"()", (const uchar *const)"[]", (const uchar *const)"{}", (const uchar *const)"<>", (const uchar *const)"@~", }; static const uchar *const num2Map = (const uchar *const)"67890"; static const mapElement mod2Map[] = { { Qt::Key_Backspace, 8 }, { Qt::Key_Delete, 0 }, { Qt::Key_Return, 13 }, { Qt::Key_Shift, 0 }, { myParenID, 0 }, }; static const int cursorMap[][2] = { { Qt::Key_Home, Qt::Key_PageUp }, { Qt::Key_End, Qt::Key_PageDown }, { Qt::Key_Up, Qt::Key_Up }, { Qt::Key_Left, Qt::Key_Right }, { Qt::Key_Down, Qt::Key_Down }, }; +using namespace KJumpX; Keyboard::Keyboard(QWidget* parent, const char* name, WFlags f) : QFrame(parent, name, f), shift(0), paren(0), ctrl(0), alt(0), lang(1), lastKey(0), pressedKeyUnicode(0), pressedKeyQcode(0), pressedMod(0), isnoncont(false), slideKeyUnicodeH(0), slideKeyQcodeH(0), slideKeyUnicodeV(0), slideKeyQcodeV(0), enableMouseTracking(false), slidePix(NULL), slidePixH(NULL), slidePixV(NULL), releasedPix(NULL), pressedPix(NULL) { //setPalette(QPalette(QColor(240,240,230))); // Beige! releasedPlain = releasedShift = releasedParen = Resource::loadPixmap("kjumpx/released"); pressedPlain = pressedShift = pressedParen = Resource::loadPixmap("kjumpx/pressed"); pressedDigit = Resource::loadPixmap("kjumpx/pressed"); QPixmap tmp; tmp = Resource::loadPixmap("kjumpx/releasedShift"); bitBlt(&releasedShift, letterx1, 0, &tmp); tmp = Resource::loadPixmap("kjumpx/releasedParen"); bitBlt(&releasedParen, specialx1, 0, &tmp); tmp = Resource::loadPixmap("kjumpx/pressedShift"); bitBlt(&pressedShift, letterx1, 0, &tmp); tmp = Resource::loadPixmap("kjumpx/pressedParen"); bitBlt(&pressedParen, specialx1, 0, &tmp); tmp = Resource::loadPixmap("kjumpx/pressedDigit"); bitBlt(&pressedDigit, specialx1, 0, &tmp); offscreen = QPixmap( releasedPlain ); releasedPix = &releasedPlain; pressedPix = &pressedPlain; slidePix = &pressedPlain; delayTimer = new QTimer(this); rateTimer = new QTimer(this); connect( delayTimer, SIGNAL( timeout() ), this, SLOT( delayTimerDone() ) ); connect( rateTimer, SIGNAL( timeout() ), this, SLOT( rateTimerDone() ) ); } void Keyboard::resizeEvent(QResizeEvent*) { //cout << "resizeEvent()" << endl; } void Keyboard::paintEvent(QPaintEvent*) { bitBlt(this, 0, 0, &offscreen); } void Keyboard::mousePressEvent(QMouseEvent *e) { pressedx = -1; pressedKeyUnicode = pressedKeyQcode = pressedMod = 0; int x = e->x(); int y = e->y(); int row = (y - 1) / letterh; if ( x <= mod1x2 ) // mod1 { pressedx = mod1x1; pressedy = row * letterh; pressedw = mod1w + 1; pressedh = letterh + 1; if ( row == 2 ) // return { pressed2x = mod2x1; pressed2y = 2 * letterh; pressed2w = mod2w + 1; pressed2h = letterh + 1; isnoncont = true; } else if ( row == 3 ) // alt alt = 1; else if ( row == 4 ) // ctrl ctrl = 1; pressedKeyUnicode = mod1Map[row].unicode; pressedKeyQcode = mod1Map[row].qcode; } else if ( x >= letterx1 && x <= letterx2 ) // letter { int column = (x - letterx1 - 1) / letterw; QChar temp; if (lang == 0) // english if ( shift ) temp = QChar( letterMapShift[row][column] ); else temp = QChar( letterMap[row][column] ); else if (lang == 1) // korean if ( shift ) temp = parseKoreanInput( kletterMapShift[row][column] ); else temp = parseKoreanInput( kletterMap[row][column] ); if ( temp == ' ' ) // space { if ( column < 3 ) { pressedx = letterx1; pressed2x = letterx1 + letterw * 4; } else { pressedx = letterx1 + letterw * 4; pressed2x = letterx1; } pressedy = pressed2y = row * letterh; pressedw = pressed2w = letterw * 2 + 1; pressedh = pressed2h = letterh + 1; isnoncont = true; } else { pressedx = letterx1 + column * letterw; pressedy = row * letterh; pressedw = letterw + 1; pressedh = letterh + 1; } pressedKeyUnicode = temp.unicode(); pressedKeyQcode = slideKeyQcodeH = slideKeyQcodeV = temp.upper().unicode(); if ( temp == ' ' ) { slideKeyUnicodeH = slideKeyUnicodeV = 8; slideKeyQcodeH = slideKeyQcodeV = Qt::Key_Backspace; } else if ( temp == temp.lower() ) { slideKeyUnicodeH = slideKeyUnicodeV = temp.upper().unicode(); slidePixH = slidePixV = &pressedShift; } else { slideKeyUnicodeH = slideKeyUnicodeV = temp.lower().unicode(); slidePixH = slidePixV = &pressedPlain; } enableMouseTracking = true; } else if ( x >= num1x1 && x <= num1x2 ) // num1 { pressedx = num1x1; pressedy = row * letterh; pressedw = num1w + 1; pressedh = letterh + 1; QChar temp = QChar( num1Map[row] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); } else if ( x >= specialx1 && x <= specialx2 ) // special { int column = (x - specialx1 - 1) / specialw; pressedx = specialx1 + column * specialw; pressedy = row * letterh; pressedw = specialw + 1; pressedh = letterh + 1; QChar temp; if ( shift ) temp = QChar( specialMapShift[row][column] ); else if ( paren ) temp = QChar( specialMapParen[row][column] ); else temp = QChar( specialMap[row][column] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); slideKeyUnicodeH = slideKeyQcodeH = slideKeyUnicodeV = slideKeyQcodeV = QChar('0').unicode() + ( 5 * column + row + 1 ) % 10; slidePixH = slidePixV = &pressedDigit; if ( shift ) { slideKeyUnicodeV = slideKeyQcodeV = QChar( specialMap[row][column] ).unicode(); slidePixV = &pressedPlain; } else if ( !(shift || paren) ) { slideKeyUnicodeV = slideKeyQcodeV = QChar( specialMapShift[row][column] ).unicode(); slidePixV = &pressedShift; } enableMouseTracking = true; } else if ( x >= num2x1 && x <= num2x2 ) // num2 { pressedx = num2x1; pressedy = row * letterh; pressedw = num2w + 1; pressedh = letterh + 1; QChar temp = QChar( num2Map[row] ); pressedKeyUnicode = pressedKeyQcode = temp.unicode(); } else if ( x >= mod2x1 && x <= mod2x2 ) // mod2 { pressedx = mod2x1; pressedy = row * letterh; pressedw = mod2w + 1; pressedh = letterh + 1; if ( row == 2 ) // return { pressed2x = mod1x1; pressed2y = 2 * letterh; pressed2w = mod2w + 1; pressed2h = letterh + 1; isnoncont = true; } pressedKeyUnicode = mod2Map[row].unicode; pressedKeyQcode = mod2Map[row].qcode; if ( row == 3 ) // shift { paren = 0; switch ( shift ) { case 0: { shift = 1; releasedPix = &releasedShift; pressedPix = &pressedShift; bitBlt( &offscreen, 0, 0, releasedPix ); break; } case 1: { shift = 2; break; } case 2: { shift = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); break; } } } else if ( row == 4 ) // parenthesis { shift = 0; switch ( paren ) { case 0: { paren = 1; releasedPix = &releasedParen; pressedPix = &pressedParen; bitBlt( &offscreen, 0, 0, releasedPix ); break; } case 1: { paren = 2; break; } case 2: { paren = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); break; } } } } else if ( x >= cursorx1 ) // cursor { int column = (x - cursorx1 - 1) / cursorw; if ( row == 2 || row == 4 ) pressedx = cursorx1 + cursorw / 2; else pressedx = cursorx1 + column * cursorw; pressedy = row * letterh; pressedw = cursorw + 1; pressedh = letterh + 1; pressedKeyQcode = cursorMap[row][column]; } pressedMod = ( shift ? Qt::ShiftButton : 0 ) | ( ctrl ? Qt::ControlButton : 0 ) | ( alt ? Qt::AltButton : 0 ); lastKey = pressedKeyUnicode; emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false ); delayTimer->start( autorepeatDelaytime, true ); if ( pressedx == -1 ) return; bitBlt( &offscreen, pressedx, pressedy, pressedPix, pressedx, pressedy, pressedw, pressedh ); if ( isnoncont ) bitBlt( &offscreen, pressed2x, pressed2y, pressedPix, pressed2x, pressed2y, pressed2w, pressed2h ); repaint( false ); } void Keyboard::mouseReleaseEvent(QMouseEvent*) { //cout << pressedx << " " << pressedy << " " << pressedw << " " << pressedh << endl; delayTimer->stop(); rateTimer->stop(); enableMouseTracking = false; if ( pressedx == -1 ) return; if ( shift == 2 && pressedKeyQcode == Qt::Key_Shift ) return; if ( paren == 2 && pressedKeyQcode == myParenID ) return; if ( shift == 1 && pressedKeyQcode != Qt::Key_Shift ) { shift = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); } if ( paren == 1 && pressedKeyQcode != myParenID ) { paren = 0; releasedPix = &releasedPlain; pressedPix = &pressedPlain; bitBlt( &offscreen, 0, 0, releasedPix ); } if ( alt && pressedKeyQcode != Qt::Key_Alt ) alt = 0; if ( ctrl && pressedKeyQcode != Qt::Key_Control ) ctrl = 0; bitBlt( &offscreen, pressedx, pressedy, releasedPix, pressedx, pressedy, pressedw, pressedh ); if ( isnoncont ) { isnoncont = false; bitBlt( &offscreen, pressed2x, pressed2y, releasedPix, pressed2x, pressed2y, pressed2w, pressed2h ); } repaint( false ); } void Keyboard::mouseMoveEvent(QMouseEvent *e) { if ( !enableMouseTracking ) return; if ( e->x() < pressedx || e->x() >= pressedx + pressedw ) { pressedKeyUnicode = slideKeyUnicodeH; pressedKeyQcode = slideKeyQcodeH; slidePix = slidePixH; } else if ( e->y() < pressedy || e->y() >= pressedy + pressedh ) { pressedKeyUnicode = slideKeyUnicodeV; pressedKeyQcode = slideKeyQcodeV; slidePix = slidePixV; } else return; enableMouseTracking = false; delayTimer->stop(); rateTimer->stop(); bitBlt( &offscreen, pressedx, pressedy, slidePix, pressedx, pressedy, pressedw, pressedh ); emit key( 8, Qt::Key_Backspace, pressedMod, true, false ); emit key( pressedKeyUnicode, pressedKeyQcode, pressedMod, true, false ); delayTimer->start( autorepeatDelaytime, true ); diff --git a/inputmethods/kjumpx/keyboard.h b/inputmethods/kjumpx/keyboard.h index 148cb72..ca83915 100644 --- a/inputmethods/kjumpx/keyboard.h +++ b/inputmethods/kjumpx/keyboard.h @@ -1,79 +1,84 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include <qframe.h> #include <qpixmap.h> #include <qtimer.h> +namespace KJumpX +{ + class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); //void timerEvent(QTimerEvent* e); QSize sizeHint() const; QChar parseKoreanInput(ushort); ushort combineKoreanChars(const ushort, const ushort, const ushort); ushort constoe(const ushort); signals: void key( ushort unicode, ushort qcode, ushort modifiers, bool, bool ); private slots: void delayTimerDone(); void rateTimerDone(); private: int shift; // 0, 1, 2 int paren; // 0, 1, 2 int ctrl; // 0, 1 int alt; // 0, 1 bool lang; // 0 -> english, 1 -> korean int lastKey; int pressedKeyUnicode, pressedKeyQcode, pressedMod; int pressedx, pressedy, pressedw, pressedh; bool isnoncont; int pressed2x, pressed2y, pressed2w, pressed2h; int slideKeyUnicodeH, slideKeyQcodeH, slideKeyUnicodeV, slideKeyQcodeV; bool enableMouseTracking; QPixmap *slidePix, *slidePixH, *slidePixV; QPixmap releasedPlain; QPixmap releasedShift; QPixmap releasedParen; QPixmap pressedPlain; QPixmap pressedShift; QPixmap pressedParen; QPixmap pressedDigit; QPixmap offscreen; QPixmap *releasedPix; QPixmap *pressedPix; QTimer *delayTimer; QTimer *rateTimer; }; + +} // namespace KJumpX diff --git a/inputmethods/kjumpx/keyboardimpl.cpp b/inputmethods/kjumpx/keyboardimpl.cpp index 5d8e0d3..976d816 100644 --- a/inputmethods/kjumpx/keyboardimpl.cpp +++ b/inputmethods/kjumpx/keyboardimpl.cpp @@ -1,97 +1,97 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #include <qapplication.h> #include <qpixmap.h> #include "keyboard.h" #include "keyboardimpl.h" /* XPM */ -static char * icon_xpm[] = { +static const char * const icon_xpm[] = { "26 13 2 1", " c None", ". c #000000", " ... ... ... ... ... ... ", ". . . . . ", ". . ... .. . . ", ". . .. . . ", " ...... ...... ... .... ", ". .. .. .. . ", ". .. .. .. . ", ". ... .. . ", " ...... .. ...... ", ". . .. . . ", ". . ....... . . ", ". . . . . ", " ... ... ... ... ... ... "}; KeyboardImpl::KeyboardImpl() : input(0), icn(0), ref(0) { } KeyboardImpl::~KeyboardImpl() { delete input; delete icn; } QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) { if ( !input ) - input = new Keyboard( parent, "Keyboard", f ); + input = new KJumpX::Keyboard( parent, "Keyboard", f ); return input; } void KeyboardImpl::resetState() { if ( input ) input->resetState(); } QPixmap *KeyboardImpl::icon() { if ( !icn ) icn = new QPixmap( (const char **)icon_xpm ); return icn; } QString KeyboardImpl::name() { return qApp->translate( "InputMethods", "KJumpX" ); } void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) { if ( input ) QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); } #ifndef QT_NO_COMPONENT QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_InputMethod ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( KeyboardImpl ) } #endif diff --git a/inputmethods/kjumpx/keyboardimpl.h b/inputmethods/kjumpx/keyboardimpl.h index a82ec4a..1ff1034 100644 --- a/inputmethods/kjumpx/keyboardimpl.h +++ b/inputmethods/kjumpx/keyboardimpl.h @@ -1,43 +1,51 @@ /**************************************************************************************94x78** ** ** 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. ** *********************************************************************************************/ #ifndef KEYBOARDIMPL_H #define KEYBOARDIMPL_H #include <qpe/inputmethodinterface.h> -class Keyboard; +namespace KJumpX +{ + class Keyboard; +} class QPixmap; +namespace +{ + class KeyboardImpl : public InputMethodInterface { public: KeyboardImpl(); virtual ~KeyboardImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); virtual void resetState(); virtual QPixmap *icon(); virtual QString name(); virtual void onKeyPress( QObject *receiver, const char *slot ); private: - Keyboard *input; + KJumpX::Keyboard *input; QPixmap *icn; ulong ref; }; +} // anonymous namespace + #endif diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index 84c0c74..c22fbb1 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp @@ -1,423 +1,424 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "keyboard.h" #include "configdlg.h" #include <qpe/global.h> #include <qpe/qcopenvelope_qws.h> #include <qwindowsystem_qws.h> #include <qpainter.h> #include <qfontmetrics.h> #include <qtimer.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <ctype.h> #include <qfile.h> #include <qtextstream.h> #include <qstringlist.h> #include <sys/utsname.h> +using namespace MultiKey; /* Keyboard::Keyboard {{{1 */ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0), useLargeKeys(TRUE), usePicks(0), useRepeat(0), pressedKeyRow(-1), pressedKeyCol(-1), unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), configdlg(0) { // get the default font Config *config = new Config( "qpe" ); config->setGroup( "Appearance" ); QString familyStr = config->readEntry( "FontFamily", "fixed" ); delete config; config = new Config("multikey"); config->setGroup ("general"); usePicks = config->readBoolEntry ("usePickboard", 0); // default closed useRepeat = config->readBoolEntry ("useRepeat", 1); delete config; setFont( QFont( familyStr, 10 ) ); picks = new KeyboardPicks( this ); picks->setFont( QFont( familyStr, 10 ) ); picks->initialise(); if (usePicks) { QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); } else picks->hide(); loadKeyboardColors(); keys = new Keys(); repeatTimer = new QTimer( this ); connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); } Keyboard::~Keyboard() { if ( configdlg ) { delete (ConfigDlg *) configdlg; configdlg = 0; } } /* Keyboard::resizeEvent {{{1 */ void Keyboard::resizeEvent(QResizeEvent*) { int ph = picks->sizeHint().height(); picks->setGeometry( 0, 0, width(), ph ); keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1); int nk; // number of keys? if ( useLargeKeys ) { nk = 15; } else { nk = 19; } defaultKeyWidth = (width()/nk)/2; xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? } /* KeyboardPicks::initialize {{{1 */ void KeyboardPicks::initialise() { setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); mode = 0; dc = new KeyboardConfig(this); configs.append(dc); } /* KeyboardPicks::sizeHint {{{1 */ QSize KeyboardPicks::sizeHint() const { return QSize(240,fontMetrics().lineSpacing()); } /* KeyboardConfig::generateText {{{1 */ void KeyboardConfig::generateText(const QString &s) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) for (int i=0; i<(int)backspaces; i++) { parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); } for (int i=0; i<(int)s.length(); i++) { parent->emitKey( s[i].unicode(), 0, 0, true, false ); parent->emitKey( s[i].unicode(), 0, 0, false, false ); } parent->emitKey( 0, Qt::Key_Space, 0, true, false ); parent->emitKey( 0, Qt::Key_Space, 0, false, false ); backspaces = 0; #endif } /* Keyboard::paintEvent {{{1 */ void Keyboard::paintEvent(QPaintEvent* e) { QPainter painter(this); painter.setClipRect(e->rect()); drawKeyboard( painter ); picks->dc->draw( &painter ); } /* Keyboard::drawKeyboard {{{1 */ void Keyboard::drawKeyboard(QPainter &p, int row, int col) { if (row != -1 && col != -1) { //just redraw one key int x = 0; for (int i = 0; i < col; i++) { x += keys->width(row, i) * defaultKeyWidth; } int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); int keyWidth = keys->width(row, col); p.fillRect(x + 1, y + 1, keyWidth * defaultKeyWidth - 1, keyHeight - 1, pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); QImage *pix = keys->pix(row,col); ushort c = keys->uni(row, col); p.setPen(textcolor); if (!pix) { if ((shift || lock) && keys->shift(c)) if (circumflex && keys->circumflex(keys->shift(c))) c = keys->circumflex(keys->shift(c)); else if (diaeresis && keys->diaeresis(keys->shift(c))) c = keys->diaeresis(keys->shift(c)); else if (baccent && keys->baccent(keys->shift(c))) c = keys->baccent(keys->shift(c)); else if (accent && keys->accent(keys->shift(c))) c = keys->accent(keys->shift(c)); else if (meta && keys->meta(keys->shift(c))) c = keys->meta(keys->shift(c)); else c = keys->shift(c); else if (meta && keys->meta(c)) c = keys->meta(c); else if (circumflex && keys->circumflex(c)) c = keys->circumflex(c); else if (baccent && keys->baccent(c)) c = keys->baccent(c); else if (accent && keys->accent(c)) c = keys->accent(c); else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { // the diaeresis key itself has to be in the diaeresisMap, // or just do this to make it display the diaeresis char. if (c == 0x2c6) c = 0xa8; else c = keys->diaeresis(c); } p.drawText(x, y, defaultKeyWidth * keyWidth + 3, keyHeight, AlignCenter, (QChar)c); } else // center the image in the middle of the key p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1, y + (keyHeight - pix->height())/2 + 1, *pix ); // this fixes the problem that the very right end of the board's vertical line // gets painted over, because it's one pixel shorter than all other keys p.setPen(keycolor_lines); p.drawLine(width() - 1, 0, width() - 1, height()); } else { p.fillRect(0, 0, width(), height(), keycolor); for (row = 1; row <= keys->rows(); row++) { int x = 0; int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); p.setPen(keycolor_lines); p.drawLine(x, y, x + width(), y); for (int col = 0; col < keys->numKeys(row); col++) { QImage *pix = keys->pix(row, col); int keyWidth = keys->width(row, col); int keyWidthPix = defaultKeyWidth * keyWidth; if (keys->pressed(row, col)) p.fillRect(x+1, y+1, keyWidthPix - 1, keyHeight - 1, keycolor_pressed); ushort c = keys->uni(row, col); p.setPen(textcolor); if (!pix) { if ((shift || lock) && keys->shift(c)) if (circumflex && keys->circumflex(keys->shift(c))) c = keys->circumflex(keys->shift(c)); else if (diaeresis && keys->diaeresis(keys->shift(c))) c = keys->diaeresis(keys->shift(c)); else if (baccent && keys->baccent(keys->shift(c))) c = keys->baccent(keys->shift(c)); else if (accent && keys->accent(keys->shift(c))) c = keys->accent(keys->shift(c)); else if (meta && keys->meta(keys->shift(c))) c = keys->meta(keys->shift(c)); else c = keys->shift(c); else if (meta && keys->meta(c)) c = keys->meta(c); else if (circumflex && keys->circumflex(c)) c = keys->circumflex(c); else if (baccent && keys->baccent(c)) c = keys->baccent(c); else if (accent && keys->accent(c)) c = keys->accent(c); else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { if (c == 0x2c6) c = 0xa8; else c = keys->diaeresis(c); } p.drawText(x, y, keyWidthPix + 3, keyHeight, AlignCenter, (QChar)c); } else { // center the image in the middle of the key pix->setColor(1, textcolor.rgb()); p.drawImage( x + (keyWidthPix - pix->width())/2 + 1, y + (keyHeight - pix->height())/2 + 1, QImage(*pix) ); } p.setPen(keycolor_lines); p.drawLine(x, y, x, y + keyHeight); x += keyWidthPix; } } p.setPen(keycolor_lines); p.drawLine(0, height() - 1, width(), height() - 1); p.drawLine(width() - 1, 0, width() - 1, height()); } } /* Keyboard::mousePressEvent {{{1 */ void Keyboard::mousePressEvent(QMouseEvent *e) { int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; if (row > 5) row = 5; // figure out the column int col = 0; for (int w = 0; e->x() >= w; col++) if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys w += keys->width(row,col) * defaultKeyWidth; else break; if (col <= 0) return; col --; // rewind one... qkeycode = keys->qcode(row, col); unicode = keys->uni(row, col); // might need to repaint if two or more of the same keys. // should be faster if just paint one key even though multiple keys exist. bool need_repaint = FALSE; // circumflex and diaeresis support // messy to have this here, but too hard to implement any other method if (unicode == 0x2c6) { unicode = 0; if (shift || lock) { // diaeresis qkeycode = 0x2001; } else { // circumflex qkeycode = 0x2000; } } // Back accent character support // the keys from 2c6 ~ 2cf should be used instead of the ascii one if (unicode == 0x2cb) { unicode = 0; if (shift || lock) { // circumblex qkeycode = 0x2000; } else { // back accent qkeycode = 0x2002; } } // Accent character support if (unicode == 0x2ca) { unicode = 0; if (shift || lock) { // diaeresis qkeycode = 0x2001; } else { // accent qkeycode = 0x2003; } } if (unicode == 0) { // either Qt char, or nothing if (qkeycode == Qt::Key_F1) { // toggle the pickboard if ( configdlg ) { delete (ConfigDlg *) configdlg; configdlg = 0; } else { configdlg = new ConfigDlg (); connect(configdlg, SIGNAL(setMapToDefault()), this, SLOT(setMapToDefault())); connect(configdlg, SIGNAL(setMapToFile(QString)), this, SLOT(setMapToFile(QString))); connect(configdlg, SIGNAL(pickboardToggled(bool)), this, SLOT(togglePickboard(bool))); connect(configdlg, SIGNAL(repeatToggled(bool)), this, SLOT(toggleRepeat(bool))); connect(configdlg, SIGNAL(reloadKeyboard()), this, SLOT(reloadKeyboard())); connect(configdlg, SIGNAL(configDlgClosed()), this, SLOT(cleanupConfigDlg())); diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h index bc74e71..20c5cee 100644 --- a/inputmethods/multikey/keyboard.h +++ b/inputmethods/multikey/keyboard.h @@ -1,188 +1,191 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qframe.h> #include <qmap.h> #include "../pickboard/pickboardcfg.h" #include "../pickboard/pickboardpicks.h" #include "configdlg.h" class QTimer; +namespace MultiKey +{ + class KeyboardConfig : public DictFilterConfig { public: KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } virtual void generateText(const QString &s); void decBackspaces() { if (backspaces) backspaces--; } void incBackspaces() { backspaces++; } void resetBackspaces() { backspaces = 0; } private: int backspaces; }; class KeyboardPicks : public PickboardPicks { Q_OBJECT public: KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) : PickboardPicks(parent, name, f) { } void initialise(); virtual QSize sizeHint() const; KeyboardConfig *dc; }; class Keys { public: Keys(); Keys(const char * filename); ~Keys(); int width(const int row, const int col); int rows(); ushort uni(const int row, const int col); int qcode(const int row, const int col); bool pressed(const int row, const int col); bool *pressedPtr(const int row, const int col); ushort shift(const ushort); ushort meta(const ushort); ushort circumflex(const ushort); ushort diaeresis(const ushort); ushort baccent(const ushort); ushort accent(const ushort); QImage *pix(const int row, const int col); int numKeys(const int row); void setKeysFromFile(const char *filename); void setKey(const int row, const int qcode, const ushort unicode, const int width, QImage *pix); void setPressed(const int row, const int col, const bool pressed); QString lang; QString label; private: typedef struct Key { int qcode; // are qt key codes just unicode values? ushort unicode; int width; // not pixels but relative key width. normal key is 2 // only needed for keys like ctrl that can have multiple keys pressed at once bool *pressed; QImage *pix; }; QList<Key> keys[6]; QMap<ushort,ushort> shiftMap; QMap<ushort,ushort> metaMap; QMap<ushort,ushort> circumflexMap; QMap<ushort,ushort> diaeresisMap; QMap<ushort,ushort> baccentMap; QMap<ushort,ushort> accentMap; }; class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); ~Keyboard(); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); //void timerEvent(QTimerEvent* e); void drawKeyboard( QPainter &p, int row = -1, int col = -1); QSize sizeHint() const; signals: void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); private slots: void repeat(); void togglePickboard(bool on_off); void toggleRepeat(bool on_off); void setMapToDefault(); void setMapToFile(QString map); void cleanupConfigDlg(); // used to redraw keyboard after edited colors void reloadKeyboard(); private: int getKey( int &w, int j = -1 ); void clearHighlight(); bool *shift; bool *lock; bool *ctrl; bool *alt; bool *meta; bool *circumflex; bool *diaeresis; bool *baccent; bool *accent; uint useLargeKeys:1; uint usePicks:1; uint useRepeat:1; int pressedKeyRow; int pressedKeyCol; KeyboardPicks *picks; int keyHeight; int defaultKeyWidth; int xoffs; int unicode; int qkeycode; int modifiers; int pressTid; bool pressed; Keys *keys; /* for korean input */ ushort schar, mchar, echar; ushort parseKoreanInput(ushort c); ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); ushort constoe(const ushort c); QTimer *repeatTimer; /* colors */ void loadKeyboardColors(); QColor keycolor; QColor keycolor_pressed; QColor keycolor_lines; QColor textcolor; ConfigDlg *configdlg; }; - +} // namespace MultiKey diff --git a/inputmethods/multikey/keyboardimpl.cpp b/inputmethods/multikey/keyboardimpl.cpp index cebd43d..4cfbcd5 100644 --- a/inputmethods/multikey/keyboardimpl.cpp +++ b/inputmethods/multikey/keyboardimpl.cpp @@ -1,107 +1,107 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qapplication.h> #include <qpixmap.h> #include "keyboard.h" #include "keyboardimpl.h" /* XPM */ -static const char * kb_xpm[] = { +static const char * const kb_xpm[] = { "28 13 4 1", " c None", ". c #4C4C4C", "+ c #FFF7DD", "@ c #D6CFBA", " .......................... ", " .+++.+++.+++.+++.+++.++++. ", " .+@@.+@@.+@@.+@@.+@@.+@@@. ", " .......................... ", " .+++++.+++.+++.+++.++++++. ", " .+@@@@.+@@.+@@.+@@.+@@@@@. ", " .......................... ", " .++++++.+++.+++.+++.+++++. ", " .+@@@@@.+@@.+@@.+@@.+@@@@. ", " .......................... ", " .++++.++++++++++++++.++++. ", " .+@@@.+@@@@@@@@@@@@@.+@@@. ", " .......................... "}; KeyboardImpl::KeyboardImpl() : input(0), icn(0), ref(0) { } KeyboardImpl::~KeyboardImpl() { delete input; delete icn; } QWidget *KeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) { if ( !input ) - input = new Keyboard( parent, "Keyboard", f ); + input = new MultiKey::Keyboard( parent, "Keyboard", f ); return input; } void KeyboardImpl::resetState() { if ( input ) input->resetState(); } QPixmap *KeyboardImpl::icon() { if ( !icn ) icn = new QPixmap( (const char **)kb_xpm ); return icn; } QString KeyboardImpl::name() { return qApp->translate( "InputMethods", "Multikey" ); } void KeyboardImpl::onKeyPress( QObject *receiver, const char *slot ) { if ( input ) QObject::connect( input, SIGNAL(key(ushort,ushort,ushort,bool,bool)), receiver, slot ); } #ifndef QT_NO_COMPONENT QRESULT KeyboardImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_InputMethod ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_EXPORT_INTERFACE() { Q_CREATE_INSTANCE( KeyboardImpl ) } #endif diff --git a/inputmethods/multikey/keyboardimpl.h b/inputmethods/multikey/keyboardimpl.h index e756364..76a2955 100644 --- a/inputmethods/multikey/keyboardimpl.h +++ b/inputmethods/multikey/keyboardimpl.h @@ -1,51 +1,60 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of 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. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef KEYBOARDIMPL_H #define KEYBOARDIMPL_H #include <qpe/inputmethodinterface.h> -class Keyboard; +namespace MultiKey +{ + class Keyboard; +} + class QPixmap; +namespace +{ + class KeyboardImpl : public InputMethodInterface { public: KeyboardImpl(); virtual ~KeyboardImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f ); virtual void resetState(); virtual QPixmap *icon(); virtual QString name(); virtual void onKeyPress( QObject *receiver, const char *slot ); private: - Keyboard *input; + MultiKey::Keyboard *input; QPixmap *icn; ulong ref; }; +} // anonymous namespace + #endif |