summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/configdlg.cpp238
-rw-r--r--inputmethods/multikey/configdlg.h8
-rw-r--r--inputmethods/multikey/keyboard.cpp42
-rw-r--r--inputmethods/multikey/keyboard.h2
4 files changed, 209 insertions, 81 deletions
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index a8206b7..f127d0e 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -1,389 +1,475 @@
1/* 1/*
2 * TODO 2 * TODO
3 * make a font selection thing (size too) 3 * make a font selection thing (size too)
4 * make a keymap editor 4 * make a keymap editor
5 * make keys translucent 5 * make keys translucent
6 * make vertical keys possible 6 * make vertical keys possible
7 * 7 *
8 * 8 *
9 */ 9 */
10 10
11#include <qpe/qpeapplication.h> 11#include <qpe/qpeapplication.h>
12#include <qpe/config.h> 12#include <qpe/config.h>
13#include <qpe/resource.h>
13 14
14#include <qwidget.h> 15#include <qwidget.h>
15#include <qdialog.h> 16#include <qdialog.h>
16#include <qtabwidget.h> 17#include <qtabwidget.h>
17#include <qvbox.h> 18#include <qvbox.h>
18#include <qgrid.h> 19#include <qgrid.h>
19#include <qgroupbox.h> 20#include <qgroupbox.h>
20#include <qlabel.h> 21#include <qlabel.h>
21#include <qcheckbox.h> 22#include <qcheckbox.h>
22#include <qsizepolicy.h> 23#include <qsizepolicy.h>
23#include <qpushbutton.h> 24#include <qpushbutton.h>
24#include <qlistbox.h> 25#include <qlistbox.h>
25#include <qstringlist.h> 26#include <qstringlist.h>
27#include <qtoolbutton.h>
26#include <opie/ofiledialog.h> 28#include <opie/ofiledialog.h>
27#include <opie/colordialog.h> 29#include <opie/colordialog.h>
28#include <qdir.h> 30#include <qdir.h>
29#include <qfileinfo.h> 31#include <qfileinfo.h>
30#include "configdlg.h" 32#include "configdlg.h"
31#include "keyboard.h" 33#include "keyboard.h"
32 34
33// ConfigDlg::ConfigDlg() {{{1 35// ConfigDlg::ConfigDlg() {{{1
34ConfigDlg::ConfigDlg () : QTabWidget () 36ConfigDlg::ConfigDlg () : QTabWidget ()
35{ 37{
36 setCaption( tr("Multikey Configuration") ); 38 setCaption( tr("Multikey Configuration") );
37 Config config ("multikey"); 39 Config config ("multikey");
38 config.setGroup("keymaps"); 40 config.setGroup("keymaps");
39 QString current_map = config.readEntry("current", 0); 41 QString current_map = config.readEntry("current", 0);
40 42
41 /* 43 /*
42 * 'general config' tab 44 * 'general config' tab
43 */ 45 */
44 46
45 QVBox *gen_box = new QVBox (this); 47 QVBox *gen_box = new QVBox (this);
46 gen_box->setMargin(3); 48 gen_box->setMargin(3);
47 addTab(gen_box, tr("General Settings")); 49 addTab(gen_box, tr("General Settings"));
48 50
49 QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box); 51 QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box);
50 52
51 keymaps = new QListBox (map_group); 53 QHBox *hbox1 = new QHBox(map_group);
54 keymaps = new QListBox(hbox1);
52 keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); 55 keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
56 QVBox *vbox1 = new QVBox(hbox1);
57
58 QToolButton *tb1 = new QToolButton(vbox1, tr("Move Up"));
59 tb1->setPixmap(Resource::loadPixmap("up"));
60 tb1->setAutoRaise(TRUE);
61 tb1->setFocusPolicy(QWidget::NoFocus);
62 tb1->setToggleButton(FALSE);
63 connect(tb1, SIGNAL(clicked()), this, SLOT(moveSelectedUp()));
64
65 QToolButton *tb2 = new QToolButton(vbox1, tr("Move Down"));
66 tb2->setPixmap(Resource::loadPixmap("down"));
67 tb2->setAutoRaise(TRUE);
68 tb2->setFocusPolicy(QWidget::NoFocus);
69 tb2->setToggleButton(FALSE);
70 connect(tb2, SIGNAL(clicked()), this, SLOT(moveSelectedDown()));
53 71
54 QString cur(tr("Current Language")); 72 QString cur(tr("Current Language"));
55 keymaps->insertItem(cur); 73 keymaps->insertItem(cur);
56 keymaps->setSelected(0, true); 74 keymaps->setSelected(0, true);
57 75
58 QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap"); 76 QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
59 default_maps = map_dir.entryList(); // so i can access it in other places 77 default_maps = map_dir.entryList(); // so i can access it in other places
60
61 for (uint i = 0; i < map_dir.count(); i++) {
62
63 QFile map (map_dir.absPath() + "/" + map_dir[i]);
64 if (map.open(IO_ReadOnly)) {
65
66 QString line; bool found = 0;
67
68 map.readLine(line, 1024);
69 while (!map.atEnd()) {
70
71 if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
72
73 keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
74 found = 1;
75 break;
76 }
77 map.readLine(line, 1024);
78 }
79 if (!found) keymaps->insertItem(map_dir.absPath() + "/" + map_dir[i]);
80
81 map.close();
82 }
83 if (map_dir.absPath() + "/" + map_dir[i] == current_map) {
84
85 keymaps->setSelected(i + 1, true);
86 }
87
88 }
89
90 custom_maps = config.readListEntry("maps", QChar('|')); 78 custom_maps = config.readListEntry("maps", QChar('|'));
79 sw_maps = ConfigDlg::loadSw();
91 80
92 for (uint i = 0; i < custom_maps.count(); i++) { 81 QStringList sw_copy(sw_maps);
82 for (uint i = 0; i < sw_copy.count(); i++) {
93 83
94 if (map_dir.exists(QFileInfo(custom_maps[i]).fileName(), false) 84 QString keymap_map;
95 || !QFile::exists(custom_maps[i])) { 85 if (sw_copy[i][0] != '/') { /* share/multikey */
96 86
97 custom_maps.remove(custom_maps.at(i)); 87 keymap_map = map_dir.absPath() + "/" + sw_copy[i];
88 } else {
98 89
99 // remove it from the list too 90 if (map_dir.exists(QFileInfo(sw_copy[i]).fileName(), false)
100 config.writeEntry("maps", custom_maps.join("|")); 91 || !QFile::exists(sw_copy[i])) {
101 92
93 custom_maps.remove(sw_copy[i]);
94 sw_maps.remove(sw_copy[i]);
102 95
103 } else { 96 // remove it from the list too
97 config.writeEntry("maps", custom_maps.join("|"));
104 98
105 QFile map (custom_maps[i]); 99 continue;
106 if (map.open(IO_ReadOnly)) { 100 }
101 keymap_map = sw_copy[i];
102 }
107 103
108 QString line; bool found = 0; 104 QFile map(keymap_map);
105 if (map.open(IO_ReadOnly)) {
109 106
110 map.readLine(line, 1024); 107 QString line; bool found = 0;
111 while (!map.atEnd()) {
112 108
113 if (line.find(QRegExp("^title\\s*=\\s*")) != -1) { 109 map.readLine(line, 1024);
114 110 while (!map.atEnd()) {
115 keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
116 found = 1;
117 break;
118 }
119 map.readLine(line, 1024);
120 }
121 if (!found) keymaps->insertItem(custom_maps[i]);
122
123 map.close();
124 }
125 if (custom_maps[i] == current_map) {
126 111
127 keymaps->setSelected(map_dir.count() + i + 1, true); 112 if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
128 } 113
129 } 114 keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
115 found = 1;
116 break;
117 }
118 map.readLine(line, 1024);
119 }
120 if (!found)
121 keymaps->insertItem(keymap_map);
122
123 map.close();
124 }
125
126 if (keymap_map == current_map) {
127 keymaps->setSelected(i + 1, true);
128 }
130 } 129 }
131 130
132 // have to "+1" because the "current language" listItem... remember? 131 // have to "+1" because the "current language" listItem... remember?
133 132
134 connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int))); 133 connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int)));
135 134
136
137 QGrid *add_remove_grid = new QGrid(2, map_group); 135 QGrid *add_remove_grid = new QGrid(2, map_group);
138 add_remove_grid->setMargin(3); 136 add_remove_grid->setMargin(3);
139 add_remove_grid->setSpacing(3); 137 add_remove_grid->setSpacing(3);
140 138
141 add_button = new QPushButton(tr("Add"), add_remove_grid); 139 add_button = new QPushButton(tr("Add"), add_remove_grid);
142 add_button->setFlat((bool)1); 140 add_button->setFlat(TRUE);
143 connect(add_button, SIGNAL(clicked()), SLOT(addMap())); 141 connect(add_button, SIGNAL(clicked()), SLOT(addMap()));
144 142
145 remove_button = new QPushButton(tr("Remove"), add_remove_grid); 143 remove_button = new QPushButton(tr("Remove"), add_remove_grid);
146 remove_button->setFlat((bool)1); 144 remove_button->setFlat(TRUE);
147 if ((int)map_dir.count() >= keymaps->currentItem()) 145 if (default_maps.find(QFileInfo(current_map).fileName()) != default_maps.end())
148 remove_button->setDisabled(true); 146 remove_button->setDisabled(true);
149 connect(remove_button, SIGNAL(clicked()), SLOT(removeMap())); 147 connect(remove_button, SIGNAL(clicked()), SLOT(removeMap()));
150 148
151 // make a box that will contain the buttons on the bottom 149 // make a box that will contain the buttons on the bottom
152 QGrid *other_grid = new QGrid(2, gen_box); 150 QGrid *other_grid = new QGrid(2, gen_box);
153 pick_button = new QCheckBox(tr("Pickboard"), other_grid); 151 pick_button = new QCheckBox(tr("Pickboard"), other_grid);
154 152
155 config.setGroup ("general"); 153 config.setGroup ("general");
156 bool pick_open = config.readBoolEntry ("usePickboard", (bool)0); // default closed 154 bool pick_open = config.readBoolEntry ("usePickboard", FALSE); // default closed
157 if (pick_open) { 155 if (pick_open) {
158 156
159 pick_button->setChecked(true); 157 pick_button->setChecked(true);
160 } 158 }
161 159
162 // by connecting it after checking it, the signal isn't emmited 160 // by connecting it after checking it, the signal isn't emmited
163 connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog())); 161 connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog()));
164 162
165 repeat_button = new QCheckBox(tr("Key Repeat"), other_grid); 163 repeat_button = new QCheckBox(tr("Key Repeat"), other_grid);
166 bool repeat_on = config.readBoolEntry ("useRepeat", (bool)1); 164 bool repeat_on = config.readBoolEntry ("useRepeat", TRUE);
167 165
168 if (repeat_on) { 166 if (repeat_on) {
169 167
170 repeat_button->setChecked(true); 168 repeat_button->setChecked(true);
171 } 169 }
172 connect (repeat_button, SIGNAL(clicked()), this, SLOT(repeatTog())); 170 connect (repeat_button, SIGNAL(clicked()), this, SLOT(repeatTog()));
173 171
174
175 /* 172 /*
176 * 'color' tab 173 * 'color' tab
177 */ 174 */
178 175
179 QGrid *color_box = new QGrid(2, this); 176 QGrid *color_box = new QGrid(2, this);
180 color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); 177 color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
181 color_box->setMargin(3); 178 color_box->setMargin(3);
182 color_box->setSpacing(3); 179 color_box->setSpacing(3);
183 addTab(color_box, tr("Colors")); 180 addTab(color_box, tr("Colors"));
184 181
185 QLabel *label; 182 QLabel *label;
186 QStringList color; 183 QStringList color;
187 config.setGroup("colors"); 184 config.setGroup("colors");
188 185
189 label = new QLabel(tr("Key Color"), color_box); 186 label = new QLabel(tr("Key Color"), color_box);
190 keycolor_button = new QPushButton(color_box); 187 keycolor_button = new QPushButton(color_box);
191 connect(keycolor_button, SIGNAL(clicked()), SLOT(keyColorClicked())); 188 connect(keycolor_button, SIGNAL(clicked()), SLOT(keyColorClicked()));
192 keycolor_button->setFlat((bool)1); 189 keycolor_button->setFlat(TRUE);
193 color = config.readListEntry("keycolor", QChar(',')); 190 color = config.readListEntry("keycolor", QChar(','));
194 /* 191 /*
195 * hopefully not required 192 * hopefully not required
196 193
197 if (color.isEmpty()) { 194 if (color.isEmpty()) {
198 color = QStringList::split(",", "240,240,240"); 195 color = QStringList::split(",", "240,240,240");
199 config.writeEntry("keycolor", color.join(",")); 196 config.writeEntry("keycolor", color.join(","));
200 197
201 } 198 }
202 */ 199 */
203 keycolor_button->setPalette(QPalette(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))); 200 keycolor_button->setPalette(QPalette(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())));
204 201
205 202
206 label = new QLabel(tr("Key Pressed Color"), color_box); 203 label = new QLabel(tr("Key Pressed Color"), color_box);
207 keycolor_pressed_button = new QPushButton(color_box); 204 keycolor_pressed_button = new QPushButton(color_box);
208 connect(keycolor_pressed_button, SIGNAL(clicked()), SLOT(keyColorPressedClicked())); 205 connect(keycolor_pressed_button, SIGNAL(clicked()), SLOT(keyColorPressedClicked()));
209 keycolor_pressed_button->setFlat((bool)1); 206 keycolor_pressed_button->setFlat(TRUE);
210 color = config.readListEntry("keycolor_pressed", QChar(',')); 207 color = config.readListEntry("keycolor_pressed", QChar(','));
211 keycolor_pressed_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())))); 208 keycolor_pressed_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
212 209
213 label = new QLabel(tr("Line Color"), color_box); 210 label = new QLabel(tr("Line Color"), color_box);
214 keycolor_lines_button = new QPushButton(color_box); 211 keycolor_lines_button = new QPushButton(color_box);
215 connect(keycolor_lines_button, SIGNAL(clicked()), SLOT(keyColorLinesClicked())); 212 connect(keycolor_lines_button, SIGNAL(clicked()), SLOT(keyColorLinesClicked()));
216 keycolor_lines_button->setFlat((bool)1); 213 keycolor_lines_button->setFlat(TRUE);
217 color = config.readListEntry("keycolor_lines", QChar(',')); 214 color = config.readListEntry("keycolor_lines", QChar(','));
218 keycolor_lines_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())))); 215 keycolor_lines_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
219 216
220 217
221 label = new QLabel(tr("Text Color"), color_box); 218 label = new QLabel(tr("Text Color"), color_box);
222 textcolor_button = new QPushButton(color_box); 219 textcolor_button = new QPushButton(color_box);
223 connect(textcolor_button, SIGNAL(clicked()), SLOT(textColorClicked())); 220 connect(textcolor_button, SIGNAL(clicked()), SLOT(textColorClicked()));
224 textcolor_button->setFlat((bool)1); 221 textcolor_button->setFlat(TRUE);
225 color = config.readListEntry("textcolor", QChar(',')); 222 color = config.readListEntry("textcolor", QChar(','));
226 textcolor_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())))); 223 textcolor_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
227 224
228
229 label = new QLabel("", color_box); // a spacer so the above buttons dont expand 225 label = new QLabel("", color_box); // a spacer so the above buttons dont expand
230 label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); 226 label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
227}
228
229ConfigDlg::~ConfigDlg()
230{
231 emit reloadSw();
232}
233
234QStringList ConfigDlg::loadSw()
235{
236 Config *config = new Config("multikey");
237 config->setGroup("keymaps");
238 QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
239 QStringList d_maps = map_dir.entryList(); // so i can access it in other places
240 QStringList c_maps = config->readListEntry("maps", QChar('|'));
241 QStringList s_maps = config->readListEntry("sw", QChar('|'));
242 delete config;
243
244 if (!s_maps.count())
245 {
246 s_maps = d_maps+c_maps;
247 }
248 else
249 {
250 /* Clear non existents entries */
251 QStringList s_copy = s_maps;
252 for (uint i = 0; i < s_copy.count(); ++i) {
253 if (d_maps.find(s_copy[i]) == d_maps.end()
254 && c_maps.find(s_copy[i]) == c_maps.end()) {
255 s_maps.remove(s_copy[i]);
256 }
257 }
258 /* Update sw_maps from default_maps */
259 for (uint i = 0; i < d_maps.count(); ++i) {
260 if (s_maps.find(d_maps[i]) == s_maps.end()) {
261 s_maps.append(d_maps[i]);
262 }
263 }
264 /* Update sw_maps from custom_maps */
265 for (uint i = 0; i < c_maps.count(); ++i) {
266 if (s_maps.find(c_maps[i]) == s_maps.end()) {
267 s_maps.append(c_maps[i]);
268 }
269 }
270 }
271
272 return s_maps;
273}
274
275void ConfigDlg::moveSelectedUp()
276{
277 int i = keymaps->currentItem();
278 /* Ignore Current Language */
279 if (i > 1) {
280 QString t = sw_maps[i-1];
281 sw_maps[i-1] = sw_maps[i-2];
282 sw_maps[i-2] = t;
283
284 QString item = keymaps->currentText();
285 keymaps->removeItem(i);
286 keymaps->insertItem(item, i-1);
287 keymaps->setCurrentItem(i-1);
288
289 Config config("multikey");
290 config.setGroup("keymaps");
291 config.writeEntry("sw", sw_maps, QChar('|'));
292 }
293}
231 294
295void ConfigDlg::moveSelectedDown()
296{
297 int i = keymaps->currentItem();
298 /* Ignore Current Language */
299 if (i > 0 && i < (int)keymaps->count() - 1) {
300 QString t = sw_maps[i-1];
301 sw_maps[i-1] = sw_maps[i];
302 sw_maps[i] = t;
303
304 QString item = keymaps->currentText();
305 keymaps->removeItem(i);
306 keymaps->insertItem(item, i+1);
307 keymaps->setCurrentItem(i+1);
308
309 Config config("multikey");
310 config.setGroup("keymaps");
311 config.writeEntry("sw", sw_maps, QChar('|'));
312 }
232} 313}
233 314
234void ConfigDlg::pickTog() { 315void ConfigDlg::pickTog() {
235 316
236 Config config ("multikey"); 317 Config config ("multikey");
237 config.setGroup ("general"); 318 config.setGroup ("general");
238 config.writeEntry ("usePickboard", pick_button->isChecked()); // default closed 319 config.writeEntry ("usePickboard", pick_button->isChecked()); // default closed
239 320
240 emit pickboardToggled(pick_button->isChecked()); 321 emit pickboardToggled(pick_button->isChecked());
241} 322}
242 323
243void ConfigDlg::repeatTog() { 324void ConfigDlg::repeatTog() {
244 325
245 Config config ("multikey"); 326 Config config ("multikey");
246 config.setGroup ("general"); 327 config.setGroup ("general");
247 config.writeEntry ("useRepeat", repeat_button->isChecked()); // default closed 328 config.writeEntry ("useRepeat", repeat_button->isChecked()); // default closed
248 329
249 emit repeatToggled(repeat_button->isChecked()); 330 emit repeatToggled(repeat_button->isChecked());
250} 331}
251 332
252void ConfigDlg::closeEvent(QCloseEvent *) { 333void ConfigDlg::closeEvent(QCloseEvent *) {
253 334
254 // tell the parent it was closed, so delete me 335 // tell the parent it was closed, so delete me
255 emit configDlgClosed(); 336 emit configDlgClosed();
256} 337}
257 338
258// ConfigDlg::setMap {{{1 339// ConfigDlg::setMap {{{1
259 340
260/* 341/*
261 * the index is kinda screwy, because in the config file, index 0 is just the 342 * the index is kinda screwy, because in the config file, index 0 is just the
262 * first element in the QStringList, but here it's the "Current Language" 343 * first element in the QStringList, but here it's the "Current Language"
263 * listItem. therefor you have to minus one to the index before you access it. 344 * listItem. therefor you have to minus one to the index before you access it.
264 * 345 *
265 */ 346 */
266 347
267void ConfigDlg::setMap(int index) { 348void ConfigDlg::setMap(int index) {
268 349
269 if (index == 0) { 350 if (index == 0) {
270 351
271 remove_button->setDisabled(true); 352 remove_button->setDisabled(true);
272 emit setMapToDefault(); 353 emit setMapToDefault();
273 } 354 }
274 else if ((uint)index <= default_maps.count()) { 355 else if (default_maps.find(sw_maps[index-1]) != default_maps.end()) {
275 356
276 remove_button->setDisabled(true); 357 remove_button->setDisabled(true);
277 emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + default_maps[index - 1]); 358 emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + sw_maps[index - 1]);
278 359
279 } else { 360 } else {
280 361
281 remove_button->setEnabled(true); 362 remove_button->setEnabled(true);
282 emit setMapToFile(custom_maps[index - default_maps.count() - 1]); 363 emit setMapToFile(sw_maps[index - 1]);
283 } 364 }
284} 365}
285 366
286// ConfigDlg::addMap() {{{1 367// ConfigDlg::addMap() {{{1
287void ConfigDlg::addMap() { 368void ConfigDlg::addMap() {
288 369
289 QString map = OFileDialog::getOpenFileName(1, QDir::home().absPath()); 370 QString map = OFileDialog::getOpenFileName(1, QDir::home().absPath());
290 371
291 if (map.isNull()) return; 372 if (map.isNull()) return;
292 373
293 Config config ("multikey"); 374 Config config ("multikey");
294 config.setGroup("keymaps"); 375 config.setGroup("keymaps");
295 QStringList maps = config.readListEntry("maps", QChar('|')); 376 QStringList maps = config.readListEntry("maps", QChar('|'));
296 maps.append(map); 377 maps.append(map);
297 custom_maps.append(map); 378 custom_maps.append(map);
379 if (sw_maps.find(map) == sw_maps.end())
380 sw_maps.append(map);
298 381
299 QFile map_file (map); 382 QFile map_file (map);
300 if (map_file.open(IO_ReadOnly)) { 383 if (map_file.open(IO_ReadOnly)) {
301 384
302 QString line; bool found = 0; 385 QString line; bool found = 0;
303 386
304 map_file.readLine(line, 1024); 387 map_file.readLine(line, 1024);
305 while (!map_file.atEnd()) { 388 while (!map_file.atEnd()) {
306 389
307 if (line.find(QRegExp("^title\\s*=\\s*")) != -1) { 390 if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
308 391
309 keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace()); 392 keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
310 found = 1; 393 found = 1;
311 break; 394 break;
312 } 395 }
313 map_file.readLine(line, 1024); 396 map_file.readLine(line, 1024);
314 } 397 }
315 if (!found) keymaps->insertItem(map); 398 if (!found) keymaps->insertItem(map);
316 399
317 map_file.close(); 400 map_file.close();
318 } 401 }
319 402
320 keymaps->setSelected(keymaps->count() - 1, true); 403 keymaps->setSelected(keymaps->count() - 1, true);
321 404
322 405
323 config.writeEntry("maps", maps, QChar('|')); 406 config.writeEntry("maps", maps, QChar('|'));
407 config.writeEntry("sw", sw_maps, QChar('|'));
324 config.writeEntry("current", map); 408 config.writeEntry("current", map);
325 409
326} 410}
327 411
328// ConfigDlg::removeMap() {{{1 412// ConfigDlg::removeMap() {{{1
329void ConfigDlg::removeMap() { 413void ConfigDlg::removeMap() {
330 414
331 // move selection up one 415 // move selection up one
332 keymaps->setSelected(keymaps->currentItem() - 1, true); 416 keymaps->setSelected(keymaps->currentItem() - 1, true);
333 // delete the next selected item cus you just moved it up 417 // delete the next selected item cus you just moved it up
334 keymaps->removeItem(keymaps->currentItem() + 1); 418 keymaps->removeItem(keymaps->currentItem() + 1);
335 419
336 custom_maps.remove(custom_maps.at(keymaps->currentItem() - default_maps.count())); 420 custom_maps.remove(sw_maps[keymaps->currentItem()]);
421 sw_maps.remove(sw_maps.at(keymaps->currentItem()));
337 422
338 // write the changes 423 // write the changes
339 Config config ("multikey"); 424 Config config ("multikey");
340 config.setGroup("keymaps"); 425 config.setGroup("keymaps");
341 config.writeEntry("maps", custom_maps, QChar('|')); 426 config.writeEntry("maps", custom_maps, QChar('|'));
427 config.writeEntry("sw", sw_maps, QChar('|'));
342} 428}
343 429
344/* ConfigDlg::slots for the color buttons {{{1 430/* ConfigDlg::slots for the color buttons {{{1
345 * 431 *
346 * these four slots are almost the same, except for the names. i was thinking 432 * these four slots are almost the same, except for the names. i was thinking
347 * of making a map with pointers to the buttons and names of the configEntry 433 * of making a map with pointers to the buttons and names of the configEntry
348 * so it could be one slot, but then there would be no way of telling which 434 * so it could be one slot, but then there would be no way of telling which
349 * of the buttons was clicked if they all connect to the same slot. 435 * of the buttons was clicked if they all connect to the same slot.
350 * 436 *
351 */ 437 */
352 438
353void ConfigDlg::keyColorClicked() { 439void ConfigDlg::keyColorClicked() {
354 440
355 Config config ("multikey"); 441 Config config ("multikey");
356 config.setGroup ("colors"); 442 config.setGroup ("colors");
357 443
358 QStringList color = config.readListEntry("keycolor", QChar(',')); 444 QStringList color = config.readListEntry("keycolor", QChar(','));
359 445
360 QColor newcolor = OColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())); 446 QColor newcolor = OColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
361 447
362 color[0].setNum(newcolor.red()); 448 color[0].setNum(newcolor.red());
363 color[1].setNum(newcolor.green()); 449 color[1].setNum(newcolor.green());
364 color[2].setNum(newcolor.blue()); 450 color[2].setNum(newcolor.blue());
365 451
366 config.writeEntry("keycolor", color, QChar(',')); 452 config.writeEntry("keycolor", color, QChar(','));
367 config.write(); 453 config.write();
368 454
369 keycolor_button->setPalette(QPalette(newcolor)); 455 keycolor_button->setPalette(QPalette(newcolor));
370 emit reloadKeyboard(); 456 emit reloadKeyboard();
371} 457}
372void ConfigDlg::keyColorPressedClicked() { 458void ConfigDlg::keyColorPressedClicked() {
373 459
374 Config config ("multikey"); 460 Config config ("multikey");
375 config.setGroup ("colors"); 461 config.setGroup ("colors");
376 462
377 QStringList color = config.readListEntry("keycolor_pressed", QChar(',')); 463 QStringList color = config.readListEntry("keycolor_pressed", QChar(','));
378 464
379 QColor newcolor = OColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())); 465 QColor newcolor = OColorDialog::getColor(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()));
380 466
381 color[0].setNum(newcolor.red()); 467 color[0].setNum(newcolor.red());
382 color[1].setNum(newcolor.green()); 468 color[1].setNum(newcolor.green());
383 color[2].setNum(newcolor.blue()); 469 color[2].setNum(newcolor.blue());
384 470
385 config.writeEntry("keycolor_pressed", color, QChar(',')); 471 config.writeEntry("keycolor_pressed", color, QChar(','));
386 config.write(); 472 config.write();
387 473
388 keycolor_pressed_button->setPalette(QPalette(newcolor)); 474 keycolor_pressed_button->setPalette(QPalette(newcolor));
389 emit reloadKeyboard(); 475 emit reloadKeyboard();
diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h
index 336932b..ea157c5 100644
--- a/inputmethods/multikey/configdlg.h
+++ b/inputmethods/multikey/configdlg.h
@@ -1,59 +1,67 @@
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 ~ConfigDlg ();
17 static QStringList ConfigDlg::loadSw();
16 18
17signals: 19signals:
18 void pickboardToggled(bool on_off); 20 void pickboardToggled(bool on_off);
19 void repeatToggled(bool on_off); 21 void repeatToggled(bool on_off);
20 void setMapToDefault(); 22 void setMapToDefault();
21 void setMapToFile(QString map); 23 void setMapToFile(QString map);
22 void reloadKeyboard(); 24 void reloadKeyboard();
23 void configDlgClosed(); 25 void configDlgClosed();
26 void reloadSw();
27
28protected slots:
29 void moveSelectedUp();
30 void moveSelectedDown();
24 31
25private slots: 32private slots:
26 void pickTog(); 33 void pickTog();
27 void repeatTog(); 34 void repeatTog();
28 void setMap(int index); 35 void setMap(int index);
29 void addMap(); 36 void addMap();
30 void removeMap(); 37 void removeMap();
31 virtual void closeEvent ( QCloseEvent * ); 38 virtual void closeEvent ( QCloseEvent * );
32 39
33 40
34 // all those required slots for the color push buttons 41 // all those required slots for the color push buttons
35 void keyColorClicked(); 42 void keyColorClicked();
36 void keyColorPressedClicked(); 43 void keyColorPressedClicked();
37 void keyColorLinesClicked(); 44 void keyColorLinesClicked();
38 void textColorClicked(); 45 void textColorClicked();
39 46
40private: 47private:
41 QCheckBox *pick_button; 48 QCheckBox *pick_button;
42 QCheckBox *repeat_button; 49 QCheckBox *repeat_button;
43 QListBox *keymaps; 50 QListBox *keymaps;
44 QPushButton *add_button; 51 QPushButton *add_button;
45 QPushButton *remove_button; 52 QPushButton *remove_button;
46 53
47 54
48 QStringList default_maps; // the maps in your share/multikey/ dir 55 QStringList default_maps; // the maps in your share/multikey/ dir
49 QStringList custom_maps; // maps you added with the 'add' button 56 QStringList custom_maps; // maps you added with the 'add' button
57 QStringList sw_maps; // maps, which used in keyboard switch rotation ring
50 58
51 /* color buttons */ 59 /* color buttons */
52 QPushButton *keycolor_button; 60 QPushButton *keycolor_button;
53 QPushButton *keycolor_pressed_button; 61 QPushButton *keycolor_pressed_button;
54 QPushButton *keycolor_lines_button; 62 QPushButton *keycolor_lines_button;
55 QPushButton *textcolor_button; 63 QPushButton *textcolor_button;
56 64
57}; 65};
58 66
59#endif 67#endif
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 2ce6dd3..aec0ad3 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,150 +1,153 @@
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 <qdir.h>
35#include <qtextstream.h> 35#include <qtextstream.h>
36#include <qstringlist.h> 36#include <qstringlist.h>
37 37
38#include <sys/utsname.h> 38#include <sys/utsname.h>
39 39
40using namespace MultiKey; 40using namespace MultiKey;
41 41
42static const char * const kb_config_xpm[] = { 42static const char * const kb_config_xpm[] = {
43"13 7 2 1", 43"13 7 2 1",
44" c None", 44" c None",
45". c #000000", 45". c #000000",
46" ", 46" ",
47" . ", 47" . ",
48" ... ", 48" ... ",
49" ..... ", 49" ..... ",
50" . ", 50" . ",
51" . ", 51" . ",
52" "}; 52" "};
53 53
54/* Keyboard::Keyboard {{{1 */ 54/* Keyboard::Keyboard {{{1 */
55Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : 55Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
56 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), 56 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0),
57 meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0), 57 meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0),
58 useLargeKeys(TRUE), usePicks(0), useRepeat(0), 58 useLargeKeys(TRUE), usePicks(0), useRepeat(0),
59 pressedKeyRow(-1), pressedKeyCol(-1), 59 pressedKeyRow(-1), pressedKeyCol(-1),
60 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), 60 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
61 configdlg(0) 61 configdlg(0)
62 62
63{ 63{
64 64
65 // get the default font 65 // get the default font
66 Config *config = new Config( "qpe" ); 66 Config *config = new Config( "qpe" );
67 config->setGroup( "Appearance" ); 67 config->setGroup( "Appearance" );
68 QString familyStr = config->readEntry( "FontFamily", "smallsmooth" ); 68 QString familyStr = config->readEntry( "FontFamily", "smallsmooth" );
69 delete config; 69 delete config;
70 70
71 config = new Config("multikey"); 71 config = new Config("multikey");
72 config->setGroup ("general"); 72 config->setGroup ("general");
73 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed 73 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed
74 useRepeat = config->readBoolEntry ("useRepeat", 1); 74 useRepeat = config->readBoolEntry ("useRepeat", 1);
75 delete config; 75 delete config;
76 76
77 77
78 setFont( QFont( familyStr, 10 ) ); 78 setFont( QFont( familyStr, 10 ) );
79 79
80 picks = new KeyboardPicks( this ); 80 picks = new KeyboardPicks( this );
81 picks->setFont( QFont( familyStr, 10 ) ); 81 picks->setFont( QFont( familyStr, 10 ) );
82 picks->initialise(); 82 picks->initialise();
83 if (usePicks) { 83 if (usePicks) {
84 84
85 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 85 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
86 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 86 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
87 87
88 } else picks->hide(); 88 } else picks->hide();
89 89
90 loadKeyboardColors(); 90 loadKeyboardColors();
91 91
92 keys = new Keys(); 92 keys = new Keys();
93 93
94 repeatTimer = new QTimer( this ); 94 repeatTimer = new QTimer( this );
95 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); 95 connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
96 96
97 QCopChannel* kbdChannel = new QCopChannel("MultiKey/Keyboard", this);
98 connect(kbdChannel, SIGNAL(received(const QCString &, const QByteArray &)),
99 this, SLOT(receive(const QCString &, const QByteArray &)));
97} 100}
98 101
99Keyboard::~Keyboard() { 102Keyboard::~Keyboard() {
100 103
101 if ( configdlg ) { 104 if ( configdlg ) {
102 delete (ConfigDlg *) configdlg; 105 delete configdlg;
103 configdlg = 0; 106 configdlg = 0;
104 } 107 }
105 108
106} 109}
107 110
108/* Keyboard::resizeEvent {{{1 */ 111/* Keyboard::resizeEvent {{{1 */
109void Keyboard::resizeEvent(QResizeEvent*) 112void Keyboard::resizeEvent(QResizeEvent*)
110{ 113{
111 int ph = picks->sizeHint().height(); 114 int ph = picks->sizeHint().height();
112 picks->setGeometry( 0, 0, width(), ph ); 115 picks->setGeometry( 0, 0, width(), ph );
113 keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1); 116 keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1);
114 117
115 int nk; // number of keys? 118 int nk; // number of keys?
116 if ( useLargeKeys ) { 119 if ( useLargeKeys ) {
117 nk = 15; 120 nk = 15;
118 } else { 121 } else {
119 nk = 19; 122 nk = 19;
120 } 123 }
121 defaultKeyWidth = (width()/nk)/2; 124 defaultKeyWidth = (width()/nk)/2;
122 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? 125 xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
123 126
124} 127}
125 128
126/* KeyboardPicks::initialize {{{1 */ 129/* KeyboardPicks::initialize {{{1 */
127void KeyboardPicks::initialise() 130void KeyboardPicks::initialise()
128{ 131{
129 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); 132 setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
130 mode = 0; 133 mode = 0;
131 dc = new KeyboardConfig(this); 134 dc = new KeyboardConfig(this);
132 configs.append(dc); 135 configs.append(dc);
133} 136}
134 137
135/* KeyboardPicks::sizeHint {{{1 */ 138/* KeyboardPicks::sizeHint {{{1 */
136QSize KeyboardPicks::sizeHint() const 139QSize KeyboardPicks::sizeHint() const
137{ 140{
138 return QSize(240,fontMetrics().lineSpacing()); 141 return QSize(240,fontMetrics().lineSpacing());
139} 142}
140 143
141 144
142/* KeyboardConfig::generateText {{{1 */ 145/* KeyboardConfig::generateText {{{1 */
143void KeyboardConfig::generateText(const QString &s) 146void KeyboardConfig::generateText(const QString &s)
144{ 147{
145#if defined(Q_WS_QWS) || defined(_WS_QWS_) 148#if defined(Q_WS_QWS) || defined(_WS_QWS_)
146 for (int i=0; i<(int)backspaces; i++) { 149 for (int i=0; i<(int)backspaces; i++) {
147 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); 150 parent->emitKey( 0, Qt::Key_Backspace, 0, true, false );
148 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); 151 parent->emitKey( 0, Qt::Key_Backspace, 0, false, false );
149 } 152 }
150 for (int i=0; i<(int)s.length(); i++) { 153 for (int i=0; i<(int)s.length(); i++) {
@@ -372,113 +375,115 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
372 375
373 // circumflex 376 // circumflex
374 qkeycode = 0x2000; 377 qkeycode = 0x2000;
375 } 378 }
376 } 379 }
377 380
378 // Back accent character support 381 // Back accent character support
379 382
380 // the keys from 2c6 ~ 2cf should be used instead of the ascii one 383 // the keys from 2c6 ~ 2cf should be used instead of the ascii one
381 if (unicode == 0x2cb) { 384 if (unicode == 0x2cb) {
382 385
383 unicode = 0; 386 unicode = 0;
384 if (shift || lock) { 387 if (shift || lock) {
385 388
386 // circumblex 389 // circumblex
387 qkeycode = 0x2000; 390 qkeycode = 0x2000;
388 } 391 }
389 else { 392 else {
390 393
391 // back accent 394 // back accent
392 qkeycode = 0x2002; 395 qkeycode = 0x2002;
393 } 396 }
394 } 397 }
395 398
396 // Accent character support 399 // Accent character support
397 400
398 if (unicode == 0x2ca) { 401 if (unicode == 0x2ca) {
399 402
400 unicode = 0; 403 unicode = 0;
401 if (shift || lock) { 404 if (shift || lock) {
402 405
403 // diaeresis 406 // diaeresis
404 qkeycode = 0x2001; 407 qkeycode = 0x2001;
405 } 408 }
406 else { 409 else {
407 410
408 // accent 411 // accent
409 qkeycode = 0x2003; 412 qkeycode = 0x2003;
410 } 413 }
411 } 414 }
412 415
413 416
414 if (unicode == 0) { // either Qt char, or nothing 417 if (unicode == 0) { // either Qt char, or nothing
415 418
416 if (qkeycode == Qt::Key_F1) { // toggle the pickboard 419 if (qkeycode == Qt::Key_F1) { // toggle the pickboard
417 420
418 if ( configdlg ) { 421 if ( configdlg ) {
419 422
420 delete (ConfigDlg *) configdlg; 423 delete configdlg;
421 configdlg = 0; 424 configdlg = 0;
422 } 425 }
423 else { 426 else {
424 configdlg = new ConfigDlg (); 427 configdlg = new ConfigDlg ();
425 connect(configdlg, SIGNAL(setMapToDefault()), 428 connect(configdlg, SIGNAL(setMapToDefault()),
426 this, SLOT(setMapToDefault())); 429 this, SLOT(setMapToDefault()));
427 connect(configdlg, SIGNAL(setMapToFile(QString)), 430 connect(configdlg, SIGNAL(setMapToFile(QString)),
428 this, SLOT(setMapToFile(QString))); 431 this, SLOT(setMapToFile(QString)));
429 connect(configdlg, SIGNAL(pickboardToggled(bool)), 432 connect(configdlg, SIGNAL(pickboardToggled(bool)),
430 this, SLOT(togglePickboard(bool))); 433 this, SLOT(togglePickboard(bool)));
431 connect(configdlg, SIGNAL(repeatToggled(bool)), 434 connect(configdlg, SIGNAL(repeatToggled(bool)),
432 this, SLOT(toggleRepeat(bool))); 435 this, SLOT(toggleRepeat(bool)));
433 connect(configdlg, SIGNAL(reloadKeyboard()), 436 connect(configdlg, SIGNAL(reloadKeyboard()),
434 this, SLOT(reloadKeyboard())); 437 this, SLOT(reloadKeyboard()));
435 connect(configdlg, SIGNAL(configDlgClosed()), 438 connect(configdlg, SIGNAL(configDlgClosed()),
436 this, SLOT(cleanupConfigDlg())); 439 this, SLOT(cleanupConfigDlg()));
440 connect(configdlg, SIGNAL(reloadSw()),
441 this, SLOT(reloadSw()));
437 configdlg->showMaximized(); 442 configdlg->showMaximized();
438 configdlg->show(); 443 configdlg->show();
439 configdlg->raise(); 444 configdlg->raise();
440 } 445 }
441 446
442 } else if (qkeycode == Qt::Key_Control) { 447 } else if (qkeycode == Qt::Key_Control) {
443 need_repaint = TRUE; 448 need_repaint = TRUE;
444 449
445 if (ctrl) { 450 if (ctrl) {
446 451
447 *ctrl = 0; 452 *ctrl = 0;
448 ctrl = 0; 453 ctrl = 0;
449 454
450 } else { 455 } else {
451 456
452 ctrl = keys->pressedPtr(row, col); 457 ctrl = keys->pressedPtr(row, col);
453 need_repaint = TRUE; 458 need_repaint = TRUE;
454 *ctrl = !keys->pressed(row, col); 459 *ctrl = !keys->pressed(row, col);
455 460
456 } 461 }
457 462
458 } else if (qkeycode == Qt::Key_Alt) { 463 } else if (qkeycode == Qt::Key_Alt) {
459 need_repaint = TRUE; 464 need_repaint = TRUE;
460 465
461 if (alt) { 466 if (alt) {
462 *alt = 0; 467 *alt = 0;
463 alt = 0; 468 alt = 0;
464 469
465 } else { 470 } else {
466 471
467 alt = keys->pressedPtr(row, col); 472 alt = keys->pressedPtr(row, col);
468 need_repaint = TRUE; 473 need_repaint = TRUE;
469 *alt = !keys->pressed(row, col); 474 *alt = !keys->pressed(row, col);
470 } 475 }
471 476
472 } else if (qkeycode == Qt::Key_Shift) { 477 } else if (qkeycode == Qt::Key_Shift) {
473 need_repaint = TRUE; 478 need_repaint = TRUE;
474 479
475 if (shift) { 480 if (shift) {
476 *shift = 0; 481 *shift = 0;
477 shift = 0; 482 shift = 0;
478 } 483 }
479 else { 484 else {
480 shift = keys->pressedPtr(row, col); 485 shift = keys->pressedPtr(row, col);
481 *shift = 1; 486 *shift = 1;
482 if (lock) { 487 if (lock) {
483 *lock = 0; 488 *lock = 0;
484 lock = 0; 489 lock = 0;
@@ -715,96 +720,107 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
715 qkeycode = QChar(unicode).upper(); 720 qkeycode = QChar(unicode).upper();
716 unicode = qkeycode - '@'; 721 unicode = qkeycode - '@';
717 } 722 }
718 723
719 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false); 724 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false);
720 725
721 // pickboard stuff 726 // pickboard stuff
722 if (usePicks) { 727 if (usePicks) {
723 728
724 KeyboardConfig *dc = picks->dc; 729 KeyboardConfig *dc = picks->dc;
725 730
726 if (dc) { 731 if (dc) {
727 if (qkeycode == Qt::Key_Backspace) { 732 if (qkeycode == Qt::Key_Backspace) {
728 dc->input.remove(dc->input.last()); // remove last input 733 dc->input.remove(dc->input.last()); // remove last input
729 dc->decBackspaces(); 734 dc->decBackspaces();
730 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) { 735 } else if ( qkeycode == Qt::Key_Return || QChar(unicode).isPunct() || QChar(unicode).isSpace() || unicode == 0) {
731 dc->input.clear(); 736 dc->input.clear();
732 dc->resetBackspaces(); 737 dc->resetBackspaces();
733 } else { 738 } else {
734 dc->add(QString(QChar(unicode))); 739 dc->add(QString(QChar(unicode)));
735 dc->incBackspaces(); 740 dc->incBackspaces();
736 } 741 }
737 } 742 }
738 picks->repaint(); 743 picks->repaint();
739 } 744 }
740 745
741 746
742 // painting 747 // painting
743 pressed = TRUE; 748 pressed = TRUE;
744 749
745 pressedKeyRow = row; 750 pressedKeyRow = row;
746 pressedKeyCol = col; 751 pressedKeyCol = col;
747 752
748 if (need_repaint) repaint(FALSE); 753 if (need_repaint) repaint(FALSE);
749 else { // just paint the one key pressed 754 else { // just paint the one key pressed
750 755
751 756
752 757
753 QPainter p(this); 758 QPainter p(this);
754 drawKeyboard(p, row, col); 759 drawKeyboard(p, row, col);
755 760
756 } 761 }
757 762
758 if (useRepeat) repeatTimer->start( 800 ); 763 if (useRepeat) repeatTimer->start( 800 );
759 //pressTid = startTimer(80); 764 //pressTid = startTimer(80);
760 765
761} 766}
762 767
768void Keyboard::receive(const QCString &msg, const QByteArray &data)
769{
770 if (msg == "setmultikey(QString)") {
771 QDataStream stream(data, IO_ReadOnly);
772 QString map;
773 stream >> map;
774 setMapToFile(map);
775 } else if (msg == "getmultikey()") {
776 reloadSw();
777 }
778}
763 779
764/* Keyboard::mouseReleaseEvent {{{1 */ 780/* Keyboard::mouseReleaseEvent {{{1 */
765void Keyboard::mouseReleaseEvent(QMouseEvent*) 781void Keyboard::mouseReleaseEvent(QMouseEvent*)
766{ 782{
767 pressed = FALSE; 783 pressed = FALSE;
768 //if ( pressTid == 0 ) 784 //if ( pressTid == 0 )
769#if defined(Q_WS_QWS) || defined(_WS_QWS_) 785#if defined(Q_WS_QWS) || defined(_WS_QWS_)
770 if ( unicode != -1 ) { 786 if ( unicode != -1 ) {
771 emit key( unicode, qkeycode, modifiers, false, false ); 787 emit key( unicode, qkeycode, modifiers, false, false );
772 repeatTimer->stop(); 788 repeatTimer->stop();
773 } 789 }
774#endif 790#endif
775 if (shift && unicode != 0) { 791 if (shift && unicode != 0) {
776 792
777 793
778 *shift = 0; // unpress shift key 794 *shift = 0; // unpress shift key
779 shift = 0; // reset the shift pointer 795 shift = 0; // reset the shift pointer
780 repaint(FALSE); 796 repaint(FALSE);
781 797
782 } 798 }
783 if (ctrl && unicode != 0) { 799 if (ctrl && unicode != 0) {
784 800
785 *ctrl = 0; 801 *ctrl = 0;
786 ctrl = 0; 802 ctrl = 0;
787 repaint(FALSE); 803 repaint(FALSE);
788 804
789 } 805 }
790 if (alt && alt != 0) { 806 if (alt && alt != 0) {
791 807
792 *alt = 0; 808 *alt = 0;
793 alt = 0; 809 alt = 0;
794 repaint(FALSE); 810 repaint(FALSE);
795 811
796 } 812 }
797 813
798 /* 814 /*
799 * do not make the meta key release after being pressed 815 * do not make the meta key release after being pressed
800 * 816 *
801 817
802 else if (meta && unicode != 0) { 818 else if (meta && unicode != 0) {
803 819
804 *meta = 0; 820 *meta = 0;
805 meta = 0; 821 meta = 0;
806 repaint(FALSE); 822 repaint(FALSE);
807 } 823 }
808 824
809 */ 825 */
810 826
@@ -866,111 +882,127 @@ void Keyboard::resetState()
866 if (shift) { *shift = 0; shift = 0; } 882 if (shift) { *shift = 0; shift = 0; }
867 if (lock) {*lock = 0; lock = 0; } 883 if (lock) {*lock = 0; lock = 0; }
868 if (meta) { *meta = 0; meta = 0; } 884 if (meta) { *meta = 0; meta = 0; }
869 if (circumflex) { *circumflex = 0; circumflex = 0; } 885 if (circumflex) { *circumflex = 0; circumflex = 0; }
870 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 886 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
871 if (baccent) { *baccent = 0; baccent = 0; } 887 if (baccent) { *baccent = 0; baccent = 0; }
872 if (accent) { *accent = 0; accent = 0; } 888 if (accent) { *accent = 0; accent = 0; }
873 889
874 schar = mchar = echar = 0; 890 schar = mchar = echar = 0;
875 picks->resetState(); 891 picks->resetState();
876} 892}
877 893
878/* Keyboard::togglePickboard {{{1 */ 894/* Keyboard::togglePickboard {{{1 */
879void Keyboard::togglePickboard(bool on_off) 895void Keyboard::togglePickboard(bool on_off)
880{ 896{
881 usePicks = on_off; 897 usePicks = on_off;
882 if (usePicks) { 898 if (usePicks) {
883 picks->show(); 899 picks->show();
884 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send 900 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
885 //adjustSize(); 901 //adjustSize();
886 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 902 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
887 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 903 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
888 } else { 904 } else {
889 905
890 picks->hide(); 906 picks->hide();
891 picks->resetState(); 907 picks->resetState();
892 //move(x(), y() + picks->height()); 908 //move(x(), y() + picks->height());
893 //adjustSize(); 909 //adjustSize();
894 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 910 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
895 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 911 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
896 912
897 } 913 }
898 /* 914 /*
899 * this closes && opens the input method 915 * this closes && opens the input method
900 */ 916 */
901 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 917 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
902 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 918 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
903} 919}
904 920
905void Keyboard::toggleRepeat(bool on) { 921void Keyboard::toggleRepeat(bool on) {
906 922
907 useRepeat = on; 923 useRepeat = on;
908 //cout << "setting useRepeat to: " << useRepeat << "\n"; 924 //cout << "setting useRepeat to: " << useRepeat << "\n";
909} 925}
910 926
911void Keyboard::cleanupConfigDlg() { 927void Keyboard::cleanupConfigDlg() {
912 928
913 if ( configdlg ) { 929 if ( configdlg ) {
914 delete (ConfigDlg *) configdlg; 930 delete configdlg;
915 configdlg = 0; 931 configdlg = 0;
916 } 932 }
917} 933}
918 934
935void Keyboard::reloadSw() {
936 QCopEnvelope e("MultiKey/Switcher", "setsw(QString,QString)");
937
938 Config* config = new Config("multikey");
939 config->setGroup("keymaps");
940 QString current_map = config->readEntry("current", "en.keymap");
941 delete config;
942
943 e << ConfigDlg::loadSw().join("|") << current_map;
944}
945
919/* Keyboard::setMapTo ... {{{1 */ 946/* Keyboard::setMapTo ... {{{1 */
920void Keyboard::setMapToDefault() { 947void Keyboard::setMapToDefault() {
921 948
922 949
923 /* load current locale language map */ 950 /* load current locale language map */
924 Config *config = new Config("locale"); 951 Config *config = new Config("locale");
925 config->setGroup( "Language" ); 952 config->setGroup( "Language" );
926 QString l = config->readEntry( "Language" , "en" ); 953 QString l = config->readEntry( "Language" , "en" );
927 delete config; 954 delete config;
928 955
956 /* if Language represents as en_US, ru_RU, etc... */
957 int d = l.find('_');
958 if (d != -1) {
959 l.remove(d, l.length()-d);
960 }
929 QString key_map = QPEApplication::qpeDir() + "share/multikey/" 961 QString key_map = QPEApplication::qpeDir() + "share/multikey/"
930 + l + ".keymap"; 962 + l + ".keymap";
931 963
932 /* save change to multikey config file */ 964 /* save change to multikey config file */
933 config = new Config("multikey"); 965 config = new Config("multikey");
934 config->setGroup ("keymaps"); 966 config->setGroup ("keymaps");
935 config->writeEntry ("current", key_map); // default closed 967 config->writeEntry ("current", key_map); // default closed
936 delete config; 968 delete config;
937 969
938 int prevRows = keys->rows(); 970 int prevRows = keys->rows();
939 971
940 delete keys; 972 delete keys;
941 keys = new Keys(key_map); 973 keys = new Keys(key_map);
942 974
943 // have to repaint the keyboard 975 // have to repaint the keyboard
944 if (prevRows != keys->rows()) { 976 if (prevRows != keys->rows()) {
945 977
946 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 978 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
947 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 979 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
948 980
949 } else repaint(FALSE); 981 } else repaint(FALSE);
950 982
951 resetState(); 983 resetState();
952} 984}
953 985
954void Keyboard::setMapToFile(QString map) { 986void Keyboard::setMapToFile(QString map) {
955 987
956 /* save change to multikey config file */ 988 /* save change to multikey config file */
957 Config *config = new Config("multikey"); 989 Config *config = new Config("multikey");
958 config->setGroup ("keymaps"); 990 config->setGroup ("keymaps");
959 config->writeEntry ("current", map); // default closed 991 config->writeEntry ("current", map); // default closed
960 992
961 delete config; 993 delete config;
962 994
963 int prevRows = keys->rows(); 995 int prevRows = keys->rows();
964 996
965 delete keys; 997 delete keys;
966 if (QFile(map).exists()) 998 if (QFile(map).exists())
967 keys = new Keys(map); 999 keys = new Keys(map);
968 else 1000 else
969 keys = new Keys(); 1001 keys = new Keys();
970 1002
971 if (keys->rows() != prevRows) { 1003 if (keys->rows() != prevRows) {
972 1004
973 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()"); 1005 QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
974 QCopChannel::send ("QPE/TaskBar", "showInputMethod()"); 1006 QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
975 } 1007 }
976 else repaint(FALSE); 1008 else repaint(FALSE);
@@ -1461,97 +1493,97 @@ void Keys::setKeysFromFile(const char * filename) {
1461 1493
1462 QTextStream tmp (buf, IO_ReadOnly); 1494 QTextStream tmp (buf, IO_ReadOnly);
1463 ushort lower, shift; 1495 ushort lower, shift;
1464 QChar c; 1496 QChar c;
1465 tmp >> c >> lower >> shift; 1497 tmp >> c >> lower >> shift;
1466 1498
1467 circumflexMap.insert(lower, shift); 1499 circumflexMap.insert(lower, shift);
1468 1500
1469 buf = t.readLine(); 1501 buf = t.readLine();
1470 } 1502 }
1471 // diaeresis 1503 // diaeresis
1472 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1504 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1473 1505
1474 QTextStream tmp (buf, IO_ReadOnly); 1506 QTextStream tmp (buf, IO_ReadOnly);
1475 ushort lower, shift; 1507 ushort lower, shift;
1476 QChar d; 1508 QChar d;
1477 tmp >> d >> lower >> shift; 1509 tmp >> d >> lower >> shift;
1478 1510
1479 diaeresisMap.insert(lower, shift); 1511 diaeresisMap.insert(lower, shift);
1480 1512
1481 buf = t.readLine(); 1513 buf = t.readLine();
1482 } 1514 }
1483 // back accent 1515 // back accent
1484 else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1516 else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1485 1517
1486 QTextStream tmp (buf, IO_ReadOnly); 1518 QTextStream tmp (buf, IO_ReadOnly);
1487 ushort lower, shift; 1519 ushort lower, shift;
1488 QChar d; 1520 QChar d;
1489 tmp >> d >> lower >> shift; 1521 tmp >> d >> lower >> shift;
1490 1522
1491 baccentMap.insert(lower, shift); 1523 baccentMap.insert(lower, shift);
1492 1524
1493 qDebug ("Estoy aadiendo %i con %i", lower, shift); 1525 qDebug ("Estoy aadiendo %i con %i", lower, shift);
1494 buf = t.readLine(); 1526 buf = t.readLine();
1495 } 1527 }
1496 // accent 1528 // accent
1497 else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1529 else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1498 1530
1499 QTextStream tmp (buf, IO_ReadOnly); 1531 QTextStream tmp (buf, IO_ReadOnly);
1500 ushort lower, shift; 1532 ushort lower, shift;
1501 QChar d; 1533 QChar d;
1502 tmp >> d >> lower >> shift; 1534 tmp >> d >> lower >> shift;
1503 1535
1504 accentMap.insert(lower, shift); 1536 accentMap.insert(lower, shift);
1505 1537
1506 buf = t.readLine(); 1538 buf = t.readLine();
1507 } 1539 }
1508 1540
1509 // other variables like lang & title 1541 // other variables like lang & title & sw
1510 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { 1542 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
1511 1543
1512 QTextStream tmp (buf, IO_ReadOnly); 1544 QTextStream tmp (buf, IO_ReadOnly);
1513 QString name, equals, value; 1545 QString name, equals, value;
1514 1546
1515 tmp >> name >> equals >> value; 1547 tmp >> name >> equals >> value;
1516 1548
1517 if (name == "lang") { 1549 if (name == "lang") {
1518 1550
1519 lang = value; 1551 lang = value;
1520 1552
1521 } 1553 }
1522 1554
1523 buf = t.readLine(); 1555 buf = t.readLine();
1524 } 1556 }
1525 // comments 1557 // comments
1526 else if (buf.contains(QRegExp("^\\s*#"))) { 1558 else if (buf.contains(QRegExp("^\\s*#"))) {
1527 1559
1528 buf = t.readLine(); 1560 buf = t.readLine();
1529 1561
1530 } else { // blank line, or garbage 1562 } else { // blank line, or garbage
1531 1563
1532 buf = t.readLine(); 1564 buf = t.readLine();
1533 1565
1534 } 1566 }
1535 1567
1536 } 1568 }
1537 1569
1538 f.close(); 1570 f.close();
1539 } else { 1571 } else {
1540 // We couldnt find the selected keymap, give them a configure button 1572 // We couldnt find the selected keymap, give them a configure button
1541 QImage * btn = new QImage((const char ** )kb_config_xpm); 1573 QImage * btn = new QImage((const char ** )kb_config_xpm);
1542 setKey(1, 0x1030, 0, 2, btn); 1574 setKey(1, 0x1030, 0, 2, btn);
1543 } 1575 }
1544 1576
1545} 1577}
1546 1578
1547 1579
1548// Keys::setKey {{{2 1580// Keys::setKey {{{2
1549void Keys::setKey(const int row, const int qcode, const ushort unicode, 1581void Keys::setKey(const int row, const int qcode, const ushort unicode,
1550 const int width, QImage *pix) { 1582 const int width, QImage *pix) {
1551 1583
1552 Key * key; 1584 Key * key;
1553 key = new Key; 1585 key = new Key;
1554 key->qcode = qcode; 1586 key->qcode = qcode;
1555 key->unicode = unicode; 1587 key->unicode = unicode;
1556 key->width = width; 1588 key->width = width;
1557 1589
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index 20c5cee..0b56988 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -85,99 +85,101 @@ private:
85 typedef struct Key { 85 typedef struct Key {
86 int qcode; // are qt key codes just unicode values? 86 int qcode; // are qt key codes just unicode values?
87 ushort unicode; 87 ushort unicode;
88 int width; // not pixels but relative key width. normal key is 2 88 int width; // not pixels but relative key width. normal key is 2
89 89
90 // only needed for keys like ctrl that can have multiple keys pressed at once 90 // only needed for keys like ctrl that can have multiple keys pressed at once
91 bool *pressed; 91 bool *pressed;
92 QImage *pix; 92 QImage *pix;
93 }; 93 };
94 94
95 QList<Key> keys[6]; 95 QList<Key> keys[6];
96 QMap<ushort,ushort> shiftMap; 96 QMap<ushort,ushort> shiftMap;
97 QMap<ushort,ushort> metaMap; 97 QMap<ushort,ushort> metaMap;
98 QMap<ushort,ushort> circumflexMap; 98 QMap<ushort,ushort> circumflexMap;
99 QMap<ushort,ushort> diaeresisMap; 99 QMap<ushort,ushort> diaeresisMap;
100 QMap<ushort,ushort> baccentMap; 100 QMap<ushort,ushort> baccentMap;
101 QMap<ushort,ushort> accentMap; 101 QMap<ushort,ushort> accentMap;
102 102
103}; 103};
104 104
105class Keyboard : public QFrame 105class Keyboard : public QFrame
106{ 106{
107 Q_OBJECT 107 Q_OBJECT
108public: 108public:
109 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); 109 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
110 ~Keyboard(); 110 ~Keyboard();
111 111
112 void resetState(); 112 void resetState();
113 113
114 void mousePressEvent(QMouseEvent*); 114 void mousePressEvent(QMouseEvent*);
115 void mouseReleaseEvent(QMouseEvent*); 115 void mouseReleaseEvent(QMouseEvent*);
116 void resizeEvent(QResizeEvent*); 116 void resizeEvent(QResizeEvent*);
117 void paintEvent(QPaintEvent* e); 117 void paintEvent(QPaintEvent* e);
118 //void timerEvent(QTimerEvent* e); 118 //void timerEvent(QTimerEvent* e);
119 void drawKeyboard( QPainter &p, int row = -1, int col = -1); 119 void drawKeyboard( QPainter &p, int row = -1, int col = -1);
120 120
121 QSize sizeHint() const; 121 QSize sizeHint() const;
122 122
123signals: 123signals:
124 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); 124 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool );
125 125
126private slots: 126private slots:
127 void repeat(); 127 void repeat();
128 void togglePickboard(bool on_off); 128 void togglePickboard(bool on_off);
129 void toggleRepeat(bool on_off); 129 void toggleRepeat(bool on_off);
130 void setMapToDefault(); 130 void setMapToDefault();
131 void setMapToFile(QString map); 131 void setMapToFile(QString map);
132 void cleanupConfigDlg(); 132 void cleanupConfigDlg();
133 void reloadSw();
133 134
134 // used to redraw keyboard after edited colors 135 // used to redraw keyboard after edited colors
135 void reloadKeyboard(); 136 void reloadKeyboard();
137 void receive( const QCString &msg, const QByteArray &data );
136 138
137private: 139private:
138 int getKey( int &w, int j = -1 ); 140 int getKey( int &w, int j = -1 );
139 void clearHighlight(); 141 void clearHighlight();
140 142
141 bool *shift; 143 bool *shift;
142 bool *lock; 144 bool *lock;
143 bool *ctrl; 145 bool *ctrl;
144 bool *alt; 146 bool *alt;
145 bool *meta; 147 bool *meta;
146 bool *circumflex; 148 bool *circumflex;
147 bool *diaeresis; 149 bool *diaeresis;
148 bool *baccent; 150 bool *baccent;
149 bool *accent; 151 bool *accent;
150 152
151 uint useLargeKeys:1; 153 uint useLargeKeys:1;
152 uint usePicks:1; 154 uint usePicks:1;
153 uint useRepeat:1; 155 uint useRepeat:1;
154 156
155 int pressedKeyRow; 157 int pressedKeyRow;
156 int pressedKeyCol; 158 int pressedKeyCol;
157 159
158 KeyboardPicks *picks; 160 KeyboardPicks *picks;
159 161
160 int keyHeight; 162 int keyHeight;
161 int defaultKeyWidth; 163 int defaultKeyWidth;
162 int xoffs; 164 int xoffs;
163 165
164 int unicode; 166 int unicode;
165 int qkeycode; 167 int qkeycode;
166 int modifiers; 168 int modifiers;
167 169
168 int pressTid; 170 int pressTid;
169 bool pressed; 171 bool pressed;
170 172
171 Keys *keys; 173 Keys *keys;
172 174
173 /* for korean input */ 175 /* for korean input */
174 ushort schar, mchar, echar; 176 ushort schar, mchar, echar;
175 ushort parseKoreanInput(ushort c); 177 ushort parseKoreanInput(ushort c);
176 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e); 178 ushort combineKoreanChars(const ushort s, const ushort m, const ushort e);
177 ushort constoe(const ushort c); 179 ushort constoe(const ushort c);
178 180
179 QTimer *repeatTimer; 181 QTimer *repeatTimer;
180 182
181 /* colors */ 183 /* colors */
182 void loadKeyboardColors(); 184 void loadKeyboardColors();
183 QColor keycolor; 185 QColor keycolor;