summaryrefslogtreecommitdiff
authorhash <hash>2002-08-15 09:49:41 (UTC)
committer hash <hash>2002-08-15 09:49:41 (UTC)
commit56d64478a06c6d4bf137e2e0dcf5ed7d85dadb71 (patch) (side-by-side diff)
tree55037c6d09c9b2324a3a02d4c3a89db95e586ee1
parentb54a9a4b4188ff4759574028f7ea0e231ee6bed3 (diff)
downloadopie-56d64478a06c6d4bf137e2e0dcf5ed7d85dadb71.zip
opie-56d64478a06c6d4bf137e2e0dcf5ed7d85dadb71.tar.gz
opie-56d64478a06c6d4bf137e2e0dcf5ed7d85dadb71.tar.bz2
keymap dynamic loading works, but no file select dialog. remembers your selected keymap too
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
@@ -39,12 +39,20 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
addTab(gen_box, tr("General Settings"));
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);
@@ -97,4 +105,16 @@ void ConfigDlg::pickTog() {
config.writeEntry ("open", pick_button->isChecked()); // default closed
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,7 +1,8 @@
#include <qpe/qpeapplication.h>
#include <qtabwidget.h>
#include <qcheckbox.h>
+#include <qcombobox.h>
#ifndef CONFIGDLG_H
#define CONFIGDLG_H
@@ -13,14 +14,18 @@ public:
ConfigDlg ();
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;
};
#endif
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
@@ -32,8 +32,9 @@
#include <qpe/config.h>
#include <ctype.h>
#include <qfile.h>
#include <qtextstream.h>
+#include <iostream.h>
#include <sys/utsname.h>
@@ -42,20 +43,22 @@
/* 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), 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 ) );
picks = new KeyboardPicks( this );
@@ -67,11 +70,9 @@ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
} 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()) );
@@ -157,27 +158,27 @@ 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
p.drawPixmap( x + (defaultKeyWidth * keyWidth - pix->width())/2,
@@ -201,27 +202,27 @@ 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
p.drawPixmap( x + (keyWidthPix - pix->width())/2,
@@ -252,16 +253,16 @@ 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.
bool need_repaint = FALSE;
@@ -277,22 +278,26 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
else {
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;
@@ -300,9 +305,9 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
*shift = 0;
shift = 0;
}
else {
- shift = keys.pressedPtr(row, col);
+ shift = keys->pressedPtr(row, col);
*shift = 1;
if (lock) {
*lock = 0;
lock = 0;
@@ -316,9 +321,9 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
*lock = 0;
lock = 0;
}
else {
- lock = keys.pressedPtr(row, col);;
+ lock = keys->pressedPtr(row, col);;
*lock = 1;
if (shift) {
*shift = 0;
shift = 0;
@@ -328,15 +333,15 @@ 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);
}
@@ -488,8 +493,48 @@ void Keyboard::togglePickboard(bool on_off)
QCopChannel::send ("QPE/TaskBar", "hideInputMethod()");
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
* one major problem with this implementation is that you can't move the
@@ -794,14 +839,25 @@ ushort Keyboard::constoe(const ushort c) {
// Keys::Keys {{{1
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);
}
@@ -829,8 +885,9 @@ 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
// dont know of any sscanf() type funcs in Qt lib
@@ -874,8 +931,10 @@ 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);
ushort lower, shift;
@@ -884,8 +943,27 @@ void Keys::setKeysFromFile(const char * filename) {
shiftMap.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;
+
+ 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
@@ -66,8 +66,10 @@ public:
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 title;
private:
typedef struct Key {
@@ -107,8 +109,10 @@ signals:
private slots:
void repeat();
void togglePickboard(bool on_off);
+ void setMapToDefault();
+ void setMapToFile(QString file);
private:
int getKey( int &w, int j = -1 );
void clearHighlight();
@@ -135,10 +139,10 @@ private:
int pressTid;
bool pressed;
- Keys keys;
- QString LANG;
+ Keys *keys;
+
/* for korean input */
ushort schar, mchar, echar;
ushort parseKoreanInput(ushort c);
ushort combineKoreanChars(const ushort s, const ushort m, const ushort e);