diff --git a/autotests/integration/activities_test.cpp b/autotests/integration/activities_test.cpp index 4de8bc2a1e..12fd7237e3 100644 --- a/autotests/integration/activities_test.cpp +++ b/autotests/integration/activities_test.cpp @@ -128,8 +128,8 @@ void ActivitiesTest::testSetOnActivitiesValidates() QVERIFY(window->isDecorated()); // verify the test machine doesn't have the following activities used - QVERIFY(!Activities::self()->all().contains(QStringLiteral("foo"))); - QVERIFY(!Activities::self()->all().contains(QStringLiteral("bar"))); + QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("foo"))); + QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("bar"))); window->setOnActivities(QStringList{QStringLiteral("foo"), QStringLiteral("bar")}); QVERIFY(!window->activities().contains(QLatin1String("foo"))); diff --git a/src/activation.cpp b/src/activation.cpp index d0a24b6e17..36256d98f9 100644 --- a/src/activation.cpp +++ b/src/activation.cpp @@ -297,7 +297,8 @@ void Workspace::activateWindow(Window *window, bool force) if (!window->isOnCurrentActivity()) { ++block_focus; // DBUS! - Activities::self()->setCurrent(window->activities().constFirst()); // first isn't necessarily best, but it's easiest + // first isn't necessarily best, but it's easiest + m_activities->setCurrent(window->activities().constFirst()); --block_focus; } #endif diff --git a/src/activities.cpp b/src/activities.cpp index a4beac566c..5a09018cfe 100644 --- a/src/activities.cpp +++ b/src/activities.cpp @@ -21,11 +21,8 @@ namespace KWin { -KWIN_SINGLETON_FACTORY(Activities) - -Activities::Activities(QObject *parent) - : QObject(parent) - , m_controller(new KActivities::Controller(this)) +Activities::Activities() + : m_controller(new KActivities::Controller(this)) { connect(m_controller, &KActivities::Controller::activityRemoved, this, &Activities::slotRemoved); connect(m_controller, &KActivities::Controller::activityRemoved, this, &Activities::removed); @@ -33,11 +30,6 @@ Activities::Activities(QObject *parent) connect(m_controller, &KActivities::Controller::currentActivityChanged, this, &Activities::slotCurrentChanged); } -Activities::~Activities() -{ - s_self = nullptr; -} - KActivities::Consumer::ServiceStatus Activities::serviceStatus() const { return m_controller->serviceStatus(); diff --git a/src/activities.h b/src/activities.h index f1014a5557..83efd7d0ab 100644 --- a/src/activities.h +++ b/src/activities.h @@ -30,7 +30,7 @@ class KWIN_EXPORT Activities : public QObject Q_OBJECT public: - ~Activities() override; + explicit Activities(); bool stop(const QString &id); bool start(const QString &id); @@ -79,8 +79,6 @@ private: QString m_previous; QString m_current; KActivities::Controller *m_controller; - - KWIN_SINGLETON(Activities) }; inline QStringList Activities::all() const diff --git a/src/dbusinterface.cpp b/src/dbusinterface.cpp index f55c910890..391b0b0272 100644 --- a/src/dbusinterface.cpp +++ b/src/dbusinterface.cpp @@ -102,10 +102,10 @@ QString DBusInterface::activeOutputName() bool DBusInterface::startActivity(const QString &in0) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return false; } - return Activities::self()->start(in0); + return Workspace::self()->activities()->start(in0); #else Q_UNUSED(in0) return false; @@ -115,10 +115,10 @@ bool DBusInterface::startActivity(const QString &in0) bool DBusInterface::stopActivity(const QString &in0) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return false; } - return Activities::self()->stop(in0); + return Workspace::self()->activities()->stop(in0); #else Q_UNUSED(in0) return false; diff --git a/src/effects.cpp b/src/effects.cpp index 1cb18c3163..1eef9d108b 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -197,7 +197,7 @@ EffectsHandlerImpl::EffectsHandlerImpl(Compositor *compositor, Scene *scene) connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenSizeChanged); connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenGeometryChanged); #if KWIN_BUILD_ACTIVITIES - if (Activities *activities = Activities::self()) { + if (Activities *activities = Workspace::self()->activities()) { connect(activities, &Activities::added, this, &EffectsHandler::activityAdded); connect(activities, &Activities::removed, this, &EffectsHandler::activityRemoved); connect(activities, &Activities::currentChanged, this, &EffectsHandler::currentActivityChanged); @@ -979,10 +979,10 @@ void EffectsHandlerImpl::setShowingDesktop(bool showing) QString EffectsHandlerImpl::currentActivity() const { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return QString(); } - return Activities::self()->current(); + return Workspace::self()->activities()->current(); #else return QString(); #endif diff --git a/src/scripting/desktopbackgrounditem.cpp b/src/scripting/desktopbackgrounditem.cpp index 9e277ceab1..eb7f390575 100644 --- a/src/scripting/desktopbackgrounditem.cpp +++ b/src/scripting/desktopbackgrounditem.cpp @@ -101,7 +101,7 @@ void DesktopBackgroundItem::updateWindow() QString activity = m_activity; if (activity.isEmpty()) { #if KWIN_BUILD_ACTIVITIES - activity = Activities::self()->current(); + activity = Workspace::self()->activities()->current(); #endif } diff --git a/src/scripting/v2/clientmodel.cpp b/src/scripting/v2/clientmodel.cpp index 2a6899e5f8..69e3a0cd10 100644 --- a/src/scripting/v2/clientmodel.cpp +++ b/src/scripting/v2/clientmodel.cpp @@ -31,7 +31,7 @@ ClientLevel::ClientLevel(ClientModel *model, AbstractLevel *parent) : AbstractLevel(model, parent) { #if KWIN_BUILD_ACTIVITIES - if (Activities *activities = Activities::self()) { + if (Activities *activities = Workspace::self()->activities()) { connect(activities, &Activities::currentChanged, this, &ClientLevel::reInit); } #endif @@ -307,8 +307,8 @@ AbstractLevel *AbstractLevel::create(const QList switch (restriction) { case ClientModel::ActivityRestriction: { #if KWIN_BUILD_ACTIVITIES - if (Activities::self()) { - const QStringList &activities = Activities::self()->all(); + if (Workspace::self()->activities()) { + const QStringList &activities = Workspace::self()->activities()->all(); for (QStringList::const_iterator it = activities.begin(); it != activities.end(); ++it) { AbstractLevel *childLevel = create(childRestrictions, childrenRestrictions, model, currentLevel); if (!childLevel) { @@ -400,7 +400,7 @@ ForkLevel::ForkLevel(const QList &childRestrictio connect(VirtualDesktopManager::self(), &VirtualDesktopManager::countChanged, this, &ForkLevel::desktopCountChanged); connect(screens(), &Screens::countChanged, this, &ForkLevel::screenCountChanged); #if KWIN_BUILD_ACTIVITIES - if (Activities *activities = Activities::self()) { + if (Activities *activities = Workspace::self()->activities()) { connect(activities, &Activities::added, this, &ForkLevel::activityAdded); connect(activities, &Activities::removed, this, &ForkLevel::activityRemoved); } diff --git a/src/scripting/workspace_wrapper.cpp b/src/scripting/workspace_wrapper.cpp index 7973be74f3..c659d01af9 100644 --- a/src/scripting/workspace_wrapper.cpp +++ b/src/scripting/workspace_wrapper.cpp @@ -41,7 +41,7 @@ WorkspaceWrapper::WorkspaceWrapper(QObject *parent) connect(vds, &VirtualDesktopManager::currentChanged, this, &WorkspaceWrapper::currentVirtualDesktopChanged); connect(ws, &Workspace::windowDemandsAttentionChanged, this, &WorkspaceWrapper::clientDemandsAttentionChanged); #if KWIN_BUILD_ACTIVITIES - if (KWin::Activities *activities = KWin::Activities::self()) { + if (KWin::Activities *activities = ws->activities()) { connect(activities, &Activities::currentChanged, this, &WorkspaceWrapper::currentActivityChanged); connect(activities, &Activities::added, this, &WorkspaceWrapper::activitiesChanged); connect(activities, &Activities::added, this, &WorkspaceWrapper::activityAdded); @@ -104,10 +104,10 @@ Window *WorkspaceWrapper::activeClient() const QString WorkspaceWrapper::currentActivity() const { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return QString(); } - return Activities::self()->current(); + return Workspace::self()->activities()->current(); #else return QString(); #endif @@ -116,8 +116,8 @@ QString WorkspaceWrapper::currentActivity() const void WorkspaceWrapper::setCurrentActivity(QString activity) { #if KWIN_BUILD_ACTIVITIES - if (Activities::self()) { - Activities::self()->setCurrent(activity); + if (Workspace::self()->activities()) { + Workspace::self()->activities()->setCurrent(activity); } #else Q_UNUSED(activity) @@ -127,10 +127,10 @@ void WorkspaceWrapper::setCurrentActivity(QString activity) QStringList WorkspaceWrapper::activityList() const { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return QStringList(); } - return Activities::self()->all(); + return Workspace::self()->activities()->all(); #else return QStringList(); #endif diff --git a/src/tabbox/tabbox.cpp b/src/tabbox/tabbox.cpp index 43d2af5669..efc9f041c4 100644 --- a/src/tabbox/tabbox.cpp +++ b/src/tabbox/tabbox.cpp @@ -70,8 +70,8 @@ TabBoxHandlerImpl::TabBoxHandlerImpl(TabBox *tabBox) connect(vds, &VirtualDesktopManager::countChanged, m_desktopFocusChain, &DesktopChainManager::resize); connect(vds, &VirtualDesktopManager::currentChanged, m_desktopFocusChain, &DesktopChainManager::addDesktop); #if KWIN_BUILD_ACTIVITIES - if (Activities::self()) { - connect(Activities::self(), &Activities::currentChanged, m_desktopFocusChain, &DesktopChainManager::useChain); + if (Workspace::self()->activities()) { + connect(Workspace::self()->activities(), &Activities::currentChanged, m_desktopFocusChain, &DesktopChainManager::useChain); } #endif } diff --git a/src/useractions.cpp b/src/useractions.cpp index 8cea08b98d..3fd7825e48 100644 --- a/src/useractions.cpp +++ b/src/useractions.cpp @@ -418,10 +418,10 @@ void UserActionsMenu::menuAboutToShow() void UserActionsMenu::showHideActivityMenu() { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return; } - const QStringList &openActivities_ = Activities::self()->running(); + const QStringList &openActivities_ = Workspace::self()->activities()->running(); qCDebug(KWIN_CORE) << "activities:" << openActivities_.size(); if (openActivities_.size() < 2) { delete m_activityMenu; @@ -696,7 +696,7 @@ void UserActionsMenu::activityPopupAboutToShow() } #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return; } m_activityMenu->clear(); @@ -717,7 +717,7 @@ void UserActionsMenu::activityPopupAboutToShow() } m_activityMenu->addSeparator(); - const auto activities = Activities::self()->running(); + const auto activities = Workspace::self()->activities()->running(); for (const QString &id : activities) { KActivities::Info activity(id); QString name = activity.name(); @@ -776,7 +776,7 @@ void UserActionsMenu::slotWindowOperation(QAction *action) void UserActionsMenu::slotToggleOnActivity(QAction *action) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return; } QString activity = action->data().toString(); @@ -789,7 +789,7 @@ void UserActionsMenu::slotToggleOnActivity(QAction *action) return; } - Activities::self()->toggleWindowOnActivity(m_window, activity, false); + Workspace::self()->activities()->toggleWindowOnActivity(m_window, activity, false); if (m_activityMenu && m_activityMenu->isVisible() && m_activityMenu->actions().count()) { const bool isOnAll = m_window->isOnAllActivities(); m_activityMenu->actions().at(0)->setChecked(isOnAll); diff --git a/src/window.cpp b/src/window.cpp index 811fa013ac..0a41dc3eef 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -546,10 +546,10 @@ bool Window::isDeleted() const bool Window::isOnCurrentActivity() const { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return true; } - return isOnActivity(Activities::self()->current()); + return isOnActivity(Workspace::self()->activities()->current()); #else return true; #endif @@ -3464,7 +3464,7 @@ QStringList Window::activities() const void Window::setOnActivity(const QString &activity, bool enable) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return; } QStringList newActivitiesList = activities(); @@ -3473,7 +3473,7 @@ void Window::setOnActivity(const QString &activity, bool enable) return; } if (enable) { - QStringList allActivities = Activities::self()->all(); + QStringList allActivities = Workspace::self()->activities()->all(); if (!allActivities.contains(activity)) { // bogus ID return; @@ -3495,10 +3495,10 @@ void Window::setOnActivity(const QString &activity, bool enable) void Window::setOnActivities(const QStringList &newActivitiesList) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!Workspace::self()->activities()) { return; } - const auto allActivities = Activities::self()->all(); + const auto allActivities = Workspace::self()->activities()->all(); const auto activityList = [&] { auto result = rules()->checkActivity(newActivitiesList); @@ -3543,7 +3543,7 @@ void Window::setOnAllActivities(bool all) if (all) { setOnActivities(QStringList()); } else { - setOnActivity(Activities::self()->current(), true); + setOnActivity(Workspace::self()->activities()->current(), true); } #else Q_UNUSED(all) diff --git a/src/workspace.cpp b/src/workspace.cpp index 31005b69ba..2cbcaf7c43 100644 --- a/src/workspace.cpp +++ b/src/workspace.cpp @@ -135,12 +135,11 @@ Workspace::Workspace() _self = this; #if KWIN_BUILD_ACTIVITIES - Activities *activities = nullptr; if (kwinApp()->usesKActivities()) { - activities = Activities::create(this); + m_activities = std::make_unique(); } - if (activities) { - connect(activities, &Activities::currentChanged, this, &Workspace::updateCurrentActivity); + if (m_activities) { + connect(m_activities.get(), &Activities::currentChanged, this, &Workspace::updateCurrentActivity); } #endif @@ -1102,7 +1101,7 @@ Window *Workspace::findWindowToActivateOnDesktop(VirtualDesktop *desktop) void Workspace::updateCurrentActivity(const QString &new_activity) { #if KWIN_BUILD_ACTIVITIES - if (!Activities::self()) { + if (!m_activities) { return; } // closeActivePopup(); @@ -2828,4 +2827,11 @@ FocusChain *Workspace::focusChain() const return m_focusChain.get(); } +#if KWIN_BUILD_ACTIVITIES +Activities *Workspace::activities() const +{ + return m_activities.get(); +} +#endif + } // namespace diff --git a/src/workspace.h b/src/workspace.h index c7ec38e117..c43a79d24b 100644 --- a/src/workspace.h +++ b/src/workspace.h @@ -56,6 +56,9 @@ class X11Window; class X11EventFilter; class FocusChain; enum class Predicate; +#if KWIN_BUILD_ACTIVITIES +class Activities; +#endif class KWIN_EXPORT Workspace : public QObject { @@ -425,6 +428,9 @@ public: return m_lastActiveWindow; } FocusChain *focusChain() const; +#if KWIN_BUILD_ACTIVITIES + Activities *activities() const; +#endif public Q_SLOTS: void performWindowOperation(KWin::Window *window, Options::WindowOperation op); @@ -694,6 +700,9 @@ private: SessionManager *m_sessionManager; std::unique_ptr m_focusChain; +#if KWIN_BUILD_ACTIVITIES + std::unique_ptr m_activities; +#endif private: friend bool performTransiencyCheck(); diff --git a/src/x11window.cpp b/src/x11window.cpp index 322bede9e1..c89c270ee5 100644 --- a/src/x11window.cpp +++ b/src/x11window.cpp @@ -571,7 +571,7 @@ bool X11Window::manage(xcb_window_t w, bool isMapped) } } #if KWIN_BUILD_ACTIVITIES - if (Activities::self() && !isMapped && !skipTaskbar() && isNormalWindow() && !activitiesDefined) { + if (Workspace::self()->activities() && !isMapped && !skipTaskbar() && isNormalWindow() && !activitiesDefined) { // a new, regular window, when we're not recovering from a crash, // and it hasn't got an activity. let's try giving it the current one. // TODO: decide whether to keep this before the 4.6 release @@ -579,7 +579,7 @@ bool X11Window::manage(xcb_window_t w, bool isMapped) // with a public API for setting windows to be on all activities. // something like KWindowSystem::setOnAllActivities or // KActivityConsumer::setOnAllActivities - setOnActivity(Activities::self()->current(), true); + setOnActivity(Workspace::self()->activities()->current(), true); } #endif } @@ -2504,8 +2504,8 @@ void X11Window::readActivities(Xcb::StringProperty &property) // if the activities are not synced, and there are existing clients with // activities specified, somebody has restarted kwin. we can not validate // activities in this case. we need to trust the old values. - if (Activities::self() && Activities::self()->serviceStatus() != KActivities::Consumer::Unknown) { - QStringList allActivities = Activities::self()->all(); + if (Workspace::self()->activities() && Workspace::self()->activities()->serviceStatus() != KActivities::Consumer::Unknown) { + QStringList allActivities = Workspace::self()->activities()->all(); if (allActivities.isEmpty()) { qCDebug(KWIN_CORE) << "no activities!?!?"; // don't touch anything, there's probably something bad going on and we don't wanna make it worse diff --git a/src/xdgshellwindow.cpp b/src/xdgshellwindow.cpp index 0ef34235de..3d4a19add7 100644 --- a/src/xdgshellwindow.cpp +++ b/src/xdgshellwindow.cpp @@ -562,7 +562,7 @@ XdgToplevelWindow::XdgToplevelWindow(XdgToplevelInterface *shellSurface) { setDesktops({VirtualDesktopManager::self()->currentDesktop()}); #if KWIN_BUILD_ACTIVITIES - if (auto a = Activities::self()) { + if (auto a = Workspace::self()->activities()) { setOnActivities({a->current()}); } #endif @@ -1771,7 +1771,7 @@ XdgPopupWindow::XdgPopupWindow(XdgPopupInterface *shellSurface) m_windowType = NET::Unknown; setDesktops({VirtualDesktopManager::self()->currentDesktop()}); #if KWIN_BUILD_ACTIVITIES - if (auto a = Activities::self()) { + if (auto a = Workspace::self()->activities()) { setOnActivities({a->current()}); } #endif