From 24a753cd7a6cdcb2fc81738eec58aea35fa17b76 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 8 Dec 2014 14:13:49 +0000 Subject: [PATCH] remove activities support --- CMakeLists.txt | 8 +- kwin/CMakeLists.txt | 13 - kwin/activation.cpp | 11 - kwin/activities.cpp | 286 -------------- kwin/activities.h | 130 ------ kwin/client.cpp | 94 ----- kwin/config-kwin.h.cmake | 1 - kwin/dbusinterface.cpp | 11 - kwin/effects.cpp | 13 - kwin/kcmkwin/kwinrules/CMakeLists.txt | 6 +- kwin/kcmkwin/kwinrules/ruleswidget.cpp | 49 --- kwin/kcmkwin/kwinrules/ruleswidget.h | 7 - kwin/manage.cpp | 15 - kwin/scripting/scripting_model.cpp | 52 --- kwin/scripting/workspace_wrapper.cpp | 19 - kwin/tabbox/tabbox.cpp | 6 - kwin/toplevel.cpp | 7 - kwin/useractions.cpp | 82 ---- kwin/workspace.cpp | 98 ----- libs/taskmanager/CMakeLists.txt | 4 +- plasma/desktop/applets/CMakeLists.txt | 1 - plasma/desktop/applets/pager/CMakeLists.txt | 3 - .../showActivityManager/CMakeLists.txt | 15 - .../applets/showActivityManager/Messages.sh | 4 - .../showActivityManager/activities.svgz | Bin 58239 -> 0 bytes .../package/contents/ui/main.qml | 64 --- .../package/metadata.desktop | 129 ------ plasma/desktop/shell/CMakeLists.txt | 13 +- .../desktop/shell/activitymanager/Messages.sh | 4 - .../shell/activitymanager/activities.knsrc | 7 - .../shell/activitymanager/activitymanager.cpp | 324 --------------- .../shell/activitymanager/activitymanager.h | 117 ------ .../activitymanager/kidenticongenerator.cpp | 295 -------------- .../activitymanager/kidenticongenerator.h | 47 --- .../package/contents/ui/.directory | 5 - .../package/contents/ui/ActivityDelegate.qml | 322 --------------- .../package/contents/ui/main.qml | 305 -------------- .../activitymanager/package/metadata.desktop | 60 --- .../contents/layout.js | 15 - .../metadata.desktop | 72 ---- plasma/generic/applets/CMakeLists.txt | 1 - .../applets/activitybar/CMakeLists.txt | 17 - .../generic/applets/activitybar/Messages.sh | 2 - .../applets/activitybar/activitybar.cpp | 372 ------------------ .../generic/applets/activitybar/activitybar.h | 72 ---- .../plasma-applet-activitybar.desktop | 160 -------- plasma/generic/dataengines/CMakeLists.txt | 1 - .../dataengines/activities/ActivityData.cpp | 87 ---- .../dataengines/activities/ActivityData.h | 48 --- .../dataengines/activities/CMakeLists.txt | 30 -- .../activities/activities.operations | 38 -- .../dataengines/activities/activityengine.cpp | 270 ------------- .../dataengines/activities/activityengine.h | 81 ---- .../dataengines/activities/activityjob.cpp | 105 ----- .../dataengines/activities/activityjob.h | 48 --- .../activities/activityservice.cpp | 35 -- .../dataengines/activities/activityservice.h | 50 --- ...rg.kde.ActivityManager.ActivityRanking.xml | 24 -- .../plasma-engine-activities.desktop | 130 ------ .../plasmaextracomponents/CMakeLists.txt | 4 +- plasma/generic/runners/CMakeLists.txt | 1 - .../generic/runners/activities/CMakeLists.txt | 12 - plasma/generic/runners/activities/Messages.sh | 4 - .../runners/activities/activityrunner.cpp | 173 -------- .../runners/activities/activityrunner.h | 53 --- .../plasma-runner-activityrunner.desktop | 121 ------ powerdevil/daemon/CMakeLists.txt | 4 +- powerdevil/kcmodule/CMakeLists.txt | 1 - powerdevil/kcmodule/activities/CMakeLists.txt | 26 -- powerdevil/kcmodule/activities/Messages.sh | 5 - .../kcmodule/activities/activityWidget.ui | 192 --------- .../kcmodule/activities/activitypage.cpp | 219 ----------- powerdevil/kcmodule/activities/activitypage.h | 57 --- .../kcmodule/activities/activitywidget.cpp | 189 --------- .../kcmodule/activities/activitywidget.h | 61 --- .../powerdevilactivitiesconfig.desktop | 147 ------- 76 files changed, 7 insertions(+), 5547 deletions(-) delete mode 100644 kwin/activities.cpp delete mode 100644 kwin/activities.h delete mode 100644 plasma/desktop/applets/showActivityManager/CMakeLists.txt delete mode 100644 plasma/desktop/applets/showActivityManager/Messages.sh delete mode 100644 plasma/desktop/applets/showActivityManager/activities.svgz delete mode 100644 plasma/desktop/applets/showActivityManager/package/contents/ui/main.qml delete mode 100644 plasma/desktop/applets/showActivityManager/package/metadata.desktop delete mode 100644 plasma/desktop/shell/activitymanager/Messages.sh delete mode 100644 plasma/desktop/shell/activitymanager/activities.knsrc delete mode 100644 plasma/desktop/shell/activitymanager/activitymanager.cpp delete mode 100644 plasma/desktop/shell/activitymanager/activitymanager.h delete mode 100644 plasma/desktop/shell/activitymanager/kidenticongenerator.cpp delete mode 100644 plasma/desktop/shell/activitymanager/kidenticongenerator.h delete mode 100644 plasma/desktop/shell/activitymanager/package/contents/ui/.directory delete mode 100644 plasma/desktop/shell/activitymanager/package/contents/ui/ActivityDelegate.qml delete mode 100644 plasma/desktop/shell/activitymanager/package/contents/ui/main.qml delete mode 100644 plasma/desktop/shell/activitymanager/package/metadata.desktop delete mode 100644 plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/contents/layout.js delete mode 100644 plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/metadata.desktop delete mode 100644 plasma/generic/applets/activitybar/CMakeLists.txt delete mode 100644 plasma/generic/applets/activitybar/Messages.sh delete mode 100644 plasma/generic/applets/activitybar/activitybar.cpp delete mode 100644 plasma/generic/applets/activitybar/activitybar.h delete mode 100644 plasma/generic/applets/activitybar/plasma-applet-activitybar.desktop delete mode 100644 plasma/generic/dataengines/activities/ActivityData.cpp delete mode 100644 plasma/generic/dataengines/activities/ActivityData.h delete mode 100644 plasma/generic/dataengines/activities/CMakeLists.txt delete mode 100644 plasma/generic/dataengines/activities/activities.operations delete mode 100644 plasma/generic/dataengines/activities/activityengine.cpp delete mode 100644 plasma/generic/dataengines/activities/activityengine.h delete mode 100644 plasma/generic/dataengines/activities/activityjob.cpp delete mode 100644 plasma/generic/dataengines/activities/activityjob.h delete mode 100644 plasma/generic/dataengines/activities/activityservice.cpp delete mode 100644 plasma/generic/dataengines/activities/activityservice.h delete mode 100644 plasma/generic/dataengines/activities/org.kde.ActivityManager.ActivityRanking.xml delete mode 100644 plasma/generic/dataengines/activities/plasma-engine-activities.desktop delete mode 100644 plasma/generic/runners/activities/CMakeLists.txt delete mode 100755 plasma/generic/runners/activities/Messages.sh delete mode 100644 plasma/generic/runners/activities/activityrunner.cpp delete mode 100644 plasma/generic/runners/activities/activityrunner.h delete mode 100644 plasma/generic/runners/activities/plasma-runner-activityrunner.desktop delete mode 100644 powerdevil/kcmodule/activities/CMakeLists.txt delete mode 100644 powerdevil/kcmodule/activities/Messages.sh delete mode 100644 powerdevil/kcmodule/activities/activityWidget.ui delete mode 100644 powerdevil/kcmodule/activities/activitypage.cpp delete mode 100644 powerdevil/kcmodule/activities/activitypage.h delete mode 100644 powerdevil/kcmodule/activities/activitywidget.cpp delete mode 100644 powerdevil/kcmodule/activities/activitywidget.h delete mode 100644 powerdevil/kcmodule/activities/powerdevilactivitiesconfig.desktop diff --git a/CMakeLists.txt b/CMakeLists.txt index 2735250b..18caf7f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,12 +80,6 @@ set_package_properties(Wayland PROPERTIES DESCRIPTION "The Wayland Client and Se PURPOSE "Required for building KWin with Wayland support" ) -find_package(KActivities 6.0.0 CONFIG) -set_package_properties(KActivities PROPERTIES DESCRIPTION "Interface library for the activity manager" - URL "https://projects.kde.org/kactivities" - TYPE REQUIRED - ) - if(Q_WS_X11) find_package(XCB REQUIRED) set_package_properties(XCB PROPERTIES DESCRIPTION "X protocol C-language Binding" @@ -204,7 +198,7 @@ configure_file(config-workspace.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-works add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS} -DHAVE_CONFIG_H=1) add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) -include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ${KACTIVITIES_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/libs) +include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ${CMAKE_SOURCE_DIR}/libs) # libs add_subdirectory(cmake) diff --git a/kwin/CMakeLists.txt b/kwin/CMakeLists.txt index 75b8dd97..fd4b2f5b 100644 --- a/kwin/CMakeLists.txt +++ b/kwin/CMakeLists.txt @@ -10,7 +10,6 @@ OPTION(KWIN_BUILD_SCRIPTING "Enable building of KWin with scripting support" ON) OPTION(KWIN_BUILD_KAPPMENU "Enable building of KWin with application menu support" ON) OPTION(KWIN_BUILD_XRENDER_COMPOSITING "Enable building of KWin with XRender Compositing support" ON) OPTION(KWIN_BUILD_OPENGL_1_COMPOSITING "Enable support for OpenGL 1.x, automatically disabled when building for OpenGL ES 2.0" ON) -OPTION(KWIN_BUILD_ACTIVITIES "Enable building of KWin with kactivities support" ON) if(${KDE_PLATFORM_PROFILE} STREQUAL "Desktop") OPTION(KWIN_PLASMA_ACTIVE "Enable building KWin for Plasma Active." OFF) else() @@ -184,13 +183,6 @@ if(KWIN_BUILD_KAPPMENU) ) endif() -if(KWIN_BUILD_ACTIVITIES) - set( - kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} - activities.cpp - ) -endif() - if(KWIN_HAVE_EGL) set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} eglonxbackend.cpp) endif() @@ -274,11 +266,6 @@ if(KWIN_BUILD_SCRIPTING) set(kwin_QT_LIBS ${kwin_QT_LIBS} ${QT_QTSCRIPT_LIBRARY}) endif() -if(KWIN_BUILD_ACTIVITIES) - set(kwin_KDE_LIBS ${kwin_KDE_LIBS} ${KACTIVITIES_LIBRARIES}) - include_directories(${KACTIVITIES_INCLUDE_DIR}) -endif() - if(OPENGL_EGL_FOUND) set(kwin_OPENGL_LIBS ${kwin_OPENGL_LIBS} ${OPENGLES_EGL_LIBRARY}) endif() diff --git a/kwin/activation.cpp b/kwin/activation.cpp index 2a95d3fe..a7687298 100644 --- a/kwin/activation.cpp +++ b/kwin/activation.cpp @@ -31,9 +31,6 @@ along with this program. If not, see . #include "focuschain.h" #include "netinfo.h" #include "workspace.h" -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #include #include @@ -302,14 +299,6 @@ void Workspace::activateClient(Client* c, bool force) VirtualDesktopManager::self()->setCurrent(c->desktop()); --block_focus; } -#ifdef KWIN_BUILD_ACTIVITIES - if (!c->isOnCurrentActivity()) { - ++block_focus; - //DBUS! - Activities::self()->setCurrent(c->activities().first()); //first isn't necessarily best, but it's easiest - --block_focus; - } -#endif if (c->isMinimized()) c->unminimize(); diff --git a/kwin/activities.cpp b/kwin/activities.cpp deleted file mode 100644 index e6f83533..00000000 --- a/kwin/activities.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/******************************************************************** - KWin - the KDE window manager - This file is part of the KDE project. - -Copyright (C) 2013 Martin Gräßlin - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*********************************************************************/ -#include "activities.h" -// KWin -#include "client.h" -#include "workspace.h" -// KDE -#include -#include -#include -#include -// Qt -#include -#include -#include -#include - -namespace KWin -{ - -KWIN_SINGLETON_FACTORY(Activities) - -Activities::Activities(QObject *parent) - : QObject(parent) - , m_controller(new KActivities::Controller(this)) -{ - connect(m_controller, SIGNAL(activityRemoved(QString)), SLOT(slotRemoved(QString))); - connect(m_controller, SIGNAL(activityRemoved(QString)), SIGNAL(removed(QString))); - connect(m_controller, SIGNAL(activityAdded(QString)), SLOT(slotAdded(QString))); - connect(m_controller, SIGNAL(activityAdded(QString)), SIGNAL(added(QString))); - connect(m_controller, SIGNAL(currentActivityChanged(QString)), SLOT(slotCurrentChanged(QString))); -} - -Activities::~Activities() -{ - s_self = NULL; -} - -void Activities::setCurrent(const QString &activity) -{ - m_controller->setCurrentActivity(activity); -} - -void Activities::slotCurrentChanged(const QString &newActivity) -{ - if (m_current == newActivity) { - return; - } - m_previous = m_current; - m_current = newActivity; - emit currentChanged(newActivity); -} - -void Activities::slotAdded(const QString &activity) -{ - m_all << activity; -} - -void Activities::slotRemoved(const QString &activity) -{ - m_all.removeOne(activity); - foreach (Client * client, Workspace::self()->clientList()) { - client->setOnActivity(activity, false); - } - //toss out any session data for it - KConfigGroup cg(KGlobal::config(), QString("SubSession: ") + activity); - cg.deleteGroup(); -} - -void Activities::toggleClientOnActivity(Client* c, const QString &activity, bool dont_activate) -{ - //int old_desktop = c->desktop(); - bool was_on_activity = c->isOnActivity(activity); - bool was_on_all = c->isOnAllActivities(); - //note: all activities === no activities - bool enable = was_on_all || !was_on_activity; - c->setOnActivity(activity, enable); - if (c->isOnActivity(activity) == was_on_activity && c->isOnAllActivities() == was_on_all) // No change - return; - - Workspace *ws = Workspace::self(); - if (c->isOnCurrentActivity()) { - if (c->wantsTabFocus() && options->focusPolicyIsReasonable() && - !was_on_activity && // for stickyness changes - //FIXME not sure if the line above refers to the correct activity - !dont_activate) - ws->requestFocus(c); - else - ws->restackClientUnderActive(c); - } else - ws->raiseClient(c); - - //notifyWindowDesktopChanged( c, old_desktop ); - - ClientList transients_stacking_order = ws->ensureStackingOrder(c->transients()); - for (ClientList::ConstIterator it = transients_stacking_order.constBegin(); - it != transients_stacking_order.constEnd(); - ++it) - toggleClientOnActivity(*it, activity, dont_activate); - ws->updateClientArea(); -} - -bool Activities::start(const QString &id) -{ - Workspace *ws = Workspace::self(); - if (ws->sessionSaving()) { - return false; //ksmserver doesn't queue requests (yet) - } - - if (!m_all.contains(id)) { - return false; //bogus id - } - - ws->loadSubSessionInfo(id); - - QDBusInterface ksmserver("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface"); - if (ksmserver.isValid()) { - ksmserver.asyncCall("restoreSubSession", id); - } else { - kDebug(1212) << "couldn't get ksmserver interface"; - return false; - } - return true; -} - -bool Activities::stop(const QString &id) -{ - if (Workspace::self()->sessionSaving()) { - return false; //ksmserver doesn't queue requests (yet) - //FIXME what about session *loading*? - } - - //ugly hack to avoid dbus deadlocks - update(true, false); - QMetaObject::invokeMethod(this, "reallyStop", Qt::QueuedConnection, Q_ARG(QString, id)); - //then lie and assume it worked. - return true; -} - -void Activities::reallyStop(const QString &id) -{ - Workspace *ws = Workspace::self(); - if (ws->sessionSaving()) - return; //ksmserver doesn't queue requests (yet) - - kDebug(1212) << id; - - QSet saveSessionIds; - QSet dontCloseSessionIds; - const ClientList &clients = ws->clientList(); - for (ClientList::const_iterator it = clients.constBegin(); it != clients.constEnd(); ++it) { - const Client* c = (*it); - const QByteArray sessionId = c->sessionId(); - if (sessionId.isEmpty()) { - continue; //TODO support old wm_command apps too? - } - - //kDebug() << sessionId; - - //if it's on the activity that's closing, it needs saving - //but if a process is on some other open activity, I don't wanna close it yet - //this is, of course, complicated by a process having many windows. - if (c->isOnAllActivities()) { - dontCloseSessionIds << sessionId; - continue; - } - - const QStringList activities = c->activities(); - foreach (const QString & activityId, activities) { - if (activityId == id) { - saveSessionIds << sessionId; - } else if (m_running.contains(activityId)) { - dontCloseSessionIds << sessionId; - } - } - } - - ws->storeSubSession(id, saveSessionIds); - - QStringList saveAndClose; - QStringList saveOnly; - foreach (const QByteArray & sessionId, saveSessionIds) { - if (dontCloseSessionIds.contains(sessionId)) { - saveOnly << sessionId; - } else { - saveAndClose << sessionId; - } - } - - kDebug(1212) << "saveActivity" << id << saveAndClose << saveOnly; - - //pass off to ksmserver - QDBusInterface ksmserver("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface"); - if (ksmserver.isValid()) { - ksmserver.asyncCall("saveSubSession", id, saveAndClose, saveOnly); - } else { - kDebug(1212) << "couldn't get ksmserver interface"; - } -} - -//BEGIN threaded activity list fetching -typedef QPair AssignedList; -typedef QPair CurrentAndList; - -static AssignedList -fetchActivityList(KActivities::Controller *controller, QStringList *target, bool running) // could be member function, but actually it's much simpler this way -{ - return AssignedList(target, running ? controller->listActivities(KActivities::Info::Running) : - controller->listActivities()); -} - -static CurrentAndList -fetchActivityListAndCurrent(KActivities::Controller *controller) -{ - QStringList l = controller->listActivities(); - QString c = controller->currentActivity(); - return CurrentAndList(c, l); -} - -void Activities::update(bool running, bool updateCurrent, QObject *target, QString slot) -{ - if (updateCurrent) { - QFutureWatcher* watcher = new QFutureWatcher; - connect( watcher, SIGNAL(finished()), SLOT(handleReply()) ); - if (!slot.isEmpty()) { - watcher->setProperty("activityControllerCallback", slot); // "activity reply trigger" - watcher->setProperty("activityControllerCallbackTarget", qVariantFromValue((void*)target)); - } - watcher->setFuture(QtConcurrent::run(fetchActivityListAndCurrent, m_controller)); - } else { - QFutureWatcher* watcher = new QFutureWatcher; - connect(watcher, SIGNAL(finished()), SLOT(handleReply())); - if (!slot.isEmpty()) { - watcher->setProperty("activityControllerCallback", slot); // "activity reply trigger" - watcher->setProperty("activityControllerCallbackTarget", qVariantFromValue((void*)target)); - } - QStringList *target = running ? &m_running : &m_all; - watcher->setFuture(QtConcurrent::run(fetchActivityList, m_controller, target, running)); - } -} - -void Activities::handleReply() -{ - QObject *watcherObject = 0; - if (QFutureWatcher* watcher = dynamic_cast< QFutureWatcher* >(sender())) { - // we carry over the to-be-updated StringList member as pointer in the threaded return - *(watcher->result().first) = watcher->result().second; - watcherObject = watcher; - } - - if (!watcherObject) { - if (QFutureWatcher* watcher = dynamic_cast< QFutureWatcher* >(sender())) { - m_all = watcher->result().second; - slotCurrentChanged(watcher->result().first); - watcherObject = watcher; - } - } - - if (watcherObject) { - QString slot = watcherObject->property("activityControllerCallback").toString(); - QObject *target = static_cast(watcherObject->property("activityControllerCallbackTarget").value()); - watcherObject->deleteLater(); // has done it's job - if (!slot.isEmpty()) - QMetaObject::invokeMethod(target, slot.toAscii().data(), Qt::DirectConnection); - } -} -//END threaded activity list fetching - -} // namespace diff --git a/kwin/activities.h b/kwin/activities.h deleted file mode 100644 index 87176116..00000000 --- a/kwin/activities.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************** - KWin - the KDE window manager - This file is part of the KDE project. - -Copyright (C) 2013 Martin Gräßlin - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*********************************************************************/ -#ifndef KWIN_ACTIVITIES_H -#define KWIN_ACTIVITIES_H - -#include - -#include -#include - -namespace KActivities { -class Controller; -} - -namespace KWin -{ -class Client; - -class Activities : public QObject -{ - Q_OBJECT - -public: - ~Activities(); - - bool stop(const QString &id); - bool start(const QString &id); - void update(bool running, bool updateCurrent, QObject *target = NULL, QString slot = QString()); - void setCurrent(const QString &activity); - /** - * Adds/removes client \a c to/from \a activity. - * - * Takes care of transients as well. - */ - void toggleClientOnActivity(Client* c, const QString &activity, bool dont_activate); - - const QStringList &running() const; - const QStringList &all() const; - const QString ¤t() const; - const QString &previous() const; - - static QString nullUuid(); - -Q_SIGNALS: - /** - * This signal is emitted when the global - * activity is changed - * @param id id of the new current activity - */ - void currentChanged(const QString &id); - /** - * This signal is emitted when a new activity is added - * @param id id of the new activity - */ - void added(const QString &id); - /** - * This signal is emitted when the activity - * is removed - * @param id id of the removed activity - */ - void removed(const QString &id); - -private Q_SLOTS: - void slotRemoved(const QString &activity); - void slotAdded(const QString &activity); - void slotCurrentChanged(const QString &newActivity); - void reallyStop(const QString &id); //dbus deadlocks suck - void handleReply(); - -private: - QStringList m_running; - QStringList m_all; - QString m_current; - QString m_previous; - KActivities::Controller *m_controller; - - KWIN_SINGLETON(Activities) -}; - -inline -const QStringList &Activities::all() const -{ - return m_all; -} - -inline -const QString &Activities::current() const -{ - return m_current; -} - -inline -const QString &Activities::previous() const -{ - return m_previous; -} - -inline -const QStringList &Activities::running() const -{ - return m_running; -} - -inline -QString Activities::nullUuid() -{ - // cloned from kactivities/src/lib/core/consumer.cpp - return QString("00000000-0000-0000-0000-000000000000"); -} - -} - -#endif // KWIN_ACTIVITIES_H diff --git a/kwin/client.cpp b/kwin/client.cpp index fa52acee..79a32c77 100644 --- a/kwin/client.cpp +++ b/kwin/client.cpp @@ -21,9 +21,6 @@ along with this program. If not, see . // own #include "client.h" // kwin -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #ifdef KWIN_BUILD_KAPPMENU #include "appmenu.h" #endif @@ -1501,22 +1498,8 @@ void Client::setDesktop(int desktop) */ void Client::setOnActivity(const QString &activity, bool enable) { -#ifdef KWIN_BUILD_ACTIVITIES - QStringList newActivitiesList = activities(); - if (newActivitiesList.contains(activity) == enable) //nothing to do - return; - if (enable) { - QStringList allActivities = Activities::self()->all(); - if (!allActivities.contains(activity)) //bogus ID - return; - newActivitiesList.append(activity); - } else - newActivitiesList.removeOne(activity); - setOnActivities(newActivitiesList); -#else Q_UNUSED(activity) Q_UNUSED(enable) -#endif } /** @@ -1524,33 +1507,7 @@ void Client::setOnActivity(const QString &activity, bool enable) */ void Client::setOnActivities(QStringList newActivitiesList) { -#ifdef KWIN_BUILD_ACTIVITIES - QString joinedActivitiesList = newActivitiesList.join(","); - joinedActivitiesList = rules()->checkActivity(joinedActivitiesList, false); - newActivitiesList = joinedActivitiesList.split(',', QString::SkipEmptyParts); - - QStringList allActivities = Activities::self()->all(); - if ( newActivitiesList.isEmpty() || - (newActivitiesList.count() > 1 && newActivitiesList.count() == allActivities.count()) || - (newActivitiesList.count() == 1 && newActivitiesList.at(0) == Activities::nullUuid())) { - activityList.clear(); - const QByteArray nullUuid = Activities::nullUuid().toUtf8(); - XChangeProperty(display(), window(), atoms->activities, XA_STRING, 8, - PropModeReplace, (const unsigned char *)nullUuid.constData(), nullUuid.length()); - - } else { - QByteArray joined = joinedActivitiesList.toAscii(); - char *data = joined.data(); - activityList = newActivitiesList; - XChangeProperty(display(), window(), atoms->activities, XA_STRING, 8, - PropModeReplace, (unsigned char *)data, joined.size()); - - } - - updateActivities(false); -#else Q_UNUSED(newActivitiesList) -#endif } void Client::blockActivityUpdates(bool b) @@ -1633,16 +1590,6 @@ void Client::setOnAllDesktops(bool b) */ void Client::setOnAllActivities(bool on) { -#ifdef KWIN_BUILD_ACTIVITIES - if (on == isOnAllActivities()) - return; - if (on) { - setOnActivities(QStringList()); - - } else { - setOnActivity(Activities::self()->current(), true); - } -#endif } /** @@ -2377,47 +2324,6 @@ QPixmap* kwin_get_menu_pix_hack() void Client::checkActivities() { -#ifdef KWIN_BUILD_ACTIVITIES - QStringList newActivitiesList; - QByteArray prop = getStringProperty(window(), atoms->activities); - activitiesDefined = !prop.isEmpty(); - if (prop == Activities::nullUuid()) { - //copied from setOnAllActivities to avoid a redundant XChangeProperty. - if (!activityList.isEmpty()) { - activityList.clear(); - updateActivities(true); - } - return; - } - if (prop.isEmpty()) { - //note: this makes it *act* like it's on all activities but doesn't set the property to 'ALL' - if (!activityList.isEmpty()) { - activityList.clear(); - updateActivities(true); - } - return; - } - - newActivitiesList = QString(prop).split(','); - - if (newActivitiesList == activityList) - return; //expected change, it's ok. - - //otherwise, somebody else changed it. we need to validate before reacting - QStringList allActivities = Activities::self()->all(); - if (allActivities.isEmpty()) { - kDebug() << "no activities!?!?"; - //don't touch anything, there's probably something bad going on and we don't wanna make it worse - return; - } - for (int i = 0; i < newActivitiesList.size(); ++i) { - if (! allActivities.contains(newActivitiesList.at(i))) { - kDebug() << "invalid:" << newActivitiesList.at(i); - newActivitiesList.removeAt(i--); - } - } - setOnActivities(newActivitiesList); -#endif } void Client::setSessionInteract(bool needed) diff --git a/kwin/config-kwin.h.cmake b/kwin/config-kwin.h.cmake index 3dbd146b..01fd38ea 100644 --- a/kwin/config-kwin.h.cmake +++ b/kwin/config-kwin.h.cmake @@ -4,7 +4,6 @@ #cmakedefine KWIN_BUILD_SCREENEDGES 1 #cmakedefine KWIN_BUILD_SCRIPTING 1 #cmakedefine KWIN_BUILD_KAPPMENU 1 -#cmakedefine KWIN_BUILD_ACTIVITIES 1 #cmakedefine KWIN_BUILD_OXYGEN 1 #define KWIN_NAME "${KWIN_NAME}" #define KWIN_CONFIG "${KWIN_NAME}rc" diff --git a/kwin/dbusinterface.cpp b/kwin/dbusinterface.cpp index 10ea3f2f..7c4cdfa8 100644 --- a/kwin/dbusinterface.cpp +++ b/kwin/dbusinterface.cpp @@ -30,9 +30,6 @@ along with this program. If not, see . #include "kwinadaptor.h" #include "workspace.h" #include "virtualdesktops.h" -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif // Qt #include @@ -131,20 +128,12 @@ WRAP(bool, waitForCompositingSetup) bool DBusInterface::startActivity(const QString &in0) { -#ifdef KWIN_BUILD_ACTIVITIES - return Activities::self()->start(in0); -#else return false; -#endif } bool DBusInterface::stopActivity(const QString &in0) { -#ifdef KWIN_BUILD_ACTIVITIES - return Activities::self()->stop(in0); -#else return false; -#endif } void DBusInterface::doNotManage(const QString &name) diff --git a/kwin/effects.cpp b/kwin/effects.cpp index e2b0e9f1..12d69f51 100644 --- a/kwin/effects.cpp +++ b/kwin/effects.cpp @@ -22,9 +22,6 @@ along with this program. If not, see . #include "effects.h" #include "effectsadaptor.h" -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #include "decorations.h" #include "deleted.h" #include "client.h" @@ -237,12 +234,6 @@ EffectsHandlerImpl::EffectsHandlerImpl(Compositor *compositor, Scene *scene) connect(Cursor::self(), SIGNAL(mouseChanged(QPoint,QPoint,Qt::MouseButtons,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::KeyboardModifiers)), SIGNAL(mouseChanged(QPoint,QPoint,Qt::MouseButtons,Qt::MouseButtons,Qt::KeyboardModifiers,Qt::KeyboardModifiers))); connect(ws, SIGNAL(propertyNotify(long)), this, SLOT(slotPropertyNotify(long))); -#ifdef KWIN_BUILD_ACTIVITIES - Activities *activities = Activities::self(); - connect(activities, SIGNAL(added(QString)), SIGNAL(activityAdded(QString))); - connect(activities, SIGNAL(removed(QString)), SIGNAL(activityRemoved(QString))); - connect(activities, SIGNAL(currentChanged(QString)), SIGNAL(currentActivityChanged(QString))); -#endif connect(ws, SIGNAL(stackingOrderChanged()), SIGNAL(stackingOrderChanged())); #ifdef KWIN_BUILD_TABBOX TabBox::TabBox *tabBox = TabBox::TabBox::self(); @@ -922,11 +913,7 @@ void EffectsHandlerImpl::setShowingDesktop(bool showing) QString EffectsHandlerImpl::currentActivity() const { -#ifdef KWIN_BUILD_ACTIVITIES - return Activities::self()->current(); -#else return QString(); -#endif } int EffectsHandlerImpl::currentDesktop() const diff --git a/kwin/kcmkwin/kwinrules/CMakeLists.txt b/kwin/kcmkwin/kwinrules/CMakeLists.txt index 3cfc1dcc..054d4df0 100644 --- a/kwin/kcmkwin/kwinrules/CMakeLists.txt +++ b/kwin/kcmkwin/kwinrules/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories( ${KACTIVITIES_INCLUDE_DIR} ) - ADD_DEFINITIONS(-DKCMRULES) ########### next target ############### @@ -18,7 +16,7 @@ set(kwin_kcm_rules_XCB_LIBS ${X11_XCB_LIBRARIES} ) -target_link_libraries(kdeinit_kwin_rules_dialog ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES} ${KACTIVITIES_LIBRARIES} ${kwin_kcm_rules_XCB_LIBS}) +target_link_libraries(kdeinit_kwin_rules_dialog ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES} ${kwin_kcm_rules_XCB_LIBS}) install(TARGETS kdeinit_kwin_rules_dialog ${INSTALL_TARGETS_DEFAULT_ARGS} ) install(TARGETS kwin_rules_dialog DESTINATION ${LIBEXEC_INSTALL_DIR} ) @@ -30,7 +28,7 @@ set(kcm_kwinrules_PART_SRCS kcm.cpp ${kwinrules_SRCS}) kde4_add_plugin(kcm_kwinrules ${kcm_kwinrules_PART_SRCS}) -target_link_libraries(kcm_kwinrules ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES} ${KACTIVITIES_LIBRARIES} ${kwin_kcm_rules_XCB_LIBS}) +target_link_libraries(kcm_kwinrules ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES} ${kwin_kcm_rules_XCB_LIBS}) install(TARGETS kcm_kwinrules DESTINATION ${PLUGIN_INSTALL_DIR} ) diff --git a/kwin/kcmkwin/kwinrules/ruleswidget.cpp b/kwin/kcmkwin/kwinrules/ruleswidget.cpp index b30db540..50157019 100644 --- a/kwin/kcmkwin/kwinrules/ruleswidget.cpp +++ b/kwin/kcmkwin/kwinrules/ruleswidget.cpp @@ -28,9 +28,6 @@ #include #include -#ifdef KWIN_BUILD_ACTIVITIES -#include -#endif #include #include @@ -89,9 +86,6 @@ RulesWidget::RulesWidget(QWidget* parent) SETUP(size, set); SETUP(desktop, set); SETUP(screen, set); -#ifdef KWIN_BUILD_ACTIVITIES - SETUP(activity, set); -#endif SETUP(maximizehoriz, set); SETUP(maximizevert, set); SETUP(minimize, set); @@ -130,11 +124,9 @@ RulesWidget::RulesWidget(QWidget* parent) edit_reg_title->hide(); edit_reg_machine->hide(); -#ifndef KWIN_BUILD_ACTIVITIES rule_activity->hide(); enable_activity->hide(); activity->hide(); -#endif int i; for (i = 1; i <= KWindowSystem::numberOfDesktops(); @@ -142,16 +134,6 @@ RulesWidget::RulesWidget(QWidget* parent) desktop->addItem(QString::number(i).rightJustified(2) + ':' + KWindowSystem::desktopName(i)); desktop->addItem(i18n("All Desktops")); -#ifdef KWIN_BUILD_ACTIVITIES - static KActivities::Consumer activities; - foreach (const QString & activityId, activities.listActivities()) { - activity->addItem(KActivities::Info::name(activityId), activityId); - } - // cloned from kactivities/src/lib/core/consumer.cpp - #define NULL_UUID "00000000-0000-0000-0000-000000000000" - activity->addItem(i18n("All Activities"), QString::fromLatin1(NULL_UUID)); - #undef NULL_UUID -#endif } #undef SETUP @@ -168,9 +150,6 @@ UPDATE_ENABLE_SLOT(position) UPDATE_ENABLE_SLOT(size) UPDATE_ENABLE_SLOT(desktop) UPDATE_ENABLE_SLOT(screen) -#ifdef KWIN_BUILD_ACTIVITIES -UPDATE_ENABLE_SLOT(activity) -#endif UPDATE_ENABLE_SLOT(maximizehoriz) UPDATE_ENABLE_SLOT(maximizevert) UPDATE_ENABLE_SLOT(minimize) @@ -288,28 +267,6 @@ int RulesWidget::comboToDesktop(int val) const return NET::OnAllDesktops; return val + 1; } -#ifdef KWIN_BUILD_ACTIVITIES -int RulesWidget::activityToCombo(QString d) const -{ - // TODO: ivan - do a multiselection list - for (int i = 0; i < activity->count(); i++) { - if (activity->itemData(i).toString() == d) { - return i; - } - } - - return activity->count() - 1; // on all activities -} - -QString RulesWidget::comboToActivity(int val) const -{ - // TODO: ivan - do a multiselection list - if (val < 0 || val >= activity->count()) - return QString(); - - return activity->itemData(val).toString(); -} -#endif static int placementToCombo(Placement::Policy placement) { static const int conv[] = { @@ -444,9 +401,6 @@ void RulesWidget::setRules(Rules* rules) LINEEDIT_SET_RULE(size, sizeToStr); COMBOBOX_SET_RULE(desktop, desktopToCombo); SPINBOX_SET_RULE(screen, inc); -#ifdef KWIN_BUILD_ACTIVITIES - COMBOBOX_SET_RULE(activity, activityToCombo); -#endif CHECKBOX_SET_RULE(maximizehoriz,); CHECKBOX_SET_RULE(maximizevert,); CHECKBOX_SET_RULE(minimize,); @@ -543,9 +497,6 @@ Rules* RulesWidget::rules() const LINEEDIT_SET_RULE(size, strToSize); COMBOBOX_SET_RULE(desktop, comboToDesktop); SPINBOX_SET_RULE(screen, dec); -#ifdef KWIN_BUILD_ACTIVITIES - COMBOBOX_SET_RULE(activity, comboToActivity); -#endif CHECKBOX_SET_RULE(maximizehoriz,); CHECKBOX_SET_RULE(maximizevert,); CHECKBOX_SET_RULE(minimize,); diff --git a/kwin/kcmkwin/kwinrules/ruleswidget.h b/kwin/kcmkwin/kwinrules/ruleswidget.h index 7e875601..2a895736 100644 --- a/kwin/kcmkwin/kwinrules/ruleswidget.h +++ b/kwin/kcmkwin/kwinrules/ruleswidget.h @@ -60,9 +60,6 @@ private slots: void updateEnablesize(); void updateEnabledesktop(); void updateEnablescreen(); -#ifdef KWIN_BUILD_ACTIVITIES - void updateEnableactivity(); -#endif void updateEnablemaximizehoriz(); void updateEnablemaximizevert(); void updateEnableminimize(); @@ -98,10 +95,6 @@ private slots: private: int desktopToCombo(int d) const; int comboToDesktop(int val) const; -#ifdef KWIN_BUILD_ACTIVITIES - int activityToCombo(QString d) const; - QString comboToActivity(int val) const; -#endif int comboToTiling(int val) const; int inc(int i) const { return i+1; } int dec(int i) const { return i-1; } diff --git a/kwin/manage.cpp b/kwin/manage.cpp index 99526b9b..9b474475 100644 --- a/kwin/manage.cpp +++ b/kwin/manage.cpp @@ -27,9 +27,6 @@ along with this program. If not, see . #include #include -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #include "cursor.h" #include "decorations.h" #include @@ -203,18 +200,6 @@ bool Client::manage(xcb_window_t w, bool isMapped) desk = info->desktop(); // Window had the initial desktop property, force it if (desktop() == 0 && asn_valid && asn_data.desktop() != 0) desk = asn_data.desktop(); -#ifdef KWIN_BUILD_ACTIVITIES - if (!isMapped && !noborder && 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 - //TODO: if we are keeping it (at least as an option), replace noborder checking - //with a public API for setting windows to be on all activities. - //something like KWindowSystem::setOnAllActivities or - //KActivityConsumer::setOnAllActivities - setOnActivity(Activities::self()->current(), true); - } -#endif } if (desk == 0) // Assume window wants to be visible on the current desktop diff --git a/kwin/scripting/scripting_model.cpp b/kwin/scripting/scripting_model.cpp index 849c8764..75929323 100644 --- a/kwin/scripting/scripting_model.cpp +++ b/kwin/scripting/scripting_model.cpp @@ -311,20 +311,7 @@ AbstractLevel *AbstractLevel::create(const QList< ClientModel::LevelRestriction } switch (restriction) { case ClientModel::ActivityRestriction: { -#ifdef KWIN_BUILD_ACTIVITIES - const QStringList &activities = Activities::self()->all(); - for (QStringList::const_iterator it = activities.begin(); it != activities.end(); ++it) { - AbstractLevel *childLevel = create(childRestrictions, childrenRestrictions, model, currentLevel); - if (!childLevel) { - continue; - } - childLevel->setActivity(*it); - currentLevel->addChild(childLevel); - } - break; -#else return NULL; -#endif } case ClientModel::ScreenRestriction: for (int i=0; icount(); ++i) { @@ -402,11 +389,6 @@ ForkLevel::ForkLevel(const QList &childRestrictio { connect(VirtualDesktopManager::self(), SIGNAL(countChanged(uint,uint)), SLOT(desktopCountChanged(uint,uint))); connect(screens(), SIGNAL(countChanged(int,int)), SLOT(screenCountChanged(int,int))); -#ifdef KWIN_BUILD_ACTIVITIES - Activities *activities = Activities::self(); - connect(activities, SIGNAL(added(QString)), SLOT(activityAdded(QString))); - connect(activities, SIGNAL(removed(QString)), SLOT(activityRemoved(QString))); -#endif } ForkLevel::~ForkLevel() @@ -478,44 +460,10 @@ void ForkLevel::screenCountChanged(int previousCount, int newCount) void ForkLevel::activityAdded(const QString &activityId) { -#ifdef KWIN_BUILD_ACTIVITIES - if (restriction() != ClientModel::ClientModel::ActivityRestriction) { - return; - } - // verify that our children do not contain this activity - foreach (AbstractLevel *child, m_children) { - if (child->activity() == activityId) { - return; - } - } - emit beginInsert(m_children.count(), m_children.count(), id()); - AbstractLevel *childLevel = AbstractLevel::create(m_childRestrictions, restrictions(), model(), this); - if (!childLevel) { - emit endInsert(); - return; - } - childLevel->setActivity(activityId); - childLevel->init(); - addChild(childLevel); - emit endInsert(); -#endif } void ForkLevel::activityRemoved(const QString &activityId) { -#ifdef KWIN_BUILD_ACTIVITIES - if (restriction() != ClientModel::ClientModel::ActivityRestriction) { - return; - } - for (int i=0; iactivity() == activityId) { - emit beginRemove(i, i, id()); - delete m_children.takeAt(i); - emit endRemove(); - break; - } - } -#endif } int ForkLevel::count() const diff --git a/kwin/scripting/workspace_wrapper.cpp b/kwin/scripting/workspace_wrapper.cpp index fb737119..456773cc 100644 --- a/kwin/scripting/workspace_wrapper.cpp +++ b/kwin/scripting/workspace_wrapper.cpp @@ -25,9 +25,6 @@ along with this program. If not, see . #include "../screens.h" #include "../virtualdesktops.h" #include "../workspace.h" -#ifdef KWIN_BUILD_ACTIVITIES -#include "../activities.h" -#endif #include @@ -46,14 +43,6 @@ WorkspaceWrapper::WorkspaceWrapper(QObject* parent) : QObject(parent) connect(vds, SIGNAL(countChanged(uint,uint)), SIGNAL(numberDesktopsChanged(uint))); connect(vds, SIGNAL(layoutChanged(int,int)), SIGNAL(desktopLayoutChanged())); connect(ws, SIGNAL(clientDemandsAttentionChanged(KWin::Client*,bool)), SIGNAL(clientDemandsAttentionChanged(KWin::Client*,bool))); -#ifdef KWIN_BUILD_ACTIVITIES - KWin::Activities *activities = KWin::Activities::self(); - connect(activities, SIGNAL(currentChanged(QString)), SIGNAL(currentActivityChanged(QString))); - connect(activities, SIGNAL(added(QString)), SIGNAL(activitiesChanged(QString))); - connect(activities, SIGNAL(added(QString)), SIGNAL(activityAdded(QString))); - connect(activities, SIGNAL(removed(QString)), SIGNAL(activitiesChanged(QString))); - connect(activities, SIGNAL(removed(QString)), SIGNAL(activityRemoved(QString))); -#endif connect(QApplication::desktop(), SIGNAL(screenCountChanged(int)), SIGNAL(numberScreensChanged(int))); connect(QApplication::desktop(), SIGNAL(resized(int)), SIGNAL(screenResized(int))); foreach (KWin::Client *client, ws->clientList()) { @@ -92,20 +81,12 @@ GETTER(QList< KWin::Client* >, clientList) QString WorkspaceWrapper::currentActivity() const { -#ifdef KWIN_BUILD_ACTIVITIES - return Activities::self()->current(); -#else return QString(); -#endif } QStringList WorkspaceWrapper::activityList() const { -#ifdef KWIN_BUILD_ACTIVITIES - return Activities::self()->all(); -#else return QStringList(); -#endif } #define SLOTWRAPPER(name) \ diff --git a/kwin/tabbox/tabbox.cpp b/kwin/tabbox/tabbox.cpp index 1d5e466a..f8b993be 100644 --- a/kwin/tabbox/tabbox.cpp +++ b/kwin/tabbox/tabbox.cpp @@ -29,9 +29,6 @@ along with this program. If not, see . #include "tabbox/tabboxconfig.h" #include "tabbox/desktopchain.h" // kwin -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #include "client.h" #include "effects.h" #include "focuschain.h" @@ -80,9 +77,6 @@ TabBoxHandlerImpl::TabBoxHandlerImpl(TabBox* tabBox) VirtualDesktopManager *vds = VirtualDesktopManager::self(); connect(vds, SIGNAL(countChanged(uint,uint)), m_desktopFocusChain, SLOT(resize(uint,uint))); connect(vds, SIGNAL(currentChanged(uint,uint)), m_desktopFocusChain, SLOT(addDesktop(uint,uint))); -#ifdef KWIN_BUILD_ACTIVITIES - connect(Activities::self(), SIGNAL(currentChanged(QString)), m_desktopFocusChain, SLOT(useChain(QString))); -#endif } TabBoxHandlerImpl::~TabBoxHandlerImpl() diff --git a/kwin/toplevel.cpp b/kwin/toplevel.cpp index 19ed0bd4..41e411dd 100644 --- a/kwin/toplevel.cpp +++ b/kwin/toplevel.cpp @@ -22,9 +22,6 @@ along with this program. If not, see . #include -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #include "atoms.h" #include "client.h" #include "client_machine.h" @@ -451,11 +448,7 @@ bool Toplevel::isDeleted() const bool Toplevel::isOnCurrentActivity() const { -#ifdef KWIN_BUILD_ACTIVITIES - return isOnActivity(Activities::self()->current()); -#else return true; -#endif } void Toplevel::elevate(bool elevate) diff --git a/kwin/useractions.cpp b/kwin/useractions.cpp index 563cb868..64e8bbfc 100755 --- a/kwin/useractions.cpp +++ b/kwin/useractions.cpp @@ -44,10 +44,6 @@ along with this program. If not, see . #include "scripting/scripting.h" #endif -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#include -#endif #include #include @@ -426,9 +422,6 @@ void UserActionsMenu::menuAboutToShow() } else { initScreenPopup(); } -#ifdef KWIN_BUILD_ACTIVITIES - Activities::self()->update(true, false, this, "showHideActivityMenu"); -#endif m_resizeOperation->setEnabled(m_client.data()->isResizable()); m_moveOperation->setEnabled(m_client.data()->isMovableAcrossScreens()); @@ -476,16 +469,6 @@ void UserActionsMenu::menuAboutToShow() void UserActionsMenu::showHideActivityMenu() { -#ifdef KWIN_BUILD_ACTIVITIES - const QStringList &openActivities_ = Activities::self()->running(); - kDebug() << "activities:" << openActivities_.size(); - if (openActivities_.size() < 2) { - delete m_activityMenu; - m_activityMenu = 0; - } else { - initActivityPopup(); - } -#endif } void UserActionsMenu::selectPopupClientTab(QAction* action) @@ -712,43 +695,6 @@ void UserActionsMenu::activityPopupAboutToShow() if (!m_activityMenu) return; -#ifdef KWIN_BUILD_ACTIVITIES - m_activityMenu->clear(); - QAction *action = m_activityMenu->addAction(i18n("&All Activities")); - action->setData(QString()); - action->setCheckable(true); - static QPointer allActivitiesGroup; - if (!allActivitiesGroup) { - allActivitiesGroup = new QActionGroup(m_activityMenu); - } - allActivitiesGroup->addAction(action); - - if (!m_client.isNull() && m_client.data()->isOnAllActivities()) - action->setChecked(true); - m_activityMenu->addSeparator(); - - foreach (const QString &id, Activities::self()->running()) { - KActivities::Info activity(id); - QString name = activity.name(); - name.replace('&', "&&"); - QWidgetAction *action = new QWidgetAction(m_activityMenu); - QCheckBox *box = new QCheckBox(name, m_activityMenu); - action->setDefaultWidget(box); - const QString icon = activity.icon(); - if (!icon.isEmpty()) - box->setIcon(KIcon(icon)); - box->setBackgroundRole(m_activityMenu->backgroundRole()); - box->setForegroundRole(m_activityMenu->foregroundRole()); - box->setPalette(m_activityMenu->palette()); - connect (box, SIGNAL(clicked(bool)), action, SIGNAL(triggered(bool))); - m_activityMenu->addAction(action); - action->setData(id); - - if (!m_client.isNull() && - !m_client.data()->isOnAllActivities() && m_client.data()->isOnActivity(id)) - box->setChecked(true); - } -#endif } void UserActionsMenu::slotWindowOperation(QAction *action) @@ -815,34 +761,6 @@ void UserActionsMenu::slotSendToScreen(QAction *action) void UserActionsMenu::slotToggleOnActivity(QAction *action) { -#ifdef KWIN_BUILD_ACTIVITIES - QString activity = action->data().toString(); - if (m_client.isNull()) - return; - if (activity.isEmpty()) { - // the 'on_all_activities' menu entry - m_client.data()->setOnAllActivities(!m_client.data()->isOnAllActivities()); - return; - } - - Activities::self()->toggleClientOnActivity(m_client.data(), activity, false); - if (m_activityMenu && m_activityMenu->isVisible() && m_activityMenu->actions().count()) { - const bool isOnAll = m_client.data()->isOnAllActivities(); - m_activityMenu->actions().at(0)->setChecked(isOnAll); - if (isOnAll) { - // toggleClientOnActivity interprets "on all" as "on none" and - // susequent toggling ("off") would move the client to only that activity. - // bug #330838 -> set all but "on all" off to "force proper usage" - for (int i = 1; i < m_activityMenu->actions().count(); ++i) { - if (QWidgetAction *qwa = qobject_cast(m_activityMenu->actions().at(i))) { - if (QCheckBox *qcb = qobject_cast(qwa->defaultWidget())) { - qcb->setChecked(false); - } - } - } - } - } -#endif } //**************************************** diff --git a/kwin/workspace.cpp b/kwin/workspace.cpp index 82a7567c..c837ed02 100644 --- a/kwin/workspace.cpp +++ b/kwin/workspace.cpp @@ -24,9 +24,6 @@ along with this program. If not, see . #include #include // kwin -#ifdef KWIN_BUILD_ACTIVITIES -#include "activities.h" -#endif #ifdef KWIN_BUILD_KAPPMENU #include "appmenu.h" #endif @@ -154,10 +151,6 @@ Workspace::Workspace(bool restore) // start the cursor support Cursor::create(this); -#ifdef KWIN_BUILD_ACTIVITIES - Activities *activities = Activities::create(this); - connect(activities, SIGNAL(currentChanged(QString)), SLOT(updateCurrentActivity(QString))); -#endif // PluginMgr needs access to the config file, so we need to wait for it for finishing reparseConfigFuture.waitForFinished(); @@ -296,9 +289,6 @@ void Workspace::init() } if (!VirtualDesktopManager::self()->setCurrent(initial_desktop)) VirtualDesktopManager::self()->setCurrent(1); -#ifdef KWIN_BUILD_ACTIVITIES - Activities::self()->update(false, true); -#endif reconfigureTimer.setSingleShot(true); updateToolWindowsTimer.setSingleShot(true); @@ -1032,95 +1022,7 @@ Client *Workspace::findClientToActivateOnDesktop(uint desktop) void Workspace::updateCurrentActivity(const QString &new_activity) { -#ifdef KWIN_BUILD_ACTIVITIES - //closeActivePopup(); - ++block_focus; - // TODO: Q_ASSERT( block_stacking_updates == 0 ); // Make sure stacking_order is up to date - StackingUpdatesBlocker blocker(this); - - ++block_showing_desktop; //FIXME should I be using that? - // Optimized Desktop switching: unmapping done from back to front - // mapping done from front to back => less exposure events - //Notify::raise((Notify::Event) (Notify::DesktopChange+new_desktop)); - - ObscuringWindows obs_wins; - - const QString &old_activity = Activities::self()->previous(); - - for (ToplevelList::ConstIterator it = stacking_order.constBegin(); - it != stacking_order.constEnd(); - ++it) { - Client *c = qobject_cast(*it); - if (!c) { - continue; - } - if (!c->isOnActivity(new_activity) && c != movingClient && c->isOnCurrentDesktop()) { - if (c->isShown(true) && c->isOnActivity(old_activity) && !compositing()) - obs_wins.create(c); - c->updateVisibility(); - } - } - - // Now propagate the change, after hiding, before showing - //rootInfo->setCurrentDesktop( currentDesktop() ); - - /* TODO someday enable dragging windows to other activities - if ( movingClient && !movingClient->isOnDesktop( new_desktop )) - { - movingClient->setDesktop( new_desktop ); - */ - - for (int i = stacking_order.size() - 1; i >= 0 ; --i) { - Client *c = qobject_cast(stacking_order.at(i)); - if (!c) { - continue; - } - if (c->isOnActivity(new_activity)) - c->updateVisibility(); - } - - --block_showing_desktop; - //FIXME not sure if I should do this either - if (showingDesktop()) // Do this only after desktop change to avoid flicker - resetShowingDesktop(false); - - // Restore the focus on this desktop - --block_focus; - Client* c = 0; - - //FIXME below here is a lot of focuschain stuff, probably all wrong now - if (options->focusPolicyIsReasonable()) { - // Search in focus chain - c = FocusChain::self()->getForActivation(VirtualDesktopManager::self()->current()); - } - // If "unreasonable focus policy" and active_client is on_all_desktops and - // under mouse (Hence == old_active_client), conserve focus. - // (Thanks to Volker Schatz ) - else if (active_client && active_client->isShown(true) && active_client->isOnCurrentDesktop() && active_client->isOnCurrentActivity()) - c = active_client; - - if (c == NULL && !desktops.isEmpty()) - c = findDesktop(true, VirtualDesktopManager::self()->current()); - - if (c != active_client) - setActiveClient(NULL); - - if (c) - requestFocus(c); - else if (!desktops.isEmpty()) - requestFocus(findDesktop(true, VirtualDesktopManager::self()->current())); - else - focusToNull(); - - // Not for the very first time, only if something changed and there are more than 1 desktops - - //if ( effects != NULL && old_desktop != 0 && old_desktop != new_desktop ) - // static_cast( effects )->desktopChanged( old_desktop ); - if (compositing() && m_compositor) - m_compositor->addRepaintFull(); -#else Q_UNUSED(new_activity) -#endif } void Workspace::moveClientsFromRemovedDesktops() diff --git a/libs/taskmanager/CMakeLists.txt b/libs/taskmanager/CMakeLists.txt index 17cda2d3..d30aaede 100644 --- a/libs/taskmanager/CMakeLists.txt +++ b/libs/taskmanager/CMakeLists.txt @@ -31,7 +31,7 @@ set(taskmanager_LIB_SRCS ${taskmanager_LIB_SRCS} task_x11.cpp) kde4_add_library(taskmanager SHARED ${taskmanager_LIB_SRCS}) -target_link_libraries(taskmanager processcore ${KACTIVITIES_LIBRARIES} ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES}) +target_link_libraries(taskmanager processcore ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES}) if (X11_Xfixes_FOUND) target_link_libraries(taskmanager ${X11_Xfixes_LIB}) endif (X11_Xfixes_FOUND) @@ -42,8 +42,6 @@ if (X11_Xcomposite_FOUND) target_link_libraries(taskmanager ${X11_Xcomposite_LIB}) endif (X11_Xcomposite_FOUND) -include_directories(${KACTIVITIES_INCLUDE_DIR}) - if (NOT KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION) include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/kephal) target_link_libraries(taskmanager kephal) diff --git a/plasma/desktop/applets/CMakeLists.txt b/plasma/desktop/applets/CMakeLists.txt index c75edf3d..42d79938 100644 --- a/plasma/desktop/applets/CMakeLists.txt +++ b/plasma/desktop/applets/CMakeLists.txt @@ -1,5 +1,4 @@ add_subdirectory(kickoff) -add_subdirectory(showActivityManager) add_subdirectory(trash) #task and windowlist depend on libs/taskmanager diff --git a/plasma/desktop/applets/pager/CMakeLists.txt b/plasma/desktop/applets/pager/CMakeLists.txt index 8d3d5ed5..a4ee702f 100644 --- a/plasma/desktop/applets/pager/CMakeLists.txt +++ b/plasma/desktop/applets/pager/CMakeLists.txt @@ -1,7 +1,5 @@ project(plasma-pager) -include_directories(${KACTIVITIES_INCLUDE_DIR}) - set(pager_SRCS model.cpp pager.cpp) @@ -12,7 +10,6 @@ target_link_libraries(plasma_applet_pager ${KDE4_KIO_LIBS} ${KDE4_PLASMA_LIBS} ${KDE4_KCMUTILS_LIBRARY} - ${KACTIVITIES_LIBRARIES} ${QT_QTDECLARATIVE_LIBRARY} taskmanager) diff --git a/plasma/desktop/applets/showActivityManager/CMakeLists.txt b/plasma/desktop/applets/showActivityManager/CMakeLists.txt deleted file mode 100644 index 7c730011..00000000 --- a/plasma/desktop/applets/showActivityManager/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -project(plasma-showActivityManager) - -find_package(KDE4 REQUIRED) - -include(KDE4Defaults) - -install(DIRECTORY package/ - DESTINATION ${DATA_INSTALL_DIR}/plasma/plasmoids/org.kde.showActivityManager) - -install(FILES package/metadata.desktop - DESTINATION ${SERVICES_INSTALL_DIR} - RENAME plasma-applet-org.kde.showActivityManager.desktop) - -install(FILES activities.svgz - DESTINATION ${DATA_INSTALL_DIR}/desktoptheme/default/widgets/) diff --git a/plasma/desktop/applets/showActivityManager/Messages.sh b/plasma/desktop/applets/showActivityManager/Messages.sh deleted file mode 100644 index 43b59b23..00000000 --- a/plasma/desktop/applets/showActivityManager/Messages.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` >> rc.cpp -$XGETTEXT `find . -name \*.qml -o -name \*.cpp` -o $podir/plasma_applet_org.kde.showActivityManager.pot -rm -f rc.cpp diff --git a/plasma/desktop/applets/showActivityManager/activities.svgz b/plasma/desktop/applets/showActivityManager/activities.svgz deleted file mode 100644 index 6d15724ca9498c2f6ce4da590e769c72ff96f9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58239 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%0AI8=2 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 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -import QtQuick 1.1 -import org.kde.plasma.core 0.1 as PlasmaCore -import org.kde.plasma.graphicswidgets 0.1 as PlasmaWidgets - -Item { - id: iconContainer - property string activeSource: "Status" - property int minimumWidth: 16 - property int minimumHeight: 16 - implicitWidth: theme.iconSizes["panel"] - implicitHeight: implicitWidth - - Component.onCompleted: { - plasmoid.aspectRatioMode = "ConstrainedSquare" - } - - PlasmaCore.DataSource { - id: dataSource - engine: "org.kde.activities" - connectedSources: [activeSource] - } - - PlasmaCore.ToolTip { - id: tooltip - mainText: i18n("Show Activity Manager") - subText: i18n("Click to show the activity manager") - target: icon - image: "preferences-activities" - } - - PlasmaWidgets.IconWidget - { - id: icon - svg: "widgets/activities" - width: parent.width - height: parent.height - onClicked: - { - var service = dataSource.serviceForSource(activeSource) - var operation = service.operationDescription("toggleActivityManager") - service.startOperationCall(operation) - } - } -} - diff --git a/plasma/desktop/applets/showActivityManager/package/metadata.desktop b/plasma/desktop/applets/showActivityManager/package/metadata.desktop deleted file mode 100644 index bfd1badb..00000000 --- a/plasma/desktop/applets/showActivityManager/package/metadata.desktop +++ /dev/null @@ -1,129 +0,0 @@ -[Desktop Entry] -Name=Activities -Name[ar]=الأنشطة -Name[bg]=Дейности -Name[bs]=motor aktivnosti -Name[ca]=Activitats -Name[ca@valencia]=Activitats -Name[cs]=Aktivity -Name[da]=Aktiviteter -Name[de]=Aktivitäten -Name[el]=Δραστηριότητες -Name[en_GB]=Activities -Name[es]=Actividades -Name[et]=Tegevused -Name[eu]=Jarduerak -Name[fa]=فعالیتها -Name[fi]=Aktiviteetit -Name[fr]=Activités -Name[ga]=Gníomhaíochtaí -Name[gl]=Actividades -Name[he]=עילויות -Name[hr]=Aktivnosti -Name[hu]=Aktivitások -Name[ia]=Activitates -Name[is]=Virknistjóri -Name[it]=Attività -Name[ja]=アクティビティ -Name[kk]=Белсенділіктер -Name[km]=សកម្មភាព -Name[ko]=활동 -Name[lt]=Veiklos -Name[lv]=Aktivitātes -Name[mr]=कार्यपध्दती -Name[nb]=Aktiviteter -Name[nds]=Aktiviteten -Name[nl]=Activiteiten -Name[pa]=ਸਰਗਰਮੀਆਂ -Name[pl]=Działania -Name[pt]=Actividades -Name[pt_BR]=Atividades -Name[ro]=Activități -Name[ru]=Комнаты -Name[sk]=Aktivity -Name[sl]=Dejavnosti -Name[sr]=активности -Name[sr@ijekavian]=активности -Name[sr@ijekavianlatin]=aktivnosti -Name[sr@latin]=aktivnosti -Name[sv]=Aktiviteter -Name[tr]=Etkinlikler -Name[ug]=پائالىيەتلەر -Name[uk]=Простори дій -Name[vi]=Hoạt động -Name[wa]=Activités -Name[x-test]=xxActivitiesxx -Name[zh_CN]=活动 -Name[zh_TW]=活動 -Comment=Shows the activity manager -Comment[bg]=Управление на дейностите -Comment[bs]=Prikazuje menadžer aktivnosti -Comment[ca]=Mostra el gestor d'activitats -Comment[ca@valencia]=Mostra el gestor d'activitats -Comment[cs]=Zobrazí správce aktivit -Comment[da]=Vis aktivitetshåndtering -Comment[de]=Zeigt die Aktivitätenverwaltung an -Comment[el]=Εμφανίζει το διαχειριστή δραστηριοτήτων -Comment[en_GB]=Shows the activity manager -Comment[es]=Muestra el gestor de actividades -Comment[et]=Tegevuste halduri näitamine -Comment[eu]=Jarduera-kudeatzailea erakusten du -Comment[fi]=Näyttää aktiviteettienhallinnan -Comment[fr]=Affiche le gestionnaire d'activités -Comment[ga]=Taispeáin an bainisteoir gníomhaíochta -Comment[gl]=Mostra o xestor da actividade -Comment[he]=מציג את מנהל פעילויות -Comment[hr]=Prikazuje upravitelja aktivnosti -Comment[hu]=Aktivitáskezelő megjelenítése -Comment[ia]=Monstra le gerente de activitate -Comment[is]=Birtir virknistjóra -Comment[it]=Mostra il gestore delle attività -Comment[kk]=Белсенділік менеджері көрсетеді -Comment[km]=បង្ហាញ​កម្មវិធី​គ្រប់គ្រង​សកម្មភាព​ -Comment[ko]=활동 관리자 보이기 -Comment[lt]=Rodo veiklų tvarkyklę -Comment[lv]=Rāda aktivitāšu pārvaldnieku -Comment[mr]=कार्यपध्दती व्यवस्थापक दर्शवितो -Comment[nb]=Viser aktivitetshåndtereren -Comment[nds]=Wiest den Aktivitetenpleger -Comment[nl]=Toont de activiteitenbeheerder -Comment[pa]=ਸਰਗਰਮੀ ਮੈਨੇਜਰ ਵੇਖਾਉਂਦਾ ਹੈ -Comment[pl]=Pokazuje menadżera działań -Comment[pt]=Mostra o gestor de actividades -Comment[pt_BR]=Mostra o gerenciador de atividades -Comment[ro]=Arată Gestionarul de activități -Comment[ru]=Показывает диспетчер комнат -Comment[sk]=Ukáže správcu aktivít -Comment[sl]=Prikaže upravljalnika dejavnosti -Comment[sr]=Приказује менаџер активности -Comment[sr@ijekavian]=Приказује менаџер активности -Comment[sr@ijekavianlatin]=Prikazuje menadžer aktivnosti -Comment[sr@latin]=Prikazuje menadžer aktivnosti -Comment[sv]=Visar Aktivitetshanteraren -Comment[tr]=Etkinlik yöneticisini gösterir -Comment[ug]=پائالىيەت باشقۇرغۇچنى كۆرسىتىدۇ -Comment[uk]=Показує вікно керування просторами дій -Comment[wa]=Mostrer l' manaedjeu des activités -Comment[x-test]=xxShows the activity managerxx -Comment[zh_CN]=显示活动管理器 -Comment[zh_TW]=顯示活動管理員 -Icon=preferences-activities -Type=Service - -X-Plasma-API=declarativeappletscript -X-Plasma-MainScript=ui/main.qml -X-Plasma-DefaultSize=200,100 -X-Plasma-Requires-FileDialog=Unused -X-Plasma-Requires-LaunchApp=Unused - -X-KDE-PluginInfo-Author=Gregor Tätzner -X-KDE-PluginInfo-Email=plasma-devel@kde.org -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category=Windows and Tasks -X-KDE-PluginInfo-Name=org.kde.showActivityManager -X-KDE-PluginInfo-Version=1.0 -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPL -X-KDE-PluginInfo-EnabledByDefault=true - -X-KDE-ServiceTypes=Plasma/Applet diff --git a/plasma/desktop/shell/CMakeLists.txt b/plasma/desktop/shell/CMakeLists.txt index 66796806..495f5f25 100644 --- a/plasma/desktop/shell/CMakeLists.txt +++ b/plasma/desktop/shell/CMakeLists.txt @@ -2,20 +2,13 @@ include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs ${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/plasmagenericshell ${KDEBASE_WORKSPACE_SOURCE_DIR}/plasma/desktop/shell/scripting ${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/kephal - ${KACTIVITIES_INCLUDE_DIR} ) add_subdirectory(configupdates) -set(activitymanager_SRCS - activitymanager/activitymanager.cpp - activitymanager/kidenticongenerator.cpp -) - set(plasma_SRCS accessibility/accessiblefactory.cpp accessibility/accessibleplasmaview.cpp - activity.cpp scripting/desktopscriptengine.cpp scripting/panel.cpp checkbox.cpp @@ -34,7 +27,6 @@ set(plasma_SRCS positioningruler.cpp klistconfirmationdialog.cpp ${wallpaper_SRCS} - ${activitymanager_SRCS} ) kde4_add_kcfg_files(plasma_SRCS data/plasma-shell-desktop.kcfgc) @@ -49,7 +41,7 @@ kde4_add_app_icon(plasma_SRCS "${KDE4_INSTALL_DIR}/share/icons/oxygen/*/apps/pla kde4_add_kdeinit_executable(plasma-desktop ${plasma_SRCS}) -target_link_libraries(kdeinit_plasma-desktop ${KDE4_PLASMA_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_KTEXTEDITOR_LIBS} ${KDE4_KIDLETIME_LIBS} ${QT_QTSCRIPT_LIBRARY} kworkspace ${KACTIVITIES_LIBRARIES} plasmagenericshell ${QT_QTDECLARATIVE_LIBRARY}) +target_link_libraries(kdeinit_plasma-desktop ${KDE4_PLASMA_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_KTEXTEDITOR_LIBS} ${KDE4_KIDLETIME_LIBS} ${QT_QTSCRIPT_LIBRARY} kworkspace plasmagenericshell ${QT_QTDECLARATIVE_LIBRARY}) if(UNIX AND Q_WS_X11) target_link_libraries(kdeinit_plasma-desktop ${X11_LIBRARIES}) @@ -67,11 +59,9 @@ install(TARGETS plasma-desktop ${INSTALL_TARGETS_DEFAULT_ARGS}) install(FILES data/plasma.desktop data/plasma-desktop.desktop DESTINATION ${AUTOSTART_INSTALL_DIR}) install(FILES data/plasma-shell-desktop.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(FILES data/plasma-themes.knsrc DESTINATION ${CONFIG_INSTALL_DIR}) -install(FILES activitymanager/activities.knsrc DESTINATION ${CONFIG_INSTALL_DIR}) install(FILES data/plasma-desktop.notifyrc DESTINATION ${DATA_INSTALL_DIR}/plasma-desktop) install(FILES data/layouts/00-defaultLayout.js DESTINATION ${DATA_INSTALL_DIR}/plasma-desktop/init) install(FILES data/plasma-desktop-js.xml DESTINATION ${DATA_INSTALL_DIR}/katepart/syntax/) -install(DIRECTORY activitymanager/package/ DESTINATION ${DATA_INSTALL_DIR}/plasma/packages/org.kde.desktop.activitymanager) MACRO(INSTALL_PLASMA_JAVASCRIPT_TEMPLATE dir addonPrefix) configure_file(${dir}/metadata.desktop ${CMAKE_CURRENT_BINARY_DIR}/plasma-layout-${addonPrefix}.desktop COPYONLY) @@ -82,7 +72,6 @@ ENDMACRO(INSTALL_PLASMA_JAVASCRIPT_TEMPLATE) INSTALL_PLASMA_JAVASCRIPT_TEMPLATE(data/layouts/org.kde.plasma-desktop.defaultPanel org.kde.plasma-desktop.defaultPanel) INSTALL_PLASMA_JAVASCRIPT_TEMPLATE(data/layouts/org.kde.plasma-desktop.findWidgets org.kde.plasma-desktop.findWidgets) -INSTALL_PLASMA_JAVASCRIPT_TEMPLATE(data/layouts/org.kde.plasma-desktop.photoActivity org.kde.plasma-desktop.photoActivity) INSTALL_PLASMA_JAVASCRIPT_TEMPLATE(data/layouts/org.kde.plasma-desktop.desktopIcons org.kde.plasma-desktop.desktopIcons) INSTALL_PLASMA_JAVASCRIPT_TEMPLATE(data/layouts/org.kde.plasma-desktop.SaL org.kde.plasma-desktop.SaL) diff --git a/plasma/desktop/shell/activitymanager/Messages.sh b/plasma/desktop/shell/activitymanager/Messages.sh deleted file mode 100644 index a40b5ff5..00000000 --- a/plasma/desktop/shell/activitymanager/Messages.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -$XGETTEXT `find . -name \*.qml` -L Java -o $podir/plasma_package_org.kde.desktop.activitymanager.pot -$XGETTEXT `find . -name \*.cpp` -j -o $podir/plasma_package_org.kde.desktop.activitymanager.pot -rm -f rc.cpp diff --git a/plasma/desktop/shell/activitymanager/activities.knsrc b/plasma/desktop/shell/activitymanager/activities.knsrc deleted file mode 100644 index 900ba05f..00000000 --- a/plasma/desktop/shell/activitymanager/activities.knsrc +++ /dev/null @@ -1,7 +0,0 @@ -[KNewStuff3] -ProvidersUrl=http://download.kde.org/ocs/providers.xml -Categories=Plasma Activity Template -StandardResource=tmp -InstallationCommand=plasmapkg -t layout-template -i %f -UninstallCommand=plasmapkg -t layout-template -r %f - diff --git a/plasma/desktop/shell/activitymanager/activitymanager.cpp b/plasma/desktop/shell/activitymanager/activitymanager.cpp deleted file mode 100644 index 9a8d8432..00000000 --- a/plasma/desktop/shell/activitymanager/activitymanager.cpp +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright (C) 2007 by Ivan Cukic - * Copyright (C) 2009 by Ana Cecília Martins - * Copyright 2010 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library/Lesser General Public License - * version 2, or (at your option) any later version, as published by the - * Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library/Lesser General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "activitymanager.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "kidenticongenerator.h" -#include "plasmaapp.h" - -#include -#include "scripting/desktopscriptengine.h" - -class ActivityManagerPrivate -{ - -public: - ActivityManagerPrivate(ActivityManager *w) - : q(w), - containment(0) - { - } - - void init(Plasma::Location location); - void containmentDestroyed(); - void setLocation(Plasma::Location location); - - Qt::Orientation orientation; - Plasma::Location location; - ActivityManager *q; - Plasma::Containment *containment; - Plasma::DeclarativeWidget *declarativeWidget; - Plasma::Package *package; - - QGraphicsLinearLayout *mainLayout; -}; - -void ActivityManagerPrivate::init(Plasma::Location loc) -{ - location = loc; - //init widgets - if (loc == Plasma::LeftEdge || loc == Plasma::RightEdge) { - orientation = Qt::Vertical; - } else { - orientation = Qt::Horizontal; - } - - mainLayout = new QGraphicsLinearLayout(Qt::Vertical); - mainLayout->setContentsMargins(0, 0, 0, 0); - mainLayout->setSpacing(0); - - - Plasma::PackageStructure::Ptr structure = Plasma::PackageStructure::load("Plasma/Generic"); - QString path; - const QString pluginName = "org.kde.desktop.activitymanager"; - - QString subPath = structure->defaultPackageRoot() + pluginName + '/'; - path = KStandardDirs::locate("data", subPath + "metadata.desktop"); - if (path.isEmpty()) { - path = KStandardDirs::locate("data", subPath); - } else { - path.remove(QString("metadata.desktop")); - } - - if (!path.endsWith('/')) { - path.append('/'); - } - structure->setPath(path); - - package = new Plasma::Package(path, pluginName, structure); - KGlobal::locale()->insertCatalog("plasma_package_" + pluginName); - - declarativeWidget = new Plasma::DeclarativeWidget(q); - declarativeWidget->setInitializationDelayed(true); - declarativeWidget->setQmlPath(package->filePath("mainscript")); - mainLayout->addItem(declarativeWidget); - - //the activitymanager class will be directly accessible from qml - if (declarativeWidget->engine()) { - QDeclarativeContext *ctxt = declarativeWidget->engine()->rootContext(); - if (ctxt) { - ctxt->setContextProperty("activityManager", q); - } - } - - q->setLayout(mainLayout); -} - -void ActivityManagerPrivate::setLocation(Plasma::Location loc) -{ - Qt::Orientation orient; - if (loc == Plasma::LeftEdge || loc == Plasma::RightEdge) { - orient = Qt::Vertical; - } else { - orient = Qt::Horizontal; - } - - if (orientation == orient) { - return; - } - - location = loc; - emit q->orientationChanged(); -} - -void ActivityManagerPrivate::containmentDestroyed() -{ - containment = 0; -} - -//ActivityBar - -ActivityManager::ActivityManager(Plasma::Location loc, QGraphicsItem *parent) - :QGraphicsWidget(parent), - d(new ActivityManagerPrivate(this)) -{ - d->init(loc); -} - -ActivityManager::ActivityManager(QGraphicsItem *parent) - :QGraphicsWidget(parent), - d(new ActivityManagerPrivate(this)) -{ - d->init(Plasma::BottomEdge); -} - -ActivityManager::~ActivityManager() -{ - delete d; -} - -void ActivityManager::setLocation(Plasma::Location loc) -{ - d->setLocation(loc); - emit(locationChanged(loc)); -} - -ActivityManager::Location ActivityManager::location() -{ - return (ActivityManager::Location)d->location; -} - -Qt::Orientation ActivityManager::orientation() const -{ - return d->orientation; -} - -QPixmap ActivityManager::pixmapForActivity(const QString &activityId) -{ - return KIdenticonGenerator::self()->generatePixmap(KIconLoader::SizeHuge, activityId); -} - -void ActivityManager::cloneCurrentActivity() -{ - PlasmaApp::self()->cloneCurrentActivity(); -} - -void ActivityManager::createActivity(const QString &pluginName) -{ - PlasmaApp::self()->createActivity(pluginName); -} - -void ActivityManager::createActivityFromScript(const QString &script, const QString &name, const QString &icon, const QStringList &startupApps) -{ - PlasmaApp::self()->createActivityFromScript(script, name, icon, startupApps); -} - -void ActivityManager::downloadActivityScripts() -{ - KNS3::DownloadDialog *dialog = new KNS3::DownloadDialog( "activities.knsrc", 0 ); - connect(dialog, SIGNAL(accepted()), this, SIGNAL(activityTypeActionsChanged())); - connect(dialog, SIGNAL(accepted()), dialog, SLOT(deleteLater())); - dialog->show(); -} - -void ActivityManager::setContainment(Plasma::Containment *containment) -{ - kDebug() << "Setting containment to" << containment; - if (d->containment != containment) { - if (d->containment) { - d->containment->disconnect(this); - } - - d->containment = containment; - - if (d->containment) { - connect(d->containment, SIGNAL(destroyed(QObject*)), this, SLOT(containmentDestroyed())); - } - } -} - -QList ActivityManager::activityTypeActions() -{ - QList actions; - - QMap sorted; //qmap sorts alphabetically - - //regular plugins - KPluginInfo::List plugins = Plasma::Containment::listContainmentsOfType("desktop"); - foreach (const KPluginInfo& info, plugins) { - if (info.property("NoDisplay").toBool()) { - continue; - } - QVariantHash actionDescription; - //skip desktop, it's in the top level menu - if (info.pluginName() != "desktop") { - actionDescription["icon"] = info.icon(); - actionDescription["text"] = info.name(); - actionDescription["separator"] = false; - actionDescription["pluginName"] = info.pluginName(); - sorted.insert(info.name(), actionDescription); - } - } - - //templates - const QString constraint = QString("[X-Plasma-Shell] == '%1' and 'desktop' ~in [X-Plasma-ContainmentCategories]") - .arg(KGlobal::mainComponent().componentName()); - KService::List templates = KServiceTypeTrader::self()->query("Plasma/LayoutTemplate", constraint); - foreach (const KService::Ptr &service, templates) { - KPluginInfo info(service); - Plasma::PackageStructure::Ptr structure(new WorkspaceScripting::LayoutTemplatePackageStructure); - const QString path = KStandardDirs::locate("data", structure->defaultPackageRoot() + '/' + info.pluginName() + '/'); - if (!path.isEmpty()) { - Plasma::Package package(path, structure); - const QString scriptFile = package.filePath("mainscript"); - const QStringList startupApps = service->property("X-Plasma-ContainmentLayout-ExecuteOnCreation", QVariant::StringList).toStringList(); - - if (!scriptFile.isEmpty() || !startupApps.isEmpty()) { - QVariantHash actionDescription; - - actionDescription["icon"] = info.icon(); - actionDescription["text"] = info.name(); - actionDescription["separator"] = false; - actionDescription["pluginName"] = QString(); - actionDescription["scriptFile"] = scriptFile; - actionDescription["startupApps"] = startupApps; - - sorted.insert(info.name(), actionDescription); - } - } - } - - //set up sorted menu - foreach (QVariantHash actionDescription, sorted) { - actions << actionDescription; - } - - //separator - { - QVariantHash actionDescription; - actionDescription["separator"] = true; - actions << actionDescription; - } - - //ghns - //FIXME - { - QVariantHash actionDescription; - actionDescription["icon"] = "get-hot-new-stuff"; - actionDescription["text"] = i18n("Get New Templates..."); - actionDescription["separator"] = false; - actions << actionDescription; - } - - return actions; -} - -QString ActivityManager::chooseIcon() const -{ - KIconDialog *dialog = new KIconDialog; - dialog->setup(KIconLoader::Desktop); - dialog->setProperty("DoNotCloseController", true); - KWindowSystem::setOnDesktop(dialog->winId(), KWindowSystem::currentDesktop()); - dialog->showDialog(); - KWindowSystem::forceActiveWindow(dialog->winId()); - QString icon = dialog->openDialog(); - dialog->deleteLater(); - return icon; -} - -bool ActivityManager::canAddActivities() const -{ - return KAuthorized::authorize("plasma-desktop/add_activities"); -} - -bool ActivityManager::canAddWidgets() const -{ - return d->containment && d->containment->corona()->immutability() == Plasma::Mutable; -} - -#include "activitymanager.moc" diff --git a/plasma/desktop/shell/activitymanager/activitymanager.h b/plasma/desktop/shell/activitymanager/activitymanager.h deleted file mode 100644 index 44885ef8..00000000 --- a/plasma/desktop/shell/activitymanager/activitymanager.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2010 by Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library/Lesser General Public License - * version 2, or (at your option) any later version, as published by the - * Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library/Lesser General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITYMANAGER_H -#define ACTIVITYMANAGER_H - -#include -#include - -namespace Plasma -{ -class Corona; -class Containment; -} -class ActivityManagerPrivate; - -class ActivityManager : public QGraphicsWidget -{ - Q_OBJECT - /** - * list of all activity creation actions (ie new desktop, new search and launch, etc) - */ - Q_PROPERTY(QList activityTypeActions READ activityTypeActions NOTIFY activityTypeActionsChanged) - - /** - * Plasma location of the panel containment the controller is associated to - */ - Q_PROPERTY(Location location READ location NOTIFY locationChanged) - Q_ENUMS(Location) - - /** - * Orientation the controller will be disaplayed, depends from location - */ - Q_PROPERTY(Qt::Orientation orientation READ orientation NOTIFY orientationChanged) - - Q_PROPERTY(bool canAddActivities READ canAddActivities CONSTANT) - Q_PROPERTY(bool canAddWidgets READ canAddWidgets CONSTANT) - -public: - /** - * The Location enumeration describes where on screen an element, such as an - * Applet or its managing container, is positioned on the screen. - **/ - enum Location { - Floating = 0, /**< Free floating. Neither geometry or z-ordering - is described precisely by this value. */ - Desktop, /**< On the planar desktop layer, extending across - the full screen from edge to edge */ - FullScreen, /**< Full screen */ - TopEdge, /**< Along the top of the screen*/ - BottomEdge, /**< Along the bottom of the screen*/ - LeftEdge, /**< Along the left side of the screen */ - RightEdge /**< Along the right side of the screen */ - }; - - explicit ActivityManager(Plasma::Location loc, QGraphicsItem *parent=0); - ActivityManager(QGraphicsItem *parent=0); - ~ActivityManager(); - - /** - * Changes the current containment - * you've got to call this at least once so that it can access the corona - * FIXME if you can use scene() as corona, get rid of this - */ - void setContainment(Plasma::Containment *containment); - - void setLocation(Plasma::Location loc); - - //FIXME: it's asymmetric due to the problems of QML of exporting enums - ActivityManager::Location location(); - - Qt::Orientation orientation() const; - - QList activityTypeActions(); - - Q_INVOKABLE QPixmap pixmapForActivity(const QString &activityId); - Q_INVOKABLE void cloneCurrentActivity(); - Q_INVOKABLE void createActivity(const QString &pluginName); - Q_INVOKABLE void createActivityFromScript(const QString &script, const QString &name, const QString &icon, const QStringList &startupApps); - Q_INVOKABLE void downloadActivityScripts(); - Q_INVOKABLE QString chooseIcon() const; - - bool canAddActivities() const; - bool canAddWidgets() const; - -Q_SIGNALS: - void locationChanged(Plasma::Location loc); - void orientationChanged(); - void closeClicked(); - void addWidgetsRequested(); - void activityTypeActionsChanged(); - -private: - Q_PRIVATE_SLOT(d, void containmentDestroyed()) - - ActivityManagerPrivate * const d; - friend class ActivityManagerPrivate; - -}; - -#endif diff --git a/plasma/desktop/shell/activitymanager/kidenticongenerator.cpp b/plasma/desktop/shell/activitymanager/kidenticongenerator.cpp deleted file mode 100644 index 53ec7838..00000000 --- a/plasma/desktop/shell/activitymanager/kidenticongenerator.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright 2010 Ivan Cukic - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library/Lesser General Public License - * version 2, or (at your option) any later version, as published by the - * Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library/Lesser General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "kidenticongenerator.h" - -#include -#include -#include -#include - -#include - -#include -#include - -#define VALUE_LIMIT_UP 192 -#define VALUE_LIMIT_DOWN 64 - -class KIdenticonGenerator::Private { -public: - QPixmap generatePattern(int size, quint32 hash, QIcon::Mode mode); - - QString elementName(const QString & element, QIcon::Mode mode); - QColor colorForHash(quint32 hash) const; - quint32 hash(const QString & data); - - static KIdenticonGenerator * instance; - - Plasma::Svg shapes; - Plasma::Svg theme; -}; - -QPixmap KIdenticonGenerator::Private::generatePattern(int size, quint32 hash, QIcon::Mode mode) -{ - // We are dividing the pixmap into 9 blocks - 3 x 3 - int blockSize = size / 3; - - // pulling parts of the hash - quint32 tmp = hash; - - quint8 block[4]; - block[0] = tmp & 31; tmp >>= 5; - block[1] = tmp & 31; tmp >>= 5; - block[2] = tmp & 31; tmp >>= 5; - - // Painting alpha channel - QPixmap pixmapAlpha(size, size); - pixmapAlpha.fill(Qt::black); - - QPainter painterAlpha(& pixmapAlpha); - - QRectF rect(0, 0, blockSize + 0.5, blockSize + 0.5); - - for (int i = 0; i < 4; i++) { - // Painting the corner item - rect.moveTopLeft(QPoint(0, 0)); - shapes.paint(& painterAlpha, rect, "shape" + QString::number(block[0] + 1)); - - // Painting side item - rect.moveTopLeft(QPoint(blockSize, 0)); - shapes.paint(& painterAlpha, rect, "shape" + QString::number(block[1] + 1)); - - // Rotating the canvas to paint other edges - painterAlpha.translate(size, 0); - painterAlpha.rotate(90); - } - - // Painting center item - rect.moveTopLeft(QPoint(blockSize, blockSize)); - shapes.paint(& painterAlpha, rect, "shape" + QString::number(block[2] + 1)); - - painterAlpha.end(); - - // Painting final pixmap - QPixmap pixmapResult(size, size); - - - pixmapResult.fill(Qt::transparent); - - // QRadialGradient gradient(50, 50, 100); - // gradient.setColorAt(0, color.lighter()); - // gradient.setColorAt(1, color.darker()); - - QPainter resultPainter(& pixmapResult); - // resultPainter.fillRect(0, 0, size, size, gradient); - theme.paint(& resultPainter, QRect(0, 0, size, size), elementName("content", mode)); - - resultPainter.end(); - - pixmapResult.setAlphaChannel(pixmapAlpha); - - // QImage itmp = pixmapResult.toImage(); - // KIconEffect::colorize(itmp, colorForHash(hash), 1.0); - // pixmapResult = pixmapResult.fromImage(itmp); - - return pixmapResult; -} - -QColor KIdenticonGenerator::Private::colorForHash(quint32 hash) const -{ - // Color is chosen according to hash - QColor color; - - // Getting the value from color theme, but we must restrain it to - // values in range from VALUE_LIMIT_DOWN to VALUE_LIMIT_UP - - int value = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor).value(); - if (value < VALUE_LIMIT_DOWN) { - value = VALUE_LIMIT_DOWN; - } else if (value > VALUE_LIMIT_UP) { - value = VALUE_LIMIT_UP; - } - - color.setHsv( - hash % 359 + 1, // hue depending on hash - 250, // high saturation level - value - ); - - return color; - -} - -QString KIdenticonGenerator::Private::elementName(const QString & element, QIcon::Mode mode) -{ - QString prefix; - - switch (mode) { - case QIcon::Normal: - prefix = "normal-"; - break; - - case QIcon::Disabled: - prefix = "disabled-"; - break; - - case QIcon::Selected: - prefix = "selected-"; - break; - - case QIcon::Active: - prefix = "active-"; - break; - - default: - break; - - } - - if (theme.hasElement(prefix + element)) { - return prefix + element; - } else { - return element; - } -} - -quint32 KIdenticonGenerator::Private::hash(const QString & data) -{ - // qHash function doesn't give random enough results - // and gives similar hashes for similar strings. - - QByteArray bytes = QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Md5); - - // Generating hash - quint32 hash = 0; - - char * hashBytes = (char *) & hash; - for (int i = 0; i < bytes.size(); i++) { - // Using XOR for mixing the bytes because - // it is fast and cryptographically safe - // (more than enough for our use-case) - hashBytes[i % 4] ^= bytes.at(i); - } - - return hash; -} - -KIdenticonGenerator * KIdenticonGenerator::Private::instance = NULL; - -KIdenticonGenerator * KIdenticonGenerator::self() -{ - if (!Private::instance) { - Private::instance = new KIdenticonGenerator(); - } - - return Private::instance; -} - -KIdenticonGenerator::KIdenticonGenerator() - : d(new Private()) -{ - // loading SVGs - d->shapes.setImagePath("widgets/identiconshapes"); - d->shapes.setContainsMultipleImages(true); - - d->theme.setImagePath("widgets/identicontheme"); - d->theme.setContainsMultipleImages(true); -} - -#define generateIconModes( PARAM ) \ - for (int omode = QIcon::Normal; omode <= QIcon::Selected; omode++) { \ - QIcon::Mode mode = (QIcon::Mode)omode; \ - result.addPixmap(generatePixmap(size, PARAM, mode), mode); \ - } - -QIcon KIdenticonGenerator::generate(int size, quint32 hash) -{ - QIcon result; - generateIconModes(hash); - return result; -} - -QIcon KIdenticonGenerator::generate(int size, const QString & data) -{ - QIcon result; - generateIconModes(data); - return result; -} - -QIcon KIdenticonGenerator::generate(int size, const QIcon & icon) -{ - QIcon result; - generateIconModes(icon); - return result; -} - -QPixmap KIdenticonGenerator::generatePixmap(int size, QString id, QIcon::Mode mode) -{ - return generatePixmap(size, d->hash(id), mode); -} - -QPixmap KIdenticonGenerator::generatePixmap(int size, quint32 hash, QIcon::Mode mode) -{ - QPixmap pixmap(size, size); - pixmap.fill(Qt::transparent); - - // Painting background and the pattern - { - QPainter painter(& pixmap); - d->theme.paint(& painter, QRect(0, 0, size, size), d->elementName("background", mode)); - painter.drawPixmap(0, 0, d->generatePattern(size, hash, mode)); - painter.end(); - } - - // coloring the painted image - QImage itmp = pixmap.toImage(); - KIconEffect::colorize(itmp, d->colorForHash(hash), 1.0); - if (mode == QIcon::Disabled) { - KIconEffect::toGray(itmp, 0.7); - } - pixmap = pixmap.fromImage(itmp); - - // Drawing the overlay - { - QPainter painter(& pixmap); - d->theme.paint(& painter, QRect(0, 0, size, size), d->elementName("overlay", mode)); - } - - return pixmap; -} - -QPixmap KIdenticonGenerator::generatePixmap(int size, const QIcon & icon, QIcon::Mode mode) -{ - QPixmap pixmap(size, size); - pixmap.fill(Qt::transparent); - - QRect paintRect(0, 0, size, size); - - // Painting background and the pattern - QPainter painter(& pixmap); - d->theme.paint(& painter, QRect(0, 0, size, size), d->elementName("background", mode)); - - icon.paint(& painter, paintRect, Qt::AlignCenter, mode); - - painter.end(); - - return pixmap; -} - diff --git a/plasma/desktop/shell/activitymanager/kidenticongenerator.h b/plasma/desktop/shell/activitymanager/kidenticongenerator.h deleted file mode 100644 index bbf31ada..00000000 --- a/plasma/desktop/shell/activitymanager/kidenticongenerator.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010 Ivan Cukic - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library/Lesser General Public License - * version 2, or (at your option) any later version, as published by the - * Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library/Lesser General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef KIDENTICONGENERATOR_H -#define KIDENTICONGENERATOR_H - -#include -#include - -#include - -class KIdenticonGenerator { -public: - static KIdenticonGenerator * self(); - - QPixmap generatePixmap(int size, QString id, QIcon::Mode mode = QIcon::Normal); - QPixmap generatePixmap(int size, quint32 hash, QIcon::Mode mode = QIcon::Normal); - QPixmap generatePixmap(int size, const QIcon & icon, QIcon::Mode mode = QIcon::Normal); - - QIcon generate(int size, const QString & data); - QIcon generate(int size, quint32 hash); - QIcon generate(int size, const QIcon & icon); - -private: - KIdenticonGenerator(); - - class Private; - Private * const d; -}; - -#endif // KIDENTICONGENERATOR_H diff --git a/plasma/desktop/shell/activitymanager/package/contents/ui/.directory b/plasma/desktop/shell/activitymanager/package/contents/ui/.directory deleted file mode 100644 index ec379397..00000000 --- a/plasma/desktop/shell/activitymanager/package/contents/ui/.directory +++ /dev/null @@ -1,5 +0,0 @@ -[Dolphin] -SortOrder=1 -Sorting=2 -Timestamp=2012,11,28,16,51,54 -Version=3 diff --git a/plasma/desktop/shell/activitymanager/package/contents/ui/ActivityDelegate.qml b/plasma/desktop/shell/activitymanager/package/contents/ui/ActivityDelegate.qml deleted file mode 100644 index ac3d6240..00000000 --- a/plasma/desktop/shell/activitymanager/package/contents/ui/ActivityDelegate.qml +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright 2011 Marco Martin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -import QtQuick 1.1 -import org.kde.plasma.core 0.1 as PlasmaCore -import org.kde.plasma.components 0.1 as PlasmaComponents -import org.kde.qtextracomponents 0.1 - -PlasmaCore.FrameSvgItem { - id: background - - width: Math.max((delegateStack.currentPage ? delegateStack.currentPage.implicitWidth : 0) + margins.left + margins.right, list.delegateWidth) - height: Math.max((delegateStack.currentPage ? delegateStack.currentPage.implicitHeight : 0) + margins.top + margins.bottom, list.delegateHeight) - - imagePath: "widgets/viewitem" - prefix: Current ? (mainMouseArea.containsMouse ? "selected+hover" : "selected") : (mainMouseArea.containsMouse ? "hover" : "normal") - - ListView.onRemove: SequentialAnimation { - PropertyAction { - target: background - property: "ListView.delayRemove" - value: true - } - NumberAnimation { - target: background - property: "y" - to: background.height - duration: 250 - easing.type: Easing.InOutQuad - } - PropertyAction { - target: background - property: "ListView.delayRemove" - value: false - } - } - - ListView.onAdd: NumberAnimation { - target: background - property: "y" - from: -background.height - to: 0 - duration: 250 - easing.type: Easing.InOutQuad - } - - Behavior on width { - NumberAnimation { duration: 250 } - } - Behavior on height { - NumberAnimation { duration: 250 } - } - - PlasmaComponents.PageStack { - id: delegateStack - anchors { - fill: parent - leftMargin: background.margins.left - topMargin: background.margins.top - rightMargin: background.margins.right - bottomMargin: background.margins.bottom - } - clip: true - initialPage: iconComponent - } - - property Item mainMouseArea - Component { - id: iconComponent - Item { - anchors.fill: parent - - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - - onClicked: { - var activityId = model["DataEngineSource"] - var service = activitySource.serviceForSource(activityId) - var operation = service.operationDescription("setCurrent") - service.startOperationCall(operation) - } - - Component.onCompleted: mainMouseArea = mouseArea - - QIconItem { - id: iconWidget - anchors.verticalCenter: parent.verticalCenter - x: y - width: theme.hugeIconSize - height: width - icon: QIcon(Icon) - } - QPixmapItem { - anchors.fill: iconWidget - pixmap: Icon ? undefined : activityManager.pixmapForActivity(model["DataEngineSource"]) - visible: Icon == "" - } - QIconItem { - width: theme.mediumIconSize - height: width - anchors.centerIn: iconWidget - icon: QIcon("media-playback-start") - visible: model["State"] != "Running" - } - Column { - anchors { - left: iconWidget.right - right: parent.right - verticalCenter: parent.verticalCenter - - leftMargin: background.margins.left - } - PlasmaComponents.Label { - id: titleText - text: Name - anchors.left: parent.left - anchors.right: parent.right - horizontalAlignment: Text.AlignHCenter - height: paintedHeight - wrapMode: Text.WordWrap - //go with nowrap only if there is a single word too long - onPaintedWidthChanged: { - wrapTimer.restart() - } - Timer { - id: wrapTimer - interval: 200 - onTriggered: { - //give it some pixels of tolerance - if (titleText.paintedWidth > titleText.width + 3) { - titleText.wrapMode = Text.NoWrap - titleText.elide = Text.ElideRight - } else { - titleText.wrapMode = Text.WordWrap - titleText.elide = Text.ElideNone - } - } - } - } - Row { - id: buttonsRow - visible: model["State"] == "Running" - anchors.horizontalCenter: parent.horizontalCenter - - PlasmaComponents.ToolButton { - id: configureButton - flat: false - iconSource: "configure" - onClicked: delegateStack.push(configurationComponent) - } - PlasmaComponents.ToolButton { - visible: !model["Current"] - iconSource: "media-playback-stop" - flat: false - onClicked: { - var activityId = model["DataEngineSource"] - var service = activitySource.serviceForSource(activityId) - var operation = service.operationDescription("stop") - service.startOperationCall(operation) - } - } - } - PlasmaComponents.ToolButton { - visible: model["State"] != "Running" - iconSource: "edit-delete" - text: i18n("Delete") - width: Math.min(implicitWidth, parent.width) - anchors.horizontalCenter: parent.horizontalCenter - onClicked: delegateStack.push(confirmationComponent) - } - } - } - } - } - - Component { - id: confirmationComponent - MouseArea { - anchors.fill: parent - - //20 is just a number arbitrarly low, won't be followed - implicitWidth: (activityManager.orientation == Qt.Horizontal) ? confirmationLabel.paintedWidth : 20 - implicitHeight: (activityManager.orientation == Qt.Horizontal) ? 20 : confirmationColumn.childrenRect.height - - onClicked: delegateStack.pop() - Column { - id: confirmationColumn - anchors.fill: parent - spacing: 4 - PlasmaComponents.Label { - id: confirmationLabel - anchors { - left: parent.left - right: parent.right - } - horizontalAlignment: Text.AlignHCenter - text: i18n("Remove activity %1?", Name) - wrapMode: (activityManager.orientation == Qt.Horizontal) ? Text.NoWrap : Text.Wrap - } - - PlasmaComponents.Button { - anchors.horizontalCenter: parent.horizontalCenter - text: i18n("Remove") - onClicked: { - var activityId = model["DataEngineSource"] - var service = activitySource.serviceForSource(activityId) - var operation = service.operationDescription("remove") - operation["Id"] = activityId - service.startOperationCall(operation) - } - } - PlasmaComponents.Button { - anchors.horizontalCenter: parent.horizontalCenter - text: i18n("Cancel") - onClicked: delegateStack.pop() - } - } - } - } - - Component { - id: configurationComponent - MouseArea { - anchors.fill: parent - - //20 is just a number arbitrarly low, won't be followed - implicitWidth: (activityManager.orientation == Qt.Horizontal) ? (iconButton.x*3 + iconButton.width + theme.defaultFont.mSize.width * 12) : 20 - // set the implicit height to a meaningful value, otherwise the layouting goes a little crazy :) - implicitHeight: iconButton.y*3 - - onClicked: delegateStack.pop() - PlasmaComponents.Button { - id: iconButton - iconSource: Icon - anchors { - top: configurationLayout.top - bottom: configurationLayout.bottom - } - x: y - width: height - QPixmapItem { - anchors.centerIn: parent - width: theme.largeIconSize - height: width - smooth: true - visible: iconButton.iconSource == "" - pixmap: visible ? undefined : activityManager.pixmapForActivity(model["DataEngineSource"]) - } - onClicked: iconSource = activityManager.chooseIcon() - } - Column { - id: configurationLayout - anchors { - left: iconButton.right - verticalCenter: parent.verticalCenter - right: parent.right - leftMargin: iconButton.x - rightMargin: iconButton.x - } - spacing: 4 - PlasmaComponents.TextField { - id: activityNameField - text: Name - anchors { - left: parent.left - right: parent.right - } - } - - PlasmaComponents.Button { - anchors.horizontalCenter: parent.horizontalCenter - text: i18n("Apply") - onClicked: { - var activityId = model["DataEngineSource"] - var service = activitySource.serviceForSource(activityId) - - var operation = service.operationDescription("setName") - operation["Name"] = activityNameField.text - service.startOperationCall(operation) - - var operation = service.operationDescription("setIcon") - operation["Icon"] = iconButton.iconSource - service.startOperationCall(operation) - - delegateStack.pop() - } - anchors { - left: parent.left - right: parent.right - } - } - PlasmaComponents.Button { - anchors.horizontalCenter: parent.horizontalCenter - text: i18n("Cancel") - onClicked: delegateStack.pop() - anchors { - left: parent.left - right: parent.right - } - } - } - } - } -} diff --git a/plasma/desktop/shell/activitymanager/package/contents/ui/main.qml b/plasma/desktop/shell/activitymanager/package/contents/ui/main.qml deleted file mode 100644 index f59874c2..00000000 --- a/plasma/desktop/shell/activitymanager/package/contents/ui/main.qml +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright 2011 Marco Martin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -import QtQuick 1.1 -import org.kde.plasma.components 0.1 as PlasmaComponents -import org.kde.plasma.core 0.1 as PlasmaCore -import org.kde.qtextracomponents 0.1 - -Item { - id: main - - //this is used to perfectly align the filter field and delegates - property int cellWidth: theme.defaultFont.mSize.width * 20 - - property int minimumWidth: cellWidth + ( - activityManager.orientation == Qt.Horizontal - ? 0 - : (scrollBar.width + 4 * 2) // 4 * 2 == left and right margins - ) - property int minimumHeight: topBar.height + list.delegateHeight + (activityManager.orientation == Qt.Horizontal ? scrollBar.height : 0) + 4 - - - PlasmaCore.DataSource { - id: activitySource - engine: "org.kde.activities" - onSourceAdded: { - if (source != "Status") { - connectSource(source) - } - } - Component.onCompleted: { - connectedSources = sources.filter(function(val) { - return val != "Status"; - }) - } - } - - PlasmaComponents.ContextMenu { - id: newActivityMenu - visualParent: topBar.newActivityButton - PlasmaComponents.MenuItem { - id: templatesItem - text: i18n("Templates") - onClicked: activityTemplatesMenu.open() - } - PlasmaComponents.MenuItem { - icon: QIcon("user-desktop") - text: i18n("Empty Desktop") - onClicked: activityManager.createActivity("desktop") - } - PlasmaComponents.MenuItem { - icon: QIcon("edit-copy") - text: i18n("Clone current activity") - onClicked: activityManager.cloneCurrentActivity() - } - } - - - PlasmaComponents.ContextMenu { - id: activityTemplatesMenu - visualParent: templatesItem - } - Repeater { - parent: activityTemplatesMenu - model: activityManager.activityTypeActions - delegate: PlasmaComponents.MenuItem { - icon: QIcon(modelData.icon) - text: modelData.text - separator: modelData.separator - onClicked: { - //is a plugin? - if (modelData.pluginName) { - activityManager.createActivity(modelData.pluginName) - //is a script? - } else if (modelData.scriptFile) { - activityManager.createActivityFromScript(modelData.scriptFile, modelData.text, modelData.icon, modelData.startupApps) - //invoke ghns - } else { - activityManager.downloadActivityScripts() - } - } - Component.onCompleted: { - parent = activityTemplatesMenu - } - } - } - - - Loader { - id: topBar - property string query - property Item newActivityButton - - sourceComponent: (activityManager.orientation == Qt.Horizontal) ? horizontalTopBarComponent : verticalTopBarComponent - height: item.height + 2 - anchors { - top: parent.top - left: parent.left - right: parent.right - - topMargin: activityManager.orientation == Qt.Horizontal ? 4 : 0 - leftMargin: 4 - } - } - Component { - id: horizontalTopBarComponent - Item { - anchors { - top: parent.top - left:parent.left - right: parent.right - } - height: filterField.height - - PlasmaComponents.TextField { - id: filterField - anchors { - left: parent.left - leftMargin: 2 - } - width: list.width / Math.floor(list.width / cellWidth) - 4 - clearButtonShown: true - onTextChanged: topBar.query = text - placeholderText: i18n("Enter search term...") - Component.onCompleted: forceActiveFocus() - } - - Row { - anchors.right: parent.right - spacing: 4 - PlasmaComponents.Button { - id: newActivityButton - visible: activityManager.canAddActivities - iconSource: "list-add" - text: i18n("Create activity...") - onClicked: newActivityMenu.open() - } - PlasmaComponents.Button { - iconSource: "plasma" - visible: activityManager.canAddWidgets - text: i18n("Add widgets") - onClicked: activityManager.addWidgetsRequested() - } - PlasmaComponents.ToolButton { - iconSource: "window-close" - onClicked: activityManager.closeClicked() - } - } - Component.onCompleted: { - topBar.newActivityButton = newActivityButton - } - } - } - Component { - id: verticalTopBarComponent - Column { - spacing: 4 - anchors { - top: parent.top - left:parent.left - right: parent.right - } - - PlasmaComponents.ToolButton { - anchors.right: parent.right - iconSource: "window-close" - onClicked: activityManager.closeClicked() - } - - PlasmaComponents.TextField { - id: filterField - anchors { - left: parent.left - right: parent.right - } - clearButtonShown: true - onTextChanged: topBar.query = text - placeholderText: i18n("Enter search term...") - Component.onCompleted: forceActiveFocus() - } - - PlasmaComponents.Button { - id: newActivityButton - anchors { - left: parent.left - right: parent.right - } - iconSource: "list-add" - text: i18n("Create activity...") - onClicked: newActivityMenu.open() - } - Component.onCompleted: { - topBar.newActivityButton = newActivityButton - } - } - } - - MouseEventListener { - id: listParent - anchors { - top: topBar.bottom - left: parent.left - right: activityManager.orientation == Qt.Horizontal - ? parent.right - : (scrollBar.visible ? scrollBar.left : parent.right) - bottom: activityManager.orientation == Qt.Horizontal ? scrollBar.top : bottomBar.top - leftMargin: 4 - bottomMargin: 4 - } - onWheelMoved: { - //use this only if the wheel orientation is vertical and the list orientation is horizontal, otherwise will be the list itself managing the wheel - if (wheel.orientation == Qt.Vertical && list.orientation == ListView.Horizontal) { - var delta = wheel.delta > 0 ? 20 : -20 - list.contentX = Math.min(Math.max(0, list.contentWidth - list.width), - Math.max(0, list.contentX - delta)) - } - } - ListView { - id: list - - property int delegateWidth: (activityManager.orientation == Qt.Horizontal) ? (list.width / Math.floor(list.width / cellWidth)) : list.width - property int delegateHeight: theme.defaultFont.mSize.height * 7 - 4 - - - anchors.fill: parent - - orientation: activityManager.orientation == Qt.Horizontal ? ListView.Horizontal : ListView.vertical - snapMode: ListView.SnapToItem - model: PlasmaCore.SortFilterModel { - sourceModel: PlasmaCore.DataModel { - dataSource: activitySource - } - filterRole: "Name" - filterRegExp: ".*"+topBar.query+".*" - } - clip: activityManager.orientation == Qt.Vertical - - delegate: ActivityDelegate {} - } - } - PlasmaComponents.ScrollBar { - id: scrollBar - orientation: activityManager.orientation == Qt.Horizontal ? ListView.Horizontal : ListView.Vertical - anchors { - top: activityManager.orientation == Qt.Horizontal ? undefined : listParent.top - bottom: activityManager.orientation == Qt.Horizontal ? parent.bottom : bottomBar.top - left: activityManager.orientation == Qt.Horizontal ? parent.left : undefined - right: parent.right - } - flickableItem: list - } - - Loader { - id: bottomBar - - sourceComponent: (activityManager.orientation == Qt.Horizontal) ? undefined : verticalBottomBarComponent - height: item.height - anchors { - left: parent.left - right: parent.right - bottom: parent.bottom - leftMargin: 4 - } - } - - Component { - id: verticalBottomBarComponent - Column { - anchors { - left: parent.left - right: parent.right - bottom: parent.bottom - } - - spacing: 4 - - PlasmaComponents.Button { - anchors { - left: parent.left - right: parent.right - } - iconSource: "plasma" - visible: activityManager.canAddWidgets - text: i18n("Add widgets") - onClicked: activityManager.addWidgetsRequested() - } - } - } -} diff --git a/plasma/desktop/shell/activitymanager/package/metadata.desktop b/plasma/desktop/shell/activitymanager/package/metadata.desktop deleted file mode 100644 index 84a2428d..00000000 --- a/plasma/desktop/shell/activitymanager/package/metadata.desktop +++ /dev/null @@ -1,60 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Keywords= -Name=Activity manager for the desktop -Name[bs]=Aktivnost menadžera za desktop -Name[ca]=Gestor d'activitats per l'escriptori -Name[ca@valencia]=Gestor d'activitats per l'escriptori -Name[cs]=Správce aktivit pro pracovní plochu -Name[da]=Aktivitetshåndtering til desktoppen -Name[de]=Aktivitätenverwaltung für die Arbeitsfläche -Name[el]=Διαχειριστής δραστηριοτήτων για την επιφάνεια εργασίας -Name[en_GB]=Activity manager for the desktop -Name[es]=Gestor de actividades para el escritorio -Name[et]=Töölaua tegevuste haldur -Name[eu]=Mahaigainerako jarduera-kudeatzailea -Name[fi]=Työpöydän aktiviteettienhallinta -Name[fr]=Gestionnaire d'activités pour le bureau -Name[gl]=Xestor de actividades para dispositivos o escritorio -Name[he]=מנהל משימות עבור שולחן העבודה -Name[hu]=Aktivitáskezelő az asztalhoz -Name[ia]=Un gerente de activitate per le scriptorio -Name[kk]=Осы үстелдің белсенділік менеджері -Name[km]=កម្មវិធី​គ្រប់គ្រងសកម្មផាព​​សម្រាប់ផ្ទៃតុ -Name[ko]=데스크톱 활동 관리자 -Name[lt]=Darbastalio veiklos tvarkytuvė -Name[mr]=डेस्कटॉप करिता कार्यपध्दती व्यवस्थापक -Name[nb]=Aktivitetsbehandler for skrivebordet -Name[nds]=Aktivitetenpleger för den Schriefdisch -Name[nl]=Activiteitenbeheerder voor het bureaublad -Name[pa]=ਡੈਸਕਟਾਪ ਲਈ ਸਰਗਰਮੀ ਮੈਨੇਜਰ -Name[pl]=Zarządzanie działaniami dla pulpitu -Name[pt]=Gestor de actividades para o ecrã -Name[pt_BR]=Gerenciador de atividades para a área de trabalho -Name[ro]=Gestionar de activități pentru birou -Name[ru]=Диспетчер комнат для рабочего стола -Name[sk]=Správca aktivít pre plochu -Name[sl]=Upravljalnik dejavnosti za namizje -Name[sr]=Менаџер активности за површ -Name[sr@ijekavian]=Менаџер активности за површ -Name[sr@ijekavianlatin]=Menadžer aktivnosti za površ -Name[sr@latin]=Menadžer aktivnosti za površ -Name[sv]=Aktivitetshanterare för skrivbordet -Name[tr]=Masaüstü için etkinlik yöneticisi -Name[uk]=Керування просторами дій для стільниці -Name[vi]=Trình quản lý Hoạt động cho máy tính -Name[x-test]=xxActivity manager for the desktopxx -Name[zh_CN]=桌面的活动管理器 -Name[zh_TW]=桌面使用的活動管理員 -Type=Service - -X-KDE-ServiceTypes=Plasma/GenericPackage -X-KDE-ParentApp= -X-KDE-PluginInfo-Author=Marco Martin -X-KDE-PluginInfo-Category= -X-KDE-PluginInfo-Email=mart@kde.org -X-KDE-PluginInfo-License=GPL -X-KDE-PluginInfo-Name=org.kde.desktop.activitymanager -X-KDE-PluginInfo-Version= -X-KDE-PluginInfo-Website= -X-Plasma-MainScript=ui/main.qml diff --git a/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/contents/layout.js b/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/contents/layout.js deleted file mode 100644 index 7ffc5ba3..00000000 --- a/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/contents/layout.js +++ /dev/null @@ -1,15 +0,0 @@ -var activity = new Activity -activity.name = i18n("Photos Activity") - -var pictures = userDataPath("pictures") - -var folderview = activity.addWidget("folderview") -folderview.writeConfig("url", pictures) - -var frame = activity.addWidget("frame") -frame.writeConfig("slideshow", true) -frame.writeConfig("recursive slideshow", true) -frame.writeConfig("slideshow paths", pictures) -frame.writeConfig("slideshow time", 300) -frame.writeConfig("random", true) - diff --git a/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/metadata.desktop b/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/metadata.desktop deleted file mode 100644 index d46cd51c..00000000 --- a/plasma/desktop/shell/data/layouts/org.kde.plasma-desktop.photoActivity/metadata.desktop +++ /dev/null @@ -1,72 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Name=Photos Activity -Name[ar]=أنشطة الصور -Name[ast]=Photos Activity -Name[bs]=Aktivnost fotografija -Name[ca]=Activitat de fotos -Name[ca@valencia]=Activitat de fotos -Name[cs]=Aktivita fotografií -Name[da]=Fotoaktivitet -Name[de]=Aktivität Fotos -Name[el]=Δραστηριότητα φωτογραφιών -Name[en_GB]=Photos Activity -Name[es]=Actividad de fotos -Name[et]=Fototegevus -Name[eu]=Argazki-jarduera -Name[fi]=Valokuva-aktiviteetti -Name[fr]=Activité photos -Name[gl]=Fotografía -Name[he]=פעילות תמונות -Name[hi]=फोटो क्रियाएँ -Name[hr]=Fotografska aktivnost -Name[hu]=Fényképek aktivitás -Name[ia]=Activitate de photos -Name[is]=Ljósmyndavirkni -Name[ja]=フォトアクティビティ -Name[kk]=Фотомен айналысу -Name[km]=សកម្មភាព​រូបថត -Name[ko]=사진 활동 -Name[lt]=Nuotraukų veikla -Name[lv]=Aktivitāte 'Fotogrāfijas' -Name[mr]=फोटो कार्यपध्दती -Name[nb]=Foto-aktivitet -Name[nds]=Foto-Akschonen -Name[nl]=Activiteit met foto's -Name[pa]=ਫੋਟੋ ਸਰਗਰਮੀ -Name[pl]=Działania na zdjęciach -Name[pt]=Actividade de Fotografias -Name[pt_BR]=Atividade fotográfica -Name[ro]=Activitate fotografică -Name[ru]=Фотокомната -Name[sk]=Aktivita pre fotografie -Name[sl]=Dejavnost Fotografije -Name[sr]=Активност фотографија -Name[sr@ijekavian]=Активност фотографија -Name[sr@ijekavianlatin]=Aktivnost fotografija -Name[sr@latin]=Aktivnost fotografija -Name[sv]=Fotoaktivitet -Name[th]=ความเคลื่อนไหวของรูปภาพ -Name[tr]=Fotoğraf Etkinliği -Name[ug]=سۈرەت پائالىيىتى -Name[uk]=Простір дій фотографій -Name[wa]=Activité fotos -Name[x-test]=xxPhotos Activityxx -Name[zh_CN]=照片活动 -Name[zh_TW]=相片活動 -Icon=digikam -Type=Service -ServiceTypes=Plasma/LayoutTemplate -X-Plasma-Shell=plasma-desktop -X-Plasma-ContainmentCategories=desktop -X-Plasma-ContainmentLayout-ExecuteOnCreation=gwenview $pictures,digikam -X-Plasma-ContainmentLayout-ShowAsExisting=true -X-KDE-PluginInfo-Author=Chani Armitage -X-KDE-PluginInfo-Email=chani@kde.org -X-KDE-PluginInfo-Name=org.kde.plasma-desktop.photoActivity -X-KDE-PluginInfo-Version=1.0 -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category= -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPL -X-KDE-PluginInfo-EnabledByDefault=true diff --git a/plasma/generic/applets/CMakeLists.txt b/plasma/generic/applets/CMakeLists.txt index 784cc5f9..8b717120 100644 --- a/plasma/generic/applets/CMakeLists.txt +++ b/plasma/generic/applets/CMakeLists.txt @@ -1,4 +1,3 @@ -add_subdirectory(activitybar) add_subdirectory(icon) add_subdirectory(lock_logout) add_subdirectory(panelspacer) diff --git a/plasma/generic/applets/activitybar/CMakeLists.txt b/plasma/generic/applets/activitybar/CMakeLists.txt deleted file mode 100644 index 51a2edb0..00000000 --- a/plasma/generic/applets/activitybar/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Project Needs a name ofcourse -project(plasma-activitybar) -include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/kworkspace) - -# We add our source code here -set(activitybar_SRCS activitybar.cpp) - -# Now make sure all files get to the right place -kde4_add_plugin(plasma_applet_activitybar ${activitybar_SRCS}) -target_link_libraries(plasma_applet_activitybar - plasma ${KDE4_KDEUI_LIBS} kworkspace) - -install(TARGETS plasma_applet_activitybar - DESTINATION ${PLUGIN_INSTALL_DIR}) - -install(FILES plasma-applet-activitybar.desktop - DESTINATION ${SERVICES_INSTALL_DIR}) diff --git a/plasma/generic/applets/activitybar/Messages.sh b/plasma/generic/applets/activitybar/Messages.sh deleted file mode 100644 index 1f26347c..00000000 --- a/plasma/generic/applets/activitybar/Messages.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -$XGETTEXT *.cpp -o $podir/plasma_applet_activitybar.pot diff --git a/plasma/generic/applets/activitybar/activitybar.cpp b/plasma/generic/applets/activitybar/activitybar.cpp deleted file mode 100644 index e66bf04b..00000000 --- a/plasma/generic/applets/activitybar/activitybar.cpp +++ /dev/null @@ -1,372 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Marco Martin * - * Copyright (C) 2010 by Chani Armitage * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - -#include "activitybar.h" - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -ActivityBar::ActivityBar(QObject *parent, const QVariantList &args) - : Plasma::Applet(parent, args), - m_engine(0) -{ - resize(200, 60); - setAspectRatioMode(Plasma::IgnoreAspectRatio); - setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding)); -} - - -ActivityBar::~ActivityBar() -{ -} - -void ActivityBar::init() -{ - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(this); - m_tabBar = new Plasma::TabBar(this); - m_tabBar->nativeWidget()->setDrawBase(false); - layout->addItem(m_tabBar); - layout->setContentsMargins(0,0,0,0); - //layout->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); - - //This is an awful hack, but I need to keep the old behaviour for plasma-netbook - //while using the new activity API for plasma-desktop. - //TODO 4.6 convert netbook to the activity API so we won't need this - if (qApp->applicationName() == "plasma-desktop") { - m_engine = dataEngine("org.kde.activities"); - Plasma::DataEngine::Data data = m_engine->query("Status"); - QStringList activities = data["Running"].toStringList(); - //kDebug() << "$$$$$$$$$$$$# sources:" << activities.size(); - foreach (const QString &id, activities) { - insertActivity(id); - } - m_engine->connectAllSources(this); - connect(m_engine, SIGNAL(sourceAdded(QString)), this, SLOT(activityAdded(QString))); - connect(m_engine, SIGNAL(sourceRemoved(QString)), this, SLOT(activityRemoved(QString))); - connect(m_tabBar, SIGNAL(currentChanged(int)), this, SLOT(switchActivity(int))); - } else { - m_tabBar->nativeWidget()->installEventFilter(this); - if (containment()) { - Plasma::Corona *c = containment()->corona(); - - if (!c) { - kDebug() << "No corona, can't happen"; - setFailedToLaunch(true); - return; - } - - QList containments = c->containments(); - foreach (Plasma::Containment *cont, containments) { - if (cont->containmentType() == Plasma::Containment::PanelContainment || cont->containmentType() == Plasma::Containment::CustomPanelContainment || c->offscreenWidgets().contains(cont)) { - continue; - } - - insertContainment(cont); - - connect(cont, SIGNAL(destroyed(QObject*)), this, SLOT(containmentDestroyed(QObject*))); - connect(cont, SIGNAL(screenChanged(int,int,Plasma::Containment*)), this, SLOT(screenChanged(int,int,Plasma::Containment*))); - connect(cont, SIGNAL(contextChanged(Plasma::Context*)), this, SLOT(contextChanged(Plasma::Context*))); - } - - connect(c, SIGNAL(containmentAdded(Plasma::Containment*)), this, SLOT(containmentAdded(Plasma::Containment*))); - } - - connect(m_tabBar, SIGNAL(currentChanged(int)), this, SLOT(switchContainment(int))); - - connect(KWindowSystem::self(), SIGNAL(currentDesktopChanged(int)), this, SLOT(currentDesktopChanged(int))); - } - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -void ActivityBar::insertContainment(Plasma::Containment *cont) -{ - QList::iterator i = m_containments.begin(); - int index = 0; - int myScreen = containment()->screen(); - - for (; i != m_containments.end(); ++i) { - if (cont->id() < (*i)->id()) { - m_containments.insert(i, cont); - break; - } - ++index; - } - if (i == m_containments.end()) { - m_containments.append(cont); - } - - if (cont->activity().isNull()) { - m_tabBar->insertTab(index, cont->name()); - } else { - m_tabBar->insertTab(index, cont->activity()); - } - - QString iconName = cont->icon(); - - if (!iconName.isEmpty() && iconName != "user-desktop") { - m_tabBar->nativeWidget()->setTabIcon(index, KIcon(iconName)); - } - - if (cont->screen() != -1 && - cont->screen() == myScreen && - (cont->desktop() == -1 || cont->desktop() == KWindowSystem::currentDesktop()-1)) { - m_tabBar->setCurrentIndex(index); - } -} - -void ActivityBar::insertActivity(const QString &id) -{ - //assumption: activities are always added at the end of the list - //kDebug() << "activity" << id; - m_activities.append(id); - m_tabBar->addTab(QString()); //name will be added on dataUpdated -} - -void ActivityBar::constraintsEvent(Plasma::Constraints constraints) -{ - if (constraints & Plasma::FormFactorConstraint || - constraints & Plasma::SizeConstraint) { - if ((formFactor() == Plasma::Vertical || - size().height() > size().width()) && - m_tabBar->nativeWidget()->shape() != QTabBar::RoundedWest) { - m_tabBar->nativeWidget()->setShape(QTabBar::RoundedWest); - } else if (m_tabBar->nativeWidget()->shape() != QTabBar::RoundedNorth && - (formFactor() == Plasma::Horizontal || - size().height() <= size().width())) { - m_tabBar->nativeWidget()->setShape(QTabBar::RoundedNorth); - } else { - return; - } - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); - emit sizeHintChanged(Qt::PreferredSize); - } -} - -bool ActivityBar::eventFilter(QObject *watched, QEvent *event) -{ - //request an activate also if the user clicks on the current active tab - if (watched == m_tabBar->nativeWidget() && event->type() == QEvent::MouseButtonRelease) { - QMouseEvent *me = static_cast(event); - switchContainment(m_tabBar->nativeWidget()->tabAt(me->pos())); - } - return false; -} - -void ActivityBar::switchContainment(int newActive) -{ - Plasma::Containment *ownCont = containment(); - if (!ownCont || newActive > m_containments.count()-1 || newActive < 0) { - return; - } - Plasma::Corona *c = containment()->corona(); - if (!c) { - return; - } - - - Plasma::Containment *oldCont = c->containmentForScreen(ownCont->screen(), KWindowSystem::currentDesktop() - 1); - - if (oldCont) { - m_containments[newActive]->setScreen(oldCont->screen(), oldCont->desktop()); - } else { - m_containments[newActive]->setScreen(ownCont->screen(), ownCont->desktop()); - } -} - -void ActivityBar::switchActivity(int newActive) -{ - if (newActive >= m_activities.count() || newActive < 0) { - return; - } - Plasma::Service *service = m_engine->serviceForSource(m_activities.at(newActive)); - KConfigGroup op = service->operationDescription("setCurrent"); - Plasma::ServiceJob *job = service->startOperationCall(op); - connect(job, SIGNAL(finished(KJob*)), service, SLOT(deleteLater())); -} - -void ActivityBar::currentDesktopChanged(const int currentDesktop) -{ - Plasma::Corona *c = containment()->corona(); - if (!c) { - return; - } - - //-1 because kwindowsystem counts desktop from 1 :) - Plasma::Containment *cont = c->containmentForScreen(containment()->screen(), currentDesktop - 1); - - if (!cont) { - return; - } - - int index = m_containments.indexOf(cont); - - if (index != -1) { - m_tabBar->setCurrentIndex(index); - } -} - -void ActivityBar::containmentAdded(Plasma::Containment *cont) -{ - if (cont->containmentType() == Plasma::Containment::PanelContainment || - cont->containmentType() == Plasma::Containment::CustomPanelContainment || - m_containments.contains(cont) || (containment() && containment()->corona()->offscreenWidgets().contains(cont))) { - return; - } - - insertContainment(cont); - - connect(cont, SIGNAL(destroyed(QObject*)), this, SLOT(containmentDestroyed(QObject*))); - connect(cont, SIGNAL(screenChanged(int,int,Plasma::Containment*)), this, SLOT(screenChanged(int,int,Plasma::Containment*))); - connect(cont, SIGNAL(contextChanged(Plasma::Context*)), this, SLOT(contextChanged(Plasma::Context*))); - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -void ActivityBar::activityAdded(const QString &id) -{ - insertActivity(id); - m_engine->connectSource(id, this); - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -void ActivityBar::containmentDestroyed(QObject *obj) -{ - Plasma::Containment *destroyedContainment = static_cast(obj); - - int index = m_containments.indexOf(destroyedContainment); - if (index != -1) { - m_containments.removeAt(index); - m_tabBar->blockSignals(true); - m_tabBar->removeTab(index); - m_tabBar->blockSignals(false); - } - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -void ActivityBar::activityRemoved(const QString &id) -{ - int index = m_activities.indexOf(id); - if (index < 0) { - return; - } - - m_activities.removeAt(index); - - m_tabBar->blockSignals(true); - m_tabBar->removeTab(index); - m_tabBar->blockSignals(false); - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -void ActivityBar::screenChanged(int wasScreen, int isScreen, Plasma::Containment *cont) -{ - Q_UNUSED(wasScreen) - //Q_UNUSED(isScreen) - - int index = m_containments.indexOf(cont); - - //FIXME: how is supposed to work containment()->desktop() when the pervirtialthing is off? - if (index != -1 && - containment()->screen() == isScreen && - (cont->desktop() == -1 || cont->desktop() == KWindowSystem::currentDesktop()-1)) { - m_tabBar->setCurrentIndex(index); - } -} - -void ActivityBar::contextChanged(Plasma::Context *context) -{ - Plasma::Containment *cont = qobject_cast(sender()); - - if (!cont) { - return; - } - - int index = m_containments.indexOf(cont); - if (index != -1) { - m_tabBar->setTabText(index, context->currentActivity()); - } -} - -void ActivityBar::dataUpdated(const QString &source, const Plasma::DataEngine::Data &data) -{ - //kDebug() << "$$$$$$$$$$$$$$$$$$$" << source; - if (source == "Status") { - //special source, not used yet - return; - } - - int index = m_activities.indexOf(source); - if (data["State"].toString() == "Stopped") { - if (index >= 0) { - //take it out - m_activities.removeAt(index); - m_tabBar->blockSignals(true); - m_tabBar->removeTab(index); - m_tabBar->blockSignals(false); - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); - } - return; - } else if (index < 0) { - //add it back in - index = m_activities.size(); - insertActivity(source); - } - - //update the actual content - m_tabBar->setTabText(index, data["Name"].toString().replace('&', "&&")); - - QString iconName = data["Icon"].toString(); - if (!iconName.isEmpty() && iconName != "user-desktop") { - m_tabBar->nativeWidget()->setTabIcon(index, KIcon(iconName)); - } - - if (data["Current"].toBool()) { - m_tabBar->setCurrentIndex(index); - } - - setPreferredSize(m_tabBar->nativeWidget()->sizeHint()); - emit sizeHintChanged(Qt::PreferredSize); -} - -#include "activitybar.moc" diff --git a/plasma/generic/applets/activitybar/activitybar.h b/plasma/generic/applets/activitybar/activitybar.h deleted file mode 100644 index b95cb0c8..00000000 --- a/plasma/generic/applets/activitybar/activitybar.h +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Marco Martin * - * Copyright (C) 2010 by Chani Armitage * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - -#ifndef ACTIVITYBAR_H -#define ACTIVITYBAR_H - - -#include -#include - -namespace Plasma -{ - class TabBar; - class Containment; -} - -class ActivityBar : public Plasma::Applet -{ -Q_OBJECT -public: - ActivityBar(QObject *parent, const QVariantList &args); - ~ActivityBar(); - - void init(); - void constraintsEvent(Plasma::Constraints constraints); - //insert in m_containments, keeping it ordered by id() - void insertContainment(Plasma::Containment *cont); - void insertActivity(const QString &id); - -protected: - bool eventFilter(QObject *watched, QEvent *event); - -private Q_SLOTS: - void switchContainment(int newActive); - void containmentAdded(Plasma::Containment *containment); - void containmentDestroyed(QObject *obj); - void screenChanged(int wasScreen, int isScreen, Plasma::Containment *containment); - void contextChanged(Plasma::Context *context); - void currentDesktopChanged(const int currentDesktop); - - void switchActivity(int newActive); - void activityAdded(const QString &id); - void activityRemoved(const QString &id); - void dataUpdated(const QString &source, const Plasma::DataEngine::Data &data); - -private: - Plasma::TabBar *m_tabBar; - QList m_containments; - QStringList m_activities; - Plasma::DataEngine *m_engine; -}; - - -K_EXPORT_PLASMA_APPLET(activitybar, ActivityBar) -#endif diff --git a/plasma/generic/applets/activitybar/plasma-applet-activitybar.desktop b/plasma/generic/applets/activitybar/plasma-applet-activitybar.desktop deleted file mode 100644 index f158f7bc..00000000 --- a/plasma/generic/applets/activitybar/plasma-applet-activitybar.desktop +++ /dev/null @@ -1,160 +0,0 @@ -[Desktop Entry] -Name=Activity Bar -Name[ar]=شريط الأنشطة -Name[ast]=Barra de xera -Name[be@latin]=Panel zaniatkaŭ -Name[bg]=Лента за активност -Name[bs]=traka aktivnosti -Name[ca]=Barra d'activitat -Name[ca@valencia]=Barra d'activitat -Name[cs]=Pruh aktivit -Name[da]=Aktivitetslinje -Name[de]=Aktivitätsleiste -Name[el]=Γραμμή δραστηριότητας -Name[en_GB]=Activity Bar -Name[eo]=Aktiveca Nivelo -Name[es]=Barra de actividad -Name[et]=Tegevusriba -Name[eu]=Jarduera-barra -Name[fi]=Aktiviteettipalkki -Name[fr]=Barre d'activités -Name[fy]=Aktiviteitsbalke -Name[ga]=Barra Gníomhaíochta -Name[gl]=Barra de actividades -Name[gu]=ક્રિયા પટ્ટી -Name[he]=סרגל פעילויות -Name[hi]=कार्य पट्टी -Name[hne]=सक्रियता पट्टी -Name[hr]=Traka aktivnosti -Name[hsb]=Pas aktiwitow -Name[hu]=Aktivitásjelző -Name[ia]=Barra de activitate -Name[id]=Batang Aktivitas -Name[is]=Virknislá -Name[it]=Barra delle attività -Name[ja]=アクティビティバー -Name[kk]=Белсенділік панелі -Name[km]=របារ​សកម្មភាព -Name[kn]=ಚಟುವಟಿಕೆ ಪಟ್ಟಿ -Name[ko]=활동 표시줄 -Name[ku]=Darika Çalakiyan -Name[lt]=Veiklų juosta -Name[lv]=Aktivitāšu josla -Name[mk]=Лента за активности -Name[ml]=ആക്ടിവിറ്റി ബാര്‍ -Name[mr]=कार्यपध्दती पट्टी -Name[nb]=Aktivitetsstolpe -Name[nds]=Aktivitetenbalken -Name[nl]=Activiteitsbalk -Name[nn]=Aktivitetslinje -Name[pa]=ਸਰਗਰਮੀ ਪੱਟੀ -Name[pl]=Pasek działań -Name[pt]=Barra de Actividades -Name[pt_BR]=Barra de atividades -Name[ro]=Bară de activitate -Name[ru]=Панель комнат -Name[si]=ක්‍රියා තීරුව -Name[sk]=Panel aktivít -Name[sl]=Pas z dejavnostmi -Name[sr]=трака активности -Name[sr@ijekavian]=трака активности -Name[sr@ijekavianlatin]=traka aktivnosti -Name[sr@latin]=traka aktivnosti -Name[sv]=Aktivitetsrad -Name[ta]=Activity Bar -Name[te]=క్రియాశీలత పట్టీ -Name[tg]=Панели фаъолиятӣ -Name[th]=แถบกิจกรรม -Name[tr]=Etkinlik Çubuğu -Name[ug]=پائالىيەت بالدىقى -Name[uk]=Панель дій -Name[vi]=Thanh Hoạt động -Name[wa]=Bår d' activité -Name[x-test]=xxActivity Barxx -Name[zh_CN]=活动栏 -Name[zh_TW]=活動列 -Comment=Tab bar to switch activities -Comment[ar]=شريط ألسنة للتبديل بين الأنشطة -Comment[ast]=Barra de llingüetes pa camudar actividaes -Comment[bg]=Лента за превключване на активността -Comment[bs]=Traka jezičaka za prebacivanje aktivnosti -Comment[ca]=Barra de pestanyes per a canviar d'activitats -Comment[ca@valencia]=Barra de pestanyes per a canviar d'activitats -Comment[cs]=Lišta pro přepínání aktivit -Comment[da]=Fanebladslinje til at skifte mellem aktiviteter -Comment[de]=Leiste zum Wechseln von Aktivitäten -Comment[el]=Γραμμή καρτελών για την εναλλαγή δραστηριότητας -Comment[en_GB]=Tab bar to switch activities -Comment[eo]=Langetobreto por ŝalti aktivecojn -Comment[es]=Barra de pestañas para cambiar actividades -Comment[et]=Kaardiriba tegevuse lülitamiseks -Comment[eu]=Jardueraz aldatzeko fitxa-barra -Comment[fi]=Välilehtipalkki aktiviteettien vaihtamiseen -Comment[fr]=Barre d'onglets permettant de changer d'activité -Comment[fy]=Ljepper om tusken aktiviteiten te wikseljen -Comment[ga]=Barra na gcluaisíní chun an ghníomhaíocht a mhalartú -Comment[gl]=Barra de lapelas para trocar entre actividades -Comment[gu]=ક્રિયાઓ બદલવા માટે ટેબ પટ્ટી -Comment[he]=סרגל לשוניות למעבר בין פעילויות -Comment[hi]=क्रिया स्विच करने के लिए टैबपट्टी -Comment[hr]=Traka za mijenjanje aktivnosti -Comment[hu]=Aktivitások közötti váltásra szolgáló lapozóelem -Comment[ia]=Barra de scheda pro commutar activitates -Comment[id]=Batang tab untuk berpindah aktivitas -Comment[is]=Flipaslá til að skipta um verkefni -Comment[it]=Barra a schede per cambiare attività -Comment[ja]=アクティビティを切り替えるタブバー -Comment[kk]=Белсенділікті ауыстыру панелі -Comment[km]=របារ​ផ្ទាំង​ដើម្បី​ប្ដូរ​សកម្មភាព -Comment[kn]=ಚಟುವಟಿಕೆಗಳನ್ನು ಬದಲಾಯಿಸುವ ಟ್ಯಾಬ್ ಪಟ್ಟಿ -Comment[ko]=활동 사이를 전환할 수 있는 탭 표시줄 -Comment[lt]=Kortelių juosta veiklų keitimui -Comment[lv]=Ciļnu josla aktivitāšu pārslēgšanai -Comment[mai]=क्रियाकलाप स्विच करबाक लेल टैबपट्टी -Comment[ml]=പ്രവര്‍ത്തനങ്ങള്‍ മാറ്റാന്‍ ടാബ്-ബാര്‍ -Comment[mr]=कार्यपध्दती बदलण्याकरिता टॅब बार -Comment[nb]=Fanelinje for å bytte mellom aktiviteter -Comment[nds]=Paneelbalken, mit den sik Aktiviteten wesseln laat -Comment[nl]=Tabbalk om van activiteit te wisselen -Comment[nn]=Fanelinje for å byta mellom aktivitetar -Comment[pa]=ਐਕਟੀਵਿਟੀ ਬਦਲਣ ਲਈ ਟੈਬਬਾਰ -Comment[pl]=Pasek kart do przełączania działań -Comment[pt]=Barra de páginas para mudar de actividades -Comment[pt_BR]=Barra de abas para alternar atividades -Comment[ro]=Bară cu file pentru comutarea activităților -Comment[ru]=Переключение комнат -Comment[si]=ක්‍රියාකාරකම් මාරු කිරීමට ටැබ් තීරුවක් -Comment[sk]=Panel na prepínanie aktivít -Comment[sl]=Pas za preklapljanje med dejavnostmi -Comment[sr]=Трака језичака за пребацивање активности -Comment[sr@ijekavian]=Трака језичака за пребацивање активности -Comment[sr@ijekavianlatin]=Traka jezičaka za prebacivanje aktivnosti -Comment[sr@latin]=Traka jezičaka za prebacivanje aktivnosti -Comment[sv]=Flikrad för att byta aktiviteter -Comment[tg]=Переключиться в командную строку -Comment[th]=แถบแท็บเพื่อใช้สลับกิจกรรม -Comment[tr]=Eylemleri seçmek için sekme çubuğu -Comment[ug]=پائالىيەت ئالماشتۇرىدىغان بەتكۈچ بالداق -Comment[uk]=Панель з вкладками для перемикання дій -Comment[wa]=Båre di linwetes po candjî d' activités -Comment[x-test]=xxTab bar to switch activitiesxx -Comment[zh_CN]=切换活动的标签栏 -Comment[zh_TW]=切換活動的分頁列 -Type=Service -Icon=tab-new - -X-KDE-ServiceTypes=Plasma/Applet -X-KDE-Library=plasma_applet_activitybar -X-KDE-PluginInfo-Author=Marco Martin -X-KDE-PluginInfo-Email=notmart@gmail.com -X-KDE-PluginInfo-Name=activitybar -X-KDE-PluginInfo-Version=1.0 -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category=Windows and Tasks -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPL -X-KDE-PluginInfo-EnabledByDefault=true - -X-Plasma-Requires-FileDialog=Unused -X-Plasma-Requires-LaunchApp=Unused - diff --git a/plasma/generic/dataengines/CMakeLists.txt b/plasma/generic/dataengines/CMakeLists.txt index 1aa637f7..ab3c1454 100644 --- a/plasma/generic/dataengines/CMakeLists.txt +++ b/plasma/generic/dataengines/CMakeLists.txt @@ -1,5 +1,4 @@ add_subdirectory(applicationjobs) -add_subdirectory(activities) add_subdirectory(apps) add_subdirectory(devicenotifications) add_subdirectory(dict) diff --git a/plasma/generic/dataengines/activities/ActivityData.cpp b/plasma/generic/dataengines/activities/ActivityData.cpp deleted file mode 100644 index d98e8c1e..00000000 --- a/plasma/generic/dataengines/activities/ActivityData.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2011 Ivan Cukic - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * or (at your option) any later version, as published by the Free - * Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "ActivityData.h" - -#include -#include - -class ActivityDataStaticInit { -public: - ActivityDataStaticInit() - { - qDBusRegisterMetaType < ActivityData > (); - qDBusRegisterMetaType < QList < ActivityData > > (); - } - - static ActivityDataStaticInit _instance; - -}; - -ActivityDataStaticInit ActivityDataStaticInit::_instance; - -ActivityData::ActivityData() -{ -} - -ActivityData::ActivityData(const ActivityData & source) -{ - score = source.score; - id = source.id; -} - -ActivityData & ActivityData::operator = (const ActivityData & source) -{ - if (&source != this) { - score = source.score; - id = source.id; - } - - return *this; -} - -QDBusArgument & operator << (QDBusArgument & arg, const ActivityData r) -{ - arg.beginStructure(); - - arg << r.id; - arg << r.score; - - arg.endStructure(); - - return arg; -} - -const QDBusArgument & operator >> (const QDBusArgument & arg, ActivityData & r) -{ - arg.beginStructure(); - - arg >> r.id; - arg >> r.score; - - arg.endStructure(); - - return arg; -} - -QDebug operator << (QDebug dbg, const ActivityData & r) -{ - dbg << "ActivityData(" << r.score << r.id << ")"; - return dbg.space(); -} diff --git a/plasma/generic/dataengines/activities/ActivityData.h b/plasma/generic/dataengines/activities/ActivityData.h deleted file mode 100644 index a36e85a2..00000000 --- a/plasma/generic/dataengines/activities/ActivityData.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2011 Ivan Cukic - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * or (at your option) any later version, as published by the Free - * Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITY_DATA_H_ -#define ACTIVITY_DATA_H_ - -#include -#include -#include -#include - -class ActivityData { -public: - ActivityData(); - ActivityData(const ActivityData & source); - ActivityData & operator = (const ActivityData & source); - - double score; - QString id; - -}; - -typedef QList ActivityDataList; -Q_DECLARE_METATYPE(ActivityData) -Q_DECLARE_METATYPE(ActivityDataList) - -QDBusArgument & operator << (QDBusArgument & arg, const ActivityData); -const QDBusArgument & operator >> (const QDBusArgument & arg, ActivityData & rec); - -QDebug operator << (QDebug dbg, const ActivityData & r); - -#endif // ACTIVITY_DATA_H_ diff --git a/plasma/generic/dataengines/activities/CMakeLists.txt b/plasma/generic/dataengines/activities/CMakeLists.txt deleted file mode 100644 index 6ddd7e6b..00000000 --- a/plasma/generic/dataengines/activities/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -project(activityengine) - -include_directories( ${KACTIVITIES_INCLUDE_DIR} ) - -set(activity_engine_SRCS - ActivityData.cpp - activityengine.cpp - activityservice.cpp - activityjob.cpp) - -set_source_files_properties(org.kde.ActivityManager.ActivityRanking.xml PROPERTIES INCLUDE "ActivityData.h") -qt4_add_dbus_interface( - activity_engine_SRCS org.kde.ActivityManager.ActivityRanking.xml - ActivityRankingInterface - ) - -kde4_add_plugin(plasma_engine_activities ${activity_engine_SRCS}) -target_link_libraries(plasma_engine_activities - ${KDE4_KDECORE_LIBS} - ${KDE4_PLASMA_LIBS} - ${KACTIVITIES_LIBRARIES}) - -install(TARGETS plasma_engine_activities - DESTINATION ${PLUGIN_INSTALL_DIR}) - -install(FILES plasma-engine-activities.desktop - DESTINATION ${SERVICES_INSTALL_DIR}) - -install(FILES activities.operations - DESTINATION ${DATA_INSTALL_DIR}/plasma/services) diff --git a/plasma/generic/dataengines/activities/activities.operations b/plasma/generic/dataengines/activities/activities.operations deleted file mode 100644 index c438c506..00000000 --- a/plasma/generic/dataengines/activities/activities.operations +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plasma/generic/dataengines/activities/activityengine.cpp b/plasma/generic/dataengines/activities/activityengine.cpp deleted file mode 100644 index 2774a01c..00000000 --- a/plasma/generic/dataengines/activities/activityengine.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2010 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "activityengine.h" -#include "activityservice.h" -#include "ActivityRankingInterface.h" - -#include -#include - -#include -#include - -#define ACTIVITYMANAGER_SERVICE "org.kde.kactivitymanagerd" -#define ACTIVITYRANKING_OBJECT "/ActivityRanking" - -ActivityEngine::ActivityEngine(QObject* parent, const QVariantList& args) - : Plasma::DataEngine(parent, args) -{ - Q_UNUSED(args); -} - -void ActivityEngine::init() -{ - if (qApp->applicationName() == "plasma-netbook") { - //hack for the netbook - //FIXME can I read a setting or something instead? - } else { - m_activityController = new KActivities::Controller(this); - m_currentActivity = m_activityController->currentActivity(); - QStringList activities = m_activityController->listActivities(); - //setData("allActivities", activities); - foreach (const QString &id, activities) { - insertActivity(id); - } - - connect(m_activityController, SIGNAL(activityAdded(QString)), this, SLOT(activityAdded(QString))); - connect(m_activityController, SIGNAL(activityRemoved(QString)), this, SLOT(activityRemoved(QString))); - connect(m_activityController, SIGNAL(currentActivityChanged(QString)), this, SLOT(currentActivityChanged(QString))); - - //some convenience sources for times when checking every activity source would suck - //it starts with _ so that it can easily be filtered out of sources() - //maybe I should just make it not included in sources() instead? - m_runningActivities = m_activityController->listActivities(KActivities::Info::Running); - setData("Status", "Current", m_currentActivity); - setData("Status", "Running", m_runningActivities); - - m_watcher = new QDBusServiceWatcher( - ACTIVITYMANAGER_SERVICE, - QDBusConnection::sessionBus(), - QDBusServiceWatcher::WatchForRegistration - | QDBusServiceWatcher::WatchForUnregistration, - this); - - connect(m_watcher, SIGNAL(serviceRegistered(QString)), - this, SLOT(enableRanking())); - connect(m_watcher, SIGNAL(serviceUnregistered(QString)), - this, SLOT(disableRanking())); - - if (QDBusConnection::sessionBus().interface()->isServiceRegistered(ACTIVITYMANAGER_SERVICE)) { - enableRanking(); - } - } -} - -void ActivityEngine::insertActivity(const QString &id) -{ - //id -> name, icon, state - KActivities::Info *activity = new KActivities::Info(id, this); - m_activities[id] = activity; - setData(id, "Name", activity->name()); - setData(id, "Icon", activity->icon()); - setData(id, "Current", m_currentActivity == id); - setData(id, "Encrypted", false); - - QString state; - switch (activity->state()) { - case KActivities::Info::Running: - state = "Running"; - break; - case KActivities::Info::Starting: - state = "Starting"; - break; - case KActivities::Info::Stopping: - state = "Stopping"; - break; - case KActivities::Info::Stopped: - state = "Stopped"; - break; - case KActivities::Info::Invalid: - default: - state = "Invalid"; - } - setData(id, "State", state); - setData(id, "Score", m_activityScores.value(id)); - - connect(activity, SIGNAL(infoChanged()), this, SLOT(activityDataChanged())); - connect(activity, SIGNAL(stateChanged(KActivities::Info::State)), this, SLOT(activityStateChanged())); - - m_runningActivities << id; -} - -void ActivityEngine::disableRanking() -{ - delete m_activityRankingClient; -} - -void ActivityEngine::enableRanking() -{ - m_activityRankingClient = new org::kde::ActivityManager::ActivityRanking( - ACTIVITYMANAGER_SERVICE, - ACTIVITYRANKING_OBJECT, - QDBusConnection::sessionBus() - ); - connect(m_activityRankingClient, SIGNAL(rankingChanged(QStringList,ActivityDataList)), - this, SLOT(rankingChanged(QStringList,ActivityDataList))); - - QDBusMessage msg = QDBusMessage::createMethodCall(ACTIVITYMANAGER_SERVICE, - ACTIVITYRANKING_OBJECT, - "org.kde.ActivityManager.ActivityRanking", - "activities"); - QDBusPendingReply reply = QDBusConnection::sessionBus().asyncCall(msg); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); - QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), - this, SLOT(activityScoresReply(QDBusPendingCallWatcher*))); -} - -void ActivityEngine::activityScoresReply(QDBusPendingCallWatcher *watcher) -{ - QDBusPendingReply reply = *watcher; - if (reply.isError()) { - kDebug() << "Error getting activity scores: " << reply.error().message(); - } else { - setActivityScores(reply.value()); - } - - watcher->deleteLater(); -} - -void ActivityEngine::rankingChanged(const QStringList &topActivities, const ActivityDataList &activities) -{ - Q_UNUSED(topActivities) - - setActivityScores(activities); -} - -void ActivityEngine::setActivityScores(const ActivityDataList &activities) -{ - QSet presentActivities; - m_activityScores.clear(); - - foreach (const ActivityData &activity, activities) { - if (m_activities.contains(activity.id)) { - setData(activity.id, "Score", activity.score); - } - presentActivities.insert(activity.id); - m_activityScores[activity.id] = activity.score; - } - - foreach (const QString &activityId, m_activityController->listActivities()) { - if (!presentActivities.contains(activityId) && m_activities.contains(activityId)) { - setData(activityId, "Score", 0); - } - } -} - -void ActivityEngine::activityAdded(const QString &id) -{ - insertActivity(id); - setData("Status", "Running", m_runningActivities); -} - -void ActivityEngine::activityRemoved(const QString &id) -{ - removeSource(id); - KActivities::Info *activity = m_activities.take(id); - if (activity) { - delete activity; - } - m_runningActivities.removeAll(id); - setData("Status", "Running", m_runningActivities); -} - -void ActivityEngine::currentActivityChanged(const QString &id) -{ - setData(m_currentActivity, "Current", false); - m_currentActivity = id; - setData(id, "Current", true); - setData("Status", "Current", id); -} - -void ActivityEngine::activityDataChanged() -{ - KActivities::Info *activity = qobject_cast(sender()); - if (!activity) { - return; - } - setData(activity->id(), "Name", activity->name()); - setData(activity->id(), "Icon", activity->icon()); - setData(activity->id(), "Encrypted", false); - setData(activity->id(), "Current", m_currentActivity == activity->id()); - setData(activity->id(), "Score", m_activityScores.value(activity->id())); -} - -void ActivityEngine::activityStateChanged() -{ - KActivities::Info *activity = qobject_cast(sender()); - const QString id = activity->id(); - if (!activity) { - return; - } - QString state; - switch (activity->state()) { - case KActivities::Info::Running: - state = "Running"; - break; - case KActivities::Info::Starting: - state = "Starting"; - break; - case KActivities::Info::Stopping: - state = "Stopping"; - break; - case KActivities::Info::Stopped: - state = "Stopped"; - break; - case KActivities::Info::Invalid: - default: - state = "Invalid"; - } - setData(id, "State", state); - - if (activity->state() == KActivities::Info::Running) { - if (!m_runningActivities.contains(id)) { - m_runningActivities << id; - } - } else { - m_runningActivities.removeAll(id); - } - - setData("Status", "Running", m_runningActivities); -} - - -Plasma::Service *ActivityEngine::serviceForSource(const QString &source) -{ - //FIXME validate the name - ActivityService *service = new ActivityService(m_activityController, source); - service->setParent(this); - return service; -} - -K_EXPORT_PLASMA_DATAENGINE(activities, ActivityEngine) - -#include "activityengine.moc" diff --git a/plasma/generic/dataengines/activities/activityengine.h b/plasma/generic/dataengines/activities/activityengine.h deleted file mode 100644 index d6824a06..00000000 --- a/plasma/generic/dataengines/activities/activityengine.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2010 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITY_ENGINE_H -#define ACTIVITY_ENGINE_H - -#include - -#include -#include - -#include "ActivityData.h" -#include "ActivityRankingInterface.h" - - -class QDBusServiceWatcher; - -class ActivityService; - -namespace KActivities -{ - class Controller; - class Info; -} - - -class ActivityEngine : public Plasma::DataEngine -{ - Q_OBJECT - -public: - ActivityEngine(QObject* parent, const QVariantList& args); - Plasma::Service *serviceForSource(const QString &source); - void init(); - -public slots: - void activityAdded(const QString &id); - void activityRemoved(const QString &id); - void currentActivityChanged(const QString &id); - - void activityDataChanged(); - void activityStateChanged(); - - void disableRanking(); - void enableRanking(); - void rankingChanged(const QStringList &topActivities, const ActivityDataList &activities); - void activityScoresReply(QDBusPendingCallWatcher *watcher); - -private: - void insertActivity(const QString &id); - void setActivityScores(const ActivityDataList &activities); - - KActivities::Controller *m_activityController; - QHash m_activities; - QStringList m_runningActivities; - QString m_currentActivity; - - org::kde::ActivityManager::ActivityRanking *m_activityRankingClient; - QDBusServiceWatcher *m_watcher; - QHash m_activityScores; - - friend class ActivityService; -}; - -#endif // SEARCHLAUNCH_ENGINE_H diff --git a/plasma/generic/dataengines/activities/activityjob.cpp b/plasma/generic/dataengines/activities/activityjob.cpp deleted file mode 100644 index 77ce52ad..00000000 --- a/plasma/generic/dataengines/activities/activityjob.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2009 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "activityjob.h" - -#include -#include - -#include -#include - -ActivityJob::ActivityJob(KActivities::Controller *controller, const QString &id, const QString &operation, QMap ¶meters, QObject *parent) : - ServiceJob(parent->objectName(), operation, parameters, parent), - m_activityController(controller), - m_id(id) -{ -} - -ActivityJob::~ActivityJob() -{ -} - -void ActivityJob::start() -{ - const QString operation = operationName(); - if (operation == "add") { - //I wonder how well plasma will handle this... - QString name = parameters()["Name"].toString(); - if (name.isEmpty()) { - name = i18n("unnamed"); - } - const QString activityId = m_activityController->addActivity(name); - setResult(activityId); - return; - } - if (operation == "remove") { - QString id = parameters()["Id"].toString(); - m_activityController->removeActivity(id); - setResult(true); - return; - } - - //m_id is needed for the rest - if (m_id.isEmpty()) { - setResult(false); - return; - } - if (operation == "setCurrent") { - m_activityController->setCurrentActivity(m_id); - setResult(true); - return; - } - if (operation == "stop") { - m_activityController->stopActivity(m_id); - setResult(true); - return; - } - if (operation == "start") { - m_activityController->startActivity(m_id); - setResult(true); - return; - } - if (operation == "setName") { - m_activityController->setActivityName(m_id, parameters()["Name"].toString()); - setResult(true); - return; - } - if (operation == "setIcon") { - m_activityController->setActivityIcon(m_id, parameters()["Icon"].toString()); - setResult(true); - return; - } - if (operation == "setEncrypted") { - m_activityController->setActivityEncrypted(m_id, parameters()["Encrypted"].toBool()); - setResult(true); - return; - } - if (operation == "toggleActivityManager") { - QDBusMessage message = QDBusMessage::createMethodCall("org.kde.plasma-desktop", - "/App", - QString(), - "toggleActivityManager"); - QDBusConnection::sessionBus().call(message, QDBus::NoBlock); - setResult(true); - return; - } - setResult(false); -} - -#include "activityjob.moc" diff --git a/plasma/generic/dataengines/activities/activityjob.h b/plasma/generic/dataengines/activities/activityjob.h deleted file mode 100644 index a8d59d39..00000000 --- a/plasma/generic/dataengines/activities/activityjob.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2009 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITYJOB_H -#define ACTIVITYJOB_H - -// plasma -#include - -namespace KActivities -{ - class Controller; -} // namespace KActivities - -class ActivityJob : public Plasma::ServiceJob -{ - - Q_OBJECT - - public: - ActivityJob(KActivities::Controller *controller, const QString &id, const QString &operation, QMap ¶meters, QObject *parent = 0); - ~ActivityJob(); - - protected: - void start(); - - private: - KActivities::Controller *m_activityController; - QString m_id; - -}; - -#endif // TASKJOB_H diff --git a/plasma/generic/dataengines/activities/activityservice.cpp b/plasma/generic/dataengines/activities/activityservice.cpp deleted file mode 100644 index 4760d108..00000000 --- a/plasma/generic/dataengines/activities/activityservice.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "activityservice.h" -#include "activityjob.h" - -ActivityService::ActivityService(KActivities::Controller *controller, const QString &source) - : m_activityController(controller), - m_id(source) -{ - setName("activities"); -} - -ServiceJob *ActivityService::createJob(const QString &operation, QMap ¶meters) -{ - return new ActivityJob(m_activityController, m_id, operation, parameters, this); -} - -#include "activityservice.moc" diff --git a/plasma/generic/dataengines/activities/activityservice.h b/plasma/generic/dataengines/activities/activityservice.h deleted file mode 100644 index e964a81d..00000000 --- a/plasma/generic/dataengines/activities/activityservice.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2010 Chani Armitage - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2 or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITY_SERVICE_H -#define ACTIVITY_SERVICE_H - -#include "activityengine.h" - -#include -#include - -using namespace Plasma; - -namespace KActivities -{ - class Controller; -} // namespace KActivities - - -class ActivityService : public Plasma::Service -{ - Q_OBJECT - -public: - ActivityService(KActivities::Controller *controller, const QString &source); - ServiceJob *createJob(const QString &operation, - QMap ¶meters); - -private: - KActivities::Controller *m_activityController; - QString m_id; -}; - -#endif // SEARCHLAUNCH_SERVICE_H diff --git a/plasma/generic/dataengines/activities/org.kde.ActivityManager.ActivityRanking.xml b/plasma/generic/dataengines/activities/org.kde.ActivityManager.ActivityRanking.xml deleted file mode 100644 index 7eacc8be..00000000 --- a/plasma/generic/dataengines/activities/org.kde.ActivityManager.ActivityRanking.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plasma/generic/dataengines/activities/plasma-engine-activities.desktop b/plasma/generic/dataengines/activities/plasma-engine-activities.desktop deleted file mode 100644 index 1409da77..00000000 --- a/plasma/generic/dataengines/activities/plasma-engine-activities.desktop +++ /dev/null @@ -1,130 +0,0 @@ -[Desktop Entry] -Name=Activities Engine -Name[ar]=محرك الأنشطة -Name[bg]=Ядро за дейности -Name[bs]=motor aktivnosti -Name[ca]=Motor d'activitats -Name[ca@valencia]=Motor d'activitats -Name[cs]=Stroj aktivit -Name[da]=Aktivitetsmotor -Name[de]=Aktivitätenverwaltung -Name[el]=Μηχανή δραστηριοτήτων -Name[en_GB]=Activities Engine -Name[es]=Motor de actividades -Name[et]=Tegevuste mootor -Name[eu]=Jarduera-motorra -Name[fi]=Aktiviteettimoottori -Name[fr]=Moteur d'activités -Name[ga]=Inneall Gníomhaíochta -Name[gl]=Motor de actividades -Name[he]=מנוע הפעילויות -Name[hr]=Mehanizam aktivnosti -Name[hu]=Aktivitások modul -Name[ia]=Motor de activitate -Name[is]=Virknivél -Name[it]=Motore delle attività -Name[ja]=アクティビティエンジン -Name[kk]=Белсенділік тетігі -Name[km]=ម៉ាស៊ីន​សកម្មភាព -Name[kn]=ಚಟುವಟಿಕೆ ಎಂಜಿನ್ -Name[ko]=활동 엔진 -Name[lt]=Veiklų modulis -Name[lv]=Aktivitāšu dzinējs -Name[mr]=कार्यपध्दती इंजिन -Name[nb]=Aktivitetsmotor -Name[nds]=Aktivitetenpleger -Name[nl]=Activiteiten-engine -Name[pa]=ਸਰਗਰਮੀ ਇੰਜਣ -Name[pl]=Silnik działań -Name[pt]=Motor de Actividades -Name[pt_BR]=Mecanismo de atividades -Name[ro]=Motor de activități -Name[ru]=Источник данных для комнат -Name[sk]=Nástroj aktivít -Name[sl]=Pogon za dejavnosti -Name[sr]=мотор активности -Name[sr@ijekavian]=мотор активности -Name[sr@ijekavianlatin]=motor aktivnosti -Name[sr@latin]=motor aktivnosti -Name[sv]=Aktivitetsgränssnitt -Name[th]=กลไกจัดการกิจกรรม -Name[tr]=Etkinlik Motoru -Name[ug]=پائالىيەت ماتورى -Name[uk]=Рушій просторів дій -Name[vi]=Cơ chế cho Hoạt động -Name[wa]=Moteur d' activités -Name[x-test]=xxActivities Enginexx -Name[zh_CN]=活动引擎 -Name[zh_TW]=活動引擎 -Comment=Information on Plasma Activities -Comment[ar]=معلومات عن أنشطة بلازما -Comment[bg]=Данни за дейности в Plasma -Comment[bs]=Podaci o plazma aktivnostima -Comment[ca]=Informació quant a activitats del Plasma -Comment[ca@valencia]=Informació quant a activitats del Plasma -Comment[cs]=Informace o Plasma aktivitách. -Comment[da]=Information om Plasma-aktiviteter -Comment[de]=Informationen über Plasma-Aktivitäten -Comment[el]=Πληροφορίες για τις δραστηριότητες Plasma -Comment[en_GB]=Information on Plasma Activities -Comment[es]=Información sobre las actividades de Plasma -Comment[et]=Teave Plasma tegevuste kohta. -Comment[eu]=Plasmaren jarduerei buruzko informazioa -Comment[fi]=Tietoja Plasma-aktiviteeteista -Comment[fr]=Informations sur les activités de Plasma -Comment[gl]=Información acerca das actividades de Plasma -Comment[he]=מידע אודות הפעילויות של Plasma -Comment[hr]=Informacije o Plasminim aktivnostima -Comment[hu]=Információk a Plasma aktivitásokról -Comment[ia]=Information re activitates de Plasma -Comment[is]=Upplýsingar um Plasma virkni -Comment[it]=Informazioni sulle attività di Plasma -Comment[ja]=Plasma アクティビティの情報 -Comment[kk]=Plasma белсенділігі туралы мәлімет -Comment[km]=ព័ត៌មាន​អំពី​សកម្មភាព​ប្លាស្មា -Comment[kn]=ಪ್ಲಾಸ್ಮಾ ಚಟುವಟಿಕೆಗಳ ಬಗೆಗೆ ಮಾಹಿತಿ. -Comment[ko]=Plasma 활동 정보 -Comment[lt]=Informacija apie Plasma veiklas -Comment[lv]=Informācija par Plasma aktivitātēm -Comment[mr]=प्लाज्मा कार्यपध्दती बद्दल माहिती -Comment[nb]=Informasjon om Plasma-aktiviteter -Comment[nds]=Informatschonen över Plasma-Aktiviteten -Comment[nl]=Informatie over Plasma activiteiten -Comment[nn]=Informasjon om Plasma-aktivitetar -Comment[pa]=ਪਲਾਜ਼ਮਾ ਸਰਗਰਮੀਆਂ ਲਈ ਜਾਣਕਾਰੀ -Comment[pl]=Informacje o działaniach Plazmy -Comment[pt]=Informação sobre as Actividades do Plasma -Comment[pt_BR]=Informações sobre as atividades do Plasma -Comment[ro]=Informații despre activitățile Plasma -Comment[ru]=Сведения о комнатах Plasma -Comment[sk]=Informácie o Plasma aktivitách -Comment[sl]=Podatki o dejavnostih za Plasmo -Comment[sr]=Подаци о плазма активностима -Comment[sr@ijekavian]=Подаци о плазма активностима -Comment[sr@ijekavianlatin]=Podaci o plasma aktivnostima -Comment[sr@latin]=Podaci o plasma aktivnostima -Comment[sv]=Information om aktiviteter i Plasma -Comment[th]=ข้อมูลเกี่ยวกับกิจกรรมต่างๆ ของพลาสมา -Comment[tr]=Plasma Etkinliklerindeki Bilgiler -Comment[ug]=پلازما پائالىيىتىدىكى ئۇچۇر -Comment[uk]=Інформація про простори дій Плазми -Comment[vi]=Thông tin về các Hoạt động Plasma -Comment[wa]=Pondants et djondants so les activités di Plasma -Comment[x-test]=xxInformation on Plasma Activitiesxx -Comment[zh_CN]=关于 Plasma 活动的信息 -Comment[zh_TW]=Plasma 活動的資訊 -Type=Service -Icon=preferences-activities - -X-KDE-ServiceTypes=Plasma/DataEngine -X-KDE-Library=plasma_engine_activities -X-Plasma-EngineName=activities -X-KDE-PluginInfo-Author=Chani Armitage -X-KDE-PluginInfo-Email=chani@kde.org -X-KDE-PluginInfo-Name=org.kde.activities -X-KDE-PluginInfo-Version=0.1 -X-KDE-PluginInfo-Website=http://plasma.kde.org/ -X-KDE-PluginInfo-Category= -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=LGPL -X-KDE-PluginInfo-EnabledByDefault=true diff --git a/plasma/generic/declarativeimports/plasmaextracomponents/CMakeLists.txt b/plasma/generic/declarativeimports/plasmaextracomponents/CMakeLists.txt index f1d288b5..b9d471c8 100644 --- a/plasma/generic/declarativeimports/plasmaextracomponents/CMakeLists.txt +++ b/plasma/generic/declarativeimports/plasmaextracomponents/CMakeLists.txt @@ -7,14 +7,12 @@ set(plasmaextracomponents_SRCS fallbackcomponent.cpp ) -include_directories( ${KACTIVITIES_INCLUDE_DIR} ) - qt4_automoc(${plasmaextracomponents_SRCS}) add_library(plasmaextracomponentsplugin SHARED ${plasmaextracomponents_SRCS}) target_link_libraries(plasmaextracomponentsplugin ${QT_QTCORE_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} - ${QT_QTGUI_LIBRARY} ${KDE4_PLASMA_LIBS} ${KACTIVITIES_LIBRARIES} ) + ${QT_QTGUI_LIBRARY} ${KDE4_PLASMA_LIBS} ) install(TARGETS plasmaextracomponentsplugin DESTINATION ${IMPORTS_INSTALL_DIR}/org/kde/plasma/extras) diff --git a/plasma/generic/runners/CMakeLists.txt b/plasma/generic/runners/CMakeLists.txt index 573b5087..37e7a819 100644 --- a/plasma/generic/runners/CMakeLists.txt +++ b/plasma/generic/runners/CMakeLists.txt @@ -1,4 +1,3 @@ -add_subdirectory(activities) add_subdirectory(bookmarks) add_subdirectory(calculator) add_subdirectory(locations) diff --git a/plasma/generic/runners/activities/CMakeLists.txt b/plasma/generic/runners/activities/CMakeLists.txt deleted file mode 100644 index c5e2337f..00000000 --- a/plasma/generic/runners/activities/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs ${KACTIVITIES_INCLUDE_DIR}) - -set(krunner_activities_SRCS - activityrunner.cpp -) - -kde4_add_plugin(krunner_activities ${krunner_activities_SRCS}) -target_link_libraries(krunner_activities ${KDE4_PLASMA_LIBS} ${KACTIVITIES_LIBRARIES}) - -install(TARGETS krunner_activities DESTINATION ${PLUGIN_INSTALL_DIR}) -install(FILES plasma-runner-activityrunner.desktop DESTINATION ${SERVICES_INSTALL_DIR}) - diff --git a/plasma/generic/runners/activities/Messages.sh b/plasma/generic/runners/activities/Messages.sh deleted file mode 100755 index b0d1be69..00000000 --- a/plasma/generic/runners/activities/Messages.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -$EXTRACTRC *.ui >> rc.cpp -$XGETTEXT *.cpp -o $podir/plasma_runner_activities.pot -rm -f rc.cpp diff --git a/plasma/generic/runners/activities/activityrunner.cpp b/plasma/generic/runners/activities/activityrunner.cpp deleted file mode 100644 index 728e155a..00000000 --- a/plasma/generic/runners/activities/activityrunner.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2011 Aaron Seigo - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "activityrunner.h" - -#include -#include -#include - -ActivityRunner::ActivityRunner(QObject *parent, const QVariantList &args) - : Plasma::AbstractRunner(parent, args), - m_activities(0), - m_keywordi18n(i18nc("KRunner keyword", "activity")), - m_keyword("activity"), - m_enabled(false) -{ - setObjectName(QLatin1String("Activities")); - setIgnoredTypes(Plasma::RunnerContext::Directory | Plasma::RunnerContext::File | - Plasma::RunnerContext::NetworkLocation | Plasma::RunnerContext::Help); - - connect(this, SIGNAL(prepare()), this, SLOT(prep())); - connect(this, SIGNAL(teardown()), this, SLOT(down())); - - serviceStatusChanged(KActivities::Consumer::FullFunctionality); -} - -void ActivityRunner::prep() -{ - if (!m_activities) { - m_activities = new KActivities::Controller(this); - connect(m_activities, SIGNAL(serviceStatusChanged(KActivities::Consumer::ServiceStatus)), - this, SLOT(serviceStatusChanged(KActivities::Consumer::ServiceStatus))); - serviceStatusChanged(m_activities->serviceStatus()); - } -} - -void ActivityRunner::down() -{ - delete m_activities; - m_activities = 0; -} - -void ActivityRunner::serviceStatusChanged(KActivities::Consumer::ServiceStatus status) -{ - const bool active = status != KActivities::Consumer::NotRunning; - if (m_enabled == active) { - return; - } - - m_enabled = active; - QList syntaxes; - if (m_enabled) { - setDefaultSyntax(Plasma::RunnerSyntax(m_keywordi18n, i18n("Lists all activities currently available to be run."))); - addSyntax(Plasma::RunnerSyntax(i18nc("KRunner keyword", "activity :q:"), i18n("Switches to activity :q:."))); - } -} - -ActivityRunner::~ActivityRunner() -{ -} - -void ActivityRunner::match(Plasma::RunnerContext &context) -{ - if (!m_enabled) { - return; - } - - const QString term = context.query().trimmed(); - bool list = false; - QString name; - - if (term.startsWith(m_keywordi18n, Qt::CaseInsensitive)) { - if (term.size() == m_keywordi18n.size()) { - list = true; - } else { - name = term.right(term.size() - m_keywordi18n.size()).trimmed(); - list = name.isEmpty(); - } - } else if (term.startsWith(m_keyword, Qt::CaseInsensitive)) { - if (term.size() == m_keyword.size()) { - list = true; - } else { - name = term.right(term.size() - m_keyword.size()).trimmed(); - list = name.isEmpty(); - } - } else if (context.singleRunnerQueryMode()) { - name = term; - } else { - return; - } - - QList matches; - QStringList activities = m_activities->listActivities(); - qSort(activities); - - const QString current = m_activities->currentActivity(); - - if (!context.isValid()) { - return; - } - - if (list) { - foreach (const QString &activity, activities) { - if (current == activity) { - continue; - } - - KActivities::Info info(activity); - addMatch(info, matches); - - if (!context.isValid()) { - return; - } - } - } else { - foreach (const QString &activity, activities) { - if (current == activity) { - continue; - } - - KActivities::Info info(activity); - if (info.name().startsWith(name, Qt::CaseInsensitive)) { - addMatch(info, matches); - } - - if (!context.isValid()) { - return; - } - } - } - - context.addMatches(context.query(), matches); -} - -void ActivityRunner::addMatch(const KActivities::Info &activity, QList &matches) -{ - Plasma::QueryMatch match(this); - match.setData(activity.id()); - match.setType(Plasma::QueryMatch::ExactMatch); - match.setIcon(activity.icon().isEmpty() ? KIcon("preferences-activities") : KIcon(activity.icon())); - match.setText(i18n("Switch to \"%1\"", activity.name())); - match.setRelevance(0.7 + ((activity.state() == KActivities::Info::Running || - activity.state() == KActivities::Info::Starting) ? 0.1 : 0)); - matches << match; -} - -void ActivityRunner::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match) -{ - Q_UNUSED(context) - - if (!m_enabled || !m_activities) { - return; - } - - m_activities->setCurrentActivity(match.data().toString()); -} - -#include "activityrunner.moc" diff --git a/plasma/generic/runners/activities/activityrunner.h b/plasma/generic/runners/activities/activityrunner.h deleted file mode 100644 index 7fef7492..00000000 --- a/plasma/generic/runners/activities/activityrunner.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2011 Aaron Seigo - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Library General Public License version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef ACTIVITYRUNNER_H -#define ACTIVITYRUNNER_H - -#include - -#include - -class ActivityRunner : public Plasma::AbstractRunner -{ - Q_OBJECT - - public: - ActivityRunner(QObject *parent, const QVariantList &args); - ~ActivityRunner(); - - void match(Plasma::RunnerContext &context); - void run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &action); - - private Q_SLOTS: - void prep(); - void down(); - void serviceStatusChanged(KActivities::Consumer::ServiceStatus status); - - private: - void addMatch(const KActivities::Info &activity, QList &matches); - - KActivities::Controller *m_activities; - const QString m_keywordi18n; - const QString m_keyword; - bool m_enabled; -}; - -K_EXPORT_PLASMA_RUNNER(activities, ActivityRunner) - -#endif diff --git a/plasma/generic/runners/activities/plasma-runner-activityrunner.desktop b/plasma/generic/runners/activities/plasma-runner-activityrunner.desktop deleted file mode 100644 index f1ecde23..00000000 --- a/plasma/generic/runners/activities/plasma-runner-activityrunner.desktop +++ /dev/null @@ -1,121 +0,0 @@ -[Desktop Entry] -Name=Activities -Name[ar]=الأنشطة -Name[bg]=Дейности -Name[bs]=motor aktivnosti -Name[ca]=Activitats -Name[ca@valencia]=Activitats -Name[cs]=Aktivity -Name[da]=Aktiviteter -Name[de]=Aktivitäten -Name[el]=Δραστηριότητες -Name[en_GB]=Activities -Name[es]=Actividades -Name[et]=Tegevused -Name[eu]=Jarduerak -Name[fa]=فعالیتها -Name[fi]=Aktiviteetit -Name[fr]=Activités -Name[ga]=Gníomhaíochtaí -Name[gl]=Actividades -Name[he]=עילויות -Name[hr]=Aktivnosti -Name[hu]=Aktivitások -Name[ia]=Activitates -Name[is]=Virknistjóri -Name[it]=Attività -Name[ja]=アクティビティ -Name[kk]=Белсенділіктер -Name[km]=សកម្មភាព -Name[ko]=활동 -Name[lt]=Veiklos -Name[lv]=Aktivitātes -Name[mr]=कार्यपध्दती -Name[nb]=Aktiviteter -Name[nds]=Aktiviteten -Name[nl]=Activiteiten -Name[pa]=ਸਰਗਰਮੀਆਂ -Name[pl]=Działania -Name[pt]=Actividades -Name[pt_BR]=Atividades -Name[ro]=Activități -Name[ru]=Комнаты -Name[sk]=Aktivity -Name[sl]=Dejavnosti -Name[sr]=активности -Name[sr@ijekavian]=активности -Name[sr@ijekavianlatin]=aktivnosti -Name[sr@latin]=aktivnosti -Name[sv]=Aktiviteter -Name[tr]=Etkinlikler -Name[ug]=پائالىيەتلەر -Name[uk]=Простори дій -Name[vi]=Hoạt động -Name[wa]=Activités -Name[x-test]=xxActivitiesxx -Name[zh_CN]=活动 -Name[zh_TW]=活動 -Comment=List and switch between desktop activities -Comment[bg]=Списък и превключване между дейностите -Comment[bs]=Prikaz i prebacivanje između aktivnosti radne površine -Comment[ca]=Llista i commuta entre activitats d'escriptori -Comment[ca@valencia]=Llista i commuta entre activitats d'escriptori -Comment[cs]=Zobrazení a přepínač aktivit pracovní plochy -Comment[da]=Vis og skift mellem skrivebordsaktiviteter -Comment[de]=Aktivitäten anzeigen und zwischen ihnen umschalten -Comment[el]=Εμφάνιση και εναλλαγή μεταξύ των δραστηριοτήτων της επιφάνειας εργασίας -Comment[en_GB]=List and switch between desktop activities -Comment[es]=Ver y cambiar entre las actividades de escritorio -Comment[et]=Töölauategevuste näitamine ja nende vahel lülitamine -Comment[eu]=Zerrendatu mahaigaineko jarduerak eta batetik bestera aldatu -Comment[fi]=Luettele aktiviteetit ja vaihda niiden välillä -Comment[fr]=Affiche les activités du bureau et permet d'en changer -Comment[gl]=Lista e troca entre actividades o escritorio -Comment[he]=הצגה והחלפה בין פעילויות שולחן עבודה -Comment[hr]=Izlistaj i prebacuj između aktivnosti radne površine -Comment[hu]=Asztali aktivitások listázása és váltás közöttük -Comment[ia]=Lista e commuta inter activitates de scriptorio -Comment[is]=Telur upp og skiptir milli skjáborðsvirkni -Comment[it]=Visualizza e cambia le attività del desktop -Comment[ja]=デスクトップアクティビティを一覧表示して切り替える -Comment[kk]=Белсенділіктерді тізімдеу және ауыстыру -Comment[km]=មើល ហើយ​ប្ដូរ​ប្លង់​ផ្ទៃតុ​សកម្ម​ -Comment[ko]=데스크톱 활동을 보거나 바꾸기 -Comment[lt]=Peržiūrėti ir persijungti tarp darbastalio veiklų -Comment[lv]=Parādīt un pārslēgties starp virtuālajām darbvirsmām -Comment[mr]=वेगळ्या डेस्कटॉप कार्यपध्दतीवर जाण्यासाठी यादी दर्शवा व बदला -Comment[nb]=Vis og bytt mellom skrivebordsaktiviteter -Comment[nds]=Aktiv Schriefdischakschonen ankieken un wesseln -Comment[nl]=Bureaubladactiviteiten laten zien en er tussen schakelen -Comment[pa]=ਡੈਸਕਟਾਪ ਸਰਗਰਮੀਆਂ ਵੇਖੋ ਅਤੇ ਉਹਨਾਂ ਵਿੱਚ ਜਾਉ -Comment[pl]=Tworzenie listy i przełączanie się pomiędzy działaniami pulpitu -Comment[pt]=Ver e mudar de actividades no ambiente de trabalho -Comment[pt_BR]=Lista e alterna entre as atividades da área de trabalho -Comment[ro]=Vizualizează și schimbă între activitățile biroului -Comment[ru]=Просмотр и переключение между комнатами -Comment[sk]=Vypísať a prepínať medzi aktivitami pracovnej plochy -Comment[sl]=Oglejte si namizne dejavnosti in preklopite med njimi -Comment[sr]=Приказ и пребацивање између активности површи -Comment[sr@ijekavian]=Приказ и пребацивање између активности површи -Comment[sr@ijekavianlatin]=Prikaz i prebacivanje između aktivnosti površi -Comment[sr@latin]=Prikaz i prebacivanje između aktivnosti površi -Comment[sv]=Visa och byt mellan skrivbordsaktiviteter -Comment[tr]=Listele ve masaüstü eylemleri arasında değiştir -Comment[ug]=ئۈستەلئۈستى پائالىيەتلىرى ئارىسىدىكى تىزىم ۋە ئالماشتۇرۇش -Comment[uk]=Перегляд і перемикання між просторами дій стільниці -Comment[vi]=Liệt kê và chuyển đổi giữa các Hoạt động màn hình làm việc -Comment[wa]=Fé l' djivêye eyet passer d' ene activité do scribanne a ene ôte -Comment[x-test]=xxList and switch between desktop activitiesxx -Comment[zh_CN]=显示和切换桌面活动 -Comment[zh_TW]=列出並在桌面活動間切換 -X-KDE-ServiceTypes=Plasma/Runner -Type=Service -Icon=preferences-activities -X-KDE-Library=krunner_activities -X-KDE-PluginInfo-Author=Plasma Team -X-KDE-PluginInfo-Email=plasma-devel@kde.org -X-KDE-PluginInfo-Name=org.kde.activities -X-KDE-PluginInfo-Version=1.0 -X-KDE-PluginInfo-License=LGPL -X-KDE-PluginInfo-EnabledByDefault=true -X-Plasma-AdvertiseSingleRunnerQueryMode=true diff --git a/powerdevil/daemon/CMakeLists.txt b/powerdevil/daemon/CMakeLists.txt index e7f1b3ef..713a07e0 100644 --- a/powerdevil/daemon/CMakeLists.txt +++ b/powerdevil/daemon/CMakeLists.txt @@ -1,6 +1,5 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - ${KACTIVITIES_INCLUDE_DIR}) + ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(actions) @@ -54,7 +53,6 @@ target_link_libraries(powerdevilcore ${KDE4_SOLID_LIBS} ${KDE4_KIDLETIME_LIBS} ${KDE4_PLASMA_LIBS} - ${KACTIVITIES_LIBRARIES} kworkspace ) diff --git a/powerdevil/kcmodule/CMakeLists.txt b/powerdevil/kcmodule/CMakeLists.txt index bb3c13e9..6ac72936 100644 --- a/powerdevil/kcmodule/CMakeLists.txt +++ b/powerdevil/kcmodule/CMakeLists.txt @@ -5,6 +5,5 @@ include_directories ( add_subdirectory(common) -add_subdirectory(activities) add_subdirectory(global) add_subdirectory(profiles) diff --git a/powerdevil/kcmodule/activities/CMakeLists.txt b/powerdevil/kcmodule/activities/CMakeLists.txt deleted file mode 100644 index afe5ce82..00000000 --- a/powerdevil/kcmodule/activities/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -set( kcm_powerdevil_activities_SRCS - activitypage.cpp - activitywidget.cpp - ../common/ErrorOverlay.cpp -) - -kde4_add_ui_files(kcm_powerdevil_activities_SRCS - activityWidget.ui) - -kde4_add_kcfg_files(kcm_powerdevil_activities_SRCS ../../PowerDevilSettings.kcfgc) - -kde4_add_plugin(kcm_powerdevilactivitiesconfig ${kcm_powerdevil_activities_SRCS}) - -include_directories(${KACTIVITIES_INCLUDE_DIR}) - -target_link_libraries(kcm_powerdevilactivitiesconfig - ${KDE4_KDECORE_LIBS} - ${KDE4_KDEUI_LIBRARY} - ${KDE4_SOLID_LIBS} - ${KACTIVITIES_LIBRARIES} - powerdevilconfigcommonprivate -) - -install(TARGETS kcm_powerdevilactivitiesconfig DESTINATION ${PLUGIN_INSTALL_DIR} ) -install( FILES powerdevilactivitiesconfig.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) diff --git a/powerdevil/kcmodule/activities/Messages.sh b/powerdevil/kcmodule/activities/Messages.sh deleted file mode 100644 index c65284a8..00000000 --- a/powerdevil/kcmodule/activities/Messages.sh +++ /dev/null @@ -1,5 +0,0 @@ -#! /bin/sh -$EXTRACTRC `find -name \*.ui -o -name \*.rc -o -name \*.kcfg` >> rc.cpp || exit 11 -$XGETTEXT `find -name \*.cpp -o -name \*.h` -o $podir/powerdevilactivitiesconfig.pot -rm -f rc.cpp - diff --git a/powerdevil/kcmodule/activities/activityWidget.ui b/powerdevil/kcmodule/activities/activityWidget.ui deleted file mode 100644 index ec22df23..00000000 --- a/powerdevil/kcmodule/activities/activityWidget.ui +++ /dev/null @@ -1,192 +0,0 @@ - - - ActivityWidget - - - - 0 - 0 - 676 - 474 - - - - - - - - - Don't use special settings - - - true - - - - - - - - - Act like - - - - - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Define a special behavior - - - - - - - 30 - - - - - Never shutdown the screen - - - - - - - Never suspend or shutdown the computer - - - - - - - 10 - - - - - Always - - - - - - - - - - after - - - - - - - min - - - 1 - - - 360 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Use separate settings (advanced users only) - - - - - - - 30 - - - - - - - - - Qt::Vertical - - - - 20 - 268 - - - - - - - - - KComboBox - QComboBox -
kcombobox.h
-
-
- - - - actLikeRadio - toggled(bool) - actLikeComboBox - setEnabled(bool) - - - 44 - 66 - - - 133 - 66 - - - - -
diff --git a/powerdevil/kcmodule/activities/activitypage.cpp b/powerdevil/kcmodule/activities/activitypage.cpp deleted file mode 100644 index d8f11693..00000000 --- a/powerdevil/kcmodule/activities/activitypage.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 by Dario Freddi * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - - -#include "activitypage.h" - -#include "activitywidget.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -K_PLUGIN_FACTORY(PowerDevilActivitiesKCMFactory, - registerPlugin(); - ) -K_EXPORT_PLUGIN(PowerDevilActivitiesKCMFactory("powerdevilactivitiesconfig","powerdevil")) - -ActivityPage::ActivityPage(QWidget *parent, const QVariantList &args) - : KCModule(PowerDevilActivitiesKCMFactory::componentData(), parent, args) - , m_activityConsumer(new KActivities::Consumer(this)) -{ - setButtons(Apply | Help); - - KAboutData *about = - new KAboutData("powerdevilactivitiesconfig", "powerdevilactivitiesconfig", ki18n("Activities Power Management Configuration"), - "", ki18n("A per-activity configurator of KDE Power Management System"), - KAboutData::License_GPL, ki18n("(c), 2010 Dario Freddi"), - ki18n("From this module, you can fine tune power management settings for each of your activities.")); - - about->addAuthor(ki18n("Dario Freddi"), ki18n("Maintainer") , "drf@kde.org", - "http://drfav.wordpress.com"); - - setAboutData(about); - - // Build the UI - KTabWidget *tabWidget = new KTabWidget(); - QVBoxLayout *lay = new QVBoxLayout(); - - foreach (const QString &activity, m_activityConsumer->listActivities()) { - KActivities::Info *info = new KActivities::Info(activity, this); - QString icon = info->icon(); - QString name = info->name(); - kDebug() << activity << info->isValid() << info->availability(); - - QScrollArea *scrollArea = new QScrollArea(); - scrollArea->setFrameShape(QFrame::NoFrame); - scrollArea->setFrameShadow(QFrame::Plain); - scrollArea->setLineWidth(0); - scrollArea->setWidgetResizable(true); - - ActivityWidget *activityWidget = new ActivityWidget(activity); - scrollArea->setWidget(activityWidget); - - activityWidget->load(); - m_activityWidgets.append(activityWidget); - - connect(activityWidget, SIGNAL(changed(bool)), this, SIGNAL(changed(bool))); - - tabWidget->addTab(scrollArea, KIcon(icon), name); - } - - // Message widget - m_messageWidget = new KMessageWidget(i18n("The activity service is running with bare functionalities.\n" - "Names and icons of the activities might not be available.")); - m_messageWidget.data()->setMessageType(KMessageWidget::Warning); - m_messageWidget.data()->hide(); - - lay->addWidget(m_messageWidget.data()); - lay->addWidget(tabWidget); - setLayout(lay); - - connect(m_activityConsumer, SIGNAL(serviceStatusChanged(KActivities::Consumer::ServiceStatus)), - this, SLOT(onActivityServiceStatusChanged(KActivities::Consumer::ServiceStatus))); - onActivityServiceStatusChanged(m_activityConsumer->serviceStatus()); - - QDBusServiceWatcher *watcher = new QDBusServiceWatcher("org.kde.Solid.PowerManagement", - QDBusConnection::sessionBus(), - QDBusServiceWatcher::WatchForRegistration | - QDBusServiceWatcher::WatchForUnregistration, - this); - - connect(watcher, SIGNAL(serviceRegistered(QString)), this, SLOT(onServiceRegistered(QString))); - connect(watcher, SIGNAL(serviceUnregistered(QString)), this, SLOT(onServiceUnregistered(QString))); - - if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.Solid.PowerManagement")) { - onServiceRegistered("org.kde.Solid.PowerManagement"); - } else { - onServiceUnregistered("org.kde.Solid.PowerManagement"); - } -} - -ActivityPage::~ActivityPage() -{ - -} - -void ActivityPage::load() -{ - foreach (ActivityWidget *widget, m_activityWidgets) { - widget->load(); - } - - emit changed(false); -} - -void ActivityPage::save() -{ - foreach (ActivityWidget *widget, m_activityWidgets) { - widget->save(); - } - - emit changed(false); - - // Ask to refresh status - QDBusMessage call = QDBusMessage::createMethodCall("org.kde.Solid.PowerManagement", "/org/kde/Solid/PowerManagement", - "org.kde.Solid.PowerManagement", "refreshStatus"); - - // Perform call - QDBusConnection::sessionBus().asyncCall(call); -} - -void ActivityPage::fillUi() -{ - -} - -void ActivityPage::onActivityServiceStatusChanged(KActivities::Consumer::ServiceStatus status) -{ - switch (status) { - case KActivities::Consumer::NotRunning: - // Create error overlay, if not present - if (m_errorOverlay.isNull()) { - m_errorOverlay = new ErrorOverlay(this, i18n("The activity service is not running.\n" - "It is necessary to have the activity manager running " - "to configure activity-specific power management behavior."), - this); - } - break; - case KActivities::Consumer::BareFunctionality: - // Show message widget - m_messageWidget.data()->show(); - break; - case KActivities::Consumer::FullFunctionality: - if (m_previousServiceStatus != KActivities::Consumer::FullFunctionality && - !m_errorOverlay.isNull()) { - m_errorOverlay.data()->deleteLater(); - if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.Solid.PowerManagement")) { - onServiceRegistered("org.kde.Solid.PowerManagement"); - } else { - onServiceUnregistered("org.kde.Solid.PowerManagement"); - } - } - if (m_messageWidget.data()->isVisible()) { - m_messageWidget.data()->hide(); - } - break; - } -} - -void ActivityPage::defaults() -{ - KCModule::defaults(); -} - -void ActivityPage::onServiceRegistered(const QString& service) -{ - Q_UNUSED(service); - - if (!m_errorOverlay.isNull()) { - m_errorOverlay.data()->deleteLater(); - } - - onActivityServiceStatusChanged(m_activityConsumer->serviceStatus()); -} - -void ActivityPage::onServiceUnregistered(const QString& service) -{ - Q_UNUSED(service); - - if (!m_errorOverlay.isNull()) { - return; - } - - m_errorOverlay = new ErrorOverlay(this, i18n("The Power Management Service appears not to be running.\n" - "This can be solved by starting or scheduling it inside \"Startup and Shutdown\""), - this); -} - -#include "activitypage.moc" diff --git a/powerdevil/kcmodule/activities/activitypage.h b/powerdevil/kcmodule/activities/activitypage.h deleted file mode 100644 index 230f8354..00000000 --- a/powerdevil/kcmodule/activities/activitypage.h +++ /dev/null @@ -1,57 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 by Dario Freddi * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - - -#ifndef ACTIVITYPAGE_H -#define ACTIVITYPAGE_H - -#include - -#include - -class ErrorOverlay; -class ActivityWidget; -class KMessageWidget; -class ActivityPage : public KCModule -{ - Q_OBJECT - -public: - ActivityPage(QWidget *parent, const QVariantList &args); - virtual ~ActivityPage(); - void fillUi(); - - void load(); - void save(); - virtual void defaults(); - -private Q_SLOTS: - void onActivityServiceStatusChanged(KActivities::Consumer::ServiceStatus status); - void onServiceRegistered(const QString &service); - void onServiceUnregistered(const QString &service); - -private: - KActivities::Consumer *m_activityConsumer; - QList< ActivityWidget* > m_activityWidgets; - QWeakPointer< ErrorOverlay > m_errorOverlay; - QWeakPointer< KMessageWidget > m_messageWidget; - KActivities::Consumer::ServiceStatus m_previousServiceStatus; -}; - -#endif // ACTIVITYPAGE_H diff --git a/powerdevil/kcmodule/activities/activitywidget.cpp b/powerdevil/kcmodule/activities/activitywidget.cpp deleted file mode 100644 index 8d9517a7..00000000 --- a/powerdevil/kcmodule/activities/activitywidget.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 by Dario Freddi * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - - -#include "activitywidget.h" - -#include "ui_activityWidget.h" - -#include "daemon/actions/bundled/suspendsession.h" - -#include -#include -#include -#include - -ActivityWidget::ActivityWidget(const QString& activity, QWidget* parent) - : QWidget(parent) - , m_ui(new Ui::ActivityWidget) - , m_profilesConfig(KSharedConfig::openConfig("powermanagementprofilesrc", KConfig::SimpleConfig | KConfig::CascadeConfig)) - , m_activity(activity) - , m_activityConsumer(new KActivities::Consumer(this)) - , m_actionEditWidget(new ActionEditWidget(QString("Activities/%1/SeparateSettings").arg(activity))) -{ - m_ui->setupUi(this); - - m_ui->separateSettingsLayout->addWidget(m_actionEditWidget); - - for (int i = 0; i < m_ui->specialBehaviorLayout->count(); ++i) { - QWidget *widget = m_ui->specialBehaviorLayout->itemAt(i)->widget(); - if (widget) { - widget->setVisible(false); - connect(m_ui->specialBehaviorRadio, SIGNAL(toggled(bool)), widget, SLOT(setVisible(bool))); - } else { - QLayout *layout = m_ui->specialBehaviorLayout->itemAt(i)->layout(); - if (layout) { - for (int j = 0; j < layout->count(); ++j) { - QWidget *widget = layout->itemAt(j)->widget(); - if (widget) { - widget->setVisible(false); - connect(m_ui->specialBehaviorRadio, SIGNAL(toggled(bool)), widget, SLOT(setVisible(bool))); - } - } - } - } - } - - m_actionEditWidget->setVisible(false); - m_actionEditWidget->load(); - - connect(m_ui->separateSettingsRadio, SIGNAL(toggled(bool)), m_actionEditWidget, SLOT(setVisible(bool))); - - connect(m_ui->actLikeRadio, SIGNAL(toggled(bool)), this, SLOT(setChanged())); - connect(m_ui->noSettingsRadio, SIGNAL(toggled(bool)), this, SLOT(setChanged())); - connect(m_ui->separateSettingsRadio, SIGNAL(toggled(bool)), this, SLOT(setChanged())); - connect(m_ui->specialBehaviorRadio, SIGNAL(toggled(bool)), this, SLOT(setChanged())); - connect(m_ui->actLikeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setChanged())); - connect(m_ui->alwaysActionBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setChanged())); - connect(m_ui->alwaysAfterSpin, SIGNAL(valueChanged(int)), this, SLOT(setChanged())); - - connect(m_actionEditWidget, SIGNAL(changed(bool)), this, SIGNAL(changed(bool))); -} - -ActivityWidget::~ActivityWidget() -{ - -} - -void ActivityWidget::load() -{ - KConfigGroup activitiesGroup(m_profilesConfig, "Activities"); - KConfigGroup config = activitiesGroup.group(m_activity); - - using namespace PowerDevil::BundledActions; - - QSet< Solid::PowerManagement::SleepState > methods = Solid::PowerManagement::supportedSleepStates(); - - if (methods.contains(Solid::PowerManagement::SuspendState)) { - m_ui->alwaysActionBox->addItem(KIcon("system-suspend"), - i18n("Sleep"), (uint)SuspendSession::ToRamMode); - } - if (methods.contains(Solid::PowerManagement::HibernateState)) { - m_ui->alwaysActionBox->addItem(KIcon("system-suspend-hibernate"), - i18n("Hibernate"), (uint)SuspendSession::ToDiskMode); - } - m_ui->alwaysActionBox->addItem(KIcon("system-shutdown"), i18n("Shutdown"), (uint)SuspendSession::ShutdownMode); - - m_ui->actLikeComboBox->clear(); - - m_ui->actLikeComboBox->addItem(KIcon("battery-charging"), i18n("PC running on AC power"), "AC"); - m_ui->actLikeComboBox->addItem(KIcon("battery-060"), i18n("PC running on battery power"), "Battery"); - m_ui->actLikeComboBox->addItem(KIcon("battery-low"), i18n("PC running on low battery"), "LowBattery"); - - foreach (const QString &activity, m_activityConsumer->listActivities()) { - if (activity == m_activity) { - continue; - } - - if (activitiesGroup.group(activity).readEntry("mode", "None") == "None" || - activitiesGroup.group(activity).readEntry("mode", "None") == "ActLike") { - continue; - } - - KActivities::Info *info = new KActivities::Info(activity, this); - QString icon = info->icon(); - QString name = i18nc("This is meant to be: Act like activity %1", - "Activity \"%1\"", info->name()); - - m_ui->actLikeComboBox->addItem(KIcon(icon), name, activity); - } - - // Proper loading routine - - if (config.readEntry("mode", QString()) == "ActLike") { - m_ui->actLikeRadio->setChecked(true); - m_ui->actLikeComboBox->setCurrentIndex(m_ui->actLikeComboBox->findData(config.readEntry("actLike", QString()))); - } else if (config.readEntry("mode", QString()) == "SpecialBehavior") { - m_ui->specialBehaviorRadio->setChecked(true); - KConfigGroup behaviorGroup = config.group("SpecialBehavior"); - - m_ui->noShutdownPCBox->setChecked(behaviorGroup.readEntry("noSuspend", false)); - m_ui->noShutdownScreenBox->setChecked(behaviorGroup.readEntry("noScreenManagement", false)); - m_ui->alwaysBox->setChecked(behaviorGroup.readEntry("performAction", false)); - - KConfigGroup actionConfig = behaviorGroup.group("ActionConfig"); - m_ui->alwaysActionBox->setCurrentIndex(m_ui->alwaysActionBox->findData(actionConfig.readEntry("suspendType", 0))); - m_ui->alwaysAfterSpin->setValue(actionConfig.readEntry("idleTime", 600000) / 60 / 1000); - } else if (config.readEntry("mode", QString()) == "SeparateSettings") { - m_ui->separateSettingsRadio->setChecked(true); - - m_actionEditWidget->load(); - } -} - -void ActivityWidget::save() -{ - KConfigGroup activitiesGroup(m_profilesConfig, "Activities"); - KConfigGroup config = activitiesGroup.group(m_activity); - - if (m_ui->actLikeRadio->isChecked()) { - config.writeEntry("mode", "ActLike"); - config.writeEntry("actLike", m_ui->actLikeComboBox->itemData(m_ui->actLikeComboBox->currentIndex()).toString()); - } else if (m_ui->specialBehaviorRadio->isChecked()) { - config.writeEntry("mode", "SpecialBehavior"); - - KConfigGroup behaviorGroup = config.group("SpecialBehavior"); - - behaviorGroup.writeEntry("noSuspend", m_ui->noShutdownPCBox->isChecked()); - behaviorGroup.writeEntry("noScreenManagement", m_ui->noShutdownScreenBox->isChecked()); - behaviorGroup.writeEntry("performAction", m_ui->alwaysBox->isChecked()); - - KConfigGroup actionConfig = behaviorGroup.group("ActionConfig"); - actionConfig.writeEntry("suspendType", m_ui->alwaysActionBox->itemData(m_ui->alwaysActionBox->currentIndex())); - actionConfig.writeEntry("idleTime", m_ui->alwaysAfterSpin->value() * 60 * 1000); - - actionConfig.sync(); - behaviorGroup.sync(); - } else if (m_ui->separateSettingsRadio->isChecked()) { - config.writeEntry("mode", "SeparateSettings"); - m_actionEditWidget->save(); - } else { - config.writeEntry("mode", "None"); - } - - config.sync(); -} - -void ActivityWidget::setChanged() -{ - emit changed(true); -} - - -#include "activitywidget.moc" diff --git a/powerdevil/kcmodule/activities/activitywidget.h b/powerdevil/kcmodule/activities/activitywidget.h deleted file mode 100644 index 992029d6..00000000 --- a/powerdevil/kcmodule/activities/activitywidget.h +++ /dev/null @@ -1,61 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 by Dario Freddi * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * - ***************************************************************************/ - - -#ifndef ACTIVITYWIDGET_H -#define ACTIVITYWIDGET_H - -#include -#include - -class ActionEditWidget; -namespace KActivities -{ -class Consumer; -} // namespace KActivities - -namespace Ui { -class ActivityWidget; -} - -class ActivityWidget : public QWidget -{ - Q_OBJECT -public: - explicit ActivityWidget(const QString &activity, QWidget *parent = 0); - virtual ~ActivityWidget(); - -public Q_SLOTS: - void load(); - void save(); - - void setChanged(); - -Q_SIGNALS: - void changed(bool changed); - -private: - Ui::ActivityWidget *m_ui; - KSharedConfig::Ptr m_profilesConfig; - QString m_activity; - KActivities::Consumer *m_activityConsumer; - ActionEditWidget* m_actionEditWidget; -}; - -#endif // ACTIVITYWIDGET_H diff --git a/powerdevil/kcmodule/activities/powerdevilactivitiesconfig.desktop b/powerdevil/kcmodule/activities/powerdevilactivitiesconfig.desktop deleted file mode 100644 index b0980312..00000000 --- a/powerdevil/kcmodule/activities/powerdevilactivitiesconfig.desktop +++ /dev/null @@ -1,147 +0,0 @@ -[Desktop Entry] -Exec=kcmshell4 powerdevilactivitiesconfig -Icon=preferences-activities -Type=Service -X-KDE-ServiceTypes=KCModule -X-DocPath=kcontrol/powerdevil/index.html#activity-setting - -X-KDE-Library=kcm_powerdevilactivitiesconfig -X-KDE-ParentApp=kcontrol - -X-KDE-System-Settings-Parent-Category=power-management -X-KDE-Weight=50 - -Name=Activity Settings -Name[bs]=Postavke aktivnosti -Name[ca]=Arranjament d'activitat -Name[ca@valencia]=Arranjament d'activitat -Name[cs]=Nastavení aktivit -Name[da]=Aktivitetsindstillinger -Name[de]=Aktivitäten-Einstellungen -Name[el]=Ρυθμίσεις δραστηριοτήτων -Name[en_GB]=Activity Settings -Name[es]=Preferencias de la actividad -Name[et]=Tegevuse seadistused -Name[eu]=Jarduera-ezarpenak -Name[fi]=Aktiviteettiasetukset -Name[fr]=Configuration des activités -Name[ga]=Socruithe Gníomhaíochta -Name[gl]=Configuración da actividade -Name[he]=הגדרות של פעילות -Name[hu]=Aktivitásjellemzők -Name[ia]=Preferentias de activitate -Name[is]=Virknistillingar -Name[kk]=Істің параметрлері -Name[km]=ការ​កំណត់​សកម្មភាព -Name[ko]=활동 설정 -Name[lt]=Veiklos nustatymai -Name[mr]=कार्यपध्दती संयोजना -Name[nb]=Aktivitetsinnstillinger -Name[nds]=Aktiviteteninstellen -Name[nl]=Instellingen voor activiteiten -Name[pa]=ਐਕਟਵਿਟੀ ਸੈਟਿੰਗ -Name[pl]=Ustawienia działań -Name[pt]=Configuração da Actividade -Name[pt_BR]=Configurações da atividade -Name[ro]=Configurare activități -Name[ru]=Настройка для комнат -Name[sk]=Nastavenie aktivity -Name[sl]=Nastavitve dejavnosti -Name[sr]=Поставке активности -Name[sr@ijekavian]=Поставке активности -Name[sr@ijekavianlatin]=Postavke aktivnosti -Name[sr@latin]=Postavke aktivnosti -Name[sv]=Inställningar av aktiviteter -Name[tr]=Etkinlik Ayarları -Name[uk]=Параметри простору дій -Name[vi]=Thiết lập Hoạt động -Name[x-test]=xxActivity Settingsxx -Name[zh_CN]=活动设置 -Name[zh_TW]=活動設定 - -Comment=Configure per-activity Power Management -Comment[bs]=Konfiguracija po aktivnosti upravljanja napajanjem -Comment[ca]=Configura l'arranjament per activitat de gestió d'energia -Comment[ca@valencia]=Configura l'arranjament per activitat de gestió d'energia -Comment[cs]=Konfigurace správy napájení na činnost -Comment[da]=Indstil strømstyring pr. aktivitet -Comment[de]=Energieprofile pro Aktivität einzeln einrichten -Comment[el]=Διαμόρφωση ανά δραστηριότητα επιλογών διαχείρισης ενέργειας -Comment[en_GB]=Configure per-activity Power Management -Comment[es]=Configurar de las preferencias de la gestión de energía por actividad -Comment[et]=Toitehalduse seadistused tegevuste kaupa -Comment[eu]=Konfiguratu energia-kudeaketa jardueraka -Comment[fi]=Virranhallinnan aktiviteettikohtaiset asetukset -Comment[fr]=Configuration de la gestion d'énergie par activité -Comment[gl]=Configura a xestión da enerxía para cada actividade -Comment[he]=הגדרות צריכת חשמל לפי פעילות -Comment[hu]=Aktivitásonkénti energiakezelési beállítások módosítása -Comment[ia]=Configura gestion de energia per activitate -Comment[is]=Stilla orkustýringu á hverja virkni -Comment[kk]=Әрбір істің қуаттандыру параметрлерін баптау -Comment[km]=កំណត់​រចនាសម្ព័ន្ធក​នៃ​ការ​គ្រប់គ្រង​ថាមពល​ក្នុង​មួយ​សកម្មភាព -Comment[ko]=활동별 전원 관리 설정 -Comment[lt]=Konfigūruoti atskiros veiklos energijos valdymo nustatymus -Comment[mr]=प्रत्येक कार्यपध्दती साठी वीज व्यवस्थापन संयोजीत करा -Comment[nb]=Sett opp strømstyring per aktivitet -Comment[nds]=Stroompleeg för enkelte Aktiviteten instellen -Comment[nl]=Energiebeheer per activiteit instellen -Comment[pa]=ਪ੍ਰਤੀ-ਸਰਗਰਮੀ ਪਾਵਰ ਪਰਬੰਧ ਸੈਟਿੰਗ ਸੰਰਚਨਾ -Comment[pl]=Ustawienia zarządzania energią w zależności od działania -Comment[pt]=Configurar a Gestão de Energia por Actividade -Comment[pt_BR]=Configura o gerenciamento de energia por atividade -Comment[ro]=Configurează gestiunea alimentării per activitate -Comment[ru]=Настройка параметров энергосбережения для комнат -Comment[sk]=Nastaviť nastavenia správy napájania podľa aktivity -Comment[sl]=Nastavi upravljanje z energijo glede na dejavnost -Comment[sr]=Подешавање управљања напајањем према активности -Comment[sr@ijekavian]=Подешавање управљања напајањем према активности -Comment[sr@ijekavianlatin]=Podešavanje upravljanja napajanjem prema aktivnosti -Comment[sr@latin]=Podešavanje upravljanja napajanjem prema aktivnosti -Comment[sv]=Anpassa inställningar av strömhantering per aktivitet -Comment[tr]=Her Etkinlik için Genel Güç Yönetimi Ayarlarını Yapılandır -Comment[uk]=Налаштування окремих параметрів керування живленням простору дій -Comment[vi]=Cấu hình Quản lý năng lượng cho từng Hoạt động -Comment[x-test]=xxConfigure per-activity Power Managementxx -Comment[zh_CN]=配置基于活动的电源管理 -Comment[zh_TW]=設定個別活動的電源管理 - -X-KDE-Keywords=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities -X-KDE-Keywords[bs]=Sistem, Napajanje, Upravljanje napajanjem, energija, laptop, baterija, suspenzija, AC, suspendiraj, hiberniranje, osvljetljenje, perfomanse, kapak, aktivnost, aktivnosti -X-KDE-Keywords[ca]=sistema,energia,gestió d'energia,corrent,portàtil,bateria,suspensió,AC,suspendre,hibernació,lluminositat,rendiment,tapa,activitat,activitats -X-KDE-Keywords[ca@valencia]=sistema,energia,gestió d'energia,corrent,portàtil,bateria,suspensió,AC,suspendre,hibernació,lluminositat,rendiment,tapa,activitat,activitats -X-KDE-Keywords[da]=system,strøm,strømstyring,energi,laptop,bærbar,batteri,suspension,AC,strømforsyning,suspender,slumre,dvale,lysstyrke,ydelse,låg,aktivitet,aktiviteter -X-KDE-Keywords[de]=system,energie,energieverwaltung,laptop,notebook,akku,batterie,ruhezustand,tiefschlaf,helligkeit,leistung,deckel,aktivität -X-KDE-Keywords[el]=σύστημα,ενέργεια,διαχείριση ενέργειας,ενέργεια,φορητός,μπαταρία,αναστολή,AC,κοίμηση,νάρκη,λαμπρότητα,επιδόσεις,καπάκι,δραστηριότητα,δραστηριότητες -X-KDE-Keywords[en_GB]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities -X-KDE-Keywords[es]=sistema,energía,gestión de energía,energía,portátil,batería,suspensión,AC,suspender,hibernar,brillo,rendimiento,tapa,actividad,actividades -X-KDE-Keywords[et]=süsteem,energia,toide,toitehaldus,sülearvuti,aku,uneseisund,uni,talveuni, heledus,jõudlus,kaas,tegevus,tegevused -X-KDE-Keywords[eu]=sistema,energia,energia-kudeaketa,energia,eramangarria,bateria,egonean,korronte alternoa,egonean uztea,hibernatu,distira,errendimendua,tapa,jarduera,jarduerak -X-KDE-Keywords[fi]=järjestelmä,virta,virranhallinta,energia,kannettava,tietokone,läppäri,akku,lepotila,valmiustila,keskeytä,AC,virtalähde,kirkkaus,suorituskyky,kansi,aktiviteetti,aktiviteetit -X-KDE-Keywords[fr]=système, alimentation, gestion énergétique, énergie, portable, batterie, suspension, AC, suspendre, hiberner, luminosité, performance, capot, activité, activités -X-KDE-Keywords[gl]=sistema,enerxía,xestión da enerxía, xestión enerxética,carga,portátil,batería, suspender,corrente,hibernar,durmir,brillo,rendemento,tapa,actividade -X-KDE-Keywords[hu]=rendszer,energia,energiakezelés,energia,laptop,akkumulátor,AC,felfüggesztés,hibernálás,fényerő,teljesítmény,fedél,aktivitás,aktivitások -X-KDE-Keywords[ia]=systema,potentia,gestion de potentia,energia,laptop,batteria,suspension,CA,suspende,hiberna,brillantia,prestation,coperculo,activitate,activitates -X-KDE-Keywords[kk]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities -X-KDE-Keywords[km]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities -X-KDE-Keywords[ko]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,시스템,전원,전원 관리,에너지,노트북,배터리,어댑터,절전,대기 모드,대기,최대 절전,최대 절전 모드,밝기,성능,덮개,상판,활동 -X-KDE-Keywords[mr]=प्रणाली, वीज, वीज व्यवस्थापन, ऊर्जा, लैपटॉप, बॅटरी, अकार्यक्षम, AC, अकार्यक्षम, हायबरनेट, प्रखरता, लिड, कार्य -X-KDE-Keywords[nb]=system,strøm,strømstyring,energi,bærbar,batteri,hvilemodus,AC,hvile,dvale,lysstyrke,ytelse,lokk,aktivitet,aktiviteter -X-KDE-Keywords[nds]=Systeem,Stroom,Stroompleeg,Energie,Klappreekner,Batterie,utsetten,AC,Wesselstroom,infreren,Helligkeit,Leisten,Aktiviteet,Aktiviteten -X-KDE-Keywords[nl]=systeem,energie,energiebeheer,laptop,batterij,accu,suspension,AC,onderbreken,slapen,helderheid,prestaties,deksel,activiteit,activiteiten -X-KDE-Keywords[pl]=system,moc,zarządzanie energią,energia,laptop,bateria,wstrzymanie,AC,wstrzymaj,hibernuj,jasność,wydajność,pokrywka,działanie,działania -X-KDE-Keywords[pt]=sistema,energia,gestão de energia,portátil,bateria,suspensão,AC,suspender,hibernar,brilho,performance,tampo,actividade,actividades -X-KDE-Keywords[pt_BR]=sistema,energia,gerenciamento de energia,energia,portátil,laptop,notebook,bateria,suspensão,AC,suspender,hibernar,brilho,desempenho,tampa,atividade,atividades -X-KDE-Keywords[ru]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,системное,питание,управление питанием,энергопотребление,ноутбук,батарея,спящий режим,гибернация,ждущий режим,яркость,производительность,крышка,комната,комнаты -X-KDE-Keywords[sk]=systém,napájanie,správa napájanie,energia,laptop,batéria,uspanie,AC,uspať,hibernovať,jas,výkon,kryt,aktivita,aktivity -X-KDE-Keywords[sl]=sistem,energija,upravljanje z energijo,prenosnik,prenosni računalnik,baterija,akumulator,pripravljenost,mirovanje,električno omrežje,svetlost,zmogljivost,pokrov,dejavnost,dejavnosti,napajanje -X-KDE-Keywords[sr]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,систем,напајање,струја,управљање напајањем,лаптоп,батерија,суспендовање,АЦ,хибернација,светлина,осветљај,перформансе,поклопац,активност -X-KDE-Keywords[sr@ijekavian]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,систем,напајање,струја,управљање напајањем,лаптоп,батерија,суспендовање,АЦ,хибернација,светлина,осветљај,перформансе,поклопац,активност -X-KDE-Keywords[sr@ijekavianlatin]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,sistem,napajanje,struja,upravljanje napajanjem,laptop,baterija,suspendovanje,AC,hibernacija,svetlina,osvetljaj,performanse,poklopac,aktivnost -X-KDE-Keywords[sr@latin]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,sistem,napajanje,struja,upravljanje napajanjem,laptop,baterija,suspendovanje,AC,hibernacija,svetlina,osvetljaj,performanse,poklopac,aktivnost -X-KDE-Keywords[sv]=system,kraft,krafthantering,energi,bärbar dator,batteri,viloläge,AC,gå till viloläge,dvala,ljusstyrka,prestanda,lock,aktivitet,aktiviteter -X-KDE-Keywords[tr]=sistem,güç,güç yönetimi,enerji,dizüstü,pil,askıya alma,Adaptör,uyku kipi,hazırda bekletme,parlaklık,performans,başarım,dizüstü kapağı,ekran parlaklığı,etkinlik,etkinlikler -X-KDE-Keywords[uk]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,система,живлення,мережа,струм,керування,енергія,ноутбук,акумулятор,батарея,батареї,присипляння,призупинення,призупинка,яскравість,швидкодія,кришка,кришки,простір,дій,простори,активність -X-KDE-Keywords[x-test]=xxsystem,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activitiesxx -X-KDE-Keywords[zh_CN]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities,系统,电源,电源管理,能源,笔记本,电池,休眠,睡眠,交流,亮度,性能,活动 -X-KDE-Keywords[zh_TW]=system,power,power management,energy,laptop,battery,suspension,AC,suspend,hibernate,brightness,performance,lid,activity,activities