From 294dc4dd2889f382432d50ed1171a4f0804fdff7 Mon Sep 17 00:00:00 2001 From: Eike Hein Date: Wed, 30 Apr 2014 15:36:08 +0200 Subject: [PATCH] Last bits on focus/window persistence management; now behaves fully QMenu-like. --- submenu.cpp | 17 +++++++++++++++++ submenu.h | 4 ++++ windowsystem.cpp | 11 ++++++++++- windowsystem.h | 2 ++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/submenu.cpp b/submenu.cpp index 1b5a28cfb..11e30f293 100644 --- a/submenu.cpp +++ b/submenu.cpp @@ -22,11 +22,15 @@ #include +#include #include +#include + SubMenu::SubMenu(QQuickItem *parent) : PlasmaQuick::Dialog(parent) , m_facingLeft(false) { + KWindowSystem::setType(winId(), NET::Menu); } SubMenu::~SubMenu() @@ -76,3 +80,16 @@ QRect SubMenu::availableScreenRectForItem(QQuickItem *item) const return screen->availableGeometry(); } + + +void SubMenu::focusOutEvent(QFocusEvent *ev) +{ + const QWindow *focusWindow = QGuiApplication::focusWindow(); + + if (!(focusWindow && focusWindow->isActive() && isAncestorOf(focusWindow))) { + emit focusLost(); + } + + QQuickWindow::focusOutEvent(ev); +} + diff --git a/submenu.h b/submenu.h index 600b8ce6b..29212ec5f 100644 --- a/submenu.h +++ b/submenu.h @@ -43,6 +43,10 @@ class SubMenu : public PlasmaQuick::Dialog Q_SIGNALS: void facingLeftChanged() const; + void focusLost() const; + + protected: + void focusOutEvent(QFocusEvent *ev); private: bool m_facingLeft; diff --git a/windowsystem.cpp b/windowsystem.cpp index 83602cfc2..067037bbd 100644 --- a/windowsystem.cpp +++ b/windowsystem.cpp @@ -40,4 +40,13 @@ void WindowSystem::forceActive(QQuickItem *item) KWindowSystem::forceActiveWindow(item->window()->winId()); KWindowSystem::raiseWindow(item->window()->winId()); -} \ No newline at end of file +} + +bool WindowSystem::isActive(QQuickItem *item) +{ + if (!item || !item->window()) { + return false; + } + + return item->window()->isActive(); +} diff --git a/windowsystem.h b/windowsystem.h index 438a12766..f74ffa5ef 100644 --- a/windowsystem.h +++ b/windowsystem.h @@ -33,6 +33,8 @@ class WindowSystem : public QObject ~WindowSystem(); Q_INVOKABLE void forceActive(QQuickItem *item); + + Q_INVOKABLE bool isActive(QQuickItem *item); }; #endif