Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

KeyHelperWidget.cpp

Go to the documentation of this file.
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     //m_reset = false;
00017     m_reset = true;
00018     m_useFilter = false;
00019     m_pHelper = NULL;
00020     m_status = false;
00021 
00022     //unset();
00023     initDebugLevel();
00024 
00025     m_pHelper = new KeyHelper();
00026 
00027     //qApp->installEventFilter(this);
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     //AppLnkManager::init();
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         /* press & release */
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         /* get unicode */
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         /* check unicode */
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         /* check shift_unicode */
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         /* check ctrl_unicode */
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     //set();
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         /* default */
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");  /* IMKit */
00409         m_apps.append("POBox");     /* QPOBox */
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             //m_reset = true;
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             //m_reset = false;
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                 //QTimer::singleShot(0, this, SLOT(set()));
00443             }
00444             break;
00445 #else
00446         case QWSServer::Hide:
00447         case QWSServer::Destroy:
00448             //if(m_useFilter == false && m_reset){
00449             if(m_reset){
00450                 m_reset = false;
00451                 set();
00452                 //QTimer::singleShot(0, this, SLOT(set()));
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 }

Generated on Sat Nov 5 16:16:42 2005 for OPIE by  doxygen 1.4.2