summaryrefslogtreecommitdiff
path: root/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp
Side-by-side diff
Diffstat (limited to 'noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp490
1 files changed, 490 insertions, 0 deletions
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp
new file mode 100644
index 0000000..7beb511
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp
@@ -0,0 +1,490 @@
+#include "KeyHelperWidget.h"
+#include "QSafeDataStream.h"
+#include "KHUtil.h"
+
+QWidget* g_Widget = NULL;
+int g_level = 0;
+
+static const char* _version_ = "1.2.2";
+
+KeyHelperWidget::KeyHelperWidget(QWidget* parent, const char* name)
+ : QLabel(parent, name),disabled(Resource::loadPixmap("zkb-disabled"))
+{
+ qDebug("KeyHelperWidget::KeyHelperWidget()");
+ g_Widget = this;
+ m_defHandler = NULL;
+ //m_reset = false;
+ m_reset = true;
+ m_useFilter = false;
+ m_pHelper = NULL;
+ m_status = false;
+
+ //unset();
+ initDebugLevel();
+
+ m_pHelper = new KeyHelper();
+
+ //qApp->installEventFilter(this);
+
+ connect(qwsServer,
+ SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
+ this,
+ SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
+
+ m_pChannel = new QCopChannel("QPE/KeyHelper", this);
+ connect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
+ this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
+ m_pSysChannel = new QCopChannel("QPE/System", this);
+ connect(m_pSysChannel, SIGNAL(received(const QCString&, const QByteArray&)),
+ this, SLOT(sysMessage(const QCString&, const QByteArray&)));
+
+ //AppLnkManager::init();
+ setFixedWidth ( AppLnk::smallIconSize() );
+ setFixedHeight ( AppLnk::smallIconSize() );
+ setPixmap(disabled);
+ init();
+}
+
+KeyHelperWidget::~KeyHelperWidget()
+{
+ qDebug("KeyHelperWidget::~KeyHelperWidget()");
+ disconnect(qwsServer,
+ SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
+ this,
+ SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
+ disconnect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
+ this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
+ unset();
+ if (m_pHelper) delete m_pHelper;
+ if (m_pChannel) delete m_pChannel;
+ if (m_pSysChannel) delete m_pSysChannel;
+ m_pHelper = NULL;
+ setDebugLevel(0);
+}
+
+void KeyHelperWidget::mouseReleaseEvent(QMouseEvent*)
+{
+ ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
+}
+
+void KeyHelperWidget::receiveMessage(
+ const QCString& msg, const QByteArray& data)
+{
+ if(m_pHelper == NULL){
+ return;
+ }
+ QSafeDataStream stream(data, IO_ReadOnly);
+ if(msg == "event(int,int,int,int,int)"){
+ int unicode;
+ int keycode;
+ int modifiers;
+ int isPress;
+ int autoRepeat;
+ stream >> unicode >> keycode >> modifiers >> isPress >> autoRepeat;
+ doEvent(unicode, keycode, modifiers, isPress, autoRepeat);
+ } else if(msg == "event(QString,int)"){
+ QString key;
+ int isPress;
+ stream >> key >> isPress;
+ doEvent(key, isPress);
+ } else if(msg == "enable()"){
+ enable();
+ } else if(msg == "disable()"){
+ disable();
+ } else if(msg == "pause()"){
+ pause();
+ } else if(msg == "restart()"){
+ restart();
+ } else if(msg == "reload()"){
+ m_xmlfile = QString::null;
+ doReload();
+ } else if(msg == "reload(QString)"){
+ stream >> m_xmlfile;
+ doReload(false);
+ } else if(msg == "version()"){
+ version();
+ } else if(msg == "repeater(int)"){
+ int mode;
+ stream >> mode;
+ m_pHelper->m_oRepeater.setMode(mode);
+ } else if(msg == "hook(QString)"){
+ QString s;
+ stream >> s;
+ m_pHelper->m_oAction.setHook(s.local8Bit());
+ } else if(msg == "unhook()"){
+ m_pHelper->m_oAction.setHook("");
+ } else if(msg == "config()"){
+ ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
+ } else if(msg == "config(QString)"){
+ QString name;
+ stream >> name;
+ if(name == QString::null){
+ ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
+ } else {
+ ConfigEx::getInstance("keyhelper").setConfig(name);
+ }
+ } else if(msg == "capture(int)"){
+ int enable;
+ stream >> enable;
+ m_pHelper->m_oAction.setCapture(enable);
+ } else if(msg == "statistics()"){
+ int level = g_level;
+ if(level == 0){
+ setDebugLevel(1);
+ }
+ m_pHelper->statistics();
+ if(level == 0){
+ setDebugLevel(0);
+ }
+ } else if(msg == "dumpkeymap()"){
+ int level = g_level;
+ if(level == 0){
+ setDebugLevel(1);
+ }
+ m_pHelper->dumpkeymap();
+ if(level == 0){
+ setDebugLevel(0);
+ }
+ } else if(msg == "debug(int)"){
+ int level;
+ stream >> level;
+ setDebugLevel(level);
+ }
+}
+
+void KeyHelperWidget::doReload(bool showstatus)
+{
+ ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
+ QString oldgroup = cfg.getGroup();
+ cfg.setGroup("Global");
+ m_status = false;
+ if(showstatus && (cfg.readNumEntry("ShowStatusOnReload", 1) == 1)){
+ m_status = true;
+ version();
+ QCopEnvelope("QPE/System", "busy()");
+ }
+ cfg.setGroup(oldgroup);
+ QTimer::singleShot(0, this, SLOT(reload()));
+}
+
+void KeyHelperWidget::doEvent(int unicode, int keycode, int modifiers, int isPress, int autoRepeat)
+{
+ if(isPress == 0 || isPress == 1){
+ m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, isPress, autoRepeat);
+ m_pHelper->m_oAction.doAction();
+ } else {
+ /* press & release */
+ m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 1, autoRepeat);
+ m_pHelper->m_oAction.doAction();
+ m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 0, autoRepeat);
+ m_pHelper->m_oAction.doAction();
+ }
+}
+
+void KeyHelperWidget::doEvent(const QString& key, int isPress)
+{
+ int unicode,keycode;
+ int modifiers = 0;
+ int pos;
+ QString keyname = key;
+ pos = keyname.find("+SHIFT", 0, FALSE);
+ if(pos > 0){
+ modifiers |= Qt::ShiftButton;
+ keyname.remove(pos, 6);
+ }
+ pos = keyname.find("+CTRL", 0, FALSE);
+ if(pos > 0){
+ modifiers |= Qt::ControlButton;
+ keyname.remove(pos, 5);
+ }
+ pos = keyname.find("+ALT", 0, FALSE);
+ if(pos > 0){
+ modifiers |= Qt::AltButton;
+ keyname.remove(pos, 4);
+ }
+ if(keyname.length() > 1){
+ unicode = 0xffff;
+ keycode = KeyNames::getCode(keyname);
+ /* get unicode */
+ const QWSServer::KeyMap* m;
+ for(m=QWSServer::keyMap(); m->key_code != 0; m++){
+ if(m->key_code == keycode){
+ if(modifiers & Qt::ControlButton){
+ unicode = m->ctrl_unicode;
+ } else if(modifiers & Qt::ShiftButton){
+ unicode = m->shift_unicode;
+ } else {
+ unicode = m->unicode;
+ }
+ break;
+ }
+ }
+ } else {
+ const QWSServer::KeyMap* m;
+ keycode = 0;
+ unicode = keyname[0].unicode();
+ /* check unicode */
+ for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
+ if(m->unicode == unicode){
+ keycode = m->key_code;
+ break;
+ }
+ }
+ /* check shift_unicode */
+ for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
+ if(m->shift_unicode == unicode){
+ keycode = m->key_code;
+ modifiers |= Qt::ShiftButton;
+ break;
+ }
+ }
+ /* check ctrl_unicode */
+ for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
+ if(m->ctrl_unicode == unicode){
+ keycode = m->key_code;
+ modifiers |= Qt::ControlButton;
+ break;
+ }
+ }
+ }
+ doEvent(unicode, keycode, modifiers, isPress, 0);
+}
+
+void KeyHelperWidget::sysMessage(
+ const QCString& msg, const QByteArray& data)
+{
+ QSafeDataStream stream(data, IO_ReadOnly);
+ if(msg == "linkChanged(QString)"){
+ ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
+ QString oldgroup = cfg.getGroup();
+ if(cfg.readNumEntry("DetectLinkChange", 1) == 1){
+ AppLnkManager::init(true);
+ reload();
+ }
+ cfg.setGroup(oldgroup);
+ }
+}
+
+void MsgHandler(QtMsgType type, const char* msg)
+{
+ switch(type){
+ case QtDebugMsg:
+ if(g_level >= 2){
+ syslog(LOG_LOCAL5|LOG_DEBUG,
+ "<2>%s", msg);
+ }
+ break;
+ case QtWarningMsg:
+ if(g_level >= 1){
+ syslog(LOG_LOCAL5|LOG_DEBUG,
+ "<1>%s", msg);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void KeyHelperWidget::initDebugLevel()
+{
+ ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
+ cfg.setGroup("Global");
+
+ int level = cfg.readNumEntry("DebugLevel", 0);
+ setDebugLevel(level);
+}
+
+void KeyHelperWidget::setDebugLevel(int level)
+{
+#ifdef QT_QWS_EBX
+ static bool noDebug = true;
+ g_level = level;
+ if(g_level > 0){
+ if(noDebug){
+ m_defHandler = qInstallMsgHandler(MsgHandler);
+ noDebug = false;
+ }
+ } else {
+ qInstallMsgHandler(m_defHandler);
+ noDebug = true;
+ }
+#endif
+}
+
+void KeyHelperWidget::enable()
+{
+ m_enable = true;
+ m_pHelper->enable();
+ //set();
+ QTimer::singleShot(0, this, SLOT(set()));
+}
+
+void KeyHelperWidget::disable()
+{
+ m_enable = false;
+ m_pHelper->disable();
+ unset();
+}
+
+void KeyHelperWidget::pause()
+{
+ m_saved = m_enable;
+ disable();
+}
+
+void KeyHelperWidget::restart()
+{
+ if(m_saved){
+ enable();
+ }
+}
+
+void KeyHelperWidget::reload()
+{
+ disable();
+ ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
+ cfg.reload();
+ if(m_pHelper->reload(m_xmlfile) == false){
+ if(m_status){
+ Global::statusMessage("KeyHelper: Load Error");
+ }
+ }
+ init();
+ if(m_status){
+ QCopEnvelope e("QPE/System", "notBusy(QString)");
+ const QString app = KHUtil::currentApp();
+ e << app;
+ m_status = false;
+ }
+}
+
+void KeyHelperWidget::version()
+{
+ QString ver = "KeyHelper ";
+ ver.append(_version_);
+ Global::statusMessage(ver);
+}
+
+void KeyHelperWidget::init()
+{
+ AppLnkManager::init();
+#if 0
+ if(m_pHelper == NULL){
+ m_pHelper = new KeyHelper();
+ }
+#endif
+ loadUseFilterApps();
+ enable();
+}
+
+void KeyHelperWidget::set()
+{
+ if(m_pHelper != NULL && m_enable == true && m_useFilter == false){
+ qWarning("KeyHelperWidget::set()");
+ m_pHelper->set();
+ }
+}
+
+void KeyHelperWidget::unset()
+{
+ m_pHelper->unset();
+}
+
+void KeyHelperWidget::loadUseFilterApps()
+{
+ ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
+
+ cfg.setGroup("Global");
+ m_apps = cfg.readListEntry("UseFilterApps", ',');
+
+ if(m_apps.isEmpty()){
+ /* default */
+ m_apps.append("CRIM");
+ m_apps.append("Jpn50Pad");
+ m_apps.append("JpnKtnPad");
+ m_apps.append("JpnNumPad");
+ m_apps.append("JpnSymPad");
+ m_apps.append("Keyboard");
+ m_apps.append("IMWidget"); /* IMKit */
+ m_apps.append("POBox"); /* QPOBox */
+ }
+}
+
+#if 0
+void KeyHelperWidget::windowEvent(QWSWindow* w, QWSServer::WindowEvent e)
+{
+ if(m_apps.contains(w->name())){
+ switch(e){
+ case QWSServer::Hide:
+ case QWSServer::Destroy:
+ m_useFilter = false;
+ //m_reset = true;
+ QTimer::singleShot(0, this, SLOT(set()));
+ break;
+ case QWSServer::Create:
+ case QWSServer::Raise:
+ case QWSServer::Show:
+ m_useFilter = true;
+ //m_reset = false;
+ m_reset = true;
+ break;
+ default:
+ break;
+ }
+ } else if(w->client()->identity() != NULL && w->name() != NULL){
+ switch(e){
+#if 0
+ case QWSServer::Create:
+ case QWSServer::Hide:
+ if(m_useFilter == false && m_reset){
+ m_reset = false;
+ set();
+ //QTimer::singleShot(0, this, SLOT(set()));
+ }
+ break;
+#else
+ case QWSServer::Hide:
+ case QWSServer::Destroy:
+ //if(m_useFilter == false && m_reset){
+ if(m_reset){
+ m_reset = false;
+ set();
+ //QTimer::singleShot(0, this, SLOT(set()));
+ }
+ break;
+ case QWSServer::Create:
+ case QWSServer::Raise:
+ case QWSServer::Show:
+ m_reset = true;
+ break;
+#endif
+ default:
+#if 0
+ if(m_reset == true){
+ m_reset = false;
+ set();
+ }
+#endif
+ break;
+ }
+ }
+ if(w->name() != NULL){
+ qWarning("[%s][%s][%x][%s]",
+ w->name().latin1(),
+ w->caption().latin1(),
+ e,
+ w->client()->identity().latin1());
+ }
+}
+
+#endif
+
+bool KeyHelperWidget::eventFilter(QObject* o, QEvent* e)
+{
+ return QWidget::eventFilter(o, e);
+}
+
+int KeyHelperWidget::position()
+{
+ return 3;
+}