summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/multikey/configdlg.cpp26
-rw-r--r--inputmethods/multikey/configdlg.h5
-rw-r--r--inputmethods/multikey/keyboard.cpp158
-rw-r--r--inputmethods/multikey/keyboard.h8
4 files changed, 152 insertions, 45 deletions
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index e39fa6a..68c31be 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -40,10 +40,18 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
QGroupBox *map_group = new QGroupBox (2, Qt::Horizontal, tr("Keymap File"), gen_box);
- QComboBox *combo = new QComboBox ((bool)0, map_group);
+ map_combo = new QComboBox ((bool)0, map_group);
+ map_combo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+
QString cur(tr("Current Language"));
- combo->insertItem(cur);
- combo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+ map_combo->insertItem(cur);
+ connect(map_combo, SIGNAL(activated(int)), SLOT(setMap(int)));
+
+ QString ko(tr("/opt/opie/share/multikey/ko.keymap"));
+ map_combo->insertItem(ko);
+
+ QString en(tr("/opt/opie/share/multikey/en.keymap"));
+ map_combo->insertItem(en);
QPushButton *button = new QPushButton(tr("Browse..."), map_group);
button->setFlat((bool)1);
@@ -98,3 +106,15 @@ void ConfigDlg::pickTog() {
emit pickboardToggled(pick_button->isChecked());
}
+
+void ConfigDlg::setMap(int index) {
+
+ if (index == 0) {
+
+ emit setMapToDefault();
+ }
+ else {
+
+ emit setMapToFile(map_combo->text(index));
+ }
+}
diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h
index 21bdb17..54127a0 100644
--- a/inputmethods/multikey/configdlg.h
+++ b/inputmethods/multikey/configdlg.h
@@ -1,6 +1,7 @@
#include <qpe/qpeapplication.h>
#include <qtabwidget.h>
#include <qcheckbox.h>
+#include <qcombobox.h>
#ifndef CONFIGDLG_H
#define CONFIGDLG_H
@@ -14,12 +15,16 @@ public:
signals:
void pickboardToggled(bool on_off);
+ void setMapToDefault();
+ void setMapToFile(QString file);
private slots:
void pickTog();
+ void setMap(int index);
private:
QCheckBox *pick_button;
+ QComboBox *map_combo;
};
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index a19f07a..1d91b82 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -33,6 +33,7 @@
#include <ctype.h>
#include <qfile.h>
#include <qtextstream.h>
+#include <iostream.h>
#include <sys/utsname.h>
@@ -43,18 +44,20 @@
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), pressedKeyRow(-1), pressedKeyCol(-1),
- unicode(-1), qkeycode(0), modifiers(0), LANG("ko"), schar(0), mchar(0), echar(0),
+ unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0),
configdlg(0)
{
// get the default font
- Config qpeConfig( "qpe" );
- qpeConfig.setGroup( "Appearance" );
- QString familyStr = qpeConfig.readEntry( "FontFamily", "fixed" );
+ Config *config = new Config( "qpe" );
+ config->setGroup( "Appearance" );
+ QString familyStr = config->readEntry( "FontFamily", "fixed" );
+ delete config;
- Config multiConfig ("multikey");
- multiConfig.setGroup ("pickboard");
- usePicks = multiConfig.readBoolEntry ("open", "0"); // default closed
+ config = new Config("multikey");
+ config->setGroup ("pickboard");
+ usePicks = config->readBoolEntry ("open", "0"); // default closed
+ delete config;
setFont( QFont( familyStr, 8 ) );
@@ -68,9 +71,7 @@ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
} else picks->hide();
- Config config("locale");
- config.setGroup( "Language" );
- LANG = config.readEntry( "Language", "en" );
+ keys = new Keys();
repeatTimer = new QTimer( this );
connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
@@ -158,25 +159,25 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
int x = 0;
for (int i = 0; i < col; i++) {
- x += keys.width(row, i) * defaultKeyWidth;
+ x += keys->width(row, i) * defaultKeyWidth;
}
int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0);
- int keyWidth = keys.width(row, col);
+ int keyWidth = keys->width(row, col);
p.fillRect(x + 1, y + 1,
keyWidth * defaultKeyWidth - 1, keyHeight - 1,
- pressed || keys.pressed(row, col) ? keycolor_pressed : keycolor);
+ pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor);
- QPixmap *pix = keys.pix(row,col);
+ QPixmap *pix = keys->pix(row,col);
- ushort c = keys.uni(row, col);
+ ushort c = keys->uni(row, col);
if (!pix) {
p.setPen(textcolor);
p.drawText(x, y,
defaultKeyWidth * keyWidth, keyHeight,
- AlignCenter, ((shift || lock) && keys.shift(c)) ? (QChar)keys.shift(c) : (QChar)c);
+ AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
}
else
// center the image in the middle of the key
@@ -202,25 +203,25 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col)
p.setPen(keycolor_lines);
p.drawLine(x, y, x + width(), y);
- for (int col = 0; col < keys.numKeys(row); col++) {
+ for (int col = 0; col < keys->numKeys(row); col++) {
- QPixmap *pix = keys.pix(row, col);
- int keyWidth = keys.width(row, col);
+ QPixmap *pix = keys->pix(row, col);
+ int keyWidth = keys->width(row, col);
int keyWidthPix = defaultKeyWidth * keyWidth;
- if (keys.pressed(row, col))
+ if (keys->pressed(row, col))
p.fillRect(x+1, y+1, keyWidthPix - 1,
keyHeight - 1, keycolor_pressed);
- ushort c = keys.uni(row, col);
+ ushort c = keys->uni(row, col);
if (!pix) {
p.setPen(textcolor);
p.drawText(x, y,
keyWidthPix, keyHeight,
- AlignCenter, ((shift || lock) && keys.shift(c)) ? (QChar)keys.shift(c) : (QChar)c);
+ AlignCenter, ((shift || lock) && keys->shift(c)) ? (QChar)keys->shift(c) : (QChar)c);
}
else {
// center the image in the middle of the key
@@ -253,14 +254,14 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
// figure out the column
int col = 0;
for (int w = 0; e->x() >= w; col++)
- if (col < keys.numKeys(row)) // it segfaults if it trys to read past numKeys
- w += keys.width(row,col) * defaultKeyWidth;
+ if (col < keys->numKeys(row)) // it segfaults if it trys to read past numKeys
+ w += keys->width(row,col) * defaultKeyWidth;
else break;
col --; // rewind one...
- qkeycode = keys.qcode(row, col);
- unicode = keys.uni(row, col);
+ qkeycode = keys->qcode(row, col);
+ unicode = keys->uni(row, col);
// might need to repaint if two or more of the same keys.
// should be faster if just paint one key even though multiple keys exist.
@@ -278,20 +279,24 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
configdlg = new ConfigDlg ();
connect(configdlg, SIGNAL(pickboardToggled(bool)),
this, SLOT(togglePickboard(bool)));
+ connect(configdlg, SIGNAL(setMapToDefault()),
+ this, SLOT(setMapToDefault()));
+ connect(configdlg, SIGNAL(setMapToFile(QString)),
+ this, SLOT(setMapToFile(QString)));
configdlg->showMaximized();
configdlg->show();
configdlg->raise();
}
} else if (qkeycode == Qt::Key_Control) {
- ctrl = keys.pressedPtr(row, col);
+ ctrl = keys->pressedPtr(row, col);
need_repaint = TRUE;
- *ctrl = !keys.pressed(row, col);
+ *ctrl = !keys->pressed(row, col);
} else if (qkeycode == Qt::Key_Alt) {
- alt = keys.pressedPtr(row, col);
+ alt = keys->pressedPtr(row, col);
need_repaint = TRUE;
- *alt = !keys.pressed(row, col);
+ *alt = !keys->pressed(row, col);
} else if (qkeycode == Qt::Key_Shift) {
need_repaint = TRUE;
@@ -301,7 +306,7 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
shift = 0;
}
else {
- shift = keys.pressedPtr(row, col);
+ shift = keys->pressedPtr(row, col);
*shift = 1;
if (lock) {
*lock = 0;
@@ -317,7 +322,7 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
lock = 0;
}
else {
- lock = keys.pressedPtr(row, col);;
+ lock = keys->pressedPtr(row, col);;
*lock = 1;
if (shift) {
*shift = 0;
@@ -329,13 +334,13 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
}
else { // normal char
- if ((shift || lock) && keys.shift(unicode)) {
- unicode = keys.shift(unicode);
+ if ((shift || lock) && keys->shift(unicode)) {
+ unicode = keys->shift(unicode);
}
}
// korean parsing
- if (LANG == "ko") {
+ if (keys->lang == "ko") {
unicode = parseKoreanInput(unicode);
}
@@ -489,6 +494,46 @@ void Keyboard::togglePickboard(bool on_off)
QCopChannel::send ("QPE/TaskBar", "showInputMethod()");
}
+/* Keyboard::setMapTo ... {{{1 */
+void Keyboard::setMapToDefault() {
+
+
+ /* load current locale language map */
+ Config *config = new Config("locale");
+ config->setGroup( "Language" );
+ QString l = config->readEntry( "Language" , "en" );
+ delete config;
+
+ QString key_map = QPEApplication::qpeDir() + "/share/multikey/"
+ + l + ".keymap";
+
+ /* save change to multikey config file */
+ config = new Config("multikey");
+ config->setGroup ("keymaps");
+ config->writeEntry ("current", key_map); // default closed
+ delete config;
+
+ delete keys;
+ keys = new Keys(key_map);
+
+ // have to repaint the keyboard
+ repaint(FALSE);
+}
+
+void Keyboard::setMapToFile(QString file) {
+
+ /* save change to multikey config file */
+ Config *config = new Config("multikey");
+ config->setGroup ("keymaps");
+ config->writeEntry ("current", file); // default closed
+ delete config;
+
+ delete keys;
+ keys = new Keys(file);
+ repaint(FALSE);
+
+}
+
/* korean input functions {{{1
*
* TODO
@@ -795,12 +840,23 @@ ushort Keyboard::constoe(const ushort c) {
Keys::Keys() {
- Config config("locale");
- config.setGroup( "Language" );
- QString l = config.readEntry( "Language" , "en" );
+ Config *config = new Config ("multikey");
+ config->setGroup( "keymaps" );
+ QString key_map = config->readEntry( "current" );
+ delete config;
+
+ if (key_map.isNull()) {
+
+ Config *config = new Config("locale");
+ config->setGroup( "Language" );
+ QString l = config->readEntry( "Language" , "en" );
+ delete config;
+
+ key_map = QPEApplication::qpeDir() + "/share/multikey/"
+ + l + ".keymap";
+
+ }
- QString key_map = QPEApplication::qpeDir() + "/share/multikey/"
- + l + ".keymap";
setKeysFromFile(key_map);
}
@@ -830,6 +886,7 @@ void Keys::setKeysFromFile(const char * filename) {
buf = t.readLine();
while (buf) {
+ // key definition
if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) {
// no $1 type referencing!!! this implementation of regexp sucks
@@ -875,6 +932,8 @@ void Keys::setKeysFromFile(const char * filename) {
}
setKey(row, qcode, unicode, width, xpm2pix);
}
+
+ // shift map
else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
@@ -885,6 +944,25 @@ void Keys::setKeysFromFile(const char * filename) {
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;
+
+ if (name == "lang") {
+
+ lang = value;
+
+ }
+
+ cout << name << " = " << value << "\n";
+ buf = t.readLine();
+ }
+ // comments
else if (buf.contains(QRegExp("^\\s*#"))) {
buf = t.readLine();
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index e61b76c..c2efe10 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -67,6 +67,8 @@ public:
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 title;
private:
@@ -108,6 +110,8 @@ signals:
private slots:
void repeat();
void togglePickboard(bool on_off);
+ void setMapToDefault();
+ void setMapToFile(QString file);
private:
int getKey( int &w, int j = -1 );
@@ -136,8 +140,8 @@ private:
int pressTid;
bool pressed;
- Keys keys;
- QString LANG;
+ Keys *keys;
+
/* for korean input */
ushort schar, mchar, echar;
ushort parseKoreanInput(ushort c);