From 2b64a84d39eeed5681d0ee5068c7d11a01527750 Mon Sep 17 00:00:00 2001 From: alwin Date: Mon, 28 Feb 2005 09:40:30 +0000 Subject: other keymapping tool - not working this moment, I have to check it out - the reason is that the config file is somewhat easier to understand than from zkbapplet and has a nice config tool. Please don't put it into any repositories this moment. --- (limited to 'noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp') diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp new file mode 100644 index 0000000..4fc9cc4 --- a/dev/null +++ b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp @@ -0,0 +1,225 @@ +#include "TaskSelector.h" +extern QWidget* g_Widget; + +static const char* defkeys = +"QWERTYUIOPASDFGHJKLZXCVBNM1234567890"; + +#define START_INDEX 1 + +TaskSelector::TaskSelector(const QString& kind) : m_kind(kind) +{ + qDebug("TaskSelector::TaskSelector()"); + m_pMenu = new QPopupMenuEx(g_Widget); + m_pMenu->installEventFilter(this); + + m_isShowing = false; + m_index = START_INDEX-1; + connect(m_pMenu, SIGNAL(activated(int)), this, SLOT(select(int))); + connect(m_pMenu, SIGNAL(highlighted(int)), this, SLOT(highlight(int))); +} + +TaskSelector::~TaskSelector() +{ + qDebug("TaskSelector::~TaskSelector()"); + delete m_pMenu; +} + +bool TaskSelector::onKeyPress(int /*keycode*/) +{ + if(m_isShowing){ + qDebug("showing ..."); + } else if(m_pMenu->isVisible()){ + next(); + } else { + ConfigEx& cfg = ConfigEx::getInstance("keyhelper"); + cfg.setGroup("Global"); + int delay = cfg.readNumEntry("DelayPopup", 5); + QTimer::singleShot(delay, this, SLOT(show())); + m_isShowing = true; + } + return true; +} + +bool TaskSelector::onModRelease(int /*modcode*/) +{ + if(m_pMenu->isVisible()){ + //m_pMenu->hide(); + QTimer::singleShot(0, this, SLOT(select())); + return(true); + } else { + return(false); + } +} + +int TaskSelector::buildMenu() +{ + const AppLnk* lnk; + + ConfigEx& cfg = ConfigEx::getInstance("keyhelper"); + QString oldgroup; + + oldgroup = cfg.getGroup(); + cfg.setGroup("Global"); + QString accesskeys = cfg.readEntry("AccessKeys", defkeys); + if(accesskeys.length() <= 0){ + accesskeys = defkeys; + } + cfg.setGroup(oldgroup); + + /* get list */ + int cnt = 0; + m_index = START_INDEX+1; + m_applist.clear(); + m_pMenu->clear(); + MenuTitle* pTitle = new MenuTitle("TaskSelector", m_pMenu->font(), kind()); + m_pMenu->insertItem(pTitle); + const QList& list = qwsServer->clientWindows(); + QWSWindow* w; + for(QListIterator it(list); (w=it.current()); ++it){ + if(w->isVisible() == false + || w->caption() == QString::null){ + continue; + } + QString app = w->client()->identity(); + if(app == NULL || m_applist.contains(app)){ + continue; + } + /* exclude "launcher" */ + if(app == "launcher"){ + if(cnt == 0){ + m_index--; + } + continue; + } + m_applist.append(app); + /* append menu */ + cnt++; + AppLnkSet* lnkSet = AppLnkManager::getInstance(); + lnk = lnkSet->findExec(app); + QString text; + QPixmap icon; +#if 0 + if(lnk != NULL){ + icon = lnk->pixmap(); + text = lnk->name(); + } else { + AppLnkManager::notfound(); + icon = QPixmap(); + text = w->caption(); + } +#else + if(lnk != NULL){ + icon = lnk->pixmap(); + if(w->caption().length() > 0){ + text = w->caption(); + } else { + text = lnk->name(); + } + } else { + AppLnkManager::notfound(); + icon = QPixmap(); + text = w->caption(); + } +#endif + if(cnt <= (int)accesskeys.length()){ + text.append("(&"); + text.append(accesskeys[cnt-1].upper()); + text.append(")"); + } + m_pMenu->insertItem(icon, text, cnt); + } + return(cnt); +} + +void TaskSelector::show() +{ + /* build task selector menu */ + int cnt = buildMenu(); + ConfigEx& cfg = ConfigEx::getInstance("keyhelper"); + QString oldgroup = cfg.getGroup(); + cfg.setGroup("Global"); + int min = cfg.readNumEntry("SelectMenuMin", 2); + if(min != 1 && min != 3){ + min = 2; + } + cfg.setGroup(oldgroup); + + if(cnt == 0){ + qDebug("no applications"); + } else if(cnt < min){ + //m_index = START_INDEX; + if(m_index > cnt){ + m_index = cnt; + } + QTimer::singleShot(0, this, SLOT(select())); + } else { + if(m_index > cnt){ + m_index = cnt; + } + ConfigEx& cfg = ConfigEx::getInstance("keyhelper"); + cfg.setGroup("Style"); + int x,y; + QString key = "Position_" + kind(); + if(cfg.hasKey(key)){ + const QStringList& list = cfg.readListEntry(key, ','); + x = list[0].toInt(); + y = list[1].toInt(); + } else { + x = (qt_screen->width() - m_pMenu->sizeHint().width()) / 2; + y = (qt_screen->height() - m_pMenu->sizeHint().height()) / 2; + } + QPoint pos(x, y); + m_pMenu->popup(pos); + m_pMenu->setActiveItem(m_index); + } + m_isShowing = false; +} + +void TaskSelector::next() +{ + m_index++; + if(m_index > (signed int)m_applist.count()){ + m_index = START_INDEX; + } + m_pMenu->setActiveItem(m_index); +} + +void TaskSelector::select() +{ + //select(m_index); + m_pMenu->activateItemAt(m_index); +} + +void TaskSelector::select(int index) +{ + if(index > 0){ + Global::execute(m_applist[index-1]); + } + m_index = 0; +} + +void TaskSelector::highlight(int index) +{ + if(m_pMenu->isVisible()){ + m_index = index; + } +} + +bool TaskSelector::eventFilter(QObject* o, QEvent* e) +{ + if(m_pMenu->isVisible()){ + QKeyEvent* ke = (QKeyEvent*)e; + switch(e->type()){ + case QEvent::Accel: + if(ke->key() == Qt::Key_Space + && ke->isAutoRepeat() == false){ + select(); + } + break; + default: + //qDebug(">>>>> [%p][%d] <<<<<", o, e->type()); + break; + } + } + return QObject::eventFilter(o, e); +} -- cgit v0.9.0.2