14#include <KConfigGroup>
16#include <QDBusInterface>
17#include <QDBusPendingCall>
18#include <QFutureWatcher>
19#include <QtConcurrentRun>
27 connect(m_controller, &KActivities::Controller::activityRemoved,
this, &Activities::slotRemoved);
28 connect(m_controller, &KActivities::Controller::activityRemoved,
this, &
Activities::removed);
29 connect(m_controller, &KActivities::Controller::activityAdded,
this, &
Activities::added);
30 connect(m_controller, &KActivities::Controller::currentActivityChanged,
this, &Activities::slotCurrentChanged);
31 connect(m_controller, &KActivities::Controller::serviceStatusChanged,
this, &Activities::slotServiceStatusChanged);
36 return m_controller->serviceStatus();
39void Activities::slotServiceStatusChanged()
41 if (m_controller->serviceStatus() != KActivities::Consumer::Running) {
45 for (
auto *
const window : windows) {
46 if (!window->isClient()) {
49 if (window->isDesktop()) {
52 window->checkActivities();
58 m_controller->setCurrentActivity(activity);
61void Activities::slotCurrentChanged(
const QString &newActivity)
63 if (m_current == newActivity) {
66 m_previous = m_current;
67 m_current = newActivity;
71void Activities::slotRemoved(
const QString &activity)
74 for (
auto *
const window : windows) {
75 if (!window->isClient()) {
78 if (window->isDesktop()) {
81 window->setOnActivity(activity,
false);
84 KConfigGroup cg(KSharedConfig::openConfig(), QLatin1String(
"SubSession: ") + activity);
94 bool enable = was_on_all || !was_on_activity;
116 for (
auto *
const window : transients_stacking_order) {
132 if (!
all().contains(
id)) {
138 QDBusInterface ksmserver(
"org.kde.ksmserver",
"/KSMServer",
"org.kde.KSMServerInterface");
139 if (ksmserver.isValid()) {
140 ksmserver.asyncCall(
"restoreSubSession",
id);
142 qCDebug(KWIN_CORE) <<
"couldn't get ksmserver interface";
156 QMetaObject::invokeMethod(
160 Qt::QueuedConnection);
165void Activities::reallyStop(
const QString &
id)
172 qCDebug(KWIN_CORE) << id;
174 QSet<QByteArray> saveSessionIds;
175 QSet<QByteArray> dontCloseSessionIds;
176 const auto windows = ws->
windows();
177 for (
auto *
const window : windows) {
178 auto x11Window = qobject_cast<X11Window *>(window);
179 if (!x11Window || window->isUnmanaged()) {
182 if (window->isDesktop()) {
185 const QByteArray sessionId = x11Window->sessionId();
186 if (sessionId.isEmpty()) {
195 if (window->isOnAllActivities()) {
196 dontCloseSessionIds << sessionId;
200 const QStringList activities = window->activities();
201 for (
const QString &activityId : activities) {
202 if (activityId ==
id) {
203 saveSessionIds << sessionId;
204 }
else if (
running().contains(activityId)) {
205 dontCloseSessionIds << sessionId;
212 QStringList saveAndClose;
213 QStringList saveOnly;
214 for (
const QByteArray &sessionId : std::as_const(saveSessionIds)) {
215 if (dontCloseSessionIds.contains(sessionId)) {
216 saveOnly << sessionId;
218 saveAndClose << sessionId;
222 qCDebug(KWIN_CORE) <<
"saveActivity" <<
id << saveAndClose << saveOnly;
225 QDBusInterface ksmserver(
"org.kde.ksmserver",
"/KSMServer",
"org.kde.KSMServerInterface");
226 if (ksmserver.isValid()) {
227 ksmserver.asyncCall(
"saveSubSession",
id, saveAndClose, saveOnly);
229 qCDebug(KWIN_CORE) <<
"couldn't get ksmserver interface";
235#include "moc_activities.cpp"
void toggleWindowOnActivity(Window *window, const QString &activity, bool dont_activate)
void added(const QString &id)
KActivities::Controller::ServiceStatus serviceStatus() const
QStringList running() const
bool start(const QString &id)
bool stop(const QString &id)
void setCurrent(const QString &activity)
void currentChanged(const QString &id)
void removed(const QString &id)
bool focusPolicyIsReasonable
void loadSubSessionInfo(const QString &name)
SessionState state() const
void storeSubSession(const QString &name, QSet< QByteArray > sessionIds)
bool isOnActivity(const QString &activity) const
bool wantsTabFocus() const
bool isOnCurrentActivity() const
void setOnActivity(const QString &activity, bool enable)
const QList< Window * > & transients() const
bool isOnAllActivities() const
void raiseWindow(Window *window, bool nogroup=false)
static Workspace * self()
const QList< Window * > windows() const
bool requestFocus(Window *window, bool force=false)
SessionManager * sessionManager() const
void restackWindowUnderActive(Window *window)
QList< X11Window * > ensureStackingOrder(const QList< X11Window * > &windows) const