diff options
author | 2012-09-05 21:05:45 +0000 | |
---|---|---|
committer | 2012-09-05 21:05:45 +0000 | |
commit | c226fe91f5bb6b254a69b3cd9d3a1c7fd534d887 (patch) | |
tree | 2b91cc5647b302c0d62f18bf1a9b74f76642c647 /kde-base | |
parent | initial commit (diff) | |
download | gentoo-2-c226fe91f5bb6b254a69b3cd9d3a1c7fd534d887.tar.gz gentoo-2-c226fe91f5bb6b254a69b3cd9d3a1c7fd534d887.tar.bz2 gentoo-2-c226fe91f5bb6b254a69b3cd9d3a1c7fd534d887.zip |
Revision bump adds upstream patch which fixes an regression, that can causes freezes on tabbing by packagers ml.
(Portage version: 2.2.0_alpha124/cvs/Linux x86_64)
Diffstat (limited to 'kde-base')
-rw-r--r-- | kde-base/kwin/ChangeLog | 9 | ||||
-rw-r--r-- | kde-base/kwin/files/kwin-4.9.1-tab-freeze.patch | 182 | ||||
-rw-r--r-- | kde-base/kwin/kwin-4.9.1-r1.ebuild (renamed from kde-base/kwin/kwin-4.9.1.ebuild) | 4 |
3 files changed, 193 insertions, 2 deletions
diff --git a/kde-base/kwin/ChangeLog b/kde-base/kwin/ChangeLog index 269185436477..6c4603c9bf16 100644 --- a/kde-base/kwin/ChangeLog +++ b/kde-base/kwin/ChangeLog @@ -1,6 +1,13 @@ # ChangeLog for kde-base/kwin # Copyright 1999-2012 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/kde-base/kwin/ChangeLog,v 1.291 2012/09/05 11:21:54 kensington Exp $ +# $Header: /var/cvsroot/gentoo-x86/kde-base/kwin/ChangeLog,v 1.292 2012/09/05 21:05:45 johu Exp $ + +*kwin-4.9.1-r1 (05 Sep 2012) + + 05 Sep 2012; Johannes Huber <johu@gentoo.org> + +files/kwin-4.9.1-tab-freeze.patch, +kwin-4.9.1-r1.ebuild, -kwin-4.9.1.ebuild: + Revision bump adds upstream patch which fixes an regression, that can causes + freezes on tabbing by packagers ml. 05 Sep 2012; Michael Palimaka <kensington@gentoo.org> kwin-4.9.1.ebuild: Unrestrict tests wrt bug #428348. diff --git a/kde-base/kwin/files/kwin-4.9.1-tab-freeze.patch b/kde-base/kwin/files/kwin-4.9.1-tab-freeze.patch new file mode 100644 index 000000000000..8f944903e15c --- /dev/null +++ b/kde-base/kwin/files/kwin-4.9.1-tab-freeze.patch @@ -0,0 +1,182 @@ +commit 8452e6c3f01a65953705087e0d7ada87e2cc6997 +Author: Martin Gräßlin <mgraesslin@kde.org> +Date: Wed Sep 5 20:55:07 2012 +0200 + + Ensure that the start Client to build up the ClientModel is in the Focus Chain + + If the start Client is not part of the focus chain the call to + nextClientFocusChain() cannot return the Client again. So the loop break + condition is never reached and as the focus chain is not empty the call + always returns a not null Client which means KWin is caught in an endless + loop. + + This change checks that the starting Client is in the focus chain and if + not the first Client of the focus chain is used. + + BUG: 306260 + BUG: 306275 + FIXED-IN: 4.9.2 + +diff --git a/kwin/tabbox/clientmodel.cpp b/kwin/tabbox/clientmodel.cpp +index 9591bab..a67d979 100644 +--- a/kwin/tabbox/clientmodel.cpp ++++ b/kwin/tabbox/clientmodel.cpp +@@ -188,7 +188,7 @@ void ClientModel::createClientList(int desktop, bool partialReset) + switch(tabBox->config().clientSwitchingMode()) { + case TabBoxConfig::FocusChainSwitching: { + TabBoxClient* c = start; +- if (!c) { ++ if (!tabBox->isInFocusChain(c)) { + QSharedPointer<TabBoxClient> firstClient = tabBox->firstClientFocusChain().toStrongRef(); + if (firstClient) { + c = firstClient.data(); +diff --git a/kwin/tabbox/tabbox.cpp b/kwin/tabbox/tabbox.cpp +index d96d0bd..7a08d37 100644 +--- a/kwin/tabbox/tabbox.cpp ++++ b/kwin/tabbox/tabbox.cpp +@@ -112,6 +112,14 @@ QWeakPointer< TabBoxClient > TabBoxHandlerImpl::firstClientFocusChain() const + } + } + ++bool TabBoxHandlerImpl::isInFocusChain(TabBoxClient *client) const ++{ ++ if (TabBoxClientImpl *c = static_cast<TabBoxClientImpl*>(client)) { ++ return Workspace::self()->globalFocusChain().contains(c->client()); ++ } ++ return false; ++} ++ + int TabBoxHandlerImpl::nextDesktopFocusChain(int desktop) const + { + return m_tabBox->nextDesktopFocusChain(desktop); +diff --git a/kwin/tabbox/tabbox.h b/kwin/tabbox/tabbox.h +index 6652f93..bba0b39 100644 +--- a/kwin/tabbox/tabbox.h ++++ b/kwin/tabbox/tabbox.h +@@ -52,6 +52,7 @@ public: + virtual QString desktopName(int desktop) const; + virtual QWeakPointer< TabBoxClient > nextClientFocusChain(TabBoxClient* client) const; + virtual QWeakPointer< TabBoxClient > firstClientFocusChain() const; ++ virtual bool isInFocusChain (TabBoxClient* client) const; + virtual int nextDesktopFocusChain(int desktop) const; + virtual int numberOfDesktops() const; + virtual TabBoxClientList stackingOrder() const; +diff --git a/kwin/tabbox/tabboxhandler.h b/kwin/tabbox/tabboxhandler.h +index 7abddfc..2af65b2 100644 +--- a/kwin/tabbox/tabboxhandler.h ++++ b/kwin/tabbox/tabboxhandler.h +@@ -120,6 +120,20 @@ public: + **/ + virtual QWeakPointer<TabBoxClient> firstClientFocusChain() const = 0; + /** ++ * Checks whether the given @p client is part of the focus chain at all. ++ * This is useful to figure out whether the currently active Client can be used ++ * as a starting point to construct the recently used list. ++ * ++ * In case the @p client is not in the focus chain it is recommended to use the ++ * Client returned by @link firstClientFocusChain. ++ * ++ * The method accepts a @c null Client and in that case @c false is returned. ++ * @param client The Client to check whether it is in the Focus Chain ++ * @return @c true in case the Client is part of the focus chain, @c false otherwise. ++ * @since 4.9.2 ++ **/ ++ virtual bool isInFocusChain(TabBoxClient* client) const = 0; ++ /** + * @param client The client whose desktop name should be retrieved + * @return The desktop name of the given TabBoxClient. If the client is + * on all desktops the name of current desktop will be returned. +diff --git a/kwin/tabbox/tests/mock_tabboxhandler.cpp b/kwin/tabbox/tests/mock_tabboxhandler.cpp +index c3ad7a9..20fe8e8 100644 +--- a/kwin/tabbox/tests/mock_tabboxhandler.cpp ++++ b/kwin/tabbox/tests/mock_tabboxhandler.cpp +@@ -72,6 +72,9 @@ QWeakPointer< TabBox::TabBoxClient > MockTabBoxHandler::nextClientFocusChain(Tab + } + } + } ++ if (!m_windows.isEmpty()) { ++ return QWeakPointer< TabBox::TabBoxClient >(m_windows.last()); ++ } + return QWeakPointer< TabBox::TabBoxClient >(); + } + +@@ -83,6 +86,20 @@ QWeakPointer< TabBox::TabBoxClient > MockTabBoxHandler::firstClientFocusChain() + return m_windows.first(); + } + ++bool MockTabBoxHandler::isInFocusChain(TabBox::TabBoxClient *client) const ++{ ++ if (!client) { ++ return false; ++ } ++ QList< QSharedPointer< TabBox::TabBoxClient > >::const_iterator it = m_windows.constBegin(); ++ for (; it != m_windows.constEnd(); ++it) { ++ if ((*it).data() == client) { ++ return true; ++ } ++ } ++ return false; ++} ++ + QWeakPointer< TabBox::TabBoxClient > MockTabBoxHandler::createMockWindow(const QString &caption, WId id) + { + QSharedPointer< TabBox::TabBoxClient > client(new MockTabBoxClient(caption, id)); +diff --git a/kwin/tabbox/tests/mock_tabboxhandler.h b/kwin/tabbox/tests/mock_tabboxhandler.h +index a223648..5578001 100644 +--- a/kwin/tabbox/tests/mock_tabboxhandler.h ++++ b/kwin/tabbox/tests/mock_tabboxhandler.h +@@ -60,6 +60,7 @@ public: + } + virtual QWeakPointer< TabBox::TabBoxClient > nextClientFocusChain(TabBox::TabBoxClient *client) const; + virtual QWeakPointer<TabBox::TabBoxClient> firstClientFocusChain() const; ++ virtual bool isInFocusChain (TabBox::TabBoxClient* client) const; + virtual int nextDesktopFocusChain(int desktop) const { + Q_UNUSED(desktop) + return 1; +diff --git a/kwin/tabbox/tests/test_tabbox_clientmodel.cpp b/kwin/tabbox/tests/test_tabbox_clientmodel.cpp +index 79d0253..cee9860 100644 +--- a/kwin/tabbox/tests/test_tabbox_clientmodel.cpp ++++ b/kwin/tabbox/tests/test_tabbox_clientmodel.cpp +@@ -63,4 +63,24 @@ void TestTabBoxClientModel::testCreateClientListNoActiveClient() + QCOMPARE(clientModel->rowCount(), 2); + } + ++void TestTabBoxClientModel::testCreateClientListActiveClientNotInFocusChain() ++{ ++ MockTabBoxHandler tabboxhandler; ++ tabboxhandler.setConfig(TabBox::TabBoxConfig()); ++ TabBox::ClientModel *clientModel = new TabBox::ClientModel(&tabboxhandler); ++ // create two windows, rowCount() should go to two ++ QWeakPointer<TabBox::TabBoxClient> client = tabboxhandler.createMockWindow(QString("test"), 1); ++ client = tabboxhandler.createMockWindow(QString("test2"), 2); ++ clientModel->createClientList(); ++ QCOMPARE(clientModel->rowCount(), 2); ++ ++ // simulate that the active client is not in the focus chain ++ // for that we use the closeWindow of the MockTabBoxHandler which ++ // removes the Client from the Focus Chain but leaves the active window as it is ++ QSharedPointer<TabBox::TabBoxClient> clientOwner = client.toStrongRef(); ++ tabboxhandler.closeWindow(client.data()); ++ clientModel->createClientList(); ++ QCOMPARE(clientModel->rowCount(), 1); ++} ++ + QTEST_MAIN(TestTabBoxClientModel) +diff --git a/kwin/tabbox/tests/test_tabbox_clientmodel.h b/kwin/tabbox/tests/test_tabbox_clientmodel.h +index 2ec6608..fad7987 100644 +--- a/kwin/tabbox/tests/test_tabbox_clientmodel.h ++++ b/kwin/tabbox/tests/test_tabbox_clientmodel.h +@@ -40,6 +40,13 @@ private slots: + * See BUG: 305449 + **/ + void testCreateClientListNoActiveClient(); ++ /** ++ * Tests the creation of the Client list for the case that ++ * the active Client is not in the Focus chain. ++ * ++ * See BUG: 306260 ++ **/ ++ void testCreateClientListActiveClientNotInFocusChain(); + }; + + #endif diff --git a/kde-base/kwin/kwin-4.9.1.ebuild b/kde-base/kwin/kwin-4.9.1-r1.ebuild index d9773398abf0..f118f6ae5ae2 100644 --- a/kde-base/kwin/kwin-4.9.1.ebuild +++ b/kde-base/kwin/kwin-4.9.1-r1.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/kde-base/kwin/kwin-4.9.1.ebuild,v 1.2 2012/09/05 11:21:54 kensington Exp $ +# $Header: /var/cvsroot/gentoo-x86/kde-base/kwin/kwin-4.9.1-r1.ebuild,v 1.1 2012/09/05 21:05:45 johu Exp $ EAPI=4 @@ -49,6 +49,8 @@ KMEXTRACTONLY=" # you need one of these REQUIRED_USE="!opengl? ( gles ) !gles? ( opengl )" +PATCHES=("${FILESDIR}/${P}-tab-freeze.patch") + src_configure() { # FIXME Remove when activity API moved away from libkworkspace append-cppflags "-I${EPREFIX}/usr/include/kworkspace" |