move Activities singleton into Workspace

This commit is contained in:
Xaver Hugl 2022-07-20 12:53:54 +02:00
parent f2ad6bcce9
commit 1cf2205283
16 changed files with 67 additions and 61 deletions

View file

@ -128,8 +128,8 @@ void ActivitiesTest::testSetOnActivitiesValidates()
QVERIFY(window->isDecorated()); QVERIFY(window->isDecorated());
// verify the test machine doesn't have the following activities used // verify the test machine doesn't have the following activities used
QVERIFY(!Activities::self()->all().contains(QStringLiteral("foo"))); QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("foo")));
QVERIFY(!Activities::self()->all().contains(QStringLiteral("bar"))); QVERIFY(!Workspace::self()->activities()->all().contains(QStringLiteral("bar")));
window->setOnActivities(QStringList{QStringLiteral("foo"), QStringLiteral("bar")}); window->setOnActivities(QStringList{QStringLiteral("foo"), QStringLiteral("bar")});
QVERIFY(!window->activities().contains(QLatin1String("foo"))); QVERIFY(!window->activities().contains(QLatin1String("foo")));

View file

@ -297,7 +297,8 @@ void Workspace::activateWindow(Window *window, bool force)
if (!window->isOnCurrentActivity()) { if (!window->isOnCurrentActivity()) {
++block_focus; ++block_focus;
// DBUS! // 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; --block_focus;
} }
#endif #endif

View file

@ -21,11 +21,8 @@
namespace KWin namespace KWin
{ {
KWIN_SINGLETON_FACTORY(Activities) Activities::Activities()
: m_controller(new KActivities::Controller(this))
Activities::Activities(QObject *parent)
: QObject(parent)
, m_controller(new KActivities::Controller(this))
{ {
connect(m_controller, &KActivities::Controller::activityRemoved, this, &Activities::slotRemoved); connect(m_controller, &KActivities::Controller::activityRemoved, this, &Activities::slotRemoved);
connect(m_controller, &KActivities::Controller::activityRemoved, this, &Activities::removed); 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); connect(m_controller, &KActivities::Controller::currentActivityChanged, this, &Activities::slotCurrentChanged);
} }
Activities::~Activities()
{
s_self = nullptr;
}
KActivities::Consumer::ServiceStatus Activities::serviceStatus() const KActivities::Consumer::ServiceStatus Activities::serviceStatus() const
{ {
return m_controller->serviceStatus(); return m_controller->serviceStatus();

View file

@ -30,7 +30,7 @@ class KWIN_EXPORT Activities : public QObject
Q_OBJECT Q_OBJECT
public: public:
~Activities() override; explicit Activities();
bool stop(const QString &id); bool stop(const QString &id);
bool start(const QString &id); bool start(const QString &id);
@ -79,8 +79,6 @@ private:
QString m_previous; QString m_previous;
QString m_current; QString m_current;
KActivities::Controller *m_controller; KActivities::Controller *m_controller;
KWIN_SINGLETON(Activities)
}; };
inline QStringList Activities::all() const inline QStringList Activities::all() const

View file

@ -102,10 +102,10 @@ QString DBusInterface::activeOutputName()
bool DBusInterface::startActivity(const QString &in0) bool DBusInterface::startActivity(const QString &in0)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return false; return false;
} }
return Activities::self()->start(in0); return Workspace::self()->activities()->start(in0);
#else #else
Q_UNUSED(in0) Q_UNUSED(in0)
return false; return false;
@ -115,10 +115,10 @@ bool DBusInterface::startActivity(const QString &in0)
bool DBusInterface::stopActivity(const QString &in0) bool DBusInterface::stopActivity(const QString &in0)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return false; return false;
} }
return Activities::self()->stop(in0); return Workspace::self()->activities()->stop(in0);
#else #else
Q_UNUSED(in0) Q_UNUSED(in0)
return false; return false;

View file

