author | mickeyl <mickeyl> | 2004-01-04 14:22:59 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2004-01-04 14:22:59 (UTC) |
commit | 5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057 (patch) (side-by-side diff) | |
tree | c2e1b4a090ca53efd3b3e0c20d12a633e01470d4 | |
parent | 84f039ef3799c5310a4f94057b9d76d4ee55f499 (diff) | |
download | opie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.zip opie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.tar.gz opie-5c4c2a789c19e727bb9ca323ea1fec1b7d1bd057.tar.bz2 |
more patches to multikey+applet courtesy Anton Kachalov <mouse@altlinux.ru>
-rw-r--r-- | core/applets/multikeyapplet/multikey.cpp | 22 | ||||
-rw-r--r-- | core/applets/multikeyapplet/multikey.h | 2 | ||||
-rw-r--r-- | inputmethods/multikey/configdlg.cpp | 161 | ||||
-rw-r--r-- | inputmethods/multikey/configdlg.h | 12 | ||||
-rw-r--r-- | share/multikey/ru.keymap | 255 |
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 # . -> , |