diff --git a/tabbox/tabbox.cpp b/tabbox/tabbox.cpp
index 31080f8ac8..992b377c6d 100644
--- a/tabbox/tabbox.cpp
+++ b/tabbox/tabbox.cpp
@@ -34,6 +34,7 @@ along with this program. If not, see .
// Qt
#include
#include
+#include
// KDE
#include
#include
@@ -288,6 +289,7 @@ TabBox::TabBox(QObject *parent)
, m_displayRefcount(0)
, m_desktopGrab(false)
, m_tabGrab(false)
+ , m_noModifierGrab(false)
, m_forcedGlobalMouseGrab(false)
, m_ready(false)
{
@@ -323,10 +325,12 @@ TabBox::TabBox(QObject *parent)
m_tabBoxMode = TabBoxDesktopMode; // init variables
connect(&m_delayedShowTimer, SIGNAL(timeout()), this, SLOT(show()));
connect(Workspace::self(), SIGNAL(configChanged()), this, SLOT(reconfigure()));
+ QDBusConnection::sessionBus().registerObject("/TabBox", this, QDBusConnection::ExportScriptableContents);
}
TabBox::~TabBox()
{
+ QDBusConnection::sessionBus().unregisterObject("/TabBox");
}
void TabBox::handlerReady()
@@ -668,6 +672,19 @@ void TabBox::grabbedKeyEvent(QKeyEvent* event)
// tabbox has been replaced, check effects
return;
}
+ if (m_noModifierGrab) {
+ if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return || event->key() == Qt::Key_Space) {
+ Client* c = currentClient();
+ close();
+ if (c) {
+ Workspace::self()->activateClient(c);
+ if (c->isShade() && options->shadeHover)
+ c->setShade(ShadeActivated);
+ if (c->isDesktop())
+ Workspace::self()->setShowingDesktop(!Workspace::self()->showingDesktop());
+ }
+ }
+ }
setCurrentIndex(m_tabBox->grabbedKeyEvent(event));
}
@@ -922,11 +939,27 @@ void TabBox::modalActionsSwitch(bool enabled)
action->setEnabled(enabled);
}
+void TabBox::start()
+{
+ if (isDisplayed()) {
+ return;
+ }
+ if (!establishTabBoxGrab()) {
+ return;
+ }
+ m_tabGrab = true;
+ m_noModifierGrab = true;
+ setMode(TabBoxWindowsMode);
+ reset();
+ show();
+}
+
bool TabBox::startKDEWalkThroughWindows(TabBoxMode mode)
{
if (!establishTabBoxGrab())
return false;
m_tabGrab = true;
+ m_noModifierGrab = false;
modalActionsSwitch(false);
setMode(mode);
reset();
@@ -938,6 +971,7 @@ bool TabBox::startWalkThroughDesktops(TabBoxMode mode)
if (!establishTabBoxGrab())
return false;
m_desktopGrab = true;
+ m_noModifierGrab = false;
modalActionsSwitch(false);
setMode(mode);
reset();
@@ -1100,11 +1134,15 @@ void TabBox::keyPress(int keyQt)
void TabBox::close(bool abort)
{
+ if (!isGrabbed()) {
+ return;
+ }
removeTabBoxGrab();
hide(abort);
modalActionsSwitch(true);
m_tabGrab = false;
m_desktopGrab = false;
+ m_noModifierGrab = false;
}
/*!
@@ -1112,6 +1150,9 @@ void TabBox::close(bool abort)
*/
void TabBox::keyRelease(const XKeyEvent& ev)
{
+ if (m_noModifierGrab) {
+ return;
+ }
unsigned int mk = ev.state &
(KKeyServer::modXShift() |
KKeyServer::modXCtrl() |
diff --git a/tabbox/tabbox.h b/tabbox/tabbox.h
index 41b9243453..e7018aa225 100644
--- a/tabbox/tabbox.h
+++ b/tabbox/tabbox.h
@@ -97,6 +97,7 @@ private:
class TabBox : public QObject
{
Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.kde.kwin")
public:
TabBox(QObject *parent = NULL);
~TabBox();
@@ -162,12 +163,16 @@ public:
int previousDesktopFocusChain(int iDesktop) const;
int nextDesktopStatic(int iDesktop) const;
int previousDesktopStatic(int iDesktop) const;
- void close(bool abort = false);
void keyPress(int key);
void keyRelease(const XKeyEvent& ev);
public slots:
void show();
+ /**
+ * Only for DBus Interface to start primary KDE Walk through windows.
+ **/
+ Q_SCRIPTABLE void start();
+ Q_SCRIPTABLE void close(bool abort = false);
void slotWalkThroughDesktops();
void slotWalkBackThroughDesktops();
void slotWalkThroughDesktopList();
@@ -192,7 +197,7 @@ public slots:
signals:
void tabBoxAdded(int);
- void tabBoxClosed();
+ Q_SCRIPTABLE void tabBoxClosed();
void tabBoxUpdated();
void tabBoxKeyEvent(QKeyEvent*);
@@ -237,6 +242,8 @@ private:
bool m_isShown;
bool m_desktopGrab;
bool m_tabGrab;
+ // true if tabbox is in modal mode which does not require holding a modifier
+ bool m_noModifierGrab;
KShortcut m_cutWalkThroughDesktops, m_cutWalkThroughDesktopsReverse;
KShortcut m_cutWalkThroughDesktopList, m_cutWalkThroughDesktopListReverse;
KShortcut m_cutWalkThroughWindows, m_cutWalkThroughWindowsReverse;
diff --git a/tabbox/tabboxhandler.cpp b/tabbox/tabboxhandler.cpp
index a03dd5fe02..ac05d2670e 100644
--- a/tabbox/tabboxhandler.cpp
+++ b/tabbox/tabboxhandler.cpp
@@ -586,11 +586,13 @@ QModelIndex TabBoxHandler::grabbedKeyEvent(QKeyEvent* event) const
if (column >= model->columnCount())
column = 0;
break;
+ case Qt::Key_Backtab:
case Qt::Key_Up:
row--;
if (row < 0)
row = model->rowCount() - 1;
break;
+ case Qt::Key_Tab:
case Qt::Key_Down:
row++;
if (row >= model->rowCount())