@ -197,7 +197,7 @@ EffectsHandlerImpl::EffectsHandlerImpl(Compositor *compositor, Scene *scene)
connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenSizeChanged); connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenSizeChanged);
connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenGeometryChanged); connect(ws, &Workspace::geometryChanged, this, &EffectsHandler::virtualScreenGeometryChanged);
#if KWIN_BUILD_ACTIVITIES #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::added, this, &EffectsHandler::activityAdded);
connect(activities, &Activities::removed, this, &EffectsHandler::activityRemoved); connect(activities, &Activities::removed, this, &EffectsHandler::activityRemoved);
connect(activities, &Activities::currentChanged, this, &EffectsHandler::currentActivityChanged); connect(activities, &Activities::currentChanged, this, &EffectsHandler::currentActivityChanged);
@ -979,10 +979,10 @@ void EffectsHandlerImpl::setShowingDesktop(bool showing)
QString EffectsHandlerImpl::currentActivity() const QString EffectsHandlerImpl::currentActivity() const
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return QString(); return QString();
} }
return Activities::self()->current(); return Workspace::self()->activities()->current();
#else #else
return QString(); return QString();
#endif #endif

View file

@ -101,7 +101,7 @@ void DesktopBackgroundItem::updateWindow()
QString activity = m_activity; QString activity = m_activity;
if (activity.isEmpty()) { if (activity.isEmpty()) {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
activity = Activities::self()->current(); activity = Workspace::self()->activities()->current();
#endif #endif
} }

View file

