summaryrefslogtreecommitdiff
authorhash <hash>2002-08-22 05:50:34 (UTC)
committer hash <hash>2002-08-22 05:50:34 (UTC)
commit4c02921ddab3dd8b48d7d54a0c09e8f4ca71efb3 (patch) (side-by-side diff)
treeaeada387b0a02e5cbdb409309a47a36649938b95
parentea0d66f137984689c4d4ef6da7dd4b7323760e8c (diff)
downloadopie-4c02921ddab3dd8b48d7d54a0c09e8f4ca71efb3.zip
opie-4c02921ddab3dd8b48d7d54a0c09e8f4ca71efb3.tar.gz
opie-4c02921ddab3dd8b48d7d54a0c09e8f4ca71efb3.tar.bz2
added meta key support for maps like german and jumpx
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--inputmethods/multikey/keyboard.cpp98
-rw-r--r--inputmethods/multikey/keyboard.h3
2 files changed, 93 insertions, 8 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 7098a6b..74c99c7 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -36,18 +36,18 @@
#include <qstringlist.h>
#include <iostream.h>
#include <sys/utsname.h>
/* Keyboard::Keyboard {{{1 */
Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
- QFrame(parent, _name, f), shift(0), lock(0), ctrl(0),
- alt(0), useLargeKeys(TRUE), usePicks(0), useRepeat(0), pressedKeyRow(-1), pressedKeyCol(-1),
+ QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), meta(0),
+ useLargeKeys(TRUE), usePicks(0), useRepeat(0), pressedKeyRow(-1), pressedKeyCol(-1),
unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
configdlg(0)
{
// get the default font
Config *config = new Config( "qpe" );
config->setGroup( "Appearance" );
@@ -177,20 +177,27 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
keyWidth * defaultKeyWidth - 1, keyHeight - 1,
pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
QPixmap *pix = keys->pix(row,col);
ushort c = keys->uni(row, col);
p.setPen(textcolor);
- if (!pix)
+ if (!pix) {
+ if (shift || lock)
+ c = keys->shift(c);
+ if (meta) {
+
+ c = keys->meta(c);
+ }
p.drawText(x, y,
- defaultKeyWidth * keyWidth, keyHeight,
- AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
+ defaultKeyWidth * keyWidth + 3, keyHeight,
+ AlignCenter, (QChar)c);
+ }
else
// center the image in the middle of the key
p.drawPixmap( x + (defaultKeyWidth * keyWidth - pix->width())/2,
y + (keyHeight - pix->height())/2 + 1,
*pix );
// this fixes the problem that the very right end of the board's vertical line
// gets painted over, because it's one pixel shorter than all other keys
@@ -220,20 +227,24 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
if (keys->pressed(row, col))
p.fillRect(x+1, y+1, keyWidthPix - 1,
keyHeight - 1, keycolor_pressed);
ushort c = keys->uni(row, col);
if (!pix) {
- p.setPen(textcolor);
+ if ((shift || lock) && keys->shift(c))
+ c = keys->shift(c);
+ else if (meta && keys->meta(c))
+ c = keys->meta(c);
+
p.drawText(x, y,
- keyWidthPix, keyHeight,
- AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
+ defaultKeyWidth * keyWidth + 3, keyHeight,
+ AlignCenter, (QChar)c);
}
else {
// center the image in the middle of the key
p.drawPixmap( x + (keyWidthPix - pix->width())/2,
y + (keyHeight - pix->height())/2 + 1,
QPixmap(*pix) );
}
@@ -339,40 +350,82 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
else {
shift = keys->pressedPtr(row, col);
*shift = 1;
if (lock) {
*lock = 0;
lock = 0;
}
}
+ if (meta) {
+
+ *meta = 0;
+ meta = 0;
+ }
} else if (qkeycode == Qt::Key_CapsLock) {
need_repaint = TRUE;
if (lock) {
*lock = 0;
lock = 0;
}
else {
lock = keys->pressedPtr(row, col);;
*lock = 1;
if (shift) {
*shift = 0;
shift = 0;
}
}
+ if (meta) {
+
+ *meta = 0;
+ meta = 0;
+ }
+
+ } else if (qkeycode == Qt::Key_Meta) {
+ need_repaint = TRUE;
+
+ if (meta) {
+ *meta = 0;
+ meta = 0;
+
+ } else {
+
+ meta = keys->pressedPtr(row, col);
+ need_repaint = TRUE;
+ *meta = !keys->pressed(row, col);
+ }
+
+ if (shift) {
+
+ *shift = 0;
+ shift = 0;
+
+ }
+ if (lock) {
+
+ *lock = 0;
+ lock = 0;
+
+ }
+ // dont need to emit this key... acts same as alt
+ qkeycode = 0;
}
}
else { // normal char
if ((shift || lock) && keys->shift(unicode)) {
unicode = keys->shift(unicode);
}
+ if (meta && keys->meta(unicode)) {
+ unicode = keys->meta(unicode);
+ }
}
// korean parsing
if (keys->lang == "ko") {
unicode = parseKoreanInput(unicode);
}
@@ -442,16 +495,21 @@ void Keyboard::mouseReleaseEvent(QMouseEvent*)
#endif
if (shift && unicode != 0) {
*shift = 0; // unpress shift key
shift = 0; // reset the shift pointer
repaint(FALSE);
+ } else if (meta && unicode != 0) {
+
+ *meta = 0;
+ meta = 0;
+ repaint(FALSE);
}
else
clearHighlight();
}
/* Keyboard::timerEvent {{{1 */
@@ -1041,16 +1099,29 @@ void Keys::setKeysFromFile(const char * filename) {
ushort lower, shift;
tmp >> lower >> shift;
shiftMap.insert(lower, shift);
buf = t.readLine();
}
+ // meta key map
+ else if (buf.contains(QRegExp("^\\s*m\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
+
+ QTextStream tmp (buf, IO_ReadOnly);
+ ushort lower, shift;
+ QChar m;
+ tmp >> m >> lower >> shift;
+
+ metaMap.insert(lower, shift);
+
+ buf = t.readLine();
+ }
+
// other variables like lang & title
else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
QString name, equals, value;
tmp >> name >> equals >> value;
@@ -1164,12 +1235,23 @@ ushort Keys::shift(const ushort uni) {
return shiftMap[uni];
}
else
return 0;
}
+ushort Keys::meta(const ushort uni) {
+
+ if (metaMap[uni]) {
+
+ return metaMap[uni];
+ }
+ else
+ return 0;
+
+}
+
bool *Keys::pressedPtr(const int row, const int col) {
return keys[row].at(col)->pressed;
}
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index dc50e55..b692975 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -57,16 +57,17 @@ public:
Keys(const char * filename);
~Keys();
ushort uni(const int row, const int col);
int qcode(const int row, const int col);
int width(const int row, const int col);
bool pressed(const int row, const int col);
bool *pressedPtr(const int row, const int col);
ushort shift(const ushort);
+ ushort meta(const ushort);
QPixmap *pix(const int row, const int col);
int numKeys(const int row);
void setKeysFromFile(const char *filename);
void setKey(const int row, const int qcode, const ushort unicode,
const int width, QPixmap *pix);
void setPressed(const int row, const int col, const bool pressed);
QString lang;
QString label;
@@ -80,16 +81,17 @@ private:
// only needed for keys like ctrl that can have multiple keys pressed at once
bool *pressed;
QPixmap *pix;
};
QList<Key> keys[6];
QMap<ushort,ushort> shiftMap;
+ QMap<ushort,ushort> metaMap;
};
class Keyboard : public QFrame
{
Q_OBJECT
public:
Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 );
@@ -122,16 +124,17 @@ private slots:
private:
int getKey( int &w, int j = -1 );
void clearHighlight();
bool *shift;
bool *lock;
bool *ctrl;
bool *alt;
+ bool *meta;
uint useLargeKeys:1;
uint usePicks:1;
uint useRepeat:1;
int pressedKeyRow;
int pressedKeyCol;
KeyboardPicks *picks;