summaryrefslogtreecommitdiff
authorhash <hash>2002-10-14 16:53:01 (UTC)
committer hash <hash>2002-10-14 16:53:01 (UTC)
commit03d355295dd4fd6c37e54d281280127c0cf8a068 (patch) (unidiff)
treef36c74dd7909644a2ade8b4fc8fe2aeb4af32e90
parent8168216f961dc60db1acdea8671eeaa93e3ed560 (diff)
downloadopie-03d355295dd4fd6c37e54d281280127c0cf8a068.zip
opie-03d355295dd4fd6c37e54d281280127c0cf8a068.tar.gz
opie-03d355295dd4fd6c37e54d281280127c0cf8a068.tar.bz2
patch hector sent it for accent and back accent support
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/keyboard.cpp148
-rw-r--r--inputmethods/multikey/keyboard.h6
2 files changed, 153 insertions, 1 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 28d5cab..1dd8ca1 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -20,49 +20,49 @@
20 20
21#include "keyboard.h" 21#include "keyboard.h"
22#include "configdlg.h" 22#include "configdlg.h"
23 23
24#include <qpe/global.h> 24#include <qpe/global.h>
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
26 26
27#include <qwindowsystem_qws.h> 27#include <qwindowsystem_qws.h>
28#include <qpainter.h> 28#include <qpainter.h>
29#include <qfontmetrics.h> 29#include <qfontmetrics.h>
30#include <qtimer.h> 30#include <qtimer.h>
31#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
32#include <qpe/config.h> 32#include <qpe/config.h>
33#include <ctype.h> 33#include <ctype.h>
34#include <qfile.h> 34#include <qfile.h>
35#include <qtextstream.h> 35#include <qtextstream.h>
36#include <qstringlist.h> 36#include <qstringlist.h>
37 37
38#include <sys/utsname.h> 38#include <sys/utsname.h>
39 39
40 40
41/* Keyboard::Keyboard {{{1 */ 41/* Keyboard::Keyboard {{{1 */
42Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : 42Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
43 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), 43 QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0),
44 meta(0), circumflex(0), diaeresis(0), 44 meta(0), circumflex(0), diaeresis(0), baccent(0), accent(0),
45 useLargeKeys(TRUE), usePicks(0), useRepeat(0), 45 useLargeKeys(TRUE), usePicks(0), useRepeat(0),
46 pressedKeyRow(-1), pressedKeyCol(-1), 46 pressedKeyRow(-1), pressedKeyCol(-1),
47 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), 47 unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
48 configdlg(0) 48 configdlg(0)
49 49
50{ 50{
51 51
52 // get the default font 52 // get the default font
53 Config *config = new Config( "qpe" ); 53 Config *config = new Config( "qpe" );
54 config->setGroup( "Appearance" ); 54 config->setGroup( "Appearance" );
55 QString familyStr = config->readEntry( "FontFamily", "fixed" ); 55 QString familyStr = config->readEntry( "FontFamily", "fixed" );
56 delete config; 56 delete config;
57 57
58 config = new Config("multikey"); 58 config = new Config("multikey");
59 config->setGroup ("general"); 59 config->setGroup ("general");
60 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed 60 usePicks = config->readBoolEntry ("usePickboard", 0); // default closed
61 useRepeat = config->readBoolEntry ("useRepeat", 1); 61 useRepeat = config->readBoolEntry ("useRepeat", 1);
62 delete config; 62 delete config;
63 63
64 64
65 setFont( QFont( familyStr, 10 ) ); 65 setFont( QFont( familyStr, 10 ) );
66 66
67 picks = new KeyboardPicks( this ); 67 picks = new KeyboardPicks( this );
68 picks->setFont( QFont( familyStr, 10 ) ); 68 picks->setFont( QFont( familyStr, 10 ) );
@@ -169,57 +169,65 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
169 for (int i = 0; i < col; i++) { 169 for (int i = 0; i < col; i++) {
170 170
171 x += keys->width(row, i) * defaultKeyWidth; 171 x += keys->width(row, i) * defaultKeyWidth;
172 } 172 }
173 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); 173 int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
174 174
175 int keyWidth = keys->width(row, col); 175 int keyWidth = keys->width(row, col);
176 176
177 p.fillRect(x + 1, y + 1, 177 p.fillRect(x + 1, y + 1,
178 keyWidth * defaultKeyWidth - 1, keyHeight - 1, 178 keyWidth * defaultKeyWidth - 1, keyHeight - 1,
179 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); 179 pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
180 180
181 QImage *pix = keys->pix(row,col); 181 QImage *pix = keys->pix(row,col);
182 182
183 ushort c = keys->uni(row, col); 183 ushort c = keys->uni(row, col);
184 184
185 p.setPen(textcolor); 185 p.setPen(textcolor);
186 if (!pix) { 186 if (!pix) {
187 if ((shift || lock) && keys->shift(c)) 187 if ((shift || lock) && keys->shift(c))
188 188
189 if (circumflex && keys->circumflex(keys->shift(c))) 189 if (circumflex && keys->circumflex(keys->shift(c)))
190 c = keys->circumflex(keys->shift(c)); 190 c = keys->circumflex(keys->shift(c));
191 else if (diaeresis && keys->diaeresis(keys->shift(c))) 191 else if (diaeresis && keys->diaeresis(keys->shift(c)))
192 c = keys->diaeresis(keys->shift(c)); 192 c = keys->diaeresis(keys->shift(c));
193 else if (baccent && keys->baccent(keys->shift(c)))
194 c = keys->baccent(keys->shift(c));
195 else if (accent && keys->accent(keys->shift(c)))
196 c = keys->accent(keys->shift(c));
193 else if (meta && keys->meta(keys->shift(c))) 197 else if (meta && keys->meta(keys->shift(c)))
194 c = keys->meta(keys->shift(c)); 198 c = keys->meta(keys->shift(c));
195 else 199 else
196 c = keys->shift(c); 200 c = keys->shift(c);
197 201
198 else if (meta && keys->meta(c)) 202 else if (meta && keys->meta(c))
199 c = keys->meta(c); 203 c = keys->meta(c);
200 else if (circumflex && keys->circumflex(c)) 204 else if (circumflex && keys->circumflex(c))
201 c = keys->circumflex(c); 205 c = keys->circumflex(c);
206 else if (baccent && keys->baccent(c))
207 c = keys->baccent(c);
208 else if (accent && keys->accent(c))
209 c = keys->accent(c);
202 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { 210 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
203 211
204 // the diaeresis key itself has to be in the diaeresisMap, 212 // the diaeresis key itself has to be in the diaeresisMap,
205 // or just do this to make it display the diaeresis char. 213 // or just do this to make it display the diaeresis char.
206 214
207 if (c == 0x2c6) 215 if (c == 0x2c6)
208 c = 0xa8; 216 c = 0xa8;
209 else 217 else
210 c = keys->diaeresis(c); 218 c = keys->diaeresis(c);
211 } 219 }
212 220
213 p.drawText(x, y, 221 p.drawText(x, y,
214 defaultKeyWidth * keyWidth + 3, keyHeight, 222 defaultKeyWidth * keyWidth + 3, keyHeight,
215 AlignCenter, (QChar)c); 223 AlignCenter, (QChar)c);
216 } 224 }
217 else 225 else
218 // center the image in the middle of the key 226 // center the image in the middle of the key
219 p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1, 227 p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2 + 1,
220 y + (keyHeight - pix->height())/2 + 1, 228 y + (keyHeight - pix->height())/2 + 1,
221 *pix ); 229 *pix );
222 230
223 // this fixes the problem that the very right end of the board's vertical line 231 // this fixes the problem that the very right end of the board's vertical line
224 // gets painted over, because it's one pixel shorter than all other keys 232 // gets painted over, because it's one pixel shorter than all other keys
225 p.setPen(keycolor_lines); 233 p.setPen(keycolor_lines);
@@ -239,57 +247,65 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
239 p.drawLine(x, y, x + width(), y); 247 p.drawLine(x, y, x + width(), y);
240 248
241 for (int col = 0; col < keys->numKeys(row); col++) { 249 for (int col = 0; col < keys->numKeys(row); col++) {
242 250
243 QImage *pix = keys->pix(row, col); 251 QImage *pix = keys->pix(row, col);
244 int keyWidth = keys->width(row, col); 252 int keyWidth = keys->width(row, col);
245 253
246 254
247 int keyWidthPix = defaultKeyWidth * keyWidth; 255 int keyWidthPix = defaultKeyWidth * keyWidth;
248 256
249 if (keys->pressed(row, col)) 257 if (keys->pressed(row, col))
250 p.fillRect(x+1, y+1, keyWidthPix - 1, 258 p.fillRect(x+1, y+1, keyWidthPix - 1,
251 keyHeight - 1, keycolor_pressed); 259 keyHeight - 1, keycolor_pressed);
252 260
253 ushort c = keys->uni(row, col); 261 ushort c = keys->uni(row, col);
254 262
255 p.setPen(textcolor); 263 p.setPen(textcolor);
256 if (!pix) { 264 if (!pix) {
257 if ((shift || lock) && keys->shift(c)) 265 if ((shift || lock) && keys->shift(c))
258 266
259 if (circumflex && keys->circumflex(keys->shift(c))) 267 if (circumflex && keys->circumflex(keys->shift(c)))
260 c = keys->circumflex(keys->shift(c)); 268 c = keys->circumflex(keys->shift(c));
261 else if (diaeresis && keys->diaeresis(keys->shift(c))) 269 else if (diaeresis && keys->diaeresis(keys->shift(c)))
262 c = keys->diaeresis(keys->shift(c)); 270 c = keys->diaeresis(keys->shift(c));
271 else if (baccent && keys->baccent(keys->shift(c)))
272 c = keys->baccent(keys->shift(c));
273 else if (accent && keys->accent(keys->shift(c)))
274 c = keys->accent(keys->shift(c));
263 else if (meta && keys->meta(keys->shift(c))) 275 else if (meta && keys->meta(keys->shift(c)))
264 c = keys->meta(keys->shift(c)); 276 c = keys->meta(keys->shift(c));
265 else 277 else
266 c = keys->shift(c); 278 c = keys->shift(c);
267 279
268 else if (meta && keys->meta(c)) 280 else if (meta && keys->meta(c))
269 c = keys->meta(c); 281 c = keys->meta(c);
270 else if (circumflex && keys->circumflex(c)) 282 else if (circumflex && keys->circumflex(c))
271 c = keys->circumflex(c); 283 c = keys->circumflex(c);
284 else if (baccent && keys->baccent(c))
285 c = keys->baccent(c);
286 else if (accent && keys->accent(c))
287 c = keys->accent(c);
272 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) { 288 else if (diaeresis && (keys->diaeresis(c) || c == 0x2c6)) {
273 289
274 if (c == 0x2c6) 290 if (c == 0x2c6)
275 c = 0xa8; 291 c = 0xa8;
276 else 292 else
277 c = keys->diaeresis(c); 293 c = keys->diaeresis(c);
278 } 294 }
279 295
280 p.drawText(x, y, 296 p.drawText(x, y,
281 keyWidthPix + 3, keyHeight, 297 keyWidthPix + 3, keyHeight,
282 AlignCenter, (QChar)c); 298 AlignCenter, (QChar)c);
283 } 299 }
284 else { 300 else {
285 // center the image in the middle of the key 301 // center the image in the middle of the key
286 pix->setColor(1, textcolor.rgb()); 302 pix->setColor(1, textcolor.rgb());
287 p.drawImage( x + (keyWidthPix - pix->width())/2 + 1, 303 p.drawImage( x + (keyWidthPix - pix->width())/2 + 1,
288 y + (keyHeight - pix->height())/2 + 1, 304 y + (keyHeight - pix->height())/2 + 1,
289 QImage(*pix) ); 305 QImage(*pix) );
290 } 306 }
291 307
292 p.setPen(keycolor_lines); 308 p.setPen(keycolor_lines);
293 p.drawLine(x, y, x, y + keyHeight); 309 p.drawLine(x, y, x, y + keyHeight);
294 310
295 x += keyWidthPix; 311 x += keyWidthPix;
@@ -325,48 +341,83 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
325 qkeycode = keys->qcode(row, col); 341 qkeycode = keys->qcode(row, col);
326 unicode = keys->uni(row, col); 342 unicode = keys->uni(row, col);
327 343
328 // might need to repaint if two or more of the same keys. 344 // might need to repaint if two or more of the same keys.
329 // should be faster if just paint one key even though multiple keys exist. 345 // should be faster if just paint one key even though multiple keys exist.
330 bool need_repaint = FALSE; 346 bool need_repaint = FALSE;
331 347
332 // circumflex and diaeresis support 348 // circumflex and diaeresis support
333 // messy to have this here, but too hard to implement any other method 349 // messy to have this here, but too hard to implement any other method
334 if (unicode == 0x2c6) { 350 if (unicode == 0x2c6) {
335 351
336 unicode = 0; 352 unicode = 0;
337 if (shift || lock) { 353 if (shift || lock) {
338 354
339 // diaeresis 355 // diaeresis
340 qkeycode = 0x2001; 356 qkeycode = 0x2001;
341 } 357 }
342 else { 358 else {
343 359
344 // circumflex 360 // circumflex
345 qkeycode = 0x2000; 361 qkeycode = 0x2000;
346 } 362 }
347 } 363 }
348 364
365 // Back accent character support
366
367 if (unicode == 0x60) {
368
369 unicode = 0;
370 if (shift || lock) {
371
372 // circumblex
373 qkeycode = 0x2000;
374 }
375 else {
376
377 // back accent
378 qkeycode = 0x2002;
379 }
380 }
381
382 // Accent character support
383
384 if (unicode == 0xb4) {
385
386 unicode = 0;
387 if (shift || lock) {
388
389 // diaeresis
390 qkeycode = 0x2001;
391 }
392 else {
393
394 // accent
395 qkeycode = 0x2003;
396 }
397 }
398
399
349 if (unicode == 0) { // either Qt char, or nothing 400 if (unicode == 0) { // either Qt char, or nothing
350 401
351 if (qkeycode == Qt::Key_F1) { // toggle the pickboard 402 if (qkeycode == Qt::Key_F1) { // toggle the pickboard
352 403
353 if ( configdlg ) { 404 if ( configdlg ) {
354 405
355 delete (ConfigDlg *) configdlg; 406 delete (ConfigDlg *) configdlg;
356 configdlg = 0; 407 configdlg = 0;
357 } 408 }
358 else { 409 else {
359 configdlg = new ConfigDlg (); 410 configdlg = new ConfigDlg ();
360 connect(configdlg, SIGNAL(setMapToDefault()), 411 connect(configdlg, SIGNAL(setMapToDefault()),
361 this, SLOT(setMapToDefault())); 412 this, SLOT(setMapToDefault()));
362 connect(configdlg, SIGNAL(setMapToFile(QString)), 413 connect(configdlg, SIGNAL(setMapToFile(QString)),
363 this, SLOT(setMapToFile(QString))); 414 this, SLOT(setMapToFile(QString)));
364 connect(configdlg, SIGNAL(pickboardToggled(bool)), 415 connect(configdlg, SIGNAL(pickboardToggled(bool)),
365 this, SLOT(togglePickboard(bool))); 416 this, SLOT(togglePickboard(bool)));
366 connect(configdlg, SIGNAL(repeatToggled(bool)), 417 connect(configdlg, SIGNAL(repeatToggled(bool)),
367 this, SLOT(toggleRepeat(bool))); 418 this, SLOT(toggleRepeat(bool)));
368 connect(configdlg, SIGNAL(reloadKeyboard()), 419 connect(configdlg, SIGNAL(reloadKeyboard()),
369 this, SLOT(reloadKeyboard())); 420 this, SLOT(reloadKeyboard()));
370 connect(configdlg, SIGNAL(configDlgClosed()), 421 connect(configdlg, SIGNAL(configDlgClosed()),
371 this, SLOT(cleanupConfigDlg())); 422 this, SLOT(cleanupConfigDlg()));
372 configdlg->showMaximized(); 423 configdlg->showMaximized();
@@ -451,48 +502,50 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
451 /* 502 /*
452 if (meta) { *meta = 0; meta = 0; } 503 if (meta) { *meta = 0; meta = 0; }
453 if (circumflex) { *circumflex = 0; circumflex = 0; } 504 if (circumflex) { *circumflex = 0; circumflex = 0; }
454 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 505 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
455 */ 506 */
456 507
457 } else if (qkeycode == Qt::Key_Meta) { 508 } else if (qkeycode == Qt::Key_Meta) {
458 need_repaint = TRUE; 509 need_repaint = TRUE;
459 510
460 if (meta) { 511 if (meta) {
461 *meta = 0; 512 *meta = 0;
462 meta = 0; 513 meta = 0;
463 514
464 } else { 515 } else {
465 516
466 meta = keys->pressedPtr(row, col); 517 meta = keys->pressedPtr(row, col);
467 *meta = true; 518 *meta = true;
468 } 519 }
469 520
470 // reset all the other keys 521 // reset all the other keys
471 if (shift) { *shift = 0; shift = 0; } 522 if (shift) { *shift = 0; shift = 0; }
472 if (lock) { *lock = 0; lock = 0; } 523 if (lock) { *lock = 0; lock = 0; }
473 if (circumflex) { *circumflex = 0; circumflex = 0; } 524 if (circumflex) { *circumflex = 0; circumflex = 0; }
474 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 525 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
526 if (baccent) { *baccent = 0; baccent = 0; }
527 if (accent) { *accent = 0; accent = 0; }
475 528
476 // dont need to emit this key... acts same as alt 529 // dont need to emit this key... acts same as alt
477 qkeycode = 0; 530 qkeycode = 0;
478 531
479 // circumflex 532 // circumflex
480 } else if (qkeycode == 0x2000) { 533 } else if (qkeycode == 0x2000) {
481 need_repaint = TRUE; 534 need_repaint = TRUE;
482 535
483 if (circumflex) { 536 if (circumflex) {
484 537
485 *circumflex = 0; 538 *circumflex = 0;
486 circumflex = 0; 539 circumflex = 0;
487 540
488 } else { 541 } else {
489 542
490 circumflex = keys->pressedPtr(row, col); 543 circumflex = keys->pressedPtr(row, col);
491 *circumflex = true; 544 *circumflex = true;
492 } 545 }
493 546
494 /* no need to turn off shift or lock if circumflex 547 /* no need to turn off shift or lock if circumflex
495 * keys are pressed 548 * keys are pressed
496 549
497 if (shift) { *shift = 0; shift = 0; } 550 if (shift) { *shift = 0; shift = 0; }
498 if (lock) { *lock = 0; lock = 0; } 551 if (lock) { *lock = 0; lock = 0; }
@@ -530,76 +583,130 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
530 *diaeresis = true; 583 *diaeresis = true;
531 } 584 }
532 585
533 586
534 if (shift) { *shift = 0; shift = 0; } 587 if (shift) { *shift = 0; shift = 0; }
535 588
536 /* 589 /*
537 * 590 *
538 if (lock) { *lock = 0; lock = 0; } 591 if (lock) { *lock = 0; lock = 0; }
539 * 592 *
540 */ 593 */
541 594
542 if (meta) { *meta = 0; meta = 0; } 595 if (meta) { *meta = 0; meta = 0; }
543 if (circumflex) { 596 if (circumflex) {
544 597
545 // *circumflex = 0; 598 // *circumflex = 0;
546 // 599 //
547 // same thing the diaeresis pointer points too 600 // same thing the diaeresis pointer points too
548 601
549 circumflex = 0; 602 circumflex = 0;
550 } 603 }
551 604
552 605
553 qkeycode = 0; 606 qkeycode = 0;
607
608 // Back accent
609 } else if (qkeycode == 0x2002) {
610 need_repaint = TRUE;
611
612 if (baccent) {
613
614 *baccent = 0;
615 baccent = 0;
616
617 } else {
618
619 baccent = keys->pressedPtr(row, col);
620 *baccent = true;
621 }
622
623
624 if (shift) { *shift = 0; shift = 0; }
625 if (meta) { *meta = 0; meta = 0; }
626 if (accent) { *accent = 0; accent = 0; }
627
628 qkeycode = 0;
629
630 // Accent
631 } else if (qkeycode == 0x2003) {
632 need_repaint = TRUE;
633
634 if (accent) {
635
636 *accent = 0;
637 accent = 0;
638
639 } else {
640
641 accent = keys->pressedPtr(row, col);
642 *accent = true;
643 }
644
645
646 if (shift) { *shift = 0; shift = 0; }
647 if (meta) { *meta = 0; meta = 0; }
648 if (baccent) { *baccent = 0; }
649
650 qkeycode = 0;
554 } 651 }
555 652
556 } 653 }
557 else { // normal char 654 else { // normal char
558 if ((shift || lock) && keys->shift(unicode)) { 655 if ((shift || lock) && keys->shift(unicode)) {
559 656
560 // make diaeresis/circumflex -> shift input shifted 657 // make diaeresis/circumflex -> shift input shifted
561 // diaeresis/circumflex chars 658 // diaeresis/circumflex chars
562 659
563 if (circumflex && keys->circumflex(keys->shift(unicode))) 660 if (circumflex && keys->circumflex(keys->shift(unicode)))
564 unicode = keys->circumflex(keys->shift(unicode)); 661 unicode = keys->circumflex(keys->shift(unicode));
565 else if (diaeresis && keys->diaeresis(keys->shift(unicode))) 662 else if (diaeresis && keys->diaeresis(keys->shift(unicode)))
566 unicode = keys->diaeresis(keys->shift(unicode)); 663 unicode = keys->diaeresis(keys->shift(unicode));
664 else if (baccent && keys->baccent(keys->shift(unicode)))
665 unicode = keys->baccent(keys->shift(unicode));
666 else if (accent && keys->accent(keys->shift(unicode)))
667 unicode = keys->accent(keys->shift(unicode));
567 else if (meta && keys->meta(keys->shift(unicode))) 668 else if (meta && keys->meta(keys->shift(unicode)))
568 unicode = keys->meta(keys->shift(unicode)); 669 unicode = keys->meta(keys->shift(unicode));
569 else 670 else
570 unicode = keys->shift(unicode); 671 unicode = keys->shift(unicode);
571 } 672 }
572 else if (meta && keys->meta(unicode)) { 673 else if (meta && keys->meta(unicode)) {
573 unicode = keys->meta(unicode); 674 unicode = keys->meta(unicode);
574 } 675 }
575 else if (circumflex && keys->circumflex(unicode)) { 676 else if (circumflex && keys->circumflex(unicode)) {
576 unicode = keys->circumflex(unicode); 677 unicode = keys->circumflex(unicode);
577 } 678 }
578 else if (diaeresis && keys->diaeresis(unicode)) { 679 else if (diaeresis && keys->diaeresis(unicode)) {
579 680
580 unicode = keys->diaeresis(unicode); 681 unicode = keys->diaeresis(unicode);
581 } 682 }
683 else if (baccent && keys->baccent(unicode)) {
684 unicode = keys->baccent(unicode);
685 }
686 else if (accent && keys->accent(unicode)) {
687 unicode = keys->accent(unicode);
688 }
582 } 689 }
583 690
584 // korean parsing 691 // korean parsing
585 if (keys->lang == "ko") { 692 if (keys->lang == "ko") {
586 693
587 unicode = parseKoreanInput(unicode); 694 unicode = parseKoreanInput(unicode);
588 } 695 }
589 696
590 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0); 697 modifiers = (ctrl ? Qt::ControlButton : 0) | (alt ? Qt::AltButton : 0);
591 698
592 if ('A' <= unicode && unicode <= 'z' && modifiers) { 699 if ('A' <= unicode && unicode <= 'z' && modifiers) {
593 700
594 qkeycode = QChar(unicode).upper(); 701 qkeycode = QChar(unicode).upper();
595 unicode = qkeycode - '@'; 702 unicode = qkeycode - '@';
596 } 703 }
597 704
598 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false); 705 QWSServer::sendKeyEvent(unicode, qkeycode, modifiers, true, false);
599 706
600 // pickboard stuff 707 // pickboard stuff
601 if (usePicks) { 708 if (usePicks) {
602 709
603 KeyboardConfig *dc = picks->dc; 710 KeyboardConfig *dc = picks->dc;
604 711
605 if (dc) { 712 if (dc) {
@@ -712,48 +819,50 @@ void Keyboard::clearHighlight()
712 819
713 QPainter p(this); 820 QPainter p(this);
714 drawKeyboard(p, tmpRow, tmpCol); 821 drawKeyboard(p, tmpRow, tmpCol);
715 } 822 }
716} 823}
717 824
718 825
719/* Keyboard::sizeHint {{{1 */ 826/* Keyboard::sizeHint {{{1 */
720QSize Keyboard::sizeHint() const 827QSize Keyboard::sizeHint() const
721{ 828{
722 QFontMetrics fm=fontMetrics(); 829 QFontMetrics fm=fontMetrics();
723 int keyHeight = fm.lineSpacing() + 2; 830 int keyHeight = fm.lineSpacing() + 2;
724 831
725 return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1); 832 return QSize( 240, keyHeight * keys->rows() + (usePicks ? picks->sizeHint().height() : 0) + 1);
726} 833}
727 834
728 835
729void Keyboard::resetState() 836void Keyboard::resetState()
730{ 837{
731 if (shift) { *shift = 0; shift = 0; } 838 if (shift) { *shift = 0; shift = 0; }
732 if (lock) {*lock = 0; lock = 0; } 839 if (lock) {*lock = 0; lock = 0; }
733 if (meta) { *meta = 0; meta = 0; } 840 if (meta) { *meta = 0; meta = 0; }
734 if (circumflex) { *circumflex = 0; circumflex = 0; } 841 if (circumflex) { *circumflex = 0; circumflex = 0; }
735 if (diaeresis) { *diaeresis = 0; diaeresis = 0; } 842 if (diaeresis) { *diaeresis = 0; diaeresis = 0; }
843 if (baccent) { *baccent = 0; baccent = 0; }
844 if (accent) { *accent = 0; accent = 0; }
736 845
737 schar = mchar = echar = 0; 846 schar = mchar = echar = 0;
738 picks->resetState(); 847 picks->resetState();
739} 848}
740 849
741/* Keyboard::togglePickboard {{{1 */ 850/* Keyboard::togglePickboard {{{1 */
742void Keyboard::togglePickboard(bool on_off) 851void Keyboard::togglePickboard(bool on_off)
743{ 852{
744 usePicks = on_off; 853 usePicks = on_off;
745 if (usePicks) { 854 if (usePicks) {
746 picks->show(); 855 picks->show();
747 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send 856 //move(x(), y() - picks->height()); // not required anymore because QCopChannel::send
748 //adjustSize(); 857 //adjustSize();
749 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 858 QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
750 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 859 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
751 } else { 860 } else {
752 861
753 picks->hide(); 862 picks->hide();
754 picks->resetState(); 863 picks->resetState();
755 //move(x(), y() + picks->height()); 864 //move(x(), y() + picks->height());
756 //adjustSize(); 865 //adjustSize();
757 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), 866 QObject::disconnect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
758 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); 867 this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
759 868
@@ -1319,48 +1428,73 @@ void Keys::setKeysFromFile(const char * filename) {
1319 // circumflex 1428 // circumflex
1320 else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1429 else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1321 1430
1322 QTextStream tmp (buf, IO_ReadOnly); 1431 QTextStream tmp (buf, IO_ReadOnly);
1323 ushort lower, shift; 1432 ushort lower, shift;
1324 QChar c; 1433 QChar c;
1325 tmp >> c >> lower >> shift; 1434 tmp >> c >> lower >> shift;
1326 1435
1327 circumflexMap.insert(lower, shift); 1436 circumflexMap.insert(lower, shift);
1328 1437
1329 buf = t.readLine(); 1438 buf = t.readLine();
1330 } 1439 }
1331 // diaeresis 1440 // diaeresis
1332 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { 1441 else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1333 1442
1334 QTextStream tmp (buf, IO_ReadOnly); 1443 QTextStream tmp (buf, IO_ReadOnly);
1335 ushort lower, shift; 1444 ushort lower, shift;
1336 QChar d; 1445 QChar d;
1337 tmp >> d >> lower >> shift; 1446 tmp >> d >> lower >> shift;
1338 1447
1339 diaeresisMap.insert(lower, shift); 1448 diaeresisMap.insert(lower, shift);
1340 1449
1341 buf = t.readLine(); 1450 buf = t.readLine();
1342 } 1451 }
1452 // back accent
1453 else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1454
1455 QTextStream tmp (buf, IO_ReadOnly);
1456 ushort lower, shift;
1457 QChar d;
1458 tmp >> d >> lower >> shift;
1459
1460 baccentMap.insert(lower, shift);
1461
1462 qDebug ("Estoy añadiendo %i con %i", lower, shift);
1463 buf = t.readLine();
1464 }
1465 // accent
1466 else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
1467
1468 QTextStream tmp (buf, IO_ReadOnly);
1469 ushort lower, shift;
1470 QChar d;
1471 tmp >> d >> lower >> shift;
1472
1473 accentMap.insert(lower, shift);
1474
1475 buf = t.readLine();
1476 }
1343 1477
1344 // other variables like lang & title 1478 // other variables like lang & title
1345 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { 1479 else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
1346 1480
1347 QTextStream tmp (buf, IO_ReadOnly); 1481 QTextStream tmp (buf, IO_ReadOnly);
1348 QString name, equals, value; 1482 QString name, equals, value;
1349 1483
1350 tmp >> name >> equals >> value; 1484 tmp >> name >> equals >> value;
1351 1485
1352 if (name == "lang") { 1486 if (name == "lang") {
1353 1487
1354 lang = value; 1488 lang = value;
1355 1489
1356 } 1490 }
1357 1491
1358 buf = t.readLine(); 1492 buf = t.readLine();
1359 } 1493 }
1360 // comments 1494 // comments
1361 else if (buf.contains(QRegExp("^\\s*#"))) { 1495 else if (buf.contains(QRegExp("^\\s*#"))) {
1362 1496
1363 buf = t.readLine(); 1497 buf = t.readLine();
1364 1498
1365 } else { // blank line, or garbage 1499 } else { // blank line, or garbage
1366 1500
@@ -1468,28 +1602,40 @@ void Keys::setPressed(const int row, const int col, const bool pressed) {
1468ushort Keys::shift(const ushort uni) { 1602ushort Keys::shift(const ushort uni) {
1469 1603
1470 if (shiftMap[uni]) return shiftMap[uni]; 1604 if (shiftMap[uni]) return shiftMap[uni];
1471 else return 0; 1605 else return 0;
1472} 1606}
1473 1607
1474ushort Keys::meta(const ushort uni) { 1608ushort Keys::meta(const ushort uni) {
1475 1609
1476 if (metaMap[uni]) return metaMap[uni]; 1610 if (metaMap[uni]) return metaMap[uni];
1477 else return 0; 1611 else return 0;
1478} 1612}
1479 1613
1480ushort Keys::circumflex(const ushort uni) { 1614ushort Keys::circumflex(const ushort uni) {
1481 1615
1482 if (circumflexMap[uni]) return circumflexMap[uni]; 1616 if (circumflexMap[uni]) return circumflexMap[uni];
1483 else return 0; 1617 else return 0;
1484} 1618}
1485 1619
1486ushort Keys::diaeresis(const ushort uni) { 1620ushort Keys::diaeresis(const ushort uni) {
1487 1621
1488 if(diaeresisMap[uni]) return diaeresisMap[uni]; 1622 if(diaeresisMap[uni]) return diaeresisMap[uni];
1489 else return 0; 1623 else return 0;
1490} 1624}
1491 1625
1626ushort Keys::baccent(const ushort uni) {
1627
1628 if(baccentMap[uni]) return baccentMap[uni];
1629 else return 0;
1630}
1631
1632ushort Keys::accent(const ushort uni) {
1633
1634 if(accentMap[uni]) return accentMap[uni];
1635 else return 0;
1636}
1637
1492bool *Keys::pressedPtr(const int row, const int col) { 1638bool *Keys::pressedPtr(const int row, const int col) {
1493 1639
1494 return keys[row].at(col)->pressed; 1640 return keys[row].at(col)->pressed;
1495} 1641}
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index 8af80d0..bc74e71 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -45,120 +45,126 @@ public:
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 int width(const int row, const int col); 59 int width(const int row, const int col);
60 int rows(); 60 int rows();
61 ushort uni(const int row, const int col); 61 ushort uni(const int row, const int col);
62 int qcode(const int row, const int col); 62 int qcode(const int row, const int col);
63 bool pressed(const int row, const int col); 63 bool pressed(const int row, const int col);
64 bool *pressedPtr(const int row, const int col); 64 bool *pressedPtr(const int row, const int col);
65 ushort shift(const ushort); 65 ushort shift(const ushort);
66 ushort meta(const ushort); 66 ushort meta(const ushort);
67 ushort circumflex(const ushort); 67 ushort circumflex(const ushort);
68 ushort diaeresis(const ushort); 68 ushort diaeresis(const ushort);
69 ushort baccent(const ushort);
70 ushort accent(const ushort);
69 QImage *pix(const int row, const int col); 71 QImage *pix(const int row, const int col);
70 int numKeys(const int row); 72 int numKeys(const int row);
71 void setKeysFromFile(const char *filename); 73 void setKeysFromFile(const char *filename);
72 void setKey(const int row, const int qcode, const ushort unicode, 74 void setKey(const int row, const int qcode, const ushort unicode,
73 const int width, QImage *pix); 75 const int width, QImage *pix);
74 void setPressed(const int row, const int col, const bool pressed); 76 void setPressed(const int row, const int col, const bool pressed);
75 QString lang; 77 QString lang;
76 QString label; 78 QString label;
77 79
78private: 80private:
79 81
80 typedef struct Key { 82 typedef struct Key {
81 int qcode; // are qt key codes just unicode values? 83 int qcode; // are qt key codes just unicode values?
82 ushort unicode; 84 ushort unicode;
83 int width; // not pixels but relative key width. normal key is 2 85 int width; // not pixels but relative key width. normal key is 2
84 86
85 // only needed for keys like ctrl that can have multiple keys pressed at once 87 // only needed for keys like ctrl that can have multiple keys pressed at once
86 bool *pressed; 88 bool *pressed;
87 QImage *pix; 89 QImage *pix;
88 }; 90 };
89 91
90 QList<Key> keys[6]; 92 QList<Key> keys[6];
91 QMap<ushort,ushort> shiftMap; 93 QMap<ushort,ushort> shiftMap;
92 QMap<ushort,ushort> metaMap; 94 QMap<ushort,ushort> metaMap;
93 QMap<ushort,ushort> circumflexMap; 95 QMap<ushort,ushort> circumflexMap;
94 QMap<ushort,ushort> diaeresisMap; 96 QMap<ushort,ushort> diaeresisMap;
97 QMap<ushort,ushort> baccentMap;
98 QMap<ushort,ushort> accentMap;
95 99
96}; 100};
97 101
98class Keyboard : public QFrame 102class Keyboard : public QFrame
99{ 103{
100 Q_OBJECT 104 Q_OBJECT
101public: 105public:
102 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); 106 Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
103 ~Keyboard(); 107 ~Keyboard();
104 108
105 void resetState(); 109 void resetState();
106 110
107 void mousePressEvent(QMouseEvent*); 111 void mousePressEvent(QMouseEvent*);
108 void mouseReleaseEvent(QMouseEvent*); 112 void mouseReleaseEvent(QMouseEvent*);
109 void resizeEvent(QResizeEvent*); 113 void resizeEvent(QResizeEvent*);
110 void paintEvent(QPaintEvent* e); 114 void paintEvent(QPaintEvent* e);
111 //void timerEvent(QTimerEvent* e); 115 //void timerEvent(QTimerEvent* e);
112 void drawKeyboard( QPainter &p, int row = -1, int col = -1); 116 void drawKeyboard( QPainter &p, int row = -1, int col = -1);
113 117
114 QSize sizeHint() const; 118 QSize sizeHint() const;
115 119
116signals: 120signals:
117 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); 121 void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool );
118 122
119private slots: 123private slots:
120 void repeat(); 124 void repeat();
121 void togglePickboard(bool on_off); 125 void togglePickboard(bool on_off);
122 void toggleRepeat(bool on_off); 126 void toggleRepeat(bool on_off);
123 void setMapToDefault(); 127 void setMapToDefault();
124 void setMapToFile(QString map); 128 void setMapToFile(QString map);
125 void cleanupConfigDlg(); 129 void cleanupConfigDlg();
126 130
127 // used to redraw keyboard after edited colors 131 // used to redraw keyboard after edited colors
128 void reloadKeyboard(); 132 void reloadKeyboard();
129 133
130private: 134private:
131 int getKey( int &w, int j = -1 ); 135 int getKey( int &w, int j = -1 );
132 void clearHighlight(); 136 void clearHighlight();
133 137
134 bool *shift; 138 bool *shift;
135 bool *lock; 139 bool *lock;
136 bool *ctrl; 140 bool *ctrl;
137 bool *alt; 141 bool *alt;
138 bool *meta; 142 bool *meta;
139 bool *circumflex; 143 bool *circumflex;
140 bool *diaeresis; 144 bool *diaeresis;
145 bool *baccent;
146 bool *accent;
141 147
142 uint useLargeKeys:1; 148 uint useLargeKeys:1;
143 uint usePicks:1; 149 uint usePicks:1;
144 uint useRepeat:1; 150 uint useRepeat:1;
145 151
146 int pressedKeyRow; 152 int pressedKeyRow;
147 int pressedKeyCol; 153 int pressedKeyCol;
148 154
149 KeyboardPicks *picks; 155 KeyboardPicks *picks;
150 156
151 int keyHeight; 157 int keyHeight;
152 int defaultKeyWidth; 158 int defaultKeyWidth;
153 int xoffs; 159 int xoffs;
154 160
155 int unicode; 161 int unicode;
156 int qkeycode; 162 int qkeycode;
157 int modifiers; 163 int modifiers;
158 164
159 int pressTid; 165 int pressTid;
160 bool pressed; 166 bool pressed;
161 167
162 Keys *keys; 168 Keys *keys;
163 169
164 /* for korean input */ 170 /* for korean input */