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