summaryrefslogtreecommitdiff
path: root/inputmethods
Unidiff
Diffstat (limited to 'inputmethods') (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
@@ -40,9 +40,9 @@
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)
@@ -189,8 +189,12 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
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);
@@ -198,8 +202,12 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
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.
@@ -259,8 +267,12 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
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);
@@ -268,8 +280,12 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
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;
@@ -345,8 +361,43 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
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
@@ -471,8 +522,10 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
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
@@ -550,8 +603,52 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
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
@@ -563,8 +660,12 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
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);
@@ -578,8 +679,14 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
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") {
@@ -732,8 +839,10 @@ void Keyboard::resetState()
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}
@@ -1339,8 +1448,33 @@ void Keys::setKeysFromFile(const char * filename) {
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
@@ -1488,8 +1622,20 @@ ushort Keys::diaeresis(const ushort uni) {
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
@@ -65,8 +65,10 @@ public:
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,
@@ -91,8 +93,10 @@ private:
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
@@ -137,8 +141,10 @@ private:
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;