summaryrefslogtreecommitdiff
authorhash <hash>2002-08-19 05:35:38 (UTC)
committer hash <hash>2002-08-19 05:35:38 (UTC)
commit64a00421be85d223072e087d4d3c9ecdad464095 (patch) (unidiff)
tree66cf285aa1a8d17126c5b59125c7d91fc2c08c45
parentd92fbca743e676182a8f33ae4c28044031143fb0 (diff)
downloadopie-64a00421be85d223072e087d4d3c9ecdad464095.zip
opie-64a00421be85d223072e087d4d3c9ecdad464095.tar.gz
opie-64a00421be85d223072e087d4d3c9ecdad464095.tar.bz2
now reads maps in default dir, and also lets you add/remove your own maps
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--inputmethods/multikey/configdlg.cpp89
-rw-r--r--inputmethods/multikey/configdlg.h8
-rw-r--r--inputmethods/multikey/keyboard.cpp35
-rw-r--r--inputmethods/multikey/keyboard.h2
4 files changed, 92 insertions, 42 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);
49 55
50 config.setGroup ("keymaps"); 56 QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
51 QStringList maps = config.readListEntry("maps", QChar('|')); 57 default_maps = map_dir.entryList(); // so i can access it in other places
58
59 for (uint i = 0; i <map_dir.count(); i++) {
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())
140 remove_button->setDisabled(true); 171 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);
178
179 } else {
145 180
146 if (!remove_button->isEnabled())
147 remove_button->setEnabled(true); 181 remove_button->setEnabled(true);
148 182
149 emit setMapToFile(index - 1); 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
@@ -197,194 +197,194 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
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
@@ -426,219 +426,216 @@ void Keyboard::mouseReleaseEvent(QMouseEvent*)
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) { // ¤²
@@ -766,216 +763,208 @@ ushort Keyboard::parseKoreanInput (ushort c) {
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 {
880
881 key_map = maps[index];
882 } 872 }
883 873
884 874 setKeysFromFile(map);
885 setKeysFromFile(key_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
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
@@ -20,139 +20,139 @@
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