[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/workspace/libs/taskmanager
From: Chani Armitage <chanika () gmail ! com>
Date: 2010-11-11 14:12:10
Message-ID: 20101111141210.79DB1AC89E () svn ! kde ! org
[Download RAW message or body]
SVN commit 1195561 by chani:
read-only activity integration in libtaskmanager
compiles, but untested.
M +2 -0 CMakeLists.txt
M +78 -8 groupmanager.cpp
M +4 -0 groupmanager.h
M +60 -0 task.cpp
M +19 -0 task.h
M +2 -0 task_p.h
M +15 -0 taskmanager.cpp
M +14 -0 taskmanager.h
--- trunk/KDE/kdebase/workspace/libs/taskmanager/CMakeLists.txt #1195560:1195561
@@ -3,6 +3,7 @@
########### next target ###############
include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/kephal)
+include_directories(${KDEBASE_WORKSPACE_SOURCE_DIR}/libs/kworkspace)
set(taskmanager_LIB_SRCS
abstractgroupableitem.cpp
@@ -44,6 +45,7 @@
endif (X11_Xcomposite_FOUND)
target_link_libraries(taskmanager kephal)
+target_link_libraries(taskmanager kworkspace)
set_target_properties(taskmanager PROPERTIES VERSION ${GENERIC_LIB_VERSION} \
SOVERSION ${GENERIC_LIB_SOVERSION} ) install(TARGETS taskmanager EXPORT \
kdeworkspaceLibraryTargets ${INSTALL_TARGETS_DEFAULT_ARGS} )
--- trunk/KDE/kdebase/workspace/libs/taskmanager/groupmanager.cpp #1195560:1195561
@@ -58,6 +58,7 @@
currentScreen(-1),
groupIsFullLimit(0),
showOnlyCurrentDesktop(false),
+ showOnlyCurrentActivity(false),
showOnlyCurrentScreen(false),
showOnlyMinimized(false),
onlyGroupWhenFull(false),
@@ -73,6 +74,7 @@
* Keep track of changes in Taskmanager
*/
void currentDesktopChanged(int);
+ void currentActivityChanged(QString);
void taskChanged(TaskPtr, ::TaskManager::TaskChanges);
void checkScreenChange();
void taskDestroyed(QObject *item);
@@ -100,14 +102,16 @@
QSet<Task *> geometryTasks;
int groupIsFullLimit;
bool showOnlyCurrentDesktop : 1;
+ bool showOnlyCurrentActivity : 1;
bool showOnlyCurrentScreen : 1;
bool showOnlyMinimized : 1;
bool onlyGroupWhenFull : 1;
bool changingGroupingStrategy : 1;
QUuid configToken;
- QHash<int, TaskGroup*> rootGroups; //container for groups
+ QHash<QString, QHash<int, TaskGroup*> > rootGroups; //container for groups
int currentDesktop;
+ QString currentActivity;
};
@@ -123,8 +127,10 @@
connect(TaskManager::self(), SIGNAL(startupRemoved(StartupPtr)), this, \
SLOT(removeStartup(StartupPtr)));
d->currentDesktop = TaskManager::self()->currentDesktop();
- d->rootGroups[d->currentDesktop] = new TaskGroup(this, "RootGroup", \
Qt::transparent); + d->currentActivity = TaskManager::self()->currentActivity();
+ d->rootGroups[d->currentActivity][d->currentDesktop] = new TaskGroup(this, \
"RootGroup", Qt::transparent); +
d->reloadTimer.setSingleShot(true);
d->reloadTimer.setInterval(0);
connect(&d->reloadTimer, SIGNAL(timeout()), this, SLOT(actuallyReloadTasks()));
@@ -149,7 +155,7 @@
TaskGroup *GroupManagerPrivate::currentRootGroup()
{
- return rootGroups[currentDesktop];
+ return rootGroups[currentActivity][currentDesktop];
}
void GroupManagerPrivate::reloadTasks()
@@ -237,6 +243,12 @@
return false;
}
+ if (showOnlyCurrentActivity && !task->isOnCurrentActivity()) {
+ /* kDebug() << "Not on this desktop and showOnlyCurrentActivity"
+ << KWindowSystem::currentActivity() << task->desktop(); */
+ return false;
+ }
+
if (showOnlyMinimized && !task->isMinimized()) {
//kDebug() << "Not minimized and only showing minimized";
return false;
@@ -382,6 +394,38 @@
return d->currentRootGroup();
}
+void GroupManagerPrivate::currentActivityChanged(QString newActivity)
+{
+ if (!showOnlyCurrentActivity) {
+ return;
+ }
+ if (currentActivity == newActivity) {
+ return;
+ }
+
+ if (!rootGroups.contains(newActivity)) {
+ kDebug() << "created new desk group";
+ rootGroups[newActivity][currentDesktop] = new TaskGroup(q, "RootGroup", \
Qt::transparent); + if (abstractSortingStrategy) {
+ abstractSortingStrategy->handleGroup(rootGroups[newActivity][currentDesktop]);
+ }
+ }
+
+ if (onlyGroupWhenFull) {
+ QObject::disconnect(currentRootGroup(), \
SIGNAL(itemAdded(AbstractGroupableItem *)), q, SLOT(checkIfFull())); + \
QObject::disconnect(currentRootGroup(), SIGNAL(itemRemoved(AbstractGroupableItem *)), \
q, SLOT(checkIfFull())); + }
+
+ currentActivity = newActivity;
+
+ if (onlyGroupWhenFull) {
+ QObject::connect(currentRootGroup(), SIGNAL(itemAdded(AbstractGroupableItem \
*)), q, SLOT(checkIfFull())); + QObject::connect(currentRootGroup(), \
SIGNAL(itemRemoved(AbstractGroupableItem *)), q, SLOT(checkIfFull())); + }
+
+ reloadTasks();
+}
+
void GroupManagerPrivate::currentDesktopChanged(int newDesktop)
{
//kDebug();
@@ -393,11 +437,11 @@
return;
}
- if (!rootGroups.contains(newDesktop)) {
+ if (!rootGroups[currentActivity].contains(newDesktop)) {
kDebug() << "created new desk group";
- rootGroups[newDesktop] = new TaskGroup(q, "RootGroup", Qt::transparent);
+ rootGroups[currentActivity][newDesktop] = new TaskGroup(q, "RootGroup", \
Qt::transparent); if (abstractSortingStrategy) {
- abstractSortingStrategy->handleGroup(rootGroups[newDesktop]);
+ abstractSortingStrategy->handleGroup(rootGroups[currentActivity][newDesktop]);
}
}
@@ -429,6 +473,12 @@
//kDebug() << task->visibleName() << "on" << \
TaskManager::self()->currentDesktop(); }
+ if (showOnlyCurrentActivity && changes & ::TaskManager::ActivitiesChanged) {
+ takeAction = true;
+ show = task->isOnCurrentActivity();
+ //kDebug() << task->visibleName() << "on" << \
TaskManager::self()->currentDesktop(); + }
+
if (showOnlyMinimized && changes & ::TaskManager::StateChanged) {
//TODO: wouldn't it be nice to get notification of JUST minimization?
takeAction = true;
@@ -490,15 +540,21 @@
kDebug();
disconnect(TaskManager::self(), SIGNAL(desktopChanged(int)),
this, SLOT(currentDesktopChanged(int)));
+ disconnect(TaskManager::self(), SIGNAL(activityChanged(int)),
+ this, SLOT(currentActivityChanged(int)));
disconnect(TaskManager::self(), \
SIGNAL(windowChanged(TaskPtr,::TaskManager::TaskChanges)),
this, SLOT(taskChanged(TaskPtr,::TaskManager::TaskChanges)));
- if (d->showOnlyCurrentDesktop || d->showOnlyMinimized || \
d->showOnlyCurrentScreen) { + if (d->showOnlyCurrentDesktop || \
d->showOnlyMinimized || d->showOnlyCurrentScreen || d->showOnlyCurrentActivity) { // \
listen to the relevant task manager signals if (d->showOnlyCurrentDesktop) {
connect(TaskManager::self(), SIGNAL(desktopChanged(int)),
this, SLOT(currentDesktopChanged(int)));
}
+ if (d->showOnlyCurrentActivity) {
+ connect(TaskManager::self(), SIGNAL(activityChanged(QString)),
+ this, SLOT(currentActivityChanged(QString)));
+ }
connect(TaskManager::self(), \
SIGNAL(windowChanged(TaskPtr,::TaskManager::TaskChanges)),
this, SLOT(taskChanged(TaskPtr,::TaskManager::TaskChanges)));
@@ -603,6 +659,17 @@
reconnect();
}
+bool GroupManager::showOnlyCurrentActivity() const
+{
+ return d->showOnlyCurrentActivity;
+}
+
+void GroupManager::setShowOnlyCurrentActivity(bool showOnlyCurrentActivity)
+{
+ d->showOnlyCurrentActivity = showOnlyCurrentActivity;
+ reconnect();
+}
+
bool GroupManager::showOnlyMinimized() const
{
return d->showOnlyMinimized;
@@ -657,10 +724,13 @@
kDebug() << "Invalid Strategy";
}
if (d->abstractSortingStrategy) {
- foreach (TaskGroup *group, d->rootGroups) {
+ typedef QHash<int,TaskGroup*> Metagroup;
+ foreach (Metagroup metagroup, d->rootGroups) {
+ foreach (TaskGroup *group, metagroup) {
d->abstractSortingStrategy->handleGroup(group);
}
}
+ }
d->sortingStrategy = sortOrder;
reconnect();
--- trunk/KDE/kdebase/workspace/libs/taskmanager/groupmanager.h #1195560:1195561
@@ -93,6 +93,9 @@
bool showOnlyCurrentDesktop() const;
void setShowOnlyCurrentDesktop(bool);
+ bool showOnlyCurrentActivity() const;
+ void setShowOnlyCurrentActivity(bool);
+
bool showOnlyMinimized() const;
void setShowOnlyMinimized(bool);
@@ -132,6 +135,7 @@
private:
Q_PRIVATE_SLOT(d, void currentDesktopChanged(int))
+ Q_PRIVATE_SLOT(d, void currentActivityChanged(QString))
Q_PRIVATE_SLOT(d, void taskChanged(TaskPtr, ::TaskManager::TaskChanges))
Q_PRIVATE_SLOT(d, void checkScreenChange())
Q_PRIVATE_SLOT(d, void startupItemDestroyed(AbstractGroupableItem *))
--- trunk/KDE/kdebase/workspace/libs/taskmanager/task.cpp #1195560:1195561
@@ -31,6 +31,7 @@
#include <QTimer>
#include <QApplication>
#include <QDesktopWidget>
+#include <QtGui/QX11Info>
// KDE
#include <KDebug>
@@ -50,6 +51,7 @@
// try to load icon via net_wm
refreshIcon();
+ refreshActivities();
}
Task::~Task()
@@ -143,6 +145,11 @@
refreshIcon();
}
+ if (dirty.netWindowInfoProperties2 & NET::WM2Activities) {
+ refreshActivities();
+ changes |= ActivitiesChanged;
+ }
+
if (changes != TaskUnchanged) {
emit changed(changes);
}
@@ -652,6 +659,59 @@
{
}
+bool Task::isOnCurrentActivity() const
+{
+ return activities().isEmpty() || \
activities().contains(TaskManager::self()->currentActivity()); +}
+
+bool Task::isOnAllActivities() const
+{
+ return activities().isEmpty();
+}
+
+QStringList Task::activities() const
+{
+ return d->activities;
+}
+
+void Task::refreshActivities()
+{
+ unsigned long properties[] = { 0, NET::WM2Activities };
+ NETWinInfo info(QX11Info::display(), d->win, QX11Info::appRootWindow(), \
properties, 2); + QString result(info.activities());
+ if (result.isEmpty()) {
+ d->activities.clear();
+ } else {
+ d->activities = result.split(',');
+ }
+}
+
+/*
+ QStringList newActivitiesList;
+ Atom type;
+ int format, status;
+ unsigned long nitems = 0;
+ unsigned long extra = 0;
+ unsigned char *data = 0;
+ KXErrorHandler handler; // ignore errors
+ status = XGetWindowProperty( display(), window(), "_KDE_NET_WM_ACTIVITIES", 0, \
10000, + false, XA_STRING, &type, &format,
+ &nitems, &extra, &data );
+ if (status == Success && data) {
+ QString result = (const char*) data;
+ if (!result.isEmpty()) {
+ newActivitiesList = QString(data).split(',');
+ }
+ XFree(data);
+ }
+ if (newActivitiesList == d->activities) {
+ return;
+ }
+
+ d->activities = newActivitiesList;
+ emit changed(ActivitiesChanged);
+}
+*/
} // TaskManager namespace
#include "task.moc"
--- trunk/KDE/kdebase/workspace/libs/taskmanager/task.h #1195560:1195561
@@ -68,6 +68,9 @@
Q_PROPERTY( bool modified READ isModified )
Q_PROPERTY( bool demandsAttention READ demandsAttention )
Q_PROPERTY( int desktop READ desktop )
+ Q_PROPERTY( bool onCurrentActivity READ isOnCurrentActivity )
+ Q_PROPERTY( bool onAllActivities READ isOnAllActivities )
+ Q_PROPERTY( QStringList activities READ activities )
public:
@@ -249,6 +252,21 @@
*/
QRect geometry() const;
+ /**
+ * Returns true if the task's window is on the current activity.
+ */
+ bool isOnCurrentActivity() const;
+
+ /**
+ * Returns true if the task's window is on all activities
+ */
+ bool isOnAllActivities() const;
+
+ /**
+ * Returns the activities on which this task's window resides.
+ */
+ QStringList activities() const;
+
// internal
//* @internal
@@ -416,6 +434,7 @@
void timerEvent(QTimerEvent *event);
//* @internal */
void refreshIcon();
+ void refreshActivities();
private:
class Private;
--- trunk/KDE/kdebase/workspace/libs/taskmanager/task_p.h #1195560:1195561
@@ -73,6 +73,8 @@
QPixmap lastIcon;
bool active : 1;
bool lastResize : 1;
+
+ QStringList activities;
};
}
--- trunk/KDE/kdebase/workspace/libs/taskmanager/taskmanager.cpp #1195560:1195561
@@ -48,6 +48,7 @@
#endif
#include <kephal/screens.h>
+#include <kactivityconsumer.h>
namespace TaskManager
{
@@ -101,6 +102,7 @@
StartupList startups;
WindowList skiptaskbarWindows;
QSet<QUuid> trackGeometryTokens;
+ KActivityConsumer activityConsumer;
};
TaskManager::TaskManager()
@@ -118,6 +120,8 @@
this, SLOT(currentDesktopChanged(int)));
connect(KWindowSystem::self(), SIGNAL(windowChanged(WId,const unsigned long*)),
this, SLOT(windowChanged(WId,const unsigned long*)));
+ connect(&d->activityConsumer, SIGNAL(currentActivityChanged(QString)),
+ this, SLOT(currentActivityChanged(QString)));
if (QCoreApplication::instance()) {
connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, \
SLOT(onAppExitCleanup())); }
@@ -204,6 +208,7 @@
{
continue;
}
+ //FIXME activities?
if (t->isIconified() || t->isShaded())
{
@@ -418,6 +423,11 @@
emit desktopChanged(desktop);
}
+void TaskManager::currentActivityChanged(const QString &activity)
+{
+ emit activityChanged(activity);
+}
+
void TaskManager::gotNewStartup( const KStartupInfoId& id, const KStartupInfoData& \
data ) {
StartupPtr s( new Startup( id, data, 0 ) );
@@ -565,6 +575,11 @@
return KWindowSystem::currentDesktop();
}
+QString TaskManager::currentActivity() const
+{
+ return d->activityConsumer.currentActivity(); //TODO cache
+}
+
} // TaskManager namespace
--- trunk/KDE/kdebase/workspace/libs/taskmanager/taskmanager.h #1195560:1195561
@@ -57,6 +57,7 @@
TransientsChanged = 512,
IconChanged = 1024,
ColorChanged = 2048,
+ ActivitiesChanged = 4096,
EverythingChanged = 0xffff
};
Q_DECLARE_FLAGS(TaskChanges, TaskChange)
@@ -83,6 +84,7 @@
Q_OBJECT
Q_PROPERTY( int currentDesktop READ currentDesktop )
Q_PROPERTY( int numberOfDesktops READ numberOfDesktops )
+ Q_PROPERTY( QString currentActivity READ currentActivity )
public:
static TaskManager* self();
@@ -126,6 +128,11 @@
int currentDesktop() const;
/**
+ * Returns the number of the current desktop.
+ */
+ QString currentActivity() const;
+
+ /**
* Returns true if the specified task is on top.
*/
bool isOnTop(const Task*) const;
@@ -176,6 +183,11 @@
void desktopChanged(int desktop);
/**
+ * Emitted when the current activity changes.
+ */
+ void activityChanged(const QString &activity);
+
+ /**
* Emitted when a window changes desktop.
*/
void windowChanged(TaskPtr task, ::TaskManager::TaskChanges change);
@@ -193,6 +205,8 @@
//* @internal
void currentDesktopChanged(int);
//* @internal
+ void currentActivityChanged(const QString&);
+ //* @internal
void killStartup( const KStartupInfoId& );
//* @internal
void killStartup(StartupPtr);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic