1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
commit 00b03781b8106cc9d079d133373af88b23522fc1
Author: Aaron Seigo <aseigo@kde.org>
Date: Thu Aug 11 16:53:36 2011 +0200
if we are supposd to skip a task .. still check for startup items.
this should prevent the ghost-in-the-taskbar bugs
diff --git a/libs/taskmanager/groupmanager.cpp b/libs/taskmanager/groupmanager.cpp
index 4d8e4d9..854db2e 100644
--- a/libs/taskmanager/groupmanager.cpp
+++ b/libs/taskmanager/groupmanager.cpp
@@ -233,14 +233,15 @@ bool GroupManagerPrivate::addTask(TaskPtr task)
<< task->className()
<< task->classClass(); */
+ bool skip = false;
if (!task->showInTaskbar()) {
//kDebug() << "Do not show in taskbar";
- return false;
+ skip = true;
}
if (showOnlyCurrentScreen && !task->isOnScreen(currentScreen)) {
//kDebug() << "Not on this screen and showOnlyCurrentScreen";
- return false;
+ skip = true;
}
// Should the Task be displayed ? We always display if attention is demaded
@@ -250,25 +251,25 @@ bool GroupManagerPrivate::addTask(TaskPtr task)
if (showOnlyCurrentDesktop && !task->isOnCurrentDesktop()) {
/* kDebug() << "Not on this desktop and showOnlyCurrentDesktop"
<< KWindowSystem::currentDesktop() << task->desktop(); */
- return false;
+ skip = true;
}
if (showOnlyCurrentActivity && !task->isOnCurrentActivity()) {
/* kDebug() << "Not on this desktop and showOnlyCurrentActivity"
<< KWindowSystem::currentActivity() << task->desktop(); */
- return false;
+ skip = true;
}
if (showOnlyMinimized && !task->isMinimized()) {
//kDebug() << "Not minimized and only showing minimized";
- return false;
+ skip = true;
}
NET::WindowType type = task->info().windowType(NET::NormalMask | NET::DialogMask |
NET::OverrideMask | NET::UtilityMask);
if (type == NET::Utility) {
//kDebug() << "skipping utility window" << task->name();
- return false;
+ skip = true;
}
//TODO: should we check for transiency? if so the following code can detect it.
@@ -288,14 +289,14 @@ bool GroupManagerPrivate::addTask(TaskPtr task)
//Ok the Task should be displayed
TaskItem *item = qobject_cast<TaskItem*>(currentRootGroup()->getMemberByWId(task->window()));
- if (!item) {
- // first search for an existing startuptask for this task
+ if (!item || skip) {
+ TaskItem *startupItem = 0;
QHash<StartupPtr, TaskItem *>::iterator it = startupList.begin();
QHash<StartupPtr, TaskItem *>::iterator itEnd = startupList.end();
while (it != itEnd) {
if (it.key()->matchesWindow(task->window())) {
//kDebug() << "startup task found";
- item = it.value();
+ item = startupItem = it.value();
startupList.erase(it);
QObject::disconnect(item, 0, q, 0);
item->setTaskPointer(task);
@@ -304,6 +305,12 @@ bool GroupManagerPrivate::addTask(TaskPtr task)
++it;
}
+ // if we are to skip because we don't display, we simply delete the startup related to it
+ if (skip) {
+ delete startupItem;
+ return false;
+ }
+
if (!item) {
item = new TaskItem(q, task);
}
@@ -324,7 +331,6 @@ bool GroupManagerPrivate::addTask(TaskPtr task)
}
geometryTasks.insert(task.data());
-
return true;
}
|