From kde-core-devel Thu Nov 07 15:52:06 2002 From: Antonio Larrosa =?iso-8859-15?q?Jim=E9nez?= Date: Thu, 07 Nov 2002 15:52:06 +0000 To: kde-core-devel Subject: Patch for kicker/taskbar X-MARC-Message: https://marc.info/?l=kde-core-devel&m=103668448920785 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--Boundary-00=_mwoy9KBxS/iC7+v" --Boundary-00=_mwoy9KBxS/iC7+v Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello, This patch fixes kicker from a complete and unrecoverable hang (which, btw, is not solved by "killall -9 kicker ; kicker &" because it just hangs before showing up when run again) when a window is moved to an out-of-range desktop. You can move a window to a wrong desktop for example just by calling "kstart --desktop 42 konsole" for example (note my next mail). Note that I said "for example" because anybody can find ways to move windows wrong (just by calling NETWinInfo::setDesktop(42) in a broken app), and we don't want kicker to crash under any circumstance (IMHO) so I think this should be applied. Can I commit? Greetings, -- Antonio Larrosa Jimenez KDE core developer - larrosa@kde.org http://devel-home.kde.org/~larrosa/ The only thing that interferes with my learning is my education. --Boundary-00=_mwoy9KBxS/iC7+v Content-Type: text/x-diff; charset="us-ascii"; name="taskbar.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="taskbar.diff" Index: taskbar.cpp =================================================================== RCS file: /home/kde/kdebase/kicker/taskbar/taskbar.cpp,v retrieving revision 1.48 diff -u -p -r1.48 taskbar.cpp --- taskbar.cpp 2002/09/15 22:44:28 1.48 +++ taskbar.cpp 2002/11/07 15:16:21 @@ -399,14 +399,22 @@ void TaskBar::reLayout() // sort container list by desktop if ( sortByDesktop ) { TaskContainerList sorted; + /* antlarr: look for commentary about "residue" in + TaskContainer::updateFilteredTaskList() */ + TaskContainerList residue = list; for ( int desktop = -1; desktop <= taskManager()->numberOfDesktops(); desktop++ ) { for ( TaskContainerIterator it(list); it.current(); ++it ) { TaskContainer* c = it.current(); if ( c->desktop() == desktop ) + { sorted.append( c ); + residue.remove( c ); + } } } list = sorted; + for ( TaskContainer *c = residue.first(); c; c = residue.next() ) + list.append( c ); } // init content size Index: taskcontainer.cpp =================================================================== RCS file: /home/kde/kdebase/kicker/taskbar/taskcontainer.cpp,v retrieving revision 1.72 diff -u -p -r1.72 taskcontainer.cpp --- taskcontainer.cpp 2002/09/30 21:02:54 1.72 +++ taskcontainer.cpp 2002/11/07 15:16:22 @@ -813,12 +813,27 @@ void TaskContainer::updateFilteredTaskLi if ( sortByDesktop && ftasks.count() > 1 ) { TaskList sorted; + Task *t; + /* antlarr: residue shouldn't be needed, as "in theory" we already + iterate through all applications, but kicker is a core app and we + don't want it to crash nor hang under any circumstance in the real + world, so in case a window has been moved to an out-of-range desktop + (which may be possible just by calling NETWinInfo::setDesktop(42) ) + we want to keep sanity */ + TaskList residue = ftasks; for ( int desktop = -1; desktop <= taskManager->numberOfDesktops(); desktop++ ) { - for ( Task *t = ftasks.first(); t; t = ftasks.next() ) + for ( t = ftasks.first(); t; t = ftasks.next() ) if ( t->desktop() == desktop ) + { sorted.append( t ); + residue.remove( t ); + } } ftasks = sorted; + + for ( t = residue.first(); t; t = residue.next() ) + ftasks.append( t ); + } } --Boundary-00=_mwoy9KBxS/iC7+v--