[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/kdeui/windowmanagement
From: Christoph Feck <christoph () maxiom ! de>
Date: 2009-07-21 12:13:23
Message-ID: 1248178403.110504.21666.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1000474 by cfeck:
Fix reentrancy problem in NETRootInfo::update
See http://lists.kde.org/?l=kwin&m=124791974016062&w=2
Reviewed by Luboš Luňák
BUG: 170519
CCMAIL: kwin@kde.org
M +15 -6 netwm.cpp
--- trunk/KDE/kdelibs/kdeui/windowmanagement/netwm.cpp #1000473:1000474
@@ -2108,6 +2108,9 @@
}
if (dirty & ClientList) {
+ QList<Window> clientsToRemove;
+ QList<Window> clientsToAdd;
+
bool read_ok = false;
if (XGetWindowProperty(p->display, p->root, net_client_list,
0l, MAX_PROP_SIZE, False, XA_WINDOW, &type_ret,
@@ -2126,16 +2129,16 @@
while (old_index < old_count || new_index < new_count) {
if (old_index == old_count) {
- addClient(wins[new_index++]);
+ clientsToAdd.append(wins[new_index++]);
} else if (new_index == new_count) {
- removeClient(p->clients[old_index++]);
+ clientsToRemove.append(p->clients[old_index++]);
} else {
if (p->clients[old_index] <
wins[new_index]) {
- removeClient(p->clients[old_index++]);
+ clientsToRemove.append(p->clients[old_index++]);
} else if (wins[new_index] <
p->clients[old_index]) {
- addClient(wins[new_index++]);
+ clientsToAdd.append(wins[new_index++]);
} else {
new_index++;
old_index++;
@@ -2152,7 +2155,7 @@
unsigned long n;
for (n = 0; n < nitems_ret; n++) {
- addClient(wins[n]);
+ clientsToAdd.append(wins[n]);
}
}
@@ -2166,7 +2169,7 @@
}
if( !read_ok ) {
for( unsigned int i = 0; i < p->clients_count; ++ i )
- removeClient(p->clients[i]);
+ clientsToRemove.append(p->clients[i]);
p->clients_count = 0;
delete[] p->clients;
p->clients = NULL;
@@ -2176,6 +2179,12 @@
fprintf(stderr, "NETRootInfo::update: client list updated (%ld clients)\n",
p->clients_count);
#endif
+ for (int i = 0; i < clientsToRemove.size(); ++i) {
+ removeClient(clientsToRemove.at(i));
+ }
+ for (int i = 0; i < clientsToAdd.size(); ++i) {
+ addClient(clientsToAdd.at(i));
+ }
}
if (dirty & ClientListStacking) {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic