4#include <qohosapplicationstatetracker.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <QtGui/private/qguiapplication_p.h>
8#include <QtGui/qwindow.h>
11#include <qohosplatformwindow.h>
12#include <qohosutils.h>
13#include <qpa/qwindowsysteminterface_p.h>
14#include <render/qohosview.h>
23using WindowSystemEventType = QWindowSystemInterfacePrivate::EventType;
24using WindowSystemEvent = QWindowSystemInterfacePrivate::WindowSystemEvent;
25using ExposeEvent = QWindowSystemInterfacePrivate::ExposeEvent;
26using ApplicationStateChangedEvent = QWindowSystemInterfacePrivate::ApplicationStateChangedEvent;
34class ApplicationStateTracker
final :
public QWindowSystemEventHandler
41 ProcessEventResult processApplicationStateChangedEvent(ApplicationStateChangedEvent *event);
43 void startTrackingViewIfNeeded(
QOhosView *view);
44 void tryUpdateApplicationState();
46 std::set<QOhosView *> m_trackedViews;
47 std::set<QOhosView *> m_visibleViews;
49 std::optional<Qt::ApplicationState> m_lastReceivedApplicationState;
50 std::optional<Qt::ApplicationState> m_lastSentApplicationState;
51 QObject m_signalReceiver;
56 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(window);
57 return platformWindow !=
nullptr
58 ? platformWindow->ownedViewOrNull()
64 auto *view = evt->window !=
nullptr
65 ? mapQWindowToViewOrNull(evt->window)
71 startTrackingViewIfNeeded(view);
74 std::ignore = m_visibleViews.insert(view);
76 std::ignore = m_visibleViews.erase(view);
81ProcessEventResult ApplicationStateTracker::processApplicationStateChangedEvent(ApplicationStateChangedEvent *evt)
83 m_lastReceivedApplicationState = evt->newState;
87bool ApplicationStateTracker::
sendEvent(WindowSystemEvent *event)
90 switch (event->type) {
91 case WindowSystemEventType::Expose:
92 processEventResult = processExposeEvent(
static_cast<ExposeEvent *>(event));
94 case WindowSystemEventType::ApplicationStateChanged:
95 processEventResult = processApplicationStateChangedEvent(
static_cast<ApplicationStateChangedEvent *>(event));
103 QGuiApplicationPrivate::processWindowSystemEvent(event);
105 bool hasPendingEvents = QWindowSystemInterfacePrivate::windowSystemEventsQueued();
106 if (!hasPendingEvents)
107 tryUpdateApplicationState();
112void ApplicationStateTracker::tryUpdateApplicationState()
114 const bool hasAnyTrackedWindow = !m_trackedViews.empty();
115 const bool allWindowsHidden = hasAnyTrackedWindow && m_visibleViews.empty();
119 const Qt::ApplicationState lifecycleState =
120 m_lastReceivedApplicationState.has_value()
121 ? m_lastReceivedApplicationState.value()
122 : Qt::ApplicationActive;
124 const auto updatedApplicationState =
125 lifecycleState == Qt::ApplicationSuspended
126 ? Qt::ApplicationSuspended
128 ? Qt::ApplicationHidden
129 : lifecycleState == Qt::ApplicationActive
130 ? Qt::ApplicationActive
131 : Qt::ApplicationInactive;
133 if (m_lastSentApplicationState == updatedApplicationState)
136 m_lastSentApplicationState = updatedApplicationState;
137 ApplicationStateChangedEvent eventToSend{updatedApplicationState};
138 QGuiApplicationPrivate::processWindowSystemEvent(&eventToSend);
141void ApplicationStateTracker::startTrackingViewIfNeeded(
QOhosView *viewToTrack)
144 std::tie(std::ignore, added) = m_trackedViews.insert(viewToTrack);
147 viewToTrack, &QOhosView::destroyed,
148 &m_signalReceiver, [
this, viewToTrack](QObject *) {
149 std::ignore = m_trackedViews.erase(viewToTrack);
150 std::ignore = m_visibleViews.erase(viewToTrack);
159 return std::make_shared<ApplicationStateTracker>();
bool sendEvent(WindowSystemEvent *event) override
Combined button and popup list for selecting options.
@ ForwardToGuiApplication
QOhosView * mapQWindowToViewOrNull(QWindow *window)
std::shared_ptr< QWindowSystemEventHandler > makeApplicationStateTracker()