diff options
Diffstat (limited to 'src/gui/embedded/qkbd_qws.cpp')
-rw-r--r-- | src/gui/embedded/qkbd_qws.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/src/gui/embedded/qkbd_qws.cpp b/src/gui/embedded/qkbd_qws.cpp new file mode 100644 index 0000000..8cf87db --- /dev/null +++ b/src/gui/embedded/qkbd_qws.cpp @@ -0,0 +1,248 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qkbd_qws.h" + +#ifndef QT_NO_QWS_KEYBOARD + +#include "qwindowsystem_qws.h" +#include "qscreen_qws.h" +#include "qtimer.h" +#include <stdlib.h> + +QT_BEGIN_NAMESPACE + +class QWSKbPrivate : public QObject +{ + Q_OBJECT +public: + QWSKbPrivate(QWSKeyboardHandler *h) { + handler = h; + arTimer = new QTimer(this); + arTimer->setSingleShot(true); + connect(arTimer, SIGNAL(timeout()), SLOT(autoRepeat())); + repeatdelay = 400; + repeatperiod = 80; + } + + void beginAutoRepeat(int uni, int code, Qt::KeyboardModifiers mod) { + unicode = uni; + keycode = code; + modifier = mod; + arTimer->start(repeatdelay); + } + void endAutoRepeat() { + arTimer->stop(); + } + +private slots: + void autoRepeat() { + handler->processKeyEvent(unicode, keycode, modifier, false, true); + handler->processKeyEvent(unicode, keycode, modifier, true, true); + arTimer->start(repeatperiod); + } + +private: + QWSKeyboardHandler *handler; + int unicode; + int keycode; + Qt::KeyboardModifiers modifier; + int repeatdelay; + int repeatperiod; + QTimer *arTimer; +}; + +/*! + \class QWSKeyboardHandler + \ingroup qws + + \brief The QWSKeyboardHandler class is a base class for keyboard + drivers in Qt for Embedded Linux. + + Note that this class is only available in \l{Qt for Embedded Linux}. + + \l{Qt for Embedded Linux} provides ready-made drivers for several keyboard + protocols, see the \l{Qt for Embedded Linux Character Input}{character + input} documentation for details. Custom keyboard drivers can be + implemented by subclassing the QWSKeyboardHandler class and + creating a keyboard driver plugin (derived from + QKbdDriverPlugin). The default implementation of the + QKbdDriverFactory class will automatically detect the plugin, and + load the driver into the server application at run-time using Qt's + \l{How to Create Qt Plugins}{plugin system}. + + The keyboard driver receives keyboard events from the system + device and encapsulates each event with an instance of the + QWSEvent class which it then passes to the server application (the + server is responsible for propagating the event to the appropriate + client). To receive keyboard events, a QWSKeyboardHandler object + will usually create a QSocketNotifier object for the given + device. The QSocketNotifier class provides support for monitoring + activity on a file descriptor. When the socket notifier receives + data, it will call the keyboard driver's processKeyEvent() + function to send the event to the \l{Qt for Embedded Linux} server + application for relaying to clients. + + + QWSKeyboardHandler also provides functions to control + auto-repetion of key sequences, beginAutoRepeat() and + endAutoRepeat(), and the transformDirKey() function enabling + transformation of arrow keys according to the display orientation. + + \sa QKbdDriverPlugin, QKbdDriverFactory, {Qt for Embedded Linux Character Input} +*/ + + +/*! + Constructs a keyboard driver. + + Call the QWSServer::setKeyboardHandler() function to make the + newly created keyboard driver, the primary driver. Note that the + primary driver is controlled by the system, i.e., the system will + delete it upon exit. +*/ +QWSKeyboardHandler::QWSKeyboardHandler() +{ + d = new QWSKbPrivate(this); +} + +/*! + Destroys this keyboard driver. + + Do not call this function if this driver is the primary keyboard + handler, i.e., if QWSServer::setKeyboardHandler() function has + been called passing this driver as argument. The primary keyboard + driver is deleted by the system. +*/ +QWSKeyboardHandler::~QWSKeyboardHandler() +{ + delete d; +} + + +/*! + Sends a key event to the \l{Qt for Embedded Linux} server application. + + The key event is identified by its \a unicode value and the \a + keycode, \a modifiers, \a isPress and \a autoRepeat parameters. + + The \a keycode parameter is the Qt keycode value as defined by the + Qt::Key enum. The \a modifiers is an OR combination of + Qt::KeyboardModifier values, indicating whether \gui + Shift/Alt/Ctrl keys are pressed. The \a isPress parameter is true + if the event is a key press event and \a autoRepeat is true if the + event is caused by an auto-repeat mechanism and not an actual key + press. + + \sa beginAutoRepeat(), endAutoRepeat(), transformDirKey() +*/ +void QWSKeyboardHandler::processKeyEvent(int unicode, int keycode, Qt::KeyboardModifiers modifiers, + bool isPress, bool autoRepeat) +{ + qwsServer->processKeyEvent(unicode, keycode, modifiers, isPress, autoRepeat); +} + +/*! + \fn int QWSKeyboardHandler::transformDirKey(int keycode) + + Transforms the arrow key specified by the given \a keycode, to the + orientation of the display and returns the transformed keycode. + + The \a keycode is a Qt::Key value. The values identifying arrow + keys are: + + \list + \o Qt::Key_Left + \o Qt::Key_Up + \o Qt::Key_Right + \o Qt::Key_Down + \endlist + + \sa processKeyEvent() + */ +int QWSKeyboardHandler::transformDirKey(int key) +{ + static int dir_keyrot = -1; + if (dir_keyrot < 0) { + // get the rotation + switch (qgetenv("QWS_CURSOR_ROTATION").toInt()) { + case 90: dir_keyrot = 1; break; + case 180: dir_keyrot = 2; break; + case 270: dir_keyrot = 3; break; + default: dir_keyrot = 0; break; + } + } + int xf = qt_screen->transformOrientation() + dir_keyrot; + return (key-Qt::Key_Left+xf)%4+Qt::Key_Left; +} + +/*! + \fn void QWSKeyboardHandler::beginAutoRepeat(int unicode, int keycode, Qt::KeyboardModifiers modifier) + + Begins auto-repeating the specified key press; after a short delay + the key press is sent periodically until the endAutoRepeat() + function is called. + + The key press is specified by its \a unicode, \a keycode and \a + modifier state. + + \sa endAutoRepeat(), processKeyEvent() +*/ +void QWSKeyboardHandler::beginAutoRepeat(int uni, int code, Qt::KeyboardModifiers mod) +{ + d->beginAutoRepeat(uni, code, mod); +} + +/*! + Stops auto-repeating a key press. + + \sa beginAutoRepeat(), processKeyEvent() +*/ +void QWSKeyboardHandler::endAutoRepeat() +{ + d->endAutoRepeat(); +} + +QT_END_NAMESPACE + +#include "qkbd_qws.moc" + +#endif // QT_NO_QWS_KEYBOARD |