summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/configdlg.cpp93
-rw-r--r--inputmethods/multikey/configdlg.h8
-rw-r--r--inputmethods/multikey/keyboard.cpp37
-rw-r--r--inputmethods/multikey/keyboard.h2
4 files changed, 95 insertions, 45 deletions
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index 157714c..a6e4dad 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -1,162 +1,219 @@
1/* 1/*
2 * TODO 2 * TODO
3 * make a font selection thing (size too) 3 * make a font selection thing (size too)
4 * 4 *
5 * 5 *
6 * 6 *
7 */ 7 */
8 8
9#include <iostream.h>
10
9#include <qpe/qpeapplication.h> 11#include <qpe/qpeapplication.h>
10#include <qpe/config.h> 12#include <qpe/config.h>
11 13
12#include <qwidget.h> 14#include <qwidget.h>
13#include <qdialog.h> 15#include <qdialog.h>
14#include <qtabwidget.h> 16#include <qtabwidget.h>
15#include <qvbox.h> 17#include <qvbox.h>
16#include <qgrid.h> 18#include <qgrid.h>
17#include <qgroupbox.h> 19#include <qgroupbox.h>
18#include <qlabel.h> 20#include <qlabel.h>
19#include <qcheckbox.h> 21#include <qcheckbox.h>
20#include <qsizepolicy.h> 22#include <qsizepolicy.h>
21#include <qpushbutton.h> 23#include <qpushbutton.h>
22#include <qlistbox.h> 24#include <qlistbox.h>
23#include <qstringlist.h> 25#include <qstringlist.h>
24#include <opie/ofiledialog.h> 26#include <opie/ofiledialog.h>
25#include <iostream.h> 27#include <qdir.h>
28#include <qfileinfo.h>
26#include "configdlg.h" 29#include "configdlg.h"
27#include "keyboard.h" 30#include "keyboard.h"
28 31
29ConfigDlg::ConfigDlg () : QTabWidget () 32ConfigDlg::ConfigDlg () : QTabWidget ()
30{ 33{
31 setCaption( tr("Multikey Configuration") ); 34 setCaption( tr("Multikey Configuration") );
32 Config config ("multikey"); 35 Config config ("multikey");
36 config.setGroup("keymaps");
37 QString current_map = config.readEntry("current", 0);
33 38
34 /* 39 /*
35 * 'general config' tab 40 * 'general config' tab
36 */ 41 */
37 42
38 QVBox *gen_box = new QVBox (this); 43 QVBox *gen_box = new QVBox (this);
39 gen_box->setMargin(3); 44 gen_box->setMargin(3);
40 addTab(gen_box, tr("General Settings")); 45 addTab(gen_box, tr("General Settings"));
41 46
42 QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box); 47 QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box);
43 48
44 keymaps = new QListBox (map_group); 49 keymaps = new QListBox (map_group);
45 keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); 50 keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
46 51
47 QString cur(tr("Current Language")); 52 QString cur(tr("Current Language"));
48 keymaps->insertItem(cur); 53 keymaps->insertItem(cur);
54 keymaps->setSelected(0, true);
55
56 QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
57 default_maps = map_dir.entryList(); // so i can access it in other places
49 58
50 config.setGroup ("keymaps"); 59 for (uint i = 0; i <map_dir.count(); i++) {
51 QStringList maps = config.readListEntry("maps", QChar('|')); 60
61 keymaps->insertItem(map_dir.absPath() + "/" + map_dir[i]);
62 if (map_dir.absPath() + "/" + map_dir[i] == current_map) {
63
64 keymaps->setSelected(i + 1, true);
65 }
66
67 }
68
69 custom_maps = config.readListEntry("maps", QChar('|'));
70
71 for (uint i = 0; i < custom_maps.count(); i++) {
72
73 if (map_dir.exists(QFileInfo(custom_maps[i]).fileName(), false)
74 || !QFile::exists(custom_maps[i])) {
75
76 custom_maps.remove(custom_maps.at(i));
77
78 // remove it from the list too
79 config.writeEntry("maps", custom_maps.join("|"));
52 80
53 for (unsigned int i = 0; i < maps.count(); i++) {
54 81
55 keymaps->insertItem(maps[i]); 82 } else {
83
84 keymaps->insertItem(custom_maps[i]);
85 if (custom_maps[i] == current_map) {
86
87 keymaps->setSelected(map_dir.count() + i + 1, true);
88 }
89 }
56 } 90 }
57 91
58 // have to "+1" because the "current language" listItem... remember? 92 // have to "+1" because the "current language" listItem... remember?
59 keymaps->setSelected(config.readNumEntry("current", 0) + 1, true);
60 93
61 connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int))); 94 connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int)));
62 95
63 96
64 QGrid *add_remove_grid = new QGrid(2, map_group); 97 QGrid *add_remove_grid = new QGrid(2, map_group);
65 add_remove_grid->setMargin(3); 98 add_remove_grid->setMargin(3);
66 add_remove_grid->setSpacing(3); 99 add_remove_grid->setSpacing(3);
67 100
68 add_button = new QPushButton(tr("Add"), add_remove_grid); 101 add_button = new QPushButton(tr("Add"), add_remove_grid);
69 add_button->setFlat((bool)1); 102 add_button->setFlat((bool)1);
70 connect(add_button, SIGNAL(clicked()), SLOT(addMap())); 103 connect(add_button, SIGNAL(clicked()), SLOT(addMap()));
71 104
72 remove_button = new QPushButton(tr("Remove"), add_remove_grid); 105 remove_button = new QPushButton(tr("Remove"), add_remove_grid);
73 remove_button->setFlat((bool)1); 106 remove_button->setFlat((bool)1);
107 connect(remove_button, SIGNAL(clicked()), SLOT(removeMap()));
74 108
75 pick_button = new QCheckBox(tr("Pickboard"), gen_box); 109 pick_button = new QCheckBox(tr("Pickboard"), gen_box);
76 110
77 config.setGroup ("pickboard"); 111 config.setGroup ("pickboard");
78 bool pick_open = config.readBoolEntry ("open", "0"); // default closed 112 bool pick_open = config.readBoolEntry ("open", "0"); // default closed
79 if (pick_open) { 113 if (pick_open) {
80 114
81 pick_button->setChecked(true); 115 pick_button->setChecked(true);
82 } 116 }
83 117
84 // by connecting it after checking it, the signal isn't emmited 118 // by connecting it after checking it, the signal isn't emmited
85 connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog())); 119 connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog()));
86 120
87 /* 121 /*
88 * 'color' tab 122 * 'color' tab
89 */ 123 */
90 124
91 QGrid *color_box = new QGrid(2, this); 125 QGrid *color_box = new QGrid(2, this);
92 color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); 126 color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
93 color_box->setMargin(3); 127 color_box->setMargin(3);
94 color_box->setSpacing(3); 128 color_box->setSpacing(3);
95 addTab(color_box, tr("Colors")); 129 addTab(color_box, tr("Colors"));
96 130
97 QLabel *label; 131 QLabel *label;
98 132
99 label = new QLabel(tr("Key Color"), color_box); 133 label = new QLabel(tr("Key Color"), color_box);
100 QPushButton *button = new QPushButton(color_box); 134 QPushButton *button = new QPushButton(color_box);
101 button->setFlat((bool)1); 135 button->setFlat((bool)1);
102 label = new QLabel(tr("Key Pressed Color"), color_box); 136 label = new QLabel(tr("Key Pressed Color"), color_box);
103 button = new QPushButton(color_box); 137 button = new QPushButton(color_box);
104 button->setFlat((bool)1); 138 button->setFlat((bool)1);
105 label = new QLabel(tr("Line Color"), color_box); 139 label = new QLabel(tr("Line Color"), color_box);
106 button = new QPushButton(color_box); 140 button = new QPushButton(color_box);
107 button->setFlat((bool)1); 141 button->setFlat((bool)1);
108 label = new QLabel(tr("Text Color"), color_box); 142 label = new QLabel(tr("Text Color"), color_box);
109 button = new QPushButton(color_box); 143 button = new QPushButton(color_box);
110 button->setFlat((bool)1); 144 button->setFlat((bool)1);
111 145
112 label = new QLabel("", color_box); // a spacer so the above buttons dont expand 146 label = new QLabel("", color_box); // a spacer so the above buttons dont expand
113 label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); 147 label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
114 148
115} 149}
116 150
117void ConfigDlg::pickTog() { 151void ConfigDlg::pickTog() {
118 152
119 Config config ("multikey"); 153 Config config ("multikey");
120 config.setGroup ("pickboard"); 154 config.setGroup ("pickboard");
121 config.writeEntry ("open", pick_button->isChecked()); // default closed 155 config.writeEntry ("open", pick_button->isChecked()); // default closed
122 156
123 emit pickboardToggled(pick_button->isChecked()); 157 emit pickboardToggled(pick_button->isChecked());
124} 158}
125 159
126/* 160/*
127 * the index is kinda screwy, because in the config file, index 0 is just the 161 * the index is kinda screwy, because in the config file, index 0 is just the
128 * first element in the QStringList, but here it's the "Current Language" 162 * first element in the QStringList, but here it's the "Current Language"
129 * listItem. therefor you have to minus one to the index before you access 163 * listItem. therefor you have to minus one to the index before you access it.
130 * it from the config file.
131 * 164 *
132 * and later on, the "current language" setting should be -1 in the config file
133 */ 165 */
134 166
135void ConfigDlg::setMap(int index) { 167void ConfigDlg::setMap(int index) {
136 168
137 if (index == 0) { 169 if (index == 0) {
138 170
139 if (remove_button->isEnabled()) 171 remove_button->setDisabled(true);
140 remove_button->setDisabled(true);
141 172
142 emit setMapToDefault(); 173 emit setMapToDefault();
143 } 174 }
144 else { 175 else if ((uint)index <= default_maps.count()) {
176
177 remove_button->setDisabled(true);
145 178
146 if (!remove_button->isEnabled()) 179 } else {
147 remove_button->setEnabled(true);
148 180
149 emit setMapToFile(index - 1); 181 remove_button->setEnabled(true);
182
183 emit setMapToFile(keymaps->text(index));
150 } 184 }
151} 185}
152 186
153void ConfigDlg::addMap() { 187void ConfigDlg::addMap() {
154 188
155 QString map = OFileDialog::getOpenFileName(2, QPEApplication::qpeDir() + "/share/multikey"); 189 QString map = OFileDialog::getOpenFileName(1, QDir::home().absPath());
156 cout << "added file " << map << "!\n"; 190 Config config ("multikey");
191 config.setGroup("keymaps");
192 QStringList maps = config.readListEntry("maps", QChar('|'));
193 maps.append(map);
194 keymaps->insertItem(map);
195 keymaps->setSelected(keymaps->count() - 1, true);
196
197
198 config.writeEntry("maps", maps.join("|"));
199 config.writeEntry("current", map);
157 200
158} 201}
159 202
160void ConfigDlg::removeMap(int index) { 203void ConfigDlg::removeMap() {
204
205 cout << "removing : " << custom_maps[keymaps->currentItem() - default_maps.count() - 1] << "\n";
206 cout << "currentItem : " << keymaps->currentItem() << "\n";
161 207
208 // move selection up one
209 keymaps->setSelected(keymaps->currentItem() - 1, true);
210 // delete the next selected item cus you just moved it up
211 keymaps->removeItem(keymaps->currentItem() + 1);
212
213 custom_maps.remove(custom_maps[keymaps->currentItem() - default_maps.count()]);
214
215 // write the changes
216 Config config ("multikey");
217 config.setGroup("keymaps");
218 config.writeEntry("maps", custom_maps.join("|"));
162} 219}
diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h
index 03a3547..07d109c 100644
--- a/inputmethods/multikey/configdlg.h
+++ b/inputmethods/multikey/configdlg.h
@@ -1,36 +1,40 @@
1#include <qpe/qpeapplication.h> 1#include <qpe/qpeapplication.h>
2#include <qtabwidget.h> 2#include <qtabwidget.h>
3#include <qcheckbox.h> 3#include <qcheckbox.h>
4#include <qlistbox.h> 4#include <qlistbox.h>
5#include <qpushbutton.h> 5#include <qpushbutton.h>
6 6
7#ifndef CONFIGDLG_H 7#ifndef CONFIGDLG_H
8#define CONFIGDLG_H 8#define CONFIGDLG_H
9 9
10class ConfigDlg : public QTabWidget 10class ConfigDlg : public QTabWidget
11{ 11{
12 Q_OBJECT 12 Q_OBJECT
13 13
14public: 14public:
15 ConfigDlg (); 15 ConfigDlg ();
16 16
17signals: 17signals:
18 void pickboardToggled(bool on_off); 18 void pickboardToggled(bool on_off);
19 void setMapToDefault(); 19 void setMapToDefault();
20 void setMapToFile(int index); 20 void setMapToFile(QString map);
21 21
22private slots: 22private slots:
23 void pickTog(); 23 void pickTog();
24 void setMap(int index); 24 void setMap(int index);
25 void addMap(); 25 void addMap();
26 void removeMap(int index); 26 void removeMap();
27 27
28private: 28private:
29 QCheckBox *pick_button; 29 QCheckBox *pick_button;
30 QListBox *keymaps; 30 QListBox *keymaps;
31 QPushButton *add_button; 31 QPushButton *add_button;
32 QPushButton *remove_button; 32 QPushButton *remove_button;
33 33
34
35 QStringList default_maps; // the maps in your share/multikey/ dir
36 QStringList custom_maps; // maps you added with the 'add' button
37
34}; 38};
35 39
36#endif 40#endif
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index c53ae6c..ac3d9be 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,1098 +1,1087 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#include "keyboard.h" 21#include "keyboard.h"
22#include "configdlg.h" 22#include "configdlg.h"
23 23
24#include <qpe/global.h> 24#include <qpe/global.h>
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
26 26
27#include <qwindowsystem_qws.h> 27#include <qwindowsystem_qws.h>
28#include <qpainter.h> 28#include <qpainter.h>
29#include <qfontmetrics.h> 29#include <qfontmetrics.h>
30#include <qtimer.h> 30#include <qtimer.h>
31#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
32#include <qpe/config.h> 32#include <qpe/config.h>
33#include <ctype.h> 33#include <ctype.h>
34#include <qfile.h> 34#include <qfile.h>
35#include <qtextstream.h> 35#include <qtextstream.h>
36#include <qstringlist.h> 36#include <qstringlist.h>
37#include <iostream.h> 37#include <iostream.h>
38 38
39#include <sys/utsname.h> 39#include <sys/utsname.h>
40 40
41 41
42#define USE_SMALL_BACKSPACE 42#define USE_SMALL_BACKSPACE
43 43
44/* Keyboard::Keyboard {{{1 */ 44/* Keyboard::Keyboard {{{1 */
45Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : 45Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
46 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), 46 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0),
47 alt(0), useLargeKeys(TRUE), usePicks(0), pressedKeyRow(-1), pressedKeyCol(-1), 47 alt(0), useLargeKeys(TRUE), usePicks(0), pressedKeyRow(-1), pressedKeyCol(-1),
48 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), 48 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
49 configdlg(0) 49 configdlg(0)
50 50
51{ 51{
52 // get the default font 52 // get the default font
53 Config *config = new Config( "qpe" ); 53 Config *config = new Config( "qpe" );
54 config->setGroup( "Appearance" ); 54 config->setGroup( "Appearance" );
55 QString familyStr = config->readEntry( "FontFamily", "fixed" ); 55 QString familyStr = config->readEntry( "FontFamily", "fixed" );
56 delete config; 56 delete config;
57 57
58 config = new Config("multikey"); 58 config = new Config("multikey");
59 config->setGroup ("pickboard"); 59 config->setGroup ("pickboard");
60 usePicks = config->readBoolEntry ("open", "0"); // default closed 60 usePicks = config->readBoolEntry ("open", "0"); // default closed
61 delete config; 61 delete config;
62 62
63 setFont( QFont( familyStr, 10 ) ); 63 setFont( QFont( familyStr, 10 ) );
64 64
65 picks = new KeyboardPicks( this ); 65 picks = new KeyboardPicks( this );
66 picks->setFont( QFont( familyStr, 10 ) ); 66 picks->setFont( QFont( familyStr, 10 ) );
67 picks->initialise(); 67 picks->initialise();
68 if (usePicks) { 68 if (usePicks) {
69 69
70 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 70 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
71 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 71 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
72 72
73 } else picks->hide(); 73 } else picks->hide();
74 74
75 keys = new Keys(); 75 keys = new Keys();
76 76
77 repeatTimer = new QTimer( this ); 77 repeatTimer = new QTimer( this );
78 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); 78 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
79 79
80} 80}
81Keyboard::~Keyboard() { 81Keyboard::~Keyboard() {
82 82
83 if ( configdlg ) { 83 if ( configdlg ) {
84 delete (ConfigDlg *) configdlg; 84 delete (ConfigDlg *) configdlg;
85 configdlg = 0; 85 configdlg = 0;
86 } 86 }
87 87
88} 88}
89 89
90/* Keyboard::resizeEvent {{{1 */ 90/* Keyboard::resizeEvent {{{1 */
91void Keyboard::resizeEvent(QResizeEvent*) 91void Keyboard::resizeEvent(QResizeEvent*)
92{ 92{
93 int ph = picks->sizeHint().height(); 93 int ph = picks->sizeHint().height();
94 picks->setGeometry( 0, 0, width(), ph ); 94 picks->setGeometry( 0, 0, width(), ph );
95 keyHeight = (height()-(usePicks ? ph : 0))/5; 95 keyHeight = (height()-(usePicks ? ph : 0))/5;
96 96
97 int nk; // number of keys? 97 int nk; // number of keys?
98 if ( useLargeKeys ) { 98 if ( useLargeKeys ) {
99 nk = 15; 99 nk = 15;
100 } else { 100 } else {
101 nk = 19; 101 nk = 19;
102 } 102 }
103 defaultKeyWidth = (width()/nk)/2; 103 defaultKeyWidth = (width()/nk)/2;
104 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? 104 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
105 105
106} 106}
107 107
108/* KeyboardPicks::initialize {{{1 */ 108/* KeyboardPicks::initialize {{{1 */
109void KeyboardPicks::initialise() 109void KeyboardPicks::initialise()
110{ 110{
111 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); 111 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
112 mode = 0; 112 mode = 0;
113 dc = new KeyboardConfig(this); 113 dc = new KeyboardConfig(this);
114 configs.append(dc); 114 configs.append(dc);
115} 115}
116 116
117/* KeyboardPicks::sizeHint {{{1 */ 117/* KeyboardPicks::sizeHint {{{1 */
118QSize KeyboardPicks::sizeHint() const 118QSize KeyboardPicks::sizeHint() const
119{ 119{
120 return QSize(240,fontMetrics().lineSpacing()); 120 return QSize(240,fontMetrics().lineSpacing());
121} 121}
122 122
123 123
124/* KeyboardConfig::generateText {{{1 */ 124/* KeyboardConfig::generateText {{{1 */
125void KeyboardConfig::generateText(const QString &s) 125void KeyboardConfig::generateText(const QString &s)
126{ 126{
127#if defined(Q_WS_QWS) || defined(_WS_QWS_) 127#if defined(Q_WS_QWS) || defined(_WS_QWS_)
128 for (int i=0; i<(int)backspaces; i++) { 128 for (int i=0; i<(int)backspaces; i++) {
129 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); 129 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false );
130 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); 130 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false );
131 } 131 }
132 for (int i=0; i<(int)s.length(); i++) { 132 for (int i=0; i<(int)s.length(); i++) {
133 parent->emitKey( s[i].unicode(), 0, 0, true, false ); 133 parent->emitKey( s[i].unicode(), 0, 0, true, false );
134 parent->emitKey( s[i].unicode(), 0, 0, false, false ); 134 parent->emitKey( s[i].unicode(), 0, 0, false, false );
135 } 135 }
136 parent->emitKey( 0, Qt::Key_Space, 0, true, false ); 136 parent->emitKey( 0, Qt::Key_Space, 0, true, false );
137 parent->emitKey( 0, Qt::Key_Space, 0, false, false ); 137 parent->emitKey( 0, Qt::Key_Space, 0, false, false );
138 backspaces = 0; 138 backspaces = 0;
139#endif 139#endif
140} 140}
141 141
142 142
143 143
144 144
145/* Keyboard::paintEvent {{{1 */ 145/* Keyboard::paintEvent {{{1 */
146void Keyboard::paintEvent(QPaintEvent* e) 146void Keyboard::paintEvent(QPaintEvent* e)
147{ 147{
148 QPainter painter(this); 148 QPainter painter(this);
149 painter.setClipRect(e->rect()); 149 painter.setClipRect(e->rect());
150 drawKeyboard( painter ); 150 drawKeyboard( painter );
151 picks->dc->draw( &painter ); 151 picks->dc->draw( &painter );
152} 152}
153 153
154 154
155/* Keyboard::drawKeyboard {{{1 */ 155/* Keyboard::drawKeyboard {{{1 */
156 156
157void Keyboard::drawKeyboard(QPainter &p, int row, int col) 157void Keyboard::drawKeyboard(QPainter &p, int row, int col)
158{ 158{
159 QColor keycolor = 159 QColor keycolor =
160 QColor(240,240,240); 160 QColor(240,240,240);
161 QColor keycolor_pressed = QColor(171,183,198); 161 QColor keycolor_pressed = QColor(171,183,198);
162 QColor keycolor_lines = QColor(138,148,160); 162 QColor keycolor_lines = QColor(138,148,160);
163 QColor textcolor = QColor(43,54,68); 163 QColor textcolor = QColor(43,54,68);
164 164
165 165
166 if (row != -1 && col != -1) { //just redraw one key 166 if (row != -1 && col != -1) { //just redraw one key
167 167
168 int x = 0; 168 int x = 0;
169 for (int i = 0; i < col; i++) { 169 for (int i = 0; i < col; i++) {
170 170
171 x += keys->width(row, i) * defaultKeyWidth; 171 x += keys->width(row, i) * defaultKeyWidth;
172 } 172 }
173 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); 173 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
174 174
175 int keyWidth = keys->width(row, col); 175 int keyWidth = keys->width(row, col);
176 176
177 p.fillRect(x + 1, y + 1, 177 p.fillRect(x + 1, y + 1,
178 keyWidth * defaultKeyWidth - 1, keyHeight - 1, 178 keyWidth * defaultKeyWidth - 1, keyHeight - 1,
179 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); 179 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
180 180
181 QPixmap *pix = keys->pix(row,col); 181 QPixmap *pix = keys->pix(row,col);
182 182
183 ushort c = keys->uni(row, col); 183 ushort c = keys->uni(row, col);
184 184
185 if (!pix) { 185 if (!pix) {
186 p.setPen(textcolor); 186 p.setPen(textcolor);
187 p.drawText(x, y, 187 p.drawText(x, y,
188 defaultKeyWidth * keyWidth, keyHeight, 188 defaultKeyWidth * keyWidth, keyHeight,
189 AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c); 189 AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
190 } 190 }
191 else 191 else
192 // center the image in the middle of the key 192 // center the image in the middle of the key
193 p.drawPixmap( x + (defaultKeyWidth * keyWidth - pix->width())/2, 193 p.drawPixmap( x + (defaultKeyWidth * keyWidth - pix->width())/2,
194 y + (keyHeight - pix->height())/2 + 1, 194 y + (keyHeight - pix->height())/2 + 1,
195 *pix ); 195 *pix );
196 196
197 // this fixes the problem that the very right end of the board's vertical line 197 // this fixes the problem that the very right end of the board's vertical line
198 // gets painted over, because it's one pixel shorter than all other keys 198 // gets painted over, because it's one pixel shorter than all other keys
199 p.setPen(keycolor_lines); 199 p.setPen(keycolor_lines);
200 p.drawLine(width() - 1, 0, width() - 1, height()); 200 p.drawLine(width() - 1, 0, width() - 1, height());
201 201
202 } else { 202 } else {
203 203
204 204
205 p.fillRect(0, 0, width(), height(), keycolor); 205 p.fillRect(0, 0, width(), height(), keycolor);
206 206
207 for (row = 1; row <= 5; row++) { 207 for (row = 1; row <= 5; row++) {
208 208
209 int x = 0; 209 int x = 0;
210 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); 210 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
211 211
212 p.setPen(keycolor_lines); 212 p.setPen(keycolor_lines);
213 p.drawLine(x, y, x + width(), y); 213 p.drawLine(x, y, x + width(), y);
214 214
215 for (int col = 0; col < keys->numKeys(row); col++) { 215 for (int col = 0; col < keys->numKeys(row); col++) {
216 216
217 QPixmap *pix = keys->pix(row, col); 217 QPixmap *pix = keys->pix(row, col);
218 int keyWidth = keys->width(row, col); 218 int keyWidth = keys->width(row, col);
219 219
220 220
221 int keyWidthPix = defaultKeyWidth * keyWidth; 221 int keyWidthPix = defaultKeyWidth * keyWidth;
222 222
223 if (keys->pressed(row, col)) 223 if (keys->pressed(row, col))
224 p.fillRect(x+1, y+1, keyWidthPix - 1, 224 p.fillRect(x+1, y+1, keyWidthPix - 1,
225 keyHeight - 1, keycolor_pressed); 225 keyHeight - 1, keycolor_pressed);
226 226
227 ushort c = keys->uni(row, col); 227 ushort c = keys->uni(row, col);
228 228
229 if (!pix) { 229 if (!pix) {
230 p.setPen(textcolor); 230 p.setPen(textcolor);
231 p.drawText(x, y, 231 p.drawText(x, y,
232 keyWidthPix, keyHeight, 232 keyWidthPix, keyHeight,
233 AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c); 233 AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
234 } 234 }
235 else { 235 else {
236 // center the image in the middle of the key 236 // center the image in the middle of the key
237 p.drawPixmap( x + (keyWidthPix - pix->width())/2, 237 p.drawPixmap( x + (keyWidthPix - pix->width())/2,
238 y + (keyHeight - pix->height())/2 + 1, 238 y + (keyHeight - pix->height())/2 + 1,
239 QPixmap(*pix) ); 239 QPixmap(*pix) );
240 } 240 }
241 241
242 p.setPen(keycolor_lines); 242 p.setPen(keycolor_lines);
243 p.drawLine(x, y, x, y + keyHeight); 243 p.drawLine(x, y, x, y + keyHeight);
244 244
245 x += keyWidthPix; 245 x += keyWidthPix;
246 } 246 }
247 247
248 248
249 } 249 }
250 p.drawLine(0, height() - 1, width(), height() - 1); 250 p.drawLine(0, height() - 1, width(), height() - 1);
251 p.drawLine(width() - 1, 0, width() - 1, height()); 251 p.drawLine(width() - 1, 0, width() - 1, height());
252 } 252 }
253 253
254} 254}
255 255
256 256
257/* Keyboard::mousePressEvent {{{1 */ 257/* Keyboard::mousePressEvent {{{1 */
258void Keyboard::mousePressEvent(QMouseEvent *e) 258void Keyboard::mousePressEvent(QMouseEvent *e)
259{ 259{
260 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1; 260 int row = (e->y() - (usePicks ? picks->height() : 0)) / keyHeight + 1;
261 if (row > 5) row = 5; 261 if (row > 5) row = 5;
262 262
263 // figure out the column 263 // figure out the column
264 int col = 0; 264 int col = 0;
265 for (int w = 0; e->x() >= w; col++) 265 for (int w = 0; e->x() >= w; col++)
266 if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys 266 if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys
267 w += keys->width(row,col) * defaultKeyWidth; 267 w += keys->width(row,col) * defaultKeyWidth;
268 else break; 268 else break;
269 269
270 col --; // rewind one... 270 col --; // rewind one...
271 271
272 qkeycode = keys->qcode(row, col); 272 qkeycode = keys->qcode(row, col);
273 unicode = keys->uni(row, col); 273 unicode = keys->uni(row, col);
274 274
275 // might need to repaint if two or more of the same keys. 275 // might need to repaint if two or more of the same keys.
276 // should be faster if just paint one key even though multiple keys exist. 276 // should be faster if just paint one key even though multiple keys exist.
277 bool need_repaint = FALSE; 277 bool need_repaint = FALSE;
278 278
279 if (unicode == 0) { // either Qt char, or nothing 279 if (unicode == 0) { // either Qt char, or nothing
280 280
281 if (qkeycode == Qt::Key_F1) { // toggle the pickboard 281 if (qkeycode == Qt::Key_F1) { // toggle the pickboard
282 282
283 if ( configdlg ) { 283 if ( configdlg ) {
284 delete (ConfigDlg *) configdlg; 284 delete (ConfigDlg *) configdlg;
285 configdlg = 0; 285 configdlg = 0;
286 } 286 }
287 else { 287 else {
288 configdlg = new ConfigDlg (); 288 configdlg = new ConfigDlg ();
289 connect(configdlg, SIGNAL(pickboardToggled(bool)), 289 connect(configdlg, SIGNAL(pickboardToggled(bool)),
290 this, SLOT(togglePickboard(bool))); 290 this, SLOT(togglePickboard(bool)));
291 connect(configdlg, SIGNAL(setMapToDefault()), 291 connect(configdlg, SIGNAL(setMapToDefault()),
292 this, SLOT(setMapToDefault())); 292 this, SLOT(setMapToDefault()));
293 connect(configdlg, SIGNAL(setMapToFile(int)), 293 connect(configdlg, SIGNAL(setMapToFile(QString)),
294 this, SLOT(setMapToFile(int))); 294 this, SLOT(setMapToFile(QString)));
295 configdlg->showMaximized(); 295 configdlg->showMaximized();
296 configdlg->show(); 296 configdlg->show();
297 configdlg->raise(); 297 configdlg->raise();
298 } 298 }
299 299
300 } else if (qkeycode == Qt::Key_Control) { 300 } else if (qkeycode == Qt::Key_Control) {
301 ctrl = keys->pressedPtr(row, col); 301 ctrl = keys->pressedPtr(row, col);
302 need_repaint = TRUE; 302 need_repaint = TRUE;
303 *ctrl = !keys->pressed(row, col); 303 *ctrl = !keys->pressed(row, col);
304 304
305 } else if (qkeycode == Qt::Key_Alt) { 305 } else if (qkeycode == Qt::Key_Alt) {
306 alt = keys->pressedPtr(row, col); 306 alt = keys->pressedPtr(row, col);
307 need_repaint = TRUE; 307 need_repaint = TRUE;
308 *alt = !keys->pressed(row, col); 308 *alt = !keys->pressed(row, col);
309 309
310 } else if (qkeycode == Qt::Key_Shift) { 310 } else if (qkeycode == Qt::Key_Shift) {
311 need_repaint = TRUE; 311 need_repaint = TRUE;
312 312
313 if (shift) { 313 if (shift) {
314 *shift = 0; 314 *shift = 0;
315 shift = 0; 315 shift = 0;
316 } 316 }
317 else { 317 else {
318 shift = keys->pressedPtr(row, col); 318 shift = keys->pressedPtr(row, col);
319 *shift = 1; 319 *shift = 1;
320 if (lock) { 320 if (lock) {
321 *lock = 0; 321 *lock = 0;
322 lock = 0; 322 lock = 0;
323 } 323 }
324 } 324 }
325 325
326 } else if (qkeycode == Qt::Key_CapsLock) { 326 } else if (qkeycode == Qt::Key_CapsLock) {
327 need_repaint = TRUE; 327 need_repaint = TRUE;
328 328
329 if (lock) { 329 if (lock) {
330 *lock = 0; 330 *lock = 0;
331 lock = 0; 331 lock = 0;
332 } 332 }
333 else { 333 else {
334 lock = keys->pressedPtr(row, col);; 334 lock = keys->pressedPtr(row, col);;
335 *lock = 1; 335 *lock = 1;
336 if (shift) { 336 if (shift) {
337 *shift = 0; 337 *shift = 0;
338 shift = 0; 338 shift = 0;
339 } 339 }
340 } 340 }
341 341
342 } 342 }
343 343
344 } 344 }
345 else { // normal char 345 else { // normal char
346 if ((shift || lock) && keys->shift(unicode)) { 346 if ((shift || lock) && keys->shift(unicode)) {
347 unicode = keys->shift(unicode); 347 unicode = keys->shift(unicode);
348 } 348 }
349 } 349 }
350 350
351 // korean parsing 351 // korean parsing
352 if (keys->lang == "ko") { 352 if (keys->lang == "ko") {
353 353
354 unicode = parseKoreanInput(unicode); 354 unicode = parseKoreanInput(unicode);
355 } 355 }
356 356
357 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0); 357 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0);
358 358
359 emit key(unicode, qkeycode, modifiers, true, false); 359 emit key(unicode, qkeycode, modifiers, true, false);
360 360
361 // pickboard stuff 361 // pickboard stuff
362 if (usePicks) { 362 if (usePicks) {
363 363
364 KeyboardConfig *dc = picks->dc; 364 KeyboardConfig *dc = picks->dc;
365 365
366 if (dc) { 366 if (dc) {
367 if (qkeycode == Qt::Key_Backspace) { 367 if (qkeycode == Qt::Key_Backspace) {
368 dc->input.remove(dc->input.last()); // remove last input 368 dc->input.remove(dc->input.last()); // remove last input
369 dc->decBackspaces(); 369 dc->decBackspaces();
370 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) { 370 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) {
371 dc->input.clear(); 371 dc->input.clear();
372 dc->resetBackspaces(); 372 dc->resetBackspaces();
373 } else { 373 } else {
374 dc->add(QString(QChar(unicode))); 374 dc->add(QString(QChar(unicode)));
375 dc->incBackspaces(); 375 dc->incBackspaces();
376 } 376 }
377 } 377 }
378 picks->repaint(); 378 picks->repaint();
379 } 379 }
380 380
381 381
382 // painting 382 // painting
383 pressed = TRUE; 383 pressed = TRUE;
384 384
385 pressedKeyRow = row; 385 pressedKeyRow = row;
386 pressedKeyCol = col; 386 pressedKeyCol = col;
387 387
388 if (need_repaint) repaint(FALSE); 388 if (need_repaint) repaint(FALSE);
389 else { // just paint the one key pressed 389 else { // just paint the one key pressed
390 390
391 391
392 392
393 QPainter p(this); 393 QPainter p(this);
394 drawKeyboard(p, row, col); 394 drawKeyboard(p, row, col);
395 395
396 } 396 }
397 397
398 pressTid = startTimer(80); 398 pressTid = startTimer(80);
399 399
400} 400}
401 401
402 402
403/* Keyboard::mouseReleaseEvent {{{1 */ 403/* Keyboard::mouseReleaseEvent {{{1 */
404void Keyboard::mouseReleaseEvent(QMouseEvent*) 404void Keyboard::mouseReleaseEvent(QMouseEvent*)
405{ 405{
406 pressed = FALSE; 406 pressed = FALSE;
407 if ( pressTid == 0 ) 407 if ( pressTid == 0 )
408#if defined(Q_WS_QWS) || defined(_WS_QWS_) 408#if defined(Q_WS_QWS) || defined(_WS_QWS_)
409 if ( unicode != -1 ) { 409 if ( unicode != -1 ) {
410 emit key( unicode, qkeycode, modifiers, false, false ); 410 emit key( unicode, qkeycode, modifiers, false, false );
411 repeatTimer->stop(); 411 repeatTimer->stop();
412 } 412 }
413#endif 413#endif
414 if (shift && unicode != 0) { 414 if (shift && unicode != 0) {
415 415
416 416
417 *shift = 0; // unpress shift key 417 *shift = 0; // unpress shift key
418 shift = 0; // reset the shift pointer 418 shift = 0; // reset the shift pointer
419 repaint(FALSE); 419 repaint(FALSE);
420 420
421 } 421 }
422 else 422 else
423 423
424 clearHighlight(); 424 clearHighlight();
425} 425}
426 426
427/* Keyboard::timerEvent {{{1 */ 427/* Keyboard::timerEvent {{{1 */
428/* 428/*
429void Keyboard::timerEvent(QTimerEvent* e) 429void Keyboard::timerEvent(QTimerEvent* e)
430{ 430{
431 if ( e->timerId() == pressTid ) { 431 if ( e->timerId() == pressTid ) {
432 killTimer(pressTid); 432 killTimer(pressTid);
433 pressTid = 0; 433 pressTid = 0;
434 if ( !pressed ) 434 if ( !pressed )
435 cout << "calling clearHighlight from timerEvent\n"; 435 cout << "calling clearHighlight from timerEvent\n";
436 clearHighlight(); 436 clearHighlight();
437 } 437 }
438} 438}
439*/ 439*/
440 440
441void Keyboard::repeat() 441void Keyboard::repeat()
442{ 442{
443 443
444 repeatTimer->start( 200 ); 444 repeatTimer->start( 200 );
445 emit key( unicode, 0, modifiers, true, true ); 445 emit key( unicode, 0, modifiers, true, true );
446} 446}
447 447
448void Keyboard::clearHighlight() 448void Keyboard::clearHighlight()
449{ 449{
450 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) { 450 if ( pressedKeyRow >= 0 && pressedKeyCol >= 0) {
451 int tmpRow = pressedKeyRow; 451 int tmpRow = pressedKeyRow;
452 int tmpCol = pressedKeyCol; 452 int tmpCol = pressedKeyCol;
453 453
454 pressedKeyRow = -1; 454 pressedKeyRow = -1;
455 pressedKeyCol = -1; 455 pressedKeyCol = -1;
456 456
457 QPainter p(this); 457 QPainter p(this);
458 drawKeyboard(p, tmpRow, tmpCol); 458 drawKeyboard(p, tmpRow, tmpCol);
459 } 459 }
460} 460}
461 461
462 462
463/* Keyboard::sizeHint {{{1 */ 463/* Keyboard::sizeHint {{{1 */
464QSize Keyboard::sizeHint() const 464QSize Keyboard::sizeHint() const
465{ 465{
466 QFontMetrics fm=fontMetrics(); 466 QFontMetrics fm=fontMetrics();
467 int keyHeight = fm.lineSpacing() + 2; 467 int keyHeight = fm.lineSpacing() + 2;
468 468
469 return QSize( 240, keyHeight * 5 + (usePicks ? picks->sizeHint().height() : 0) + 1); 469 return QSize( 240, keyHeight * 5 + (usePicks ? picks->sizeHint().height() : 0) + 1);
470} 470}
471 471
472 472
473void Keyboard::resetState() 473void Keyboard::resetState()
474{ 474{
475 schar = mchar = echar = 0; 475 schar = mchar = echar = 0;
476 picks->resetState(); 476 picks->resetState();
477} 477}
478 478
479/* Keyboard::togglePickboard {{{1 */ 479/* Keyboard::togglePickboard {{{1 */
480void Keyboard::togglePickboard(bool on_off) 480void Keyboard::togglePickboard(bool on_off)
481{ 481{
482 usePicks = on_off; 482 usePicks = on_off;
483 if (usePicks) { 483 if (usePicks) {
484 picks->show(); 484 picks->show();
485 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send 485 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
486 //adjustSize(); 486 //adjustSize();
487 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 487 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
488 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 488 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
489 } else { 489 } else {
490 490
491 picks->hide(); 491 picks->hide();
492 picks->resetState(); 492 picks->resetState();
493 //move(x(), y() + picks->height()); 493 //move(x(), y() + picks->height());
494 //adjustSize(); 494 //adjustSize();
495 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 495 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
496 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 496 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
497 497
498 } 498 }
499 /* 499 /*
500 * this closes && opens the input method 500 * this closes && opens the input method
501 */ 501 */
502 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 502 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
503 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 503 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
504} 504}
505 505
506/* Keyboard::setMapTo ... {{{1 */ 506/* Keyboard::setMapTo ... {{{1 */
507void Keyboard::setMapToDefault() { 507void Keyboard::setMapToDefault() {
508 508
509 509
510 /* load current locale language map */ 510 /* load current locale language map */
511 Config *config = new Config("locale"); 511 Config *config = new Config("locale");
512 config->setGroup( "Language" ); 512 config->setGroup( "Language" );
513 QString l = config->readEntry( "Language" , "en" ); 513 QString l = config->readEntry( "Language" , "en" );
514 delete config; 514 delete config;
515 515
516 QString key_map = QPEApplication::qpeDir() + "/share/multikey/" 516 QString key_map = QPEApplication::qpeDir() + "/share/multikey/"
517 + l + ".keymap"; 517 + l + ".keymap";
518 518
519 /* save change to multikey config file */ 519 /* save change to multikey config file */
520 config = new Config("multikey"); 520 config = new Config("multikey");
521 config->setGroup ("keymaps"); 521 config->setGroup ("keymaps");
522 config->writeEntry ("current", -1); // default closed 522 config->writeEntry ("current", key_map); // default closed
523 delete config; 523 delete config;
524 524
525 delete keys; 525 delete keys;
526 keys = new Keys(key_map); 526 keys = new Keys(key_map);
527 527
528 // have to repaint the keyboard 528 // have to repaint the keyboard
529 repaint(FALSE); 529 repaint(FALSE);
530} 530}
531 531
532void Keyboard::setMapToFile(int index) { 532void Keyboard::setMapToFile(QString map) {
533 533
534 /* save change to multikey config file */ 534 /* save change to multikey config file */
535 Config *config = new Config("multikey"); 535 Config *config = new Config("multikey");
536 config->setGroup ("keymaps"); 536 config->setGroup ("keymaps");
537 config->writeEntry ("current", index); // default closed 537 config->writeEntry ("current", map); // default closed
538 538
539
540 /* now you have to retrieve the map */
541 QStringList maps = config->readListEntry("maps", QChar('|'));
542 delete config; 539 delete config;
543 540
544 delete keys; 541 delete keys;
545 if (index < 0 || (int)maps.count() <= index) 542 if (QFile(map).exists())
546 keys = new Keys(); 543 keys = new Keys(map);
547 else 544 else
548 keys = new Keys(maps[index]); 545 keys = new Keys();
549 546
550 repaint(FALSE); 547 repaint(FALSE);
551 548
552} 549}
553 550
554/* korean input functions {{{1 551/* korean input functions {{{1
555 * 552 *
556 * TODO 553 * TODO
557 * one major problem with this implementation is that you can't move the 554 * one major problem with this implementation is that you can't move the
558 * cursor after inputing korean chars, otherwise it will eat up and replace 555 * cursor after inputing korean chars, otherwise it will eat up and replace
559 * the char before the cursor you move to. fix that 556 * the char before the cursor you move to. fix that
560 * 557 *
561 * make backspace delete one single char, not the whole thing if still 558 * make backspace delete one single char, not the whole thing if still
562 * editing. 559 * editing.
563 * 560 *
564 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 561 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
565 * 562 *
566 * how korean input works 563 * how korean input works
567 * 564 *
568 * all following chars means unicode char value and are in hex 565 * all following chars means unicode char value and are in hex
569 * 566 *
570 * ÃÊÀ½ = schar (start char) 567 * ÃÊÀ½ = schar (start char)
571 * ÁßÀ½ = mchar (middle char) 568 * ÁßÀ½ = mchar (middle char)
572 * ³¡À½ = echar (end char) 569 * ³¡À½ = echar (end char)
573 * 570 *
574 * there are 19 schars. unicode position is at 1100 - 1112 571 * there are 19 schars. unicode position is at 1100 - 1112
575 * there are 21 mchars. unicode position is at 1161 - 1175 572 * there are 21 mchars. unicode position is at 1161 - 1175
576 * there are 27 echars. unicode position is at 11a8 - 11c2 573 * there are 27 echars. unicode position is at 11a8 - 11c2
577 * 574 *
578 * the map with everything combined is at ac00 - d7a3 575 * the map with everything combined is at ac00 - d7a3
579 * 576 *
580 */ 577 */
581 578
582ushort Keyboard::parseKoreanInput (ushort c) { 579ushort Keyboard::parseKoreanInput (ushort c) {
583 580
584 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c)) 581 if ((c != 0 && (c < 0x1100 || 0x11c2 < c) && (c < 0xac00 || 0xd7a3 < c))
585 || 582 ||
586 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode 583 (c == 0 && qkeycode != Qt::Key_Shift && Qt::Key_CapsLock != qkeycode
587 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) { 584 && qkeycode != Qt::Key_Control && qkeycode != Qt::Key_Alt)) {
588 585
589 schar = 0, mchar = 0, echar = 0; 586 schar = 0, mchar = 0, echar = 0;
590 return c; 587 return c;
591 } 588 }
592 589
593 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input 590 if ( 0x1100 <= c && c <= 0x1112 ) { // schar or echar was input
594 591
595 if (schar == 0 || (schar != 0 && mchar == 0)) { 592 if (schar == 0 || (schar != 0 && mchar == 0)) {
596 schar = c; mchar = 0; echar = 0; 593 schar = c; mchar = 0; echar = 0;
597 return c; 594 return c;
598 } 595 }
599 else if (mchar != 0) { 596 else if (mchar != 0) {
600 597
601 if (echar == 0) { 598 if (echar == 0) {
602 599
603 if (!(echar = constoe(c))) { 600 if (!(echar = constoe(c))) {
604 601
605 schar = c; mchar = 0; echar = 0; 602 schar = c; mchar = 0; echar = 0;
606 return c; 603 return c;
607 } 604 }
608 605
609 } 606 }
610 else { // must figure out what the echar is 607 else { // must figure out what the echar is
611 608
612 if (echar == 0x11a8) { // ¤¡ 609 if (echar == 0x11a8) { // ¤¡
613 610
614 if (c == 0x1100) echar = 0x11a9; // ¤¡ + ¤¡ 611 if (c == 0x1100) echar = 0x11a9; // ¤¡ + ¤¡
615 else if (c == 0x1109) echar = 0x11aa; // ¤¡ + ¤µ 612 else if (c == 0x1109) echar = 0x11aa; // ¤¡ + ¤µ
616 else { 613 else {
617 schar = c; mchar = 0; echar = 0; 614 schar = c; mchar = 0; echar = 0;
618 return c; 615 return c;
619 } 616 }
620 617
621 } else if (echar == 0x11ab) { // ¤¤ 618 } else if (echar == 0x11ab) { // ¤¤
622 619
623 if (c == 0x110c) echar = 0x11ac; // ¤¤ + ¤¸ 620 if (c == 0x110c) echar = 0x11ac; // ¤¤ + ¤¸
624 else if (c == 0x1112) echar = 0x11ad; // ¤¤ + ¤¾ 621 else if (c == 0x1112) echar = 0x11ad; // ¤¤ + ¤¾
625 else { 622 else {
626 schar = c; mchar = 0; echar = 0; 623 schar = c; mchar = 0; echar = 0;
627 return c; 624 return c;
628 } 625 }
629 626
630 } else if (echar == 0x11af) { // ¤© 627 } else if (echar == 0x11af) { // ¤©
631 628
632 if (c == 0x1100) echar = 0x11b0; // ¤© + ¤¡ 629 if (c == 0x1100) echar = 0x11b0; // ¤© + ¤¡
633 else if (c == 0x1106) echar = 0x11b1; // ¤© + ¤± 630 else if (c == 0x1106) echar = 0x11b1; // ¤© + ¤±
634 else if (c == 0x1107) echar = 0x11b2; // ¤© + ¤² 631 else if (c == 0x1107) echar = 0x11b2; // ¤© + ¤²
635 else if (c == 0x1109) echar = 0x11b3; // ¤© + ¤µ 632 else if (c == 0x1109) echar = 0x11b3; // ¤© + ¤µ
636 else if (c == 0x1110) echar = 0x11b4; // ¤© + ¤¼ 633 else if (c == 0x1110) echar = 0x11b4; // ¤© + ¤¼
637 else if (c == 0x1111) echar = 0x11b5; // ¤© + ¤½ 634 else if (c == 0x1111) echar = 0x11b5; // ¤© + ¤½
638 else if (c == 0x1112) echar = 0x11b6; // ¤© + ¤¾ 635 else if (c == 0x1112) echar = 0x11b6; // ¤© + ¤¾
639 else { 636 else {
640 schar = c; mchar = 0; echar = 0; 637 schar = c; mchar = 0; echar = 0;
641 return c; 638 return c;
642 } 639 }
643 640
644 } else if (echar == 0x11b8) { // ¤² 641 } else if (echar == 0x11b8) { // ¤²
645 642
646 if (c == 0x1109) echar = 0x11b9; // ¤² + ¤µ 643 if (c == 0x1109) echar = 0x11b9; // ¤² + ¤µ
647 else { 644 else {
648 schar = c; mchar = 0; echar = 0; 645 schar = c; mchar = 0; echar = 0;
649 return c; 646 return c;
650 } 647 }
651 648
652 } else if (echar == 0x11ba) { // ¤µ 649 } else if (echar == 0x11ba) { // ¤µ
653 650
654 if (c == 0x1109) echar = 0x11bb; // ¤µ + ¤µ 651 if (c == 0x1109) echar = 0x11bb; // ¤µ + ¤µ
655 else { 652 else {
656 schar = c; mchar = 0; echar = 0; 653 schar = c; mchar = 0; echar = 0;
657 return c; 654 return c;
658 } 655 }
659 656
660 } else { // if any other char, cannot combine chars 657 } else { // if any other char, cannot combine chars
661 658
662 schar = c; mchar = 0; echar = 0; 659 schar = c; mchar = 0; echar = 0;
663 return c; 660 return c;
664 } 661 }
665 662
666 unicode = echar; 663 unicode = echar;
667 } 664 }
668 } 665 }
669 666
670 } 667 }
671 else if (0x1161 <= c && c <= 0x1175) { // mchar was input 668 else if (0x1161 <= c && c <= 0x1175) { // mchar was input
672 669
673 if (schar != 0 && mchar == 0) { mchar = c; } 670 if (schar != 0 && mchar == 0) { mchar = c; }
674 671
675 else if (schar != 0 && mchar != 0 && echar == 0) { 672 else if (schar != 0 && mchar != 0 && echar == 0) {
676 673
677 switch (mchar) { 674 switch (mchar) {
678 case 0x1169: 675 case 0x1169:
679 if (c == 0x1161) mchar = 0x116a; 676 if (c == 0x1161) mchar = 0x116a;
680 else if (c == 0x1162) mchar = 0x116b; 677 else if (c == 0x1162) mchar = 0x116b;
681 else if (c == 0x1175) mchar = 0x116c; 678 else if (c == 0x1175) mchar = 0x116c;
682 else { 679 else {
683 schar = 0; mchar = 0; echar = 0; 680 schar = 0; mchar = 0; echar = 0;
684 return c; 681 return c;
685 } 682 }
686 break; 683 break;
687 case 0x116e: 684 case 0x116e:
688 if (c == 0x1165) mchar = 0x116f; 685 if (c == 0x1165) mchar = 0x116f;
689 else if (c == 0x1166) mchar = 0x1170; 686 else if (c == 0x1166) mchar = 0x1170;
690 else if (c == 0x1175) mchar = 0x1171; 687 else if (c == 0x1175) mchar = 0x1171;
691 else { 688 else {
692 schar = 0; mchar = 0; echar = 0; 689 schar = 0; mchar = 0; echar = 0;
693 return c; 690 return c;
694 } 691 }
695 break; 692 break;
696 case 0x1173: 693 case 0x1173:
697 if (c == 0x1175) mchar = 0x1174; 694 if (c == 0x1175) mchar = 0x1174;
698 else { 695 else {
699 schar = 0; mchar = 0; echar = 0; 696 schar = 0; mchar = 0; echar = 0;
700 return c; 697 return c;
701 } 698 }
702 break; 699 break;
703 default: 700 default:
704 schar = 0; mchar = 0; echar = 0; 701 schar = 0; mchar = 0; echar = 0;
705 return c; 702 return c;
706 } 703 }
707 } 704 }
708 else if (schar != 0 && mchar != 0 && echar != 0) { 705 else if (schar != 0 && mchar != 0 && echar != 0) {
709 706
710 emit key( 8, Qt::Key_Backspace, 0, true, false ); 707 emit key( 8, Qt::Key_Backspace, 0, true, false );
711 708
712 ushort prev = 0; 709 ushort prev = 0;
713 switch (echar) { 710 switch (echar) {
714 /* 711 /*
715 case 0x11a9: 712 case 0x11a9:
716 prev = combineKoreanChars(schar, mchar, 0x11a8); 713 prev = combineKoreanChars(schar, mchar, 0x11a8);
717 schar = 0x1100; 714 schar = 0x1100;
718 break; 715 break;
719 */ 716 */
720 case 0x11aa: 717 case 0x11aa:
721 prev = combineKoreanChars(schar, mchar, 0x11a8); 718 prev = combineKoreanChars(schar, mchar, 0x11a8);
722 schar = 0x1109; 719 schar = 0x1109;
723 break; 720 break;
724 case 0x11ac: 721 case 0x11ac:
725 prev = combineKoreanChars(schar, mchar, 0x11ab); 722 prev = combineKoreanChars(schar, mchar, 0x11ab);
726 schar = 0x110c; 723 schar = 0x110c;
727 break; 724 break;
728 case 0x11ad: 725 case 0x11ad:
729 prev = combineKoreanChars(schar, mchar, 0x11ab); 726 prev = combineKoreanChars(schar, mchar, 0x11ab);
730 schar = 0x1112; 727 schar = 0x1112;
731 break; 728 break;
732 case 0x11b0: 729 case 0x11b0:
733 prev = combineKoreanChars(schar, mchar, 0x11af); 730 prev = combineKoreanChars(schar, mchar, 0x11af);
734 schar = 0x1100; 731 schar = 0x1100;
735 break; 732 break;
736 case 0x11b1: 733 case 0x11b1:
737 prev = combineKoreanChars(schar, mchar, 0x11af); 734 prev = combineKoreanChars(schar, mchar, 0x11af);
738 schar = 0x1106; 735 schar = 0x1106;
739 break; 736 break;
740 case 0x11b2: 737 case 0x11b2:
741 prev = combineKoreanChars(schar, mchar, 0x11af); 738 prev = combineKoreanChars(schar, mchar, 0x11af);
742 schar = 0x1107; 739 schar = 0x1107;
743 break; 740 break;
744 case 0x11b3: 741 case 0x11b3:
745 prev = combineKoreanChars(schar, mchar, 0x11af); 742 prev = combineKoreanChars(schar, mchar, 0x11af);
746 schar = 0x1109; 743 schar = 0x1109;
747 break; 744 break;
748 case 0x11b4: 745 case 0x11b4:
749 prev = combineKoreanChars(schar, mchar, 0x11af); 746 prev = combineKoreanChars(schar, mchar, 0x11af);
750 schar = 0x1110; 747 schar = 0x1110;
751 break; 748 break;
752 case 0x11b9: 749 case 0x11b9:
753 prev = combineKoreanChars(schar, mchar, 0x11b8); 750 prev = combineKoreanChars(schar, mchar, 0x11b8);
754 schar = 0x1109; 751 schar = 0x1109;
755 break; 752 break;
756 /* 753 /*
757 case 0x11bb: 754 case 0x11bb:
758 prev = combineKoreanChars(schar, mchar, 0x11ba); 755 prev = combineKoreanChars(schar, mchar, 0x11ba);
759 schar = 0x1109; 756 schar = 0x1109;
760 break; 757 break;
761 */ 758 */
762 default: 759 default:
763 760
764 if (constoe(echar)) { 761 if (constoe(echar)) {
765 762
766 prev = combineKoreanChars(schar, mchar, 0); 763 prev = combineKoreanChars(schar, mchar, 0);
767 schar = constoe(echar); 764 schar = constoe(echar);
768 } 765 }
769 break; 766 break;
770 } 767 }
771 768
772 emit key( prev, prev, 0, true, false ); 769 emit key( prev, prev, 0, true, false );
773 770
774 mchar = c; echar = 0; 771 mchar = c; echar = 0;
775 772
776 return combineKoreanChars(schar, mchar, 0); 773 return combineKoreanChars(schar, mchar, 0);
777 774
778 } 775 }
779 else { 776 else {
780 schar = 0; mchar = 0; echar = 0; 777 schar = 0; mchar = 0; echar = 0;
781 return c; 778 return c;
782 } 779 }
783 780
784 } 781 }
785 else /*if (c == ' ')*/ return c; 782 else /*if (c == ' ')*/ return c;
786 783
787 784
788 // and now... finally delete previous char, and return new char 785 // and now... finally delete previous char, and return new char
789 emit key( 8, Qt::Key_Backspace, 0, true, false ); 786 emit key( 8, Qt::Key_Backspace, 0, true, false );
790 787
791 788
792 return combineKoreanChars( schar, mchar, echar); 789 return combineKoreanChars( schar, mchar, echar);
793 790
794} 791}
795 792
796ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) { 793ushort Keyboard::combineKoreanChars(const ushort s, const ushort m, const ushort e) {
797 794
798 return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00; 795 return ((s - 0x1100) * 588) + ((m - 0x1161) * 28) + (e ? e - 0x11a7 : 0) + 0xac00;
799 796
800} 797}
801 798
802ushort Keyboard::constoe(const ushort c) { 799ushort Keyboard::constoe(const ushort c) {
803 800
804 // converts schars to echars if possible 801 // converts schars to echars if possible
805 802
806 if (0x1100 <= c && c <= 0x1112) { // schar to echar 803 if (0x1100 <= c && c <= 0x1112) { // schar to echar
807 804
808 switch (c) { 805 switch (c) {
809 case 0x1100: return 0x11a8; 806 case 0x1100: return 0x11a8;
810 case 0x1101: return 0x11a9; 807 case 0x1101: return 0x11a9;
811 case 0x1102: return 0x11ab; 808 case 0x1102: return 0x11ab;
812 case 0x1103: return 0x11ae; 809 case 0x1103: return 0x11ae;
813 case 0x1105: return 0x11af; 810 case 0x1105: return 0x11af;
814 case 0x1106: return 0x11b7; 811 case 0x1106: return 0x11b7;
815 case 0x1107: return 0x11b8; 812 case 0x1107: return 0x11b8;
816 case 0x1109: return 0x11ba; 813 case 0x1109: return 0x11ba;
817 case 0x110a: return 0x11bb; 814 case 0x110a: return 0x11bb;
818 case 0x110b: return 0x11bc; 815 case 0x110b: return 0x11bc;
819 case 0x110c: return 0x11bd; 816 case 0x110c: return 0x11bd;
820 case 0x110e: return 0x11be; 817 case 0x110e: return 0x11be;
821 case 0x110f: return 0x11bf; 818 case 0x110f: return 0x11bf;
822 case 0x1110: return 0x11c0; 819 case 0x1110: return 0x11c0;
823 case 0x1111: return 0x11c1; 820 case 0x1111: return 0x11c1;
824 case 0x1112: return 0x11c2; 821 case 0x1112: return 0x11c2;
825 default: return 0; 822 default: return 0;
826 823
827 } 824 }
828 825
829 } else { //echar to schar 826 } else { //echar to schar
830 827
831 switch (c) { 828 switch (c) {
832 case 0x11a8: return 0x1100; 829 case 0x11a8: return 0x1100;
833 case 0x11a9: return 0x1101; 830 case 0x11a9: return 0x1101;
834 case 0x11ab: return 0x1102; 831 case 0x11ab: return 0x1102;
835 case 0x11ae: return 0x1103; 832 case 0x11ae: return 0x1103;
836 case 0x11af: return 0x1105; 833 case 0x11af: return 0x1105;
837 case 0x11b7: return 0x1106; 834 case 0x11b7: return 0x1106;
838 case 0x11b8: return 0x1107; 835 case 0x11b8: return 0x1107;
839 case 0x11ba: return 0x1109; 836 case 0x11ba: return 0x1109;
840 case 0x11bb: return 0x110a; 837 case 0x11bb: return 0x110a;
841 case 0x11bc: return 0x110b; 838 case 0x11bc: return 0x110b;
842 case 0x11bd: return 0x110c; 839 case 0x11bd: return 0x110c;
843 case 0x11be: return 0x110e; 840 case 0x11be: return 0x110e;
844 case 0x11bf: return 0x110f; 841 case 0x11bf: return 0x110f;
845 case 0x11c0: return 0x1110; 842 case 0x11c0: return 0x1110;
846 case 0x11c1: return 0x1111; 843 case 0x11c1: return 0x1111;
847 case 0x11c2: return 0x1112; 844 case 0x11c2: return 0x1112;
848 default: return 0; 845 default: return 0;
849 846
850 } 847 }
851 848
852 } 849 }
853} 850}
854 851
855 852
856// Keys::Keys {{{1 853// Keys::Keys {{{1
857 854
858Keys::Keys() { 855Keys::Keys() {
859 856
860 Config *config = new Config ("multikey"); 857 Config *config = new Config ("multikey");
861 config->setGroup( "keymaps" ); 858 config->setGroup( "keymaps" );
862 QStringList maps = config->readListEntry ("maps", QChar('|')); 859 QString map = config->readEntry( "current" );
863
864 int index = config->readNumEntry( "current", -1 );
865 delete config; 860 delete config;
866 861
867 QString key_map; 862 if (map.isNull() || !(QFile(map).exists())) {
868
869 if (index < 0 || (int)maps.count() <= index) {
870 863
871 Config *config = new Config("locale"); 864 Config *config = new Config("locale");
872 config->setGroup( "Language" ); 865 config->setGroup( "Language" );
873 QString l = config->readEntry( "Language" , "en" ); 866 QString l = config->readEntry( "Language" , "en" );
874 delete config; 867 delete config;
875 868
876 key_map = QPEApplication::qpeDir() + "/share/multikey/" 869 map = QPEApplication::qpeDir() + "/share/multikey/"
877 + l + ".keymap"; 870 + l + ".keymap";
878 871
879 } else { 872 }
880
881 key_map = maps[index];
882 }
883
884 873
885 setKeysFromFile(key_map); 874 setKeysFromFile(map);
886} 875}
887 876
888Keys::Keys(const char * filename) { 877Keys::Keys(const char * filename) {
889 878
890 setKeysFromFile(filename); 879 setKeysFromFile(filename);
891} 880}
892 881
893// Keys::setKeysFromFile {{{2 882// Keys::setKeysFromFile {{{2
894void Keys::setKeysFromFile(const char * filename) { 883void Keys::setKeysFromFile(const char * filename) {
895 884
896 QFile f(filename); 885 QFile f(filename);
897 886
898 if (f.open(IO_ReadOnly)) { 887 if (f.open(IO_ReadOnly)) {
899 888
900 QTextStream t(&f); 889 QTextStream t(&f);
901 int row; 890 int row;
902 int qcode; 891 int qcode;
903 ushort unicode; 892 ushort unicode;
904 int width; 893 int width;
905 QString buf; 894 QString buf;
906 QString comment; 895 QString comment;
907 char * xpm[256]; //couldnt be larger than that... could it? 896 char * xpm[256]; //couldnt be larger than that... could it?
908 QPixmap *xpm2pix = 0; 897 QPixmap *xpm2pix = 0;
909 898
910 buf = t.readLine(); 899 buf = t.readLine();
911 while (buf) { 900 while (buf) {
912 901
913 // key definition 902 // key definition
914 if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) { 903 if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) {
915 // no $1 type referencing!!! this implementation of regexp sucks 904 // no $1 type referencing!!! this implementation of regexp sucks
916 905
917 // dont know of any sscanf() type funcs in Qt lib 906 // dont know of any sscanf() type funcs in Qt lib
918 QTextStream tmp (buf, IO_ReadOnly); 907 QTextStream tmp (buf, IO_ReadOnly);
919 tmp >> row >> qcode >> unicode >> width >> comment; 908 tmp >> row >> qcode >> unicode >> width >> comment;
920 909
921 buf = t.readLine(); 910 buf = t.readLine();
922 int xpmLineCount = 0; 911 int xpmLineCount = 0;
923 xpm2pix = 0; 912 xpm2pix = 0;
924 913
925 // erase blank space 914 // erase blank space
926 while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine(); 915 while (buf.contains(QRegExp("^\\s*$")) && buf) buf = t.readLine();
927 916
928 while (buf.contains(QRegExp("^\\s*\".*\""))) { 917 while (buf.contains(QRegExp("^\\s*\".*\""))) {
929 918
930 QString xpmBuf = buf.stripWhiteSpace(); 919 QString xpmBuf = buf.stripWhiteSpace();
931 920
932 xpm[xpmLineCount] = new char [xpmBuf.length()]; 921 xpm[xpmLineCount] = new char [xpmBuf.length()];
933 922
934 int j = 0; 923 int j = 0;
935 for (ushort i = 0; i < xpmBuf.length(); i++) { 924 for (ushort i = 0; i < xpmBuf.length(); i++) {
936 if (xpmBuf[i].latin1() != '"') { 925 if (xpmBuf[i].latin1() != '"') {
937 926
938 ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); 927 ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1();
939 j++; 928 j++;
940 } 929 }
941 930
942 } 931 }
943 // have to close that facker up 932 // have to close that facker up
944 ((char *)xpm[xpmLineCount])[j] = '\0'; 933 ((char *)xpm[xpmLineCount])[j] = '\0';
945 934
946 xpmLineCount++; 935 xpmLineCount++;
947 buf = t.readLine(); 936 buf = t.readLine();
948 } 937 }
949 if (xpmLineCount) { 938 if (xpmLineCount) {
950 939
951 xpm2pix = new QPixmap((const char **)xpm); 940 xpm2pix = new QPixmap((const char **)xpm);
952 for (int i = 0; i < xpmLineCount; i++) 941 for (int i = 0; i < xpmLineCount; i++)
953 942
954 delete [] (xpm[i]); 943 delete [] (xpm[i]);
955 944
956 } 945 }
957 setKey(row, qcode, unicode, width, xpm2pix); 946 setKey(row, qcode, unicode, width, xpm2pix);
958 } 947 }
959 948
960 // shift map 949 // shift map
961 else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 950 else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
962 951
963 QTextStream tmp (buf, IO_ReadOnly); 952 QTextStream tmp (buf, IO_ReadOnly);
964 ushort lower, shift; 953 ushort lower, shift;
965 tmp >> lower >> shift; 954 tmp >> lower >> shift;
966 955
967 shiftMap.insert(lower, shift); 956 shiftMap.insert(lower, shift);
968 957
969 buf = t.readLine(); 958 buf = t.readLine();
970 } 959 }
971 960
972 // other variables like lang & title 961 // other variables like lang & title
973 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { 962 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
974 963
975 QTextStream tmp (buf, IO_ReadOnly); 964 QTextStream tmp (buf, IO_ReadOnly);
976 QString name, equals, value; 965 QString name, equals, value;
977 966
978 tmp >> name >> equals >> value; 967 tmp >> name >> equals >> value;
979 968
980 if (name == "lang") { 969 if (name == "lang") {
981 970
982 lang = value; 971 lang = value;
983 972
984 } 973 }
985 974
986 buf = t.readLine(); 975 buf = t.readLine();
987 } 976 }
988 // comments 977 // comments
989 else if (buf.contains(QRegExp("^\\s*#"))) { 978 else if (buf.contains(QRegExp("^\\s*#"))) {
990 979
991 buf = t.readLine(); 980 buf = t.readLine();
992 981
993 } else { // blank line, or garbage 982 } else { // blank line, or garbage
994 983
995 buf = t.readLine(); 984 buf = t.readLine();
996 985
997 } 986 }
998 987
999 } 988 }
1000 f.close(); 989 f.close();
1001 } 990 }
1002 991
1003} 992}
1004 993
1005// Keys::setKey {{{2 994// Keys::setKey {{{2
1006void Keys::setKey(const int row, const int qcode, const ushort unicode, 995void Keys::setKey(const int row, const int qcode, const ushort unicode,
1007 const int width, QPixmap *pix) { 996 const int width, QPixmap *pix) {
1008 997
1009 Key * key; 998 Key * key;
1010 key = new Key; 999 key = new Key;
1011 key->qcode = qcode; 1000 key->qcode = qcode;
1012 key->unicode = unicode; 1001 key->unicode = unicode;
1013 key->width = width; 1002 key->width = width;
1014 1003
1015 // share key->pressed between same keys 1004 // share key->pressed between same keys
1016 bool found = 0; 1005 bool found = 0;
1017 for (int i = 1; i <= 5; i++) { 1006 for (int i = 1; i <= 5; i++) {
1018 for (unsigned int j = 0; j < keys[i].count(); j++) 1007 for (unsigned int j = 0; j < keys[i].count(); j++)
1019 if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { 1008 if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) {
1020 1009
1021 key->pressed = keys[i].at(j)->pressed; 1010 key->pressed = keys[i].at(j)->pressed;
1022 found = 1; 1011 found = 1;
1023 } 1012 }
1024 1013
1025 } 1014 }
1026 if (!found) { 1015 if (!found) {
1027 1016
1028 key->pressed = new bool; 1017 key->pressed = new bool;
1029 *(key->pressed) = 0; 1018 *(key->pressed) = 0;
1030 } 1019 }
1031 1020
1032 key->pix = pix; 1021 key->pix = pix;
1033 1022
1034 1023
1035 keys[row].append(key); 1024 keys[row].append(key);
1036} 1025}
1037 1026
1038// Keys::~Keys {{{2 1027// Keys::~Keys {{{2
1039Keys::~Keys() { 1028Keys::~Keys() {
1040 1029
1041 for (int i = 1; i <= 5; i++) 1030 for (int i = 1; i <= 5; i++)
1042 for (unsigned int j = 0; j < keys[i].count(); j++) 1031 for (unsigned int j = 0; j < keys[i].count(); j++)
1043 delete keys[i].at(j); 1032 delete keys[i].at(j);
1044 1033
1045} 1034}
1046 1035
1047// Keys:: other functions {{{2 1036// Keys:: other functions {{{2
1048int Keys::width(const int row, const int col) { 1037int Keys::width(const int row, const int col) {
1049 1038
1050 return keys[row].at(col)->width; 1039 return keys[row].at(col)->width;
1051 1040
1052} 1041}
1053ushort Keys::uni(const int row, const int col) { 1042ushort Keys::uni(const int row, const int col) {
1054 1043
1055 return keys[row].at(col)->unicode; 1044 return keys[row].at(col)->unicode;
1056 1045
1057} 1046}
1058 1047
1059int Keys::qcode(const int row, const int col) { 1048int Keys::qcode(const int row, const int col) {
1060 1049
1061 return keys[row].at(col)->qcode; 1050 return keys[row].at(col)->qcode;
1062} 1051}
1063 1052
1064QPixmap *Keys::pix(const int row, const int col) { 1053QPixmap *Keys::pix(const int row, const int col) {
1065 1054
1066 return keys[row].at(col)->pix; 1055 return keys[row].at(col)->pix;
1067 1056
1068} 1057}
1069bool Keys::pressed(const int row, const int col) { 1058bool Keys::pressed(const int row, const int col) {
1070 1059
1071 return *(keys[row].at(col)->pressed); 1060 return *(keys[row].at(col)->pressed);
1072} 1061}
1073 1062
1074int Keys::numKeys(const int row) { 1063int Keys::numKeys(const int row) {
1075 1064
1076 return keys[row].count(); 1065 return keys[row].count();
1077} 1066}
1078 1067
1079void Keys::setPressed(const int row, const int col, const bool pressed) { 1068void Keys::setPressed(const int row, const int col, const bool pressed) {
1080 1069
1081 *(keys[row].at(col)->pressed) = pressed; 1070 *(keys[row].at(col)->pressed) = pressed;
1082} 1071}
1083 1072
1084ushort Keys::shift(const ushort uni) { 1073ushort Keys::shift(const ushort uni) {
1085 1074
1086 if (shiftMap[uni]) { 1075 if (shiftMap[uni]) {
1087 1076
1088 return shiftMap[uni]; 1077 return shiftMap[uni];
1089 } 1078 }
1090 else 1079 else
1091 return 0; 1080 return 0;
1092 1081
1093} 1082}
1094 1083
1095bool *Keys::pressedPtr(const int row, const int col) { 1084bool *Keys::pressedPtr(const int row, const int col) {
1096 1085
1097 return keys[row].at(col)->pressed; 1086 return keys[row].at(col)->pressed;
1098} 1087}
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index 7a8d4b4..805f0ed 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -1,158 +1,158 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#include <qframe.h> 20#include <qframe.h>
21#include <qmap.h> 21#include <qmap.h>
22#include "../pickboard/pickboardcfg.h" 22#include "../pickboard/pickboardcfg.h"
23#include "../pickboard/pickboardpicks.h" 23#include "../pickboard/pickboardpicks.h"
24#include "configdlg.h" 24#include "configdlg.h"
25 25
26class QTimer; 26class QTimer;
27 27
28class KeyboardConfig : public DictFilterConfig 28class KeyboardConfig : public DictFilterConfig
29{ 29{
30public: 30public:
31 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; } 31 KeyboardConfig(PickboardPicks* p) : DictFilterConfig(p), backspaces(0) { nrows = 1; }
32 virtual void generateText(const QString &s); 32 virtual void generateText(const QString &s);
33 void decBackspaces() { if (backspaces) backspaces--; } 33 void decBackspaces() { if (backspaces) backspaces--; }
34 void incBackspaces() { backspaces++; } 34 void incBackspaces() { backspaces++; }
35 void resetBackspaces() { backspaces = 0; } 35 void resetBackspaces() { backspaces = 0; }
36private: 36private:
37 int backspaces; 37 int backspaces;
38}; 38};
39 39
40 40
41class KeyboardPicks : public PickboardPicks 41class KeyboardPicks : public PickboardPicks
42{ 42{
43 Q_OBJECT 43 Q_OBJECT
44public: 44public:
45 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0) 45 KeyboardPicks(QWidget* parent=0, const char* name=0, WFlags f=0)
46 : PickboardPicks(parent, name, f) { } 46 : PickboardPicks(parent, name, f) { }
47 void initialise(); 47 void initialise();
48 virtual QSize sizeHint() const; 48 virtual QSize sizeHint() const;
49 KeyboardConfig *dc; 49 KeyboardConfig *dc;
50}; 50};
51 51
52 52
53class Keys { 53class Keys {
54public: 54public:
55 55
56 Keys(); 56 Keys();
57 Keys(const char * filename); 57 Keys(const char * filename);
58 ~Keys(); 58 ~Keys();
59 ushort uni(const int row, const int col); 59 ushort uni(const int row, const int col);
60 int qcode(const int row, const int col); 60 int qcode(const int row, const int col);
61 int width(const int row, const int col); 61 int width(const int row, const int col);
62 bool pressed(const int row, const int col); 62 bool pressed(const int row, const int col);
63 bool *pressedPtr(const int row, const int col); 63 bool *pressedPtr(const int row, const int col);
64 ushort shift(const ushort); 64 ushort shift(const ushort);
65 QPixmap *pix(const int row, const int col); 65 QPixmap *pix(const int row, const int col);
66 int numKeys(const int row); 66 int numKeys(const int row);
67 void setKeysFromFile(const char *filename); 67 void setKeysFromFile(const char *filename);
68 void setKey(const int row, const int qcode, const ushort unicode, 68 void setKey(const int row, const int qcode, const ushort unicode,
69 const int width, QPixmap *pix); 69 const int width, QPixmap *pix);
70 void setPressed(const int row, const int col, const bool pressed); 70 void setPressed(const int row, const int col, const bool pressed);
71 QString lang; 71 QString lang;
72 QString title; 72 QString title;
73 73
74private: 74private:
75 75
76 typedef struct Key { 76 typedef struct Key {
77 int qcode; // are qt key codes just unicode values? 77 int qcode; // are qt key codes just unicode values?
78 ushort unicode; 78 ushort unicode;
79 int width; // not pixels but relative key width. normal key is 2 79 int width; // not pixels but relative key width. normal key is 2
80 80
81 // only needed for keys like ctrl that can have multiple keys pressed at once 81 // only needed for keys like ctrl that can have multiple keys pressed at once
82 bool *pressed; 82 bool *pressed;
83 QPixmap *pix; 83 QPixmap *pix;
84 }; 84 };
85 85
86 QList<Key> keys[6]; 86 QList<Key> keys[6];
87 QMap<ushort,ushort> shiftMap; 87 QMap<ushort,ushort> shiftMap;
88 88
89}; 89};
90 90
91class Keyboard : public QFrame 91class Keyboard : public QFrame
92{ 92{
93 Q_OBJECT 93 Q_OBJECT
94public: 94public:
95 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); 95 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
96 ~Keyboard(); 96 ~Keyboard();
97 97
98 void resetState(); 98 void resetState();
99 99
100 void mousePressEvent(QMouseEvent*); 100 void mousePressEvent(QMouseEvent*);
101 void mouseReleaseEvent(QMouseEvent*); 101 void mouseReleaseEvent(QMouseEvent*);
102 void resizeEvent(QResizeEvent*); 102 void resizeEvent(QResizeEvent*);
103 void paintEvent(QPaintEvent* e); 103 void paintEvent(QPaintEvent* e);
104 //void timerEvent(QTimerEvent* e); 104 //void timerEvent(QTimerEvent* e);
105 void drawKeyboard( QPainter &p, int row = -1, int col = -1); 105 void drawKeyboard( QPainter &p, int row = -1, int col = -1);
106 106
107 QSize sizeHint() const; 107 QSize sizeHint() const;
108 108
109signals: 109signals:
110 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); 110 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool );
111 111
112private slots: 112private slots:
113 void repeat(); 113 void repeat();
114 void togglePickboard(bool on_off); 114 void togglePickboard(bool on_off);
115 void setMapToDefault(); 115 void setMapToDefault();
116 void setMapToFile(int index); 116 void setMapToFile(QString map);
117 117
118private: 118private:
119 int getKey( int &w, int j = -1 ); 119 int getKey( int &w, int j = -1 );
120 void clearHighlight(); 120 void clearHighlight();
121 121
122 bool *shift; 122 bool *shift;
123 bool *lock; 123 bool *lock;
124 bool *ctrl; 124 bool *ctrl;
125 bool *alt; 125 bool *alt;
126 uint useLargeKeys:1; 126 uint useLargeKeys:1;
127 uint usePicks:1; 127 uint usePicks:1;
128 128
129 int pressedKeyRow; 129 int pressedKeyRow;
130 int pressedKeyCol; 130 int pressedKeyCol;
131 131
132 KeyboardPicks *picks; 132 KeyboardPicks *picks;
133 133
134 int keyHeight; 134 int keyHeight;
135 int defaultKeyWidth; 135 int defaultKeyWidth;
136 int xoffs; 136 int xoffs;
137 137
138 int unicode; 138 int unicode;
139 int qkeycode; 139 int qkeycode;
140 int modifiers; 140 int modifiers;
141 141
142 int pressTid; 142 int pressTid;
143 bool pressed; 143 bool pressed;
144 144
145 Keys *keys; 145 Keys *keys;
146 146
147 /* for korean input */ 147 /* for korean input */
148 ushort schar, mchar, echar; 148 ushort schar, mchar, echar;
149 ushort parseKoreanInput(ushort c); 149 ushort parseKoreanInput(ushort c);
150 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); 150 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e);
151 ushort constoe(const ushort c); 151 ushort constoe(const ushort c);
152 152
153 QTimer *repeatTimer; 153 QTimer *repeatTimer;
154 154
155 ConfigDlg *configdlg; 155 ConfigDlg *configdlg;
156}; 156};
157 157
158 158