@ -31,7 +31,7 @@ ClientLevel::ClientLevel(ClientModel *model, AbstractLevel *parent)
: AbstractLevel(model, parent) : AbstractLevel(model, parent)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (Activities *activities = Activities::self()) { if (Activities *activities = Workspace::self()->activities()) {
connect(activities, &Activities::currentChanged, this, &ClientLevel::reInit); connect(activities, &Activities::currentChanged, this, &ClientLevel::reInit);
} }
#endif #endif
@ -307,8 +307,8 @@ AbstractLevel *AbstractLevel::create(const QList<ClientModel::LevelRestriction>
switch (restriction) { switch (restriction) {
case ClientModel::ActivityRestriction: { case ClientModel::ActivityRestriction: {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (Activities::self()) { if (Workspace::self()->activities()) {
const QStringList &activities = Activities::self()->all(); const QStringList &activities = Workspace::self()->activities()->all();
for (QStringList::const_iterator it = activities.begin(); it != activities.end(); ++it) { for (QStringList::const_iterator it = activities.begin(); it != activities.end(); ++it) {
AbstractLevel *childLevel = create(childRestrictions, childrenRestrictions, model, currentLevel); AbstractLevel *childLevel = create(childRestrictions, childrenRestrictions, model, currentLevel);
if (!childLevel) { if (!childLevel) {
@ -400,7 +400,7 @@ ForkLevel::ForkLevel(const QList<ClientModel::LevelRestriction> &childRestrictio
connect(VirtualDesktopManager::self(), &VirtualDesktopManager::countChanged, this, &ForkLevel::desktopCountChanged); connect(VirtualDesktopManager::self(), &VirtualDesktopManager::countChanged, this, &ForkLevel::desktopCountChanged);
connect(screens(), &Screens::countChanged, this, &ForkLevel::screenCountChanged); connect(screens(), &Screens::countChanged, this, &ForkLevel::screenCountChanged);
#if KWIN_BUILD_ACTIVITIES #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::added, this, &ForkLevel::activityAdded);
connect(activities, &Activities::removed, this, &ForkLevel::activityRemoved); connect(activities, &Activities::removed, this, &ForkLevel::activityRemoved);
} }

View file

@ -41,7 +41,7 @@ WorkspaceWrapper::WorkspaceWrapper(QObject *parent)
connect(vds, &VirtualDesktopManager::currentChanged, this, &WorkspaceWrapper::currentVirtualDesktopChanged); connect(vds, &VirtualDesktopManager::currentChanged, this, &WorkspaceWrapper::currentVirtualDesktopChanged);
connect(ws, &Workspace::windowDemandsAttentionChanged, this, &WorkspaceWrapper::clientDemandsAttentionChanged); connect(ws, &Workspace::windowDemandsAttentionChanged, this, &WorkspaceWrapper::clientDemandsAttentionChanged);
#if KWIN_BUILD_ACTIVITIES #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::currentChanged, this, &WorkspaceWrapper::currentActivityChanged);
connect(activities, &Activities::added, this, &WorkspaceWrapper::activitiesChanged); connect(activities, &Activities::added, this, &WorkspaceWrapper::activitiesChanged);
connect(activities, &Activities::added, this, &WorkspaceWrapper::activityAdded); connect(activities, &Activities::added, this, &WorkspaceWrapper::activityAdded);
@ -104,10 +104,10 @@ Window *WorkspaceWrapper::activeClient() const
QString WorkspaceWrapper::currentActivity() const QString WorkspaceWrapper::currentActivity() const
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return QString(); return QString();
} }
return Activities::self()->current(); return Workspace::self()->activities()->current();
#else #else
return QString(); return QString();
#endif #endif
@ -116,8 +116,8 @@ QString WorkspaceWrapper::currentActivity() const
void WorkspaceWrapper::setCurrentActivity(QString activity) void WorkspaceWrapper::setCurrentActivity(QString activity)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (Activities::self()) { if (Workspace::self()->activities()) {
Activities::self()->setCurrent(activity); Workspace::self()->activities()->setCurrent(activity);
} }
#else #else
Q_UNUSED(activity) Q_UNUSED(activity)
@ -127,10 +127,10 @@ void WorkspaceWrapper::setCurrentActivity(QString activity)
QStringList WorkspaceWrapper::activityList() const QStringList WorkspaceWrapper::activityList() const
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return QStringList(); return QStringList();
} }
return Activities::self()->all(); return Workspace::self()->activities()->all();
#else #else
return QStringList(); return QStringList();
#endif #endif

View file

@ -70,8 +70,8 @@ TabBoxHandlerImpl::TabBoxHandlerImpl(TabBox *tabBox)
connect(vds, &VirtualDesktopManager::countChanged, m_desktopFocusChain, &DesktopChainManager::resize); connect(vds, &VirtualDesktopManager::countChanged, m_desktopFocusChain, &DesktopChainManager::resize);
connect(vds, &VirtualDesktopManager::currentChanged, m_desktopFocusChain, &DesktopChainManager::addDesktop); connect(vds, &VirtualDesktopManager::currentChanged, m_desktopFocusChain, &DesktopChainManager::addDesktop);
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (Activities::self()) { if (Workspace::self()->activities()) {
connect(Activities::self(), &Activities::currentChanged, m_desktopFocusChain, &DesktopChainManager::useChain); connect(Workspace::self()->activities(), &Activities::currentChanged, m_desktopFocusChain, &DesktopChainManager::useChain);
} }
#endif #endif
} }

View file

@ -418,10 +418,10 @@ void UserActionsMenu::menuAboutToShow()
void UserActionsMenu::showHideActivityMenu() void UserActionsMenu::showHideActivityMenu()
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return; return;
} }
const QStringList &openActivities_ = Activities::self()->running(); const QStringList &openActivities_ = Workspace::self()->activities()->running();
qCDebug(KWIN_CORE) << "activities:" << openActivities_.size(); qCDebug(KWIN_CORE) << "activities:" << openActivities_.size();
if (openActivities_.size() < 2) { if (openActivities_.size() < 2) {
delete m_activityMenu; delete m_activityMenu;
@ -696,7 +696,7 @@ void UserActionsMenu::activityPopupAboutToShow()
} }
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return; return;
} }
m_activityMenu->clear(); m_activityMenu->clear();
@ -717,7 +717,7 @@ void UserActionsMenu::activityPopupAboutToShow()
} }
m_activityMenu->addSeparator(); m_activityMenu->addSeparator();
const auto activities = Activities::self()->running(); const auto activities = Workspace::self()->activities()->running();
for (const QString &id : activities) { for (const QString &id : activities) {
KActivities::Info activity(id); KActivities::Info activity(id);
QString name = activity.name(); QString name = activity.name();
@ -776,7 +776,7 @@ void UserActionsMenu::slotWindowOperation(QAction *action)
void UserActionsMenu::slotToggleOnActivity(QAction *action) void UserActionsMenu::slotToggleOnActivity(QAction *action)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return; return;
} }
QString activity = action->data().toString(); QString activity = action->data().toString();
@ -789,7 +789,7 @@ void UserActionsMenu::slotToggleOnActivity(QAction *action)
return; 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()) { if (m_activityMenu && m_activityMenu->isVisible() && m_activityMenu->actions().count()) {
const bool isOnAll = m_window->isOnAllActivities(); const bool isOnAll = m_window->isOnAllActivities();
m_activityMenu->actions().at(0)->setChecked(isOnAll); m_activityMenu->actions().at(0)->setChecked(isOnAll);

View file

@ -546,10 +546,10 @@ bool Window::isDeleted() const
bool Window::isOnCurrentActivity() const bool Window::isOnCurrentActivity() const
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return true; return true;
} }
return isOnActivity(Activities::self()->current()); return isOnActivity(Workspace::self()->activities()->current());
#else #else
return true; return true;
#endif #endif
@ -3464,7 +3464,7 @@ QStringList Window::activities() const
void Window::setOnActivity(const QString &activity, bool enable) void Window::setOnActivity(const QString &activity, bool enable)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return; return;
} }
QStringList newActivitiesList = activities(); QStringList newActivitiesList = activities();
@ -3473,7 +3473,7 @@ void Window::setOnActivity(const QString &activity, bool enable)
return; return;
} }
if (enable) { if (enable) {
QStringList allActivities = Activities::self()->all(); QStringList allActivities = Workspace::self()->activities()->all();
if (!allActivities.contains(activity)) { if (!allActivities.contains(activity)) {
// bogus ID // bogus ID
return; return;
@ -3495,10 +3495,10 @@ void Window::setOnActivity(const QString &activity, bool enable)
void Window::setOnActivities(const QStringList &newActivitiesList) void Window::setOnActivities(const QStringList &newActivitiesList)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!Workspace::self()->activities()) {
return; return;
} }
const auto allActivities = Activities::self()->all(); const auto allActivities = Workspace::self()->activities()->all();
const auto activityList = [&] { const auto activityList = [&] {
auto result = rules()->checkActivity(newActivitiesList); auto result = rules()->checkActivity(newActivitiesList);
@ -3543,7 +3543,7 @@ void Window::setOnAllActivities(bool all)
if (all) { if (all) {
setOnActivities(QStringList()); setOnActivities(QStringList());
} else { } else {
setOnActivity(Activities::self()->current(), true); setOnActivity(Workspace::self()->activities()->current(), true);
} }
#else #else
Q_UNUSED(all) Q_UNUSED(all)

View file

@ -135,12 +135,11 @@ Workspace::Workspace()
_self = this; _self = this;
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
Activities *activities = nullptr;
if (kwinApp()->usesKActivities()) { if (kwinApp()->usesKActivities()) {
activities = Activities::create(this); m_activities = std::make_unique<Activities>();
} }
if (activities) { if (m_activities) {
connect(activities, &Activities::currentChanged, this, &Workspace::updateCurrentActivity); connect(m_activities.get(), &Activities::currentChanged, this, &Workspace::updateCurrentActivity);
} }
#endif #endif
@ -1102,7 +1101,7 @@ Window *Workspace::findWindowToActivateOnDesktop(VirtualDesktop *desktop)
void Workspace::updateCurrentActivity(const QString &new_activity) void Workspace::updateCurrentActivity(const QString &new_activity)
{ {
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (!Activities::self()) { if (!m_activities) {
return; return;
} }
// closeActivePopup(); // closeActivePopup();
@ -2828,4 +2827,11 @@ FocusChain *Workspace::focusChain() const
return m_focusChain.get(); return m_focusChain.get();
} }
#if KWIN_BUILD_ACTIVITIES
Activities *Workspace::activities() const
{
return m_activities.get();
}
#endif
} // namespace } // namespace

View file

@ -56,6 +56,9 @@ class X11Window;
class X11EventFilter; class X11EventFilter;
class FocusChain; class FocusChain;
enum class Predicate; enum class Predicate;
#if KWIN_BUILD_ACTIVITIES
class Activities;
#endif
class KWIN_EXPORT Workspace : public QObject class KWIN_EXPORT Workspace : public QObject
{ {
@ -425,6 +428,9 @@ public:
return m_lastActiveWindow; return m_lastActiveWindow;
} }
FocusChain *focusChain() const; FocusChain *focusChain() const;
#if KWIN_BUILD_ACTIVITIES
Activities *activities() const;
#endif
public Q_SLOTS: public Q_SLOTS:
void performWindowOperation(KWin::Window *window, Options::WindowOperation op); void performWindowOperation(KWin::Window *window, Options::WindowOperation op);
@ -694,6 +700,9 @@ private:
SessionManager *m_sessionManager; SessionManager *m_sessionManager;
std::unique_ptr<FocusChain> m_focusChain; std::unique_ptr<FocusChain> m_focusChain;
#if KWIN_BUILD_ACTIVITIES
std::unique_ptr<Activities> m_activities;
#endif
private: private:
friend bool performTransiencyCheck(); friend bool performTransiencyCheck();

View file

@ -571,7 +571,7 @@ bool X11Window::manage(xcb_window_t w, bool isMapped)
} }
} }
#if KWIN_BUILD_ACTIVITIES #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, // 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. // 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 // 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. // with a public API for setting windows to be on all activities.
// something like KWindowSystem::setOnAllActivities or // something like KWindowSystem::setOnAllActivities or
// KActivityConsumer::setOnAllActivities // KActivityConsumer::setOnAllActivities
setOnActivity(Activities::self()->current(), true); setOnActivity(Workspace::self()->activities()->current(), true);
} }
#endif #endif
} }
@ -2504,8 +2504,8 @@ void X11Window::readActivities(Xcb::StringProperty &property)
// if the activities are not synced, and there are existing clients with // if the activities are not synced, and there are existing clients with
// activities specified, somebody has restarted kwin. we can not validate // activities specified, somebody has restarted kwin. we can not validate
// activities in this case. we need to trust the old values. // activities in this case. we need to trust the old values.
if (Activities::self() && Activities::self()->serviceStatus() != KActivities::Consumer::Unknown) { if (Workspace::self()->activities() && Workspace::self()->activities()->serviceStatus() != KActivities::Consumer::Unknown) {
QStringList allActivities = Activities::self()->all(); QStringList allActivities = Workspace::self()->activities()->all();
if (allActivities.isEmpty()) { if (allActivities.isEmpty()) {
qCDebug(KWIN_CORE) << "no activities!?!?"; qCDebug(KWIN_CORE) << "no activities!?!?";
// don't touch anything, there's probably something bad going on and we don't wanna make it worse // don't touch anything, there's probably something bad going on and we don't wanna make it worse

View file

@ -562,7 +562,7 @@ XdgToplevelWindow::XdgToplevelWindow(XdgToplevelInterface *shellSurface)
{ {
setDesktops({VirtualDesktopManager::self()->currentDesktop()}); setDesktops({VirtualDesktopManager::self()->currentDesktop()});
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (auto a = Activities::self()) { if (auto a = Workspace::self()->activities()) {
setOnActivities({a->current()}); setOnActivities({a->current()});
} }
#endif #endif
@ -1771,7 +1771,7 @@ XdgPopupWindow::XdgPopupWindow(XdgPopupInterface *shellSurface)
m_windowType = NET::Unknown; m_windowType = NET::Unknown;
setDesktops({VirtualDesktopManager::self()->currentDesktop()}); setDesktops({VirtualDesktopManager::self()->currentDesktop()});
#if KWIN_BUILD_ACTIVITIES #if KWIN_BUILD_ACTIVITIES
if (auto a = Activities::self()) { if (auto a = Workspace::self()->activities()) {
setOnActivities({a->current()}); setOnActivities({a->current()});
} }
#endif #endif