diff options
author | Robert Griebl <robert.griebl@qt.io> | 2023-09-27 23:09:26 +0200 |
---|---|---|
committer | Robert Griebl <robert.griebl@qt.io> | 2023-11-06 15:17:42 +0100 |
commit | 463f2f43a14137a00325c4c8dabaf2ae6ff9297b (patch) | |
tree | 0765efef69bdcd8c72535ae4ddd7be6aa8a6672e /src/window-lib | |
parent | ca4215d582b87686cf9aafe0f51c9c98db96bb8c (diff) |
Add focusOnClick for both Wayland and InProcess windows
Change-Id: I80ba80c1f822e4486adb321c83c7b085e27caf48
Reviewed-by: Bernd Weimer <bernd.weimer@qt.io>
Diffstat (limited to 'src/window-lib')
-rw-r--r-- | src/window-lib/windowitem.cpp | 45 | ||||
-rw-r--r-- | src/window-lib/windowitem.h | 18 |
2 files changed, 60 insertions, 3 deletions
diff --git a/src/window-lib/windowitem.cpp b/src/window-lib/windowitem.cpp index 98bdd240..251d0138 100644 --- a/src/window-lib/windowitem.cpp +++ b/src/window-lib/windowitem.cpp @@ -101,7 +101,7 @@ QT_BEGIN_NAMESPACE_AM /////////////////////////////////////////////////////////////////////////////////////////////////// WindowItem::WindowItem(QQuickItem *parent) - : QQuickItem(parent) + : QQuickFocusScope(parent) , m_contentItem(new QQuickItem(this)) { m_contentItem->setParent(this); @@ -299,6 +299,17 @@ void WindowItem::contentItemData_clear(QQmlListProperty<QObject> *property) emit that->contentItemDataChanged(); } +bool WindowItem::focusOnClick() const +{ + return m_impl ? m_impl->focusOnClick() : false; +} + +void WindowItem::setFocusOnClick(bool newFocusOnClick) +{ + if (m_impl) + m_impl->setFocusOnClick(newFocusOnClick); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // WindowItem::InProcessImpl /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -309,10 +320,15 @@ void WindowItem::InProcessImpl::setup(Window *window) Q_ASSERT(window && window->isInProcess()); m_inProcessWindow = static_cast<InProcessWindow*>(window); + connect(m_inProcessWindow->rootItem(), &InProcessSurfaceItem::focusOnClickChanged, + q, &WindowItem::focusOnClickChanged); } void WindowItem::InProcessImpl::tearDown() { + disconnect(m_inProcessWindow->rootItem(), &InProcessSurfaceItem::focusOnClickChanged, + q, &WindowItem::focusOnClickChanged); + if (m_shaderEffectSource) { delete m_shaderEffectSource; m_shaderEffectSource = nullptr; @@ -362,9 +378,22 @@ void WindowItem::InProcessImpl::setupSecondaryView() void WindowItem::InProcessImpl::forwardActiveFocus() { - m_inProcessWindow->rootItem()->forceActiveFocus(); + if (m_inProcessWindow) + m_inProcessWindow->rootItem()->forceActiveFocus(); +} + +bool WindowItem::InProcessImpl::focusOnClick() const +{ + return m_inProcessWindow ? m_inProcessWindow->rootItem()->focusOnClick() : false; } +void WindowItem::InProcessImpl::setFocusOnClick(bool focusOnClick) +{ + if (m_inProcessWindow) + m_inProcessWindow->rootItem()->setFocusOnClick(focusOnClick); +} + + /////////////////////////////////////////////////////////////////////////////////////////////////// // WindowItem::WaylandImpl /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -420,6 +449,8 @@ void WindowItem::WaylandImpl::createWaylandItem() // keep the buffer there to allow us to animate the window destruction m_waylandItem->setBufferLocked(true); }); + connect(m_waylandItem, &QWaylandQuickItem::focusOnClickChanged, + q, &WindowItem::focusOnClickChanged); } void WindowItem::WaylandImpl::forwardActiveFocus() @@ -427,6 +458,16 @@ void WindowItem::WaylandImpl::forwardActiveFocus() m_waylandItem->forceActiveFocus(); } +bool WindowItem::WaylandImpl::focusOnClick() const +{ + return m_waylandItem->focusOnClick(); +} + +void WindowItem::WaylandImpl::setFocusOnClick(bool focusOnClick) +{ + m_waylandItem->setFocusOnClick(focusOnClick); +} + void WindowItem::WaylandImpl::tearDown() { m_waylandItem->setSurface(nullptr); diff --git a/src/window-lib/windowitem.h b/src/window-lib/windowitem.h index 1463c8ad..39014108 100644 --- a/src/window-lib/windowitem.h +++ b/src/window-lib/windowitem.h @@ -5,7 +5,12 @@ #pragma once +#if 0 +#pragma qt_sync_skip_header_check +#endif + #include <QtQuick/QQuickItem> +#include <QtQuick/private/qquickfocusscope_p.h> #include <QtAppManCommon/global.h> QT_BEGIN_NAMESPACE_AM @@ -18,7 +23,7 @@ class WaylandQuickIgnoreKeyItem; #endif // AM_MULTI_PROCESS -class WindowItem : public QQuickItem +class WindowItem : public QQuickFocusScope { Q_OBJECT Q_CLASSINFO("AM-QmlType", "QtApplicationManager.SystemUI/WindowItem 2.0") @@ -32,6 +37,7 @@ class WindowItem : public QQuickItem NOTIFY objectFollowsItemSizeChanged) Q_PROPERTY(QQmlListProperty<QObject> contentItemData READ contentItemData NOTIFY contentItemDataChanged FINAL) + Q_PROPERTY(bool focusOnClick READ focusOnClick WRITE setFocusOnClick NOTIFY focusOnClickChanged REVISION(2, 7) FINAL) Q_CLASSINFO("DefaultProperty", "contentItemData") public: @@ -54,6 +60,10 @@ public: static QObject *contentItemData_at(QQmlListProperty<QObject> *property, qsizetype index); static void contentItemData_clear(QQmlListProperty<QObject> *property); + bool focusOnClick() const; + void setFocusOnClick(bool newFocusOnClick); + Q_SIGNAL void focusOnClickChanged(); + protected: void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; @@ -79,6 +89,8 @@ private: virtual void setupPrimaryView() = 0; virtual void setupSecondaryView() = 0; virtual void forwardActiveFocus() = 0; + virtual bool focusOnClick() const = 0; + virtual void setFocusOnClick(bool focusOnClick) = 0; WindowItem *q; }; @@ -92,6 +104,8 @@ private: void setupPrimaryView() override; void setupSecondaryView() override; void forwardActiveFocus() override; + bool focusOnClick() const override; + void setFocusOnClick(bool focusOnClick) override; InProcessWindow *m_inProcessWindow{nullptr}; QQuickItem *m_shaderEffectSource{nullptr}; @@ -110,6 +124,8 @@ private: void setupSecondaryView() override; void createWaylandItem(); void forwardActiveFocus() override; + bool focusOnClick() const override; + void setFocusOnClick(bool focusOnClick) override; WaylandWindow *m_waylandWindow{nullptr}; WaylandQuickIgnoreKeyItem *m_waylandItem{nullptr}; |