[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