summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2004-01-04 14:22:59 (UTC)
committer mickeyl <mickeyl>2004-01-04 14:22:59 (UTC)
commit5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057 (patch) (side-by-side diff)
treec2e1b4a090ca53efd3b3e0c20d12a633e01470d4
parent84f039ef3799c5310a4f94057b9d76d4ee55f499 (diff)
downloadopie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.zip
opie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.tar.gz
opie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.tar.bz2
more patches to multikey+applet courtesy Anton Kachalov <mouse@altlinux.ru>
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/applets/multikeyapplet/multikey.cpp22
-rw-r--r--core/applets/multikeyapplet/multikey.h2
-rw-r--r--inputmethods/multikey/configdlg.cpp161
-rw-r--r--inputmethods/multikey/configdlg.h12
-rw-r--r--share/multikey/ru.keymap255
5 files changed, 359 insertions, 93 deletions
diff --git a/core/applets/multikeyapplet/multikey.cpp b/core/applets/multikeyapplet/multikey.cpp
index 0a056b0..f1227ef 100644
--- a/core/applets/multikeyapplet/multikey.cpp
+++ b/core/applets/multikeyapplet/multikey.cpp
@@ -23,9 +23,9 @@
#include <qdir.h>
#include <qfileinfo.h>
#include <qcopchannel_qws.h>
-Multikey::Multikey( QWidget *parent ) : QLabel( parent ), current("EN")
+Multikey::Multikey(QWidget *parent) : QLabel(parent), popupMenu(this), current("EN")
{
QCopChannel* swChannel = new QCopChannel("MultiKey/Switcher", this);
connect( swChannel, SIGNAL(received(const QCString &, const QByteArray &)),
this, SLOT(message(const QCString &, const QByteArray &)));
@@ -33,15 +33,29 @@ Multikey::Multikey( QWidget *parent ) : QLabel( parent ), current("EN")
setFont( QFont( "Helvetica", 10, QFont::Normal ) );
lang = 0;
QCopEnvelope e("MultiKey/Keyboard", "getmultikey()");
setText("EN");
+ popupMenu.insertItem("EN", -1);
show();
}
-void Multikey::mousePressEvent( QMouseEvent * )
+void Multikey::mousePressEvent(QMouseEvent *ev)
{
- QCopEnvelope e("MultiKey/Keyboard", "setmultikey(QString)");
+ if (ev->button() == RightButton) {
+
+ QPoint p = mapToGlobal(QPoint(0, 0));
+ QSize s = popupMenu.sizeHint();
+ int opt = popupMenu.exec(QPoint(p.x() + (width() / 2) - (s.width() / 2),
+ p.y() - s.height()), 0);
+
+ if (opt == -1)
+ return;
+ lang = opt;
+ } else {
lang = lang < sw_maps.count()-1 ? lang+1 : 0;
+ }
+
+ QCopEnvelope e("MultiKey/Keyboard", "setmultikey(QString)");
//qDebug("Lang=%d, count=%d, lab=%s", lang, sw_maps.count(), labels[lang].ascii());
e << sw_maps[lang];
setText(labels[lang]);
}
@@ -59,8 +73,9 @@ void Multikey::message(const QCString &message, const QByteArray &data)
QDir map_dir(QPEApplication::qpeDir() + "/share/multikey/", "*.keymap");
lang = 0;
labels.clear();
sw_maps.clear();
+ popupMenu.clear();
for (uint i = 0; i < sw.count(); ++i) {
QString keymap_map;
if (sw[i][0] != '/') {
@@ -89,8 +104,9 @@ void Multikey::message(const QCString &message, const QByteArray &data)
lang = i;
}
sw_maps.append(keymap_map);
labels.append(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
+ popupMenu.insertItem(labels[labels.count()-1], labels.count()-1);
} else {
current = line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace();
}
break;
diff --git a/core/applets/multikeyapplet/multikey.h b/core/applets/multikeyapplet/multikey.h
index 2cb7b29..b525074 100644
--- a/core/applets/multikeyapplet/multikey.h
+++ b/core/applets/multikeyapplet/multikey.h
@@ -15,8 +15,9 @@
#define __MULTIKEY_H__
#include <qlabel.h>
#include <qstringlist.h>
+#include <qpopupmenu.h>
#include <qcopchannel_qws.h>
class Multikey : public QLabel
{
@@ -30,8 +31,9 @@ public slots:
protected:
void mousePressEvent( QMouseEvent * );
QStringList sw_maps;
QStringList labels;
+ QPopupMenu popupMenu;
QString current;
uint lang;
};
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index f127d0e..d29109a 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -11,8 +11,9 @@
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <qpe/resource.h>
+#include <qlayout.h>
#include <qwidget.h>
#include <qdialog.h>
#include <qtabwidget.h>
#include <qvbox.h>
@@ -32,9 +33,9 @@
#include "configdlg.h"
#include "keyboard.h"
// ConfigDlg::ConfigDlg() {{{1
-ConfigDlg::ConfigDlg () : QTabWidget ()
+ConfigDlg::ConfigDlg () : QDialog ()
{
setCaption( tr("Multikey Configuration") );
Config config ("multikey");
config.setGroup("keymaps");
@@ -43,12 +44,15 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
/*
* 'general config' tab
*/
- QVBox *gen_box = new QVBox (this);
- gen_box->setMargin(3);
- addTab(gen_box, tr("General Settings"));
+ QVBoxLayout *base_lay = new QVBoxLayout(this);
+ QTabWidget *tabs = new QTabWidget(this, "tabs");
+
+ QWidget *gen_box = new QWidget(tabs, "gen_tab");
+ QVBoxLayout *gen_lay = new QVBoxLayout(gen_box);
+ gen_lay->setMargin(3);
QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box);
QHBox *hbox1 = new QHBox(map_group);
keymaps = new QListBox(hbox1);
@@ -128,9 +132,8 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
}
}
// have to "+1" because the "current language" listItem... remember?
-
connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int)));
QGrid *add_remove_grid = new QGrid(2, map_group);
add_remove_grid->setMargin(3);
@@ -141,12 +144,14 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
connect(add_button, SIGNAL(clicked()), SLOT(addMap()));
remove_button = new QPushButton(tr("Remove"), add_remove_grid);
remove_button->setFlat(TRUE);
- if (default_maps.find(QFileInfo(current_map).fileName()) != default_maps.end())
+ if (keymaps->currentItem() == 0 || default_maps.find(QFileInfo(current_map).fileName()) != default_maps.end())
remove_button->setDisabled(true);
connect(remove_button, SIGNAL(clicked()), SLOT(removeMap()));
+ gen_lay->addWidget(map_group);
+
// make a box that will contain the buttons on the bottom
QGrid *other_grid = new QGrid(2, gen_box);
pick_button = new QCheckBox(tr("Pickboard"), other_grid);
@@ -156,36 +161,39 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
pick_button->setChecked(true);
}
- // by connecting it after checking it, the signal isn't emmited
- connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog()));
-
repeat_button = new QCheckBox(tr("Key Repeat"), other_grid);
bool repeat_on = config.readBoolEntry ("useRepeat", TRUE);
if (repeat_on) {
repeat_button->setChecked(true);
}
- connect (repeat_button, SIGNAL(clicked()), this, SLOT(repeatTog()));
+
+ gen_lay->addWidget(other_grid);
+ tabs->addTab(gen_box, tr("General Settings"));
/*
* 'color' tab
*/
- QGrid *color_box = new QGrid(2, this);
- color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- color_box->setMargin(3);
- color_box->setSpacing(3);
- addTab(color_box, tr("Colors"));
+ QWidget *color_box = new QWidget(tabs, "color_tab");
+
+ QGridLayout *color_lay = new QGridLayout(color_box);
+ QGrid *color_grid = new QGrid(2, color_box);
+ color_lay->setAlignment(Qt::AlignTop);
+ color_grid->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+ color_grid->layout()->setAlignment(Qt::AlignTop);
+ color_grid->setMargin(3);
+ color_grid->setSpacing(3);
QLabel *label;
QStringList color;
config.setGroup("colors");
- label = new QLabel(tr("Key Color"), color_box);
- keycolor_button = new QPushButton(color_box);
+ label = new QLabel(tr("Key Color"), color_grid);
+ keycolor_button = new QPushButton(color_grid);
connect(keycolor_button, SIGNAL(clicked()), SLOT(keyColorClicked()));
keycolor_button->setFlat(TRUE);
color = config.readListEntry("keycolor", QChar(','));
/*
@@ -199,37 +207,40 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
*/
keycolor_button->setPalette(QPalette(QColor(color[0].toInt(), color[1].toInt(), color[2].toInt())));
- label = new QLabel(tr("Key Pressed Color"), color_box);
- keycolor_pressed_button = new QPushButton(color_box);
+ label = new QLabel(tr("Key Pressed Color"), color_grid);
+ keycolor_pressed_button = new QPushButton(color_grid);
connect(keycolor_pressed_button, SIGNAL(clicked()), SLOT(keyColorPressedClicked()));
keycolor_pressed_button->setFlat(TRUE);
color = config.readListEntry("keycolor_pressed", QChar(','));
keycolor_pressed_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
- label = new QLabel(tr("Line Color"), color_box);
- keycolor_lines_button = new QPushButton(color_box);
+ label = new QLabel(tr("Line Color"), color_grid);
+ keycolor_lines_button = new QPushButton(color_grid);
connect(keycolor_lines_button, SIGNAL(clicked()), SLOT(keyColorLinesClicked()));
keycolor_lines_button->setFlat(TRUE);
color = config.readListEntry("keycolor_lines", QChar(','));
keycolor_lines_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
- label = new QLabel(tr("Text Color"), color_box);
- textcolor_button = new QPushButton(color_box);
+ label = new QLabel(tr("Text Color"), color_grid);
+ textcolor_button = new QPushButton(color_grid);
connect(textcolor_button, SIGNAL(clicked()), SLOT(textColorClicked()));
textcolor_button->setFlat(TRUE);
color = config.readListEntry("textcolor", QChar(','));
textcolor_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
- label = new QLabel("", color_box); // a spacer so the above buttons dont expand
+ label = new QLabel("", color_grid); // a spacer so the above buttons dont expand
label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
-}
+ /* FIXME: hacked spacer height */
+ QSpacerItem *spacer = new QSpacerItem(0, 300, QSizePolicy::Expanding, QSizePolicy::Maximum);
-ConfigDlg::~ConfigDlg()
-{
- emit reloadSw();
+ color_lay->addWidget(color_grid, 0, 0);
+ color_lay->addItem(spacer);
+
+ tabs->addTab(color_box, tr("Colors"));
+ base_lay->addWidget(tabs);
}
QStringList ConfigDlg::loadSw()
{
@@ -247,9 +258,9 @@ QStringList ConfigDlg::loadSw()
}
else
{
/* Clear non existents entries */
- QStringList s_copy = s_maps;
+ QStringList s_copy(s_maps);
for (uint i = 0; i < s_copy.count(); ++i) {
if (d_maps.find(s_copy[i]) == d_maps.end()
&& c_maps.find(s_copy[i]) == c_maps.end()) {
s_maps.remove(s_copy[i]);
@@ -271,8 +282,46 @@ QStringList ConfigDlg::loadSw()
return s_maps;
}
+void ConfigDlg::accept()
+{
+ /* Writing all stuffs to config */
+ Config *config = new Config("multikey");
+ config->setGroup("general");
+ config->writeEntry("usePickboard", pick_button->isChecked()); // default closed
+ config->writeEntry("useRepeat", repeat_button->isChecked()); // default closed
+
+ config->setGroup("keymaps");
+ config->writeEntry("sw", sw_maps, QChar('|'));
+ config->writeEntry("maps", custom_maps, QChar('|'));
+ delete config;
+
+ int index = keymaps->currentItem();
+ if (index == 0) {
+
+ remove_button->setDisabled(true);
+ emit setMapToDefault();
+ }
+ else if (default_maps.find(sw_maps[index-1]) != default_maps.end()) {
+
+ remove_button->setDisabled(true);
+ emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + sw_maps[index - 1]);
+
+ } else {
+
+ remove_button->setEnabled(true);
+ emit setMapToFile(sw_maps[index - 1]);
+ }
+
+ emit pickboardToggled(pick_button->isChecked());
+ emit repeatToggled(repeat_button->isChecked());
+ emit reloadSw();
+
+ QDialog::accept();
+ emit configDlgClosed();
+}
+
void ConfigDlg::moveSelectedUp()
{
int i = keymaps->currentItem();
/* Ignore Current Language */
@@ -284,12 +333,8 @@ void ConfigDlg::moveSelectedUp()
QString item = keymaps->currentText();
keymaps->removeItem(i);
keymaps->insertItem(item, i-1);
keymaps->setCurrentItem(i-1);
-
- Config config("multikey");
- config.setGroup("keymaps");
- config.writeEntry("sw", sw_maps, QChar('|'));
}
}
void ConfigDlg::moveSelectedDown()
@@ -304,64 +349,26 @@ void ConfigDlg::moveSelectedDown()
QString item = keymaps->currentText();
keymaps->removeItem(i);
keymaps->insertItem(item, i+1);
keymaps->setCurrentItem(i+1);
-
- Config config("multikey");
- config.setGroup("keymaps");
- config.writeEntry("sw", sw_maps, QChar('|'));
- }
}
-
-void ConfigDlg::pickTog() {
-
- Config config ("multikey");
- config.setGroup ("general");
- config.writeEntry ("usePickboard", pick_button->isChecked()); // default closed
-
- emit pickboardToggled(pick_button->isChecked());
-}
-
-void ConfigDlg::repeatTog() {
-
- Config config ("multikey");
- config.setGroup ("general");
- config.writeEntry ("useRepeat", repeat_button->isChecked()); // default closed
-
- emit repeatToggled(repeat_button->isChecked());
}
void ConfigDlg::closeEvent(QCloseEvent *) {
// tell the parent it was closed, so delete me
emit configDlgClosed();
}
-// ConfigDlg::setMap {{{1
-
-/*
- * the index is kinda screwy, because in the config file, index 0 is just the
- * first element in the QStringList, but here it's the "Current Language"
- * listItem. therefor you have to minus one to the index before you access it.
- *
- */
-
void ConfigDlg::setMap(int index) {
if (index == 0) {
-
remove_button->setDisabled(true);
- emit setMapToDefault();
}
else if (default_maps.find(sw_maps[index-1]) != default_maps.end()) {
-
remove_button->setDisabled(true);
- emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + sw_maps[index - 1]);
-
} else {
-
remove_button->setEnabled(true);
- emit setMapToFile(sw_maps[index - 1]);
}
}
// ConfigDlg::addMap() {{{1
@@ -400,14 +407,8 @@ void ConfigDlg::addMap() {
map_file.close();
}
keymaps->setSelected(keymaps->count() - 1, true);
-
-
- config.writeEntry("maps", maps, QChar('|'));
- config.writeEntry("sw", sw_maps, QChar('|'));
- config.writeEntry("current", map);
-
}
// ConfigDlg::removeMap() {{{1
void ConfigDlg::removeMap() {
@@ -418,14 +419,8 @@ void ConfigDlg::removeMap() {
keymaps->removeItem(keymaps->currentItem() + 1);
custom_maps.remove(sw_maps[keymaps->currentItem()]);
sw_maps.remove(sw_maps.at(keymaps->currentItem()));
-
- // write the changes
- Config config ("multikey");
- config.setGroup("keymaps");
- config.writeEntry("maps", custom_maps, QChar('|'));
- config.writeEntry("sw", sw_maps, QChar('|'));
}
/* ConfigDlg::slots for the color buttons {{{1
*
diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h
index ea157c5..91ae429 100644
--- a/inputmethods/multikey/configdlg.h
+++ b/inputmethods/multikey/configdlg.h
@@ -1,20 +1,19 @@
#include <qpe/qpeapplication.h>
-#include <qtabwidget.h>
+#include <qdialog.h>
#include <qcheckbox.h>
#include <qlistbox.h>
#include <qpushbutton.h>
#ifndef CONFIGDLG_H
#define CONFIGDLG_H
-class ConfigDlg : public QTabWidget
+class ConfigDlg : public QDialog
{
Q_OBJECT
public:
ConfigDlg ();
- ~ConfigDlg ();
static QStringList ConfigDlg::loadSw();
signals:
void pickboardToggled(bool on_off);
@@ -24,21 +23,21 @@ signals:
void reloadKeyboard();
void configDlgClosed();
void reloadSw();
+protected:
+ virtual void accept();
+
protected slots:
void moveSelectedUp();
void moveSelectedDown();
private slots:
- void pickTog();
- void repeatTog();
void setMap(int index);
void addMap();
void removeMap();
virtual void closeEvent ( QCloseEvent * );
-
// all those required slots for the color push buttons
void keyColorClicked();
void keyColorPressedClicked();
void keyColorLinesClicked();
@@ -50,9 +49,8 @@ private:
QListBox *keymaps;
QPushButton *add_button;
QPushButton *remove_button;
-
QStringList default_maps; // the maps in your share/multikey/ dir
QStringList custom_maps; // maps you added with the 'add' button
QStringList sw_maps; // maps, which used in keyboard switch rotation ring
diff --git a/share/multikey/ru.keymap b/share/multikey/ru.keymap
new file mode 100644
index 0000000..8cda846
--- a/dev/null
+++ b/share/multikey/ru.keymap
@@ -0,0 +1,255 @@
+# Created by Anton Kachalov (mouse@altlinux.ru)
+title = Russian
+sw = RU
+
+1 0x1000 0 2 # and you can write whatever you want after the last element
+
+
+ "9 9 2 1"
+ ". c None"
+ "a c #000000"
+ "........."
+ "........."
+ ".aa.aa.aa"
+ ".a..a..a."
+ ".aa.aa.a."
+ ".a...a.a."
+ ".aa.aa.aa"
+ "........."
+ "........."
+
+1 0 0x0451 2 # £
+1 0 0x31 2 # 1
+1 0 0x32 2 # 2
+1 0 0x33 2 # 3
+1 0 0x34 2 # 4
+1 0 0x35 2 # 5
+1 0 0x36 2 # 6
+1 0 0x37 2 # 7
+1 0 0x38 2 # 8
+1 0 0x39 2 # 9
+1 0 0x30 2 # 0
+1 0 0x2d 2 # -
+1 0 0x3d 2 # =
+1 0x1003 0 2
+
+ "9 9 2 1"
+ ". c None"
+ "a c #000000"
+ "........."
+ "........."
+ "...a....."
+ "..aa....."
+ ".aaaaaaaa"
+ "..aa....."
+ "...a....."
+ "........."
+ "........."
+
+
+2 0x1001 0x9 3 # tab char, but why doesnt this work...?
+
+
+ "11 9 2 1"
+ ". c None"
+ "a c #000000"
+ "..........."
+ "..........."
+ ".....a..a.."
+ ".....aa.a.."
+ ".aaaaaaaa.."
+ ".....aa.a.."
+ ".....a..a.."
+ "..........."
+ "..........."
+2 0 0x0439 2 # Ê
+2 0 0x0446 2 # Ã
+2 0 0x0443 2 # Õ
+2 0 0x043a 2 # Ë
+2 0 0x0435 2 # Å
+2 0 0x043d 2 # Î
+2 0 0x0433 2 # Ç
+2 0 0x0448 2 # Û
+2 0 0x0449 2 # Ý
+2 0 0x0437 2 # Ú
+2 0 0x0445 2 # È
+2 0 0x044a 2 # ß
+2 0 0x2f 4 # /
+
+3 0x1024 0 4
+ "17 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " .. . .. .. "
+ " . . . . . . "
+ " . ... .. . "
+ " . . . . . "
+ " .. . . . .. "
+ " "
+3 0 0x0444 2 # Æ
+3 0 0x044b 2 # Ù
+3 0 0x0432 2 # ×
+3 0 0x0430 2 # Á
+3 0 0x043f 2 # Ð
+3 0 0x0440 2 # Ò
+3 0 0x043e 2 # Ï
+3 0 0x043b 2 # Ì
+3 0 0x0434 2 # Ä
+3 0 0x0436 2 # Ö
+3 0 0x044d 2 # Ü
+3 0x1004 0 5 # ENTER
+ "16 9 2 1"
+ ". c None"
+ "a c #000000"
+ "................"
+ "................"
+ "...........a...."
+ "....aa.....a...."
+ "...aa......a...."
+ "..aaaaaaaaaa...."
+ "...aa..........."
+ "....aa.........."
+ "................"
+
+4 0x1020 0 5
+ "21 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " .. . . ... ... ... "
+ " . . . . . . "
+ " . ... . .. . "
+ " . . . . . . "
+ " .. . . ... . . "
+ " "
+4 0 0x044f 2 # Ñ
+4 0 0x0447 2 # Þ
+4 0 0x0441 2 # Ó
+4 0 0x043c 2 # Í
+4 0 0x0438 2 # É
+4 0 0x0442 2 # Ô
+4 0 0x044c 2 # Ø
+4 0 0x0431 2 # Â
+4 0 0x044e 2 # À
+4 0 0x2e 2 # .
+4 0x1020 0 5 # SHIFT
+ "21 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " .. . . ... ... ... "
+ " . . . . . . "
+ " . ... . .. . "
+ " . . . . . . "
+ " .. . . ... . . "
+ " "
+
+5 0x1021 0 3
+ "17 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " .. ... .. . "
+ " . . . . . "
+ " . . .. . "
+ " . . . . . "
+ " .. . . . ... "
+ " "
+5 0x1023 0 3
+ "13 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " . . ... "
+ " . . . . "
+ " ... . . "
+ " . . . . "
+ " . . ... . "
+ " "
+5 0 0x20 16
+5 0x1023 0 3
+ "13 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " . . ... "
+ " . . . . "
+ " ... . . "
+ " . . . . "
+ " . . ... . "
+ " "
+5 0x1021 0 3
+ "17 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " .. ... .. . "
+ " . . . . . "
+ " . . .. . "
+ " . . . . . "
+ " .. . . . ... "
+ " "
+5 0x1030 0 2 #original code is F1, but i'll use it for turning on/off the config dialog
+ "13 7 2 1"
+ " c None"
+ ". c #000000"
+ " "
+ " . "
+ " ... "
+ " ..... "
+ " . "
+ " . "
+ " "
+
+# shift table
+0x0451 0x0401 # £ -> ³
+0x31 0x21 # 1 -> !
+0x32 0x22 # 2 -> "
+0x33 0x4e # 3 -> N
+0x34 0x3b # 4 -> ;
+0x35 0x25 # 5 -> %
+0x36 0x3a # 6 -> :
+0x37 0x3f # 7 -> ?
+0x38 0x2a # 8 -> *
+0x39 0x28 # 9 -> (
+0x30 0x29 # 0 -> )
+0x2d 0x5f # - -> _
+0x3d 0x2b # = -> +
+
+0x0439 0x0419 # Ê -> ê
+0x0446 0x0426 # Ã -> ã
+0x0443 0x0423 # Õ -> õ
+0x043a 0x041a # Ë -> ë
+0x0435 0x0415 # Å -> å
+0x043d 0x041d # Î -> î
+0x0433 0x0413 # Ç -> ç
+0x0448 0x0428 # Û -> û
+0x0449 0x0429 # Ý -> ý
+0x0437 0x0417 # Ú -> ú
+0x0445 0x0425 # È -> è
+0x044a 0x042a # ß -> ÿ
+
+0x0444 0x0424 # Æ -> æ
+0x044b 0x042b # Ù -> ù
+0x0432 0x0412 # × -> ÷
+0x0430 0x0410 # Á -> á
+0x043f 0x041f # Ð -> ð
+0x0440 0x0420 # Ò -> ò
+0x043e 0x041e # Ï -> ï
+0x043b 0x041b # Ì -> ì
+0x0434 0x0414 # Ä -> ä
+0x0436 0x0416 # Ö -> ö
+0x044d 0x042d # Ü -> ü
+
+0x044f 0x042f # Ñ -> ñ
+0x0447 0x0427 # Þ -> þ
+0x0441 0x0421 # Ó -> ó
+0x043c 0x041c # Í -> í
+0x0438 0x0418 # É -> é
+0x0442 0x0422 # Ô -> ô
+0x044c 0x042c # Ø -> ø
+0x0431 0x0411 # Â -> â
+0x044e 0x042e # À -> à
+0x2f 0x7c # / -> |
+0x2e 0x2c # . -> ,