summaryrefslogtreecommitdiffstats
path: root/src/window-lib
diff options
context:
space:
mode:
authorRobert Griebl <robert.griebl@qt.io>2023-09-27 23:09:26 +0200
committerRobert Griebl <robert.griebl@qt.io>2023-11-06 15:17:42 +0100
commit463f2f43a14137a00325c4c8dabaf2ae6ff9297b (patch)
tree0765efef69bdcd8c72535ae4ddd7be6aa8a6672e /src/window-lib
parentca4215d582b87686cf9aafe0f51c9c98db96bb8c (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.cpp45
-rw-r--r--src/window-lib/windowitem.h18
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};