4#include <qohosapplicationstatetracker.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <QtGui/private/qguiapplication_p.h>
8#include <QtGui/qwindow.h>
10#include <qohosplatformwindow.h>
11#include <qohosutils.h>
12#include <qpa/qwindowsysteminterface_p.h>
13#include <render/qohosview.h>
22using WindowSystemEventType = QWindowSystemInterfacePrivate::EventType;
23using WindowSystemEvent = QWindowSystemInterfacePrivate::WindowSystemEvent;
24using ExposeEvent = QWindowSystemInterfacePrivate::ExposeEvent;
25using ApplicationStateChangedEvent = QWindowSystemInterfacePrivate::ApplicationStateChangedEvent;
33class ApplicationStateTracker
final :
public QWindowSystemEventHandler
40 ProcessEventResult processApplicationStateChangedEvent(ApplicationStateChangedEvent *event);
42 void startTrackingViewIfNeeded(
QOhosView *view);
43 void tryUpdateApplicationState();
45 std::set<QOhosView *> m_trackedViews;
46 std::set<QOhosView *> m_visibleViews;
48 QOhosOptional<Qt::ApplicationState> m_lastReceivedApplicationState;
49 QOhosOptional<Qt::ApplicationState> m_lastSentApplicationState;
50 QObject m_signalReceiver;
55 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(window);
56 return platformWindow !=
nullptr
57 ? platformWindow->ownedViewOrNull()
63 auto *view = evt->window !=
nullptr
64 ? mapQWindowToViewOrNull(evt->window)
70 startTrackingViewIfNeeded(view);
73 std::ignore = m_visibleViews.insert(view);
75 std::ignore = m_visibleViews.erase(view);
80ProcessEventResult ApplicationStateTracker::processApplicationStateChangedEvent(ApplicationStateChangedEvent *evt)
82 m_lastReceivedApplicationState = evt->newState;
86bool ApplicationStateTracker::
sendEvent(WindowSystemEvent *event)
88 QOhosOptional<ProcessEventResult> processEventResult;
89 switch (event->type) {
90 case WindowSystemEventType::Expose:
91 processEventResult = processExposeEvent(
static_cast<ExposeEvent *>(event));
93 case WindowSystemEventType::ApplicationStateChanged:
94 processEventResult = processApplicationStateChangedEvent(
static_cast<ApplicationStateChangedEvent *>(event));
102 QGuiApplicationPrivate::processWindowSystemEvent(event);
104 bool hasPendingEvents = QWindowSystemInterfacePrivate::windowSystemEventsQueued();
105 if (!hasPendingEvents)
106 tryUpdateApplicationState();
111void ApplicationStateTracker::tryUpdateApplicationState()
113 const bool allWindowsHidden = m_visibleViews.empty();
117 const Qt::ApplicationState lifecycleState =
118 m_lastReceivedApplicationState.has_value()
119 ? m_lastReceivedApplicationState.value()
120 : Qt::ApplicationActive;
122 const auto updatedApplicationState =
123 lifecycleState == Qt::ApplicationSuspended
124 ? Qt::ApplicationSuspended
126 ? Qt::ApplicationHidden
127 : lifecycleState == Qt::ApplicationActive
128 ? Qt::ApplicationActive
129 : Qt::ApplicationInactive;
131 if (m_lastSentApplicationState == updatedApplicationState)
134 m_lastSentApplicationState = updatedApplicationState;
135 ApplicationStateChangedEvent eventToSend{updatedApplicationState};
136 QGuiApplicationPrivate::processWindowSystemEvent(&eventToSend);
139void ApplicationStateTracker::startTrackingViewIfNeeded(
QOhosView *viewToTrack)
142 std::tie(std::ignore, added) = m_trackedViews.insert(viewToTrack);
145 viewToTrack, &QOhosView::destroyed,
146 &m_signalReceiver, [
this, viewToTrack](QObject *) {
147 std::ignore = m_trackedViews.erase(viewToTrack);
148 std::ignore = m_visibleViews.erase(viewToTrack);
157 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()