summaryrefslogtreecommitdiff
authortreke <treke>2003-07-19 16:38:27 (UTC)
committer treke <treke>2003-07-19 16:38:27 (UTC)
commit67b69b7aede83ccb0d933dec9bd959f01eb6ea06 (patch) (side-by-side diff)
tree6e404164453172adc58d088f72c58e6f38e4b4c3
parentcf3921fe77f87e94ff821df65bb80b02487a9f9b (diff)
downloadopie-67b69b7aede83ccb0d933dec9bd959f01eb6ea06.zip
opie-67b69b7aede83ccb0d933dec9bd959f01eb6ea06.tar.gz
opie-67b69b7aede83ccb0d933dec9bd959f01eb6ea06.tar.bz2
* Adds a keyboard layout with a configure button to multikey when it is
unable to load the selected layout. Fixes (#920)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--inputmethods/multikey/keyboard.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index bded447..2ce6dd3 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -1,137 +1,149 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "keyboard.h"
#include "configdlg.h"
#include <qpe/global.h>
#include <qpe/qcopenvelope_qws.h>
#include <qwindowsystem_qws.h>
#include <qpainter.h>
#include <qfontmetrics.h>
#include <qtimer.h>
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <ctype.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qstringlist.h>
#include <sys/utsname.h>
using namespace MultiKey;
+static const char * const kb_config_xpm[] = {
+"13 7 2 1",
+" c None",
+". c #000000",
+" ",
+" . ",
+" ... ",
+" ..... ",
+" . ",
+" . ",
+" "};
+
/* Keyboard::Keyboard {{{1 */
Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0),
meta(0), circumflex(0), diaeresis(0), baccent(0), accent(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" );
QString familyStr = config->readEntry( "FontFamily", "smallsmooth" );
delete config;
config = new Config("multikey");
config->setGroup ("general");
usePicks = config->readBoolEntry ("usePickboard", 0); // default closed
useRepeat = config->readBoolEntry ("useRepeat", 1);
delete config;
setFont( QFont( familyStr, 10 ) );
picks = new KeyboardPicks( this );
picks->setFont( QFont( familyStr, 10 ) );
picks->initialise();
if (usePicks) {
QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ),
this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) );
} else picks->hide();
loadKeyboardColors();
keys = new Keys();
repeatTimer = new QTimer( this );
connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
}
Keyboard::~Keyboard() {
if ( configdlg ) {
delete (ConfigDlg *) configdlg;
configdlg = 0;
}
}
/* Keyboard::resizeEvent {{{1 */
void Keyboard::resizeEvent(QResizeEvent*)
{
int ph = picks->sizeHint().height();
picks->setGeometry( 0, 0, width(), ph );
keyHeight = (height()-(usePicks ? ph : 0))/(keys->rows()?keys->rows():1);
int nk; // number of keys?
if ( useLargeKeys ) {
nk = 15;
} else {
nk = 19;
}
defaultKeyWidth = (width()/nk)/2;
xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces?
}
/* KeyboardPicks::initialize {{{1 */
void KeyboardPicks::initialise()
{
setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed));
mode = 0;
dc = new KeyboardConfig(this);
configs.append(dc);
}
/* KeyboardPicks::sizeHint {{{1 */
QSize KeyboardPicks::sizeHint() const
{
return QSize(240,fontMetrics().lineSpacing());
}
/* KeyboardConfig::generateText {{{1 */
void KeyboardConfig::generateText(const QString &s)
{
#if defined(Q_WS_QWS) || defined(_WS_QWS_)
for (int i=0; i<(int)backspaces; i++) {
parent->emitKey( 0, Qt::Key_Backspace, 0, true, false );
parent->emitKey( 0, Qt::Key_Backspace, 0, false, false );
}
@@ -1429,197 +1441,203 @@ void Keys::setKeysFromFile(const char * filename) {
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();
}
// circumflex
else if (buf.contains(QRegExp("^\\s*c\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar c;
tmp >> c >> lower >> shift;
circumflexMap.insert(lower, shift);
buf = t.readLine();
}
// diaeresis
else if (buf.contains(QRegExp("^\\s*d\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
diaeresisMap.insert(lower, shift);
buf = t.readLine();
}
// back accent
else if (buf.contains(QRegExp("^\\s*b\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
baccentMap.insert(lower, shift);
qDebug ("Estoy aadiendo %i con %i", lower, shift);
buf = t.readLine();
}
// accent
else if (buf.contains(QRegExp("^\\s*a\\s+[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) {
QTextStream tmp (buf, IO_ReadOnly);
ushort lower, shift;
QChar d;
tmp >> d >> lower >> shift;
accentMap.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;
}
buf = t.readLine();
}
// comments
else if (buf.contains(QRegExp("^\\s*#"))) {
buf = t.readLine();
} else { // blank line, or garbage
buf = t.readLine();
}
}
+
f.close();
+ } else {
+ // We couldnt find the selected keymap, give them a configure button
+ QImage * btn = new QImage((const char ** )kb_config_xpm);
+ setKey(1, 0x1030, 0, 2, btn);
}
}
+
// Keys::setKey {{{2
void Keys::setKey(const int row, const int qcode, const ushort unicode,
const int width, QImage *pix) {
Key * key;
key = new Key;
key->qcode = qcode;
key->unicode = unicode;
key->width = width;
// share key->pressed between same keys
bool found = 0;
for (int i = 1; i <= 5; i++) {
for (unsigned int j = 0; j < keys[i].count(); j++)
if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) {
key->pressed = keys[i].at(j)->pressed;
found = 1;
}
}
if (!found) {
key->pressed = new bool;
*(key->pressed) = 0;
}
key->pix = pix;
keys[row].append(key);
}
// Keys::~Keys {{{2
Keys::~Keys() {
for (int i = 1; i <= 5; i++)
for (unsigned int j = 0; j < keys[i].count(); j++)
delete keys[i].at(j);
}
// Keys:: other functions {{{2
int Keys::width(const int row, const int col) {
return keys[row].at(col)->width;
}
int Keys::rows() {
for (int i = 1; i <= 5; i++) {
if (keys[i].count() == 0)
return i - 1;
}
return 5;
}
ushort Keys::uni(const int row, const int col) {
return keys[row].at(col)->unicode;
}
int Keys::qcode(const int row, const int col) {
return keys[row].at(col)->qcode;
}
QImage *Keys::pix(const int row, const int col) {
return keys[row].at(col)->pix;
}
bool Keys::pressed(const int row, const int col) {
return *(keys[row].at(col)->pressed);
}
int Keys::numKeys(const int row) {
return keys[row].count();
}
void Keys::setPressed(const int row, const int col, const bool pressed) {
*(keys[row].at(col)->pressed) = pressed;
}
ushort Keys::shift(const ushort uni) {
if (shiftMap[uni]) return shiftMap[uni];
else return 0;
}