00001 #include "KeyHelperWidget.h"
00002 #include "QSafeDataStream.h"
00003 #include "KHUtil.h"
00004
00005 QWidget* g_Widget = NULL;
00006 int g_level = 0;
00007
00008 static const char* _version_ = "1.2.2";
00009
00010 KeyHelperWidget::KeyHelperWidget(QWidget* parent, const char* name)
00011 : QLabel(parent, name),disabled(Opie::Core::OResource::loadPixmap("zkb-disabled"))
00012 {
00013 qDebug("KeyHelperWidget::KeyHelperWidget()");
00014 g_Widget = this;
00015 m_defHandler = NULL;
00016
00017 m_reset = true;
00018 m_useFilter = false;
00019 m_pHelper = NULL;
00020 m_status = false;
00021
00022
00023 initDebugLevel();
00024
00025 m_pHelper = new KeyHelper();
00026
00027
00028
00029 connect(qwsServer,
00030 SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
00031 this,
00032 SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
00033
00034 m_pChannel = new QCopChannel("QPE/KeyHelper", this);
00035 connect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
00036 this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
00037 m_pSysChannel = new QCopChannel("QPE/System", this);
00038 connect(m_pSysChannel, SIGNAL(received(const QCString&, const QByteArray&)),
00039 this, SLOT(sysMessage(const QCString&, const QByteArray&)));
00040
00041
00042 setFixedWidth ( AppLnk::smallIconSize() );
00043 setFixedHeight ( AppLnk::smallIconSize() );
00044 setPixmap(disabled);
00045 init();
00046 }
00047
00048 KeyHelperWidget::~KeyHelperWidget()
00049 {
00050 qDebug("KeyHelperWidget::~KeyHelperWidget()");
00051 disconnect(qwsServer,
00052 SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
00053 this,
00054 SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
00055 disconnect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
00056 this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
00057 unset();
00058 if (m_pHelper) delete m_pHelper;
00059 if (m_pChannel) delete m_pChannel;
00060 if (m_pSysChannel) delete m_pSysChannel;
00061 m_pHelper = NULL;
00062 setDebugLevel(0);
00063 }
00064
00065 void KeyHelperWidget::mouseReleaseEvent(QMouseEvent*)
00066 {
00067 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
00068 }
00069
00070 void KeyHelperWidget::receiveMessage(
00071 const QCString& msg, const QByteArray& data)
00072 {
00073 if(m_pHelper == NULL){
00074 return;
00075 }
00076 QSafeDataStream stream(data, IO_ReadOnly);
00077 if(msg == "event(int,int,int,int,int)"){
00078 int unicode;
00079 int keycode;
00080 int modifiers;
00081 int isPress;
00082 int autoRepeat;
00083 stream >> unicode >> keycode >> modifiers >> isPress >> autoRepeat;
00084 doEvent(unicode, keycode, modifiers, isPress, autoRepeat);
00085 } else if(msg == "event(QString,int)"){
00086 QString key;
00087 int isPress;
00088 stream >> key >> isPress;
00089 doEvent(key, isPress);
00090 } else if(msg == "enable()"){
00091 enable();
00092 } else if(msg == "disable()"){
00093 disable();
00094 } else if(msg == "pause()"){
00095 pause();
00096 } else if(msg == "restart()"){
00097 restart();
00098 } else if(msg == "reload()"){
00099 m_xmlfile = QString::null;
00100 doReload();
00101 } else if(msg == "reload(QString)"){
00102 stream >> m_xmlfile;
00103 doReload(false);
00104 } else if(msg == "version()"){
00105 version();
00106 } else if(msg == "repeater(int)"){
00107 int mode;
00108 stream >> mode;
00109 m_pHelper->m_oRepeater.setMode(mode);
00110 } else if(msg == "hook(QString)"){
00111 QString s;
00112 stream >> s;
00113 m_pHelper->m_oAction.setHook(s.local8Bit());
00114 } else if(msg == "unhook()"){
00115 m_pHelper->m_oAction.setHook("");
00116 } else if(msg == "config()"){
00117 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
00118 } else if(msg == "config(QString)"){
00119 QString name;
00120 stream >> name;
00121 if(name == QString::null){
00122 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
00123 } else {
00124 ConfigEx::getInstance("keyhelper").setConfig(name);
00125 }
00126 } else if(msg == "capture(int)"){
00127 int enable;
00128 stream >> enable;
00129 m_pHelper->m_oAction.setCapture(enable);
00130 } else if(msg == "statistics()"){
00131 int level = g_level;
00132 if(level == 0){
00133 setDebugLevel(1);
00134 }
00135 m_pHelper->statistics();
00136 if(level == 0){
00137 setDebugLevel(0);
00138 }
00139 } else if(msg == "dumpkeymap()"){
00140 int level = g_level;
00141 if(level == 0){
00142 setDebugLevel(1);
00143 }
00144 m_pHelper->dumpkeymap();
00145 if(level == 0){
00146 setDebugLevel(0);
00147 }
00148 } else if(msg == "debug(int)"){
00149 int level;
00150 stream >> level;
00151 setDebugLevel(level);
00152 }
00153 }
00154
00155 void KeyHelperWidget::doReload(bool showstatus)
00156 {
00157 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00158 QString oldgroup = cfg.getGroup();
00159 cfg.setGroup("Global");
00160 m_status = false;
00161 if(showstatus && (cfg.readNumEntry("ShowStatusOnReload", 1) == 1)){
00162 m_status = true;
00163 version();
00164 QCopEnvelope("QPE/System", "busy()");
00165 }
00166 cfg.setGroup(oldgroup);
00167 QTimer::singleShot(0, this, SLOT(reload()));
00168 }
00169
00170 void KeyHelperWidget::doEvent(int unicode, int keycode, int modifiers, int isPress, int autoRepeat)
00171 {
00172 if(isPress == 0 || isPress == 1){
00173 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, isPress, autoRepeat);
00174 m_pHelper->m_oAction.doAction();
00175 } else {
00176
00177 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 1, autoRepeat);
00178 m_pHelper->m_oAction.doAction();
00179 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 0, autoRepeat);
00180 m_pHelper->m_oAction.doAction();
00181 }
00182 }
00183
00184 void KeyHelperWidget::doEvent(const QString& key, int isPress)
00185 {
00186 int unicode,keycode;
00187 int modifiers = 0;
00188 int pos;
00189 QString keyname = key;
00190 pos = keyname.find("+SHIFT", 0, FALSE);
00191 if(pos > 0){
00192 modifiers |= Qt::ShiftButton;
00193 keyname.remove(pos, 6);
00194 }
00195 pos = keyname.find("+CTRL", 0, FALSE);
00196 if(pos > 0){
00197 modifiers |= Qt::ControlButton;
00198 keyname.remove(pos, 5);
00199 }
00200 pos = keyname.find("+ALT", 0, FALSE);
00201 if(pos > 0){
00202 modifiers |= Qt::AltButton;
00203 keyname.remove(pos, 4);
00204 }
00205 if(keyname.length() > 1){
00206 unicode = 0xffff;
00207 keycode = KeyNames::getCode(keyname);
00208
00209 const QWSServer::KeyMap* m;
00210 for(m=QWSServer::keyMap(); m->key_code != 0; m++){
00211 if(m->key_code == keycode){
00212 if(modifiers & Qt::ControlButton){
00213 unicode = m->ctrl_unicode;
00214 } else if(modifiers & Qt::ShiftButton){
00215 unicode = m->shift_unicode;
00216 } else {
00217 unicode = m->unicode;
00218 }
00219 break;
00220 }
00221 }
00222 } else {
00223 const QWSServer::KeyMap* m;
00224 keycode = 0;
00225 unicode = keyname[0].unicode();
00226
00227 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
00228 if(m->unicode == unicode){
00229 keycode = m->key_code;
00230 break;
00231 }
00232 }
00233
00234 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
00235 if(m->shift_unicode == unicode){
00236 keycode = m->key_code;
00237 modifiers |= Qt::ShiftButton;
00238 break;
00239 }
00240 }
00241
00242 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
00243 if(m->ctrl_unicode == unicode){
00244 keycode = m->key_code;
00245 modifiers |= Qt::ControlButton;
00246 break;
00247 }
00248 }
00249 }
00250 doEvent(unicode, keycode, modifiers, isPress, 0);
00251 }
00252
00253 void KeyHelperWidget::sysMessage(
00254 const QCString& msg, const QByteArray& data)
00255 {
00256 QSafeDataStream stream(data, IO_ReadOnly);
00257 if(msg == "linkChanged(QString)"){
00258 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00259 QString oldgroup = cfg.getGroup();
00260 if(cfg.readNumEntry("DetectLinkChange", 1) == 1){
00261 AppLnkManager::init(true);
00262 reload();
00263 }
00264 cfg.setGroup(oldgroup);
00265 }
00266 }
00267
00268 void MsgHandler(QtMsgType type, const char* msg)
00269 {
00270 switch(type){
00271 case QtDebugMsg:
00272 if(g_level >= 2){
00273 syslog(LOG_LOCAL5|LOG_DEBUG,
00274 "<2>%s", msg);
00275 }
00276 break;
00277 case QtWarningMsg:
00278 if(g_level >= 1){
00279 syslog(LOG_LOCAL5|LOG_DEBUG,
00280 "<1>%s", msg);
00281 }
00282 break;
00283 default:
00284 break;
00285 }
00286 }
00287
00288 void KeyHelperWidget::initDebugLevel()
00289 {
00290 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00291 cfg.setGroup("Global");
00292
00293 int level = cfg.readNumEntry("DebugLevel", 0);
00294 setDebugLevel(level);
00295 }
00296
00297 void KeyHelperWidget::setDebugLevel(int level)
00298 {
00299 #ifdef QT_QWS_EBX
00300 static bool noDebug = true;
00301 g_level = level;
00302 if(g_level > 0){
00303 if(noDebug){
00304 m_defHandler = qInstallMsgHandler(MsgHandler);
00305 noDebug = false;
00306 }
00307 } else {
00308 qInstallMsgHandler(m_defHandler);
00309 noDebug = true;
00310 }
00311 #endif
00312 }
00313
00314 void KeyHelperWidget::enable()
00315 {
00316 m_enable = true;
00317 m_pHelper->enable();
00318
00319 QTimer::singleShot(0, this, SLOT(set()));
00320 }
00321
00322 void KeyHelperWidget::disable()
00323 {
00324 m_enable = false;
00325 m_pHelper->disable();
00326 unset();
00327 }
00328
00329 void KeyHelperWidget::pause()
00330 {
00331 m_saved = m_enable;
00332 disable();
00333 }
00334
00335 void KeyHelperWidget::restart()
00336 {
00337 if(m_saved){
00338 enable();
00339 }
00340 }
00341
00342 void KeyHelperWidget::reload()
00343 {
00344 disable();
00345 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00346 cfg.reload();
00347 if(m_pHelper->reload(m_xmlfile) == false){
00348 if(m_status){
00349 Global::statusMessage("KeyHelper: Load Error");
00350 }
00351 }
00352 init();
00353 if(m_status){
00354 QCopEnvelope e("QPE/System", "notBusy(QString)");
00355 const QString app = KHUtil::currentApp();
00356 e << app;
00357 m_status = false;
00358 }
00359 }
00360
00361 void KeyHelperWidget::version()
00362 {
00363 QString ver = "KeyHelper ";
00364 ver.append(_version_);
00365 Global::statusMessage(ver);
00366 }
00367
00368 void KeyHelperWidget::init()
00369 {
00370 AppLnkManager::init();
00371 #if 0
00372 if(m_pHelper == NULL){
00373 m_pHelper = new KeyHelper();
00374 }
00375 #endif
00376 loadUseFilterApps();
00377 enable();
00378 }
00379
00380 void KeyHelperWidget::set()
00381 {
00382 if(m_pHelper != NULL && m_enable == true && m_useFilter == false){
00383 qWarning("KeyHelperWidget::set()");
00384 m_pHelper->set();
00385 }
00386 }
00387
00388 void KeyHelperWidget::unset()
00389 {
00390 m_pHelper->unset();
00391 }
00392
00393 void KeyHelperWidget::loadUseFilterApps()
00394 {
00395 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
00396
00397 cfg.setGroup("Global");
00398 m_apps = cfg.readListEntry("UseFilterApps", ',');
00399
00400 if(m_apps.isEmpty()){
00401
00402 m_apps.append("CRIM");
00403 m_apps.append("Jpn50Pad");
00404 m_apps.append("JpnKtnPad");
00405 m_apps.append("JpnNumPad");
00406 m_apps.append("JpnSymPad");
00407 m_apps.append("Keyboard");
00408 m_apps.append("IMWidget");
00409 m_apps.append("POBox");
00410 }
00411 }
00412
00413 #if 0
00414 void KeyHelperWidget::windowEvent(QWSWindow* w, QWSServer::WindowEvent e)
00415 {
00416 if(m_apps.contains(w->name())){
00417 switch(e){
00418 case QWSServer::Hide:
00419 case QWSServer::Destroy:
00420 m_useFilter = false;
00421
00422 QTimer::singleShot(0, this, SLOT(set()));
00423 break;
00424 case QWSServer::Create:
00425 case QWSServer::Raise:
00426 case QWSServer::Show:
00427 m_useFilter = true;
00428
00429 m_reset = true;
00430 break;
00431 default:
00432 break;
00433 }
00434 } else if(w->client()->identity() != NULL && w->name() != NULL){
00435 switch(e){
00436 #if 0
00437 case QWSServer::Create:
00438 case QWSServer::Hide:
00439 if(m_useFilter == false && m_reset){
00440 m_reset = false;
00441 set();
00442
00443 }
00444 break;
00445 #else
00446 case QWSServer::Hide:
00447 case QWSServer::Destroy:
00448
00449 if(m_reset){
00450 m_reset = false;
00451 set();
00452
00453 }
00454 break;
00455 case QWSServer::Create:
00456 case QWSServer::Raise:
00457 case QWSServer::Show:
00458 m_reset = true;
00459 break;
00460 #endif
00461 default:
00462 #if 0
00463 if(m_reset == true){
00464 m_reset = false;
00465 set();
00466 }
00467 #endif
00468 break;
00469 }
00470 }
00471 if(w->name() != NULL){
00472 qWarning("[%s][%s][%x][%s]",
00473 w->name().latin1(),
00474 w->caption().latin1(),
00475 e,
00476 w->client()->identity().latin1());
00477 }
00478 }
00479
00480 #endif
00481
00482 bool KeyHelperWidget::eventFilter(QObject* o, QEvent* e)
00483 {
00484 return QWidget::eventFilter(o, e);
00485 }
00486
00487 int KeyHelperWidget::position()
00488 {
00489 return 3;
00490 }