extragear/utils/yakuake
Eike Hein
hein at kde.org
Mon May 24 21:08:08 CEST 2010
SVN commit 1130207 by hein:
Both Yakuake and KRunner used to suffer from the following bug: If there
are two monitors, the top edges of which are alined, and on one of those
monitors (but not the other) is a panel at the top edge, their windows
would appear at a distance away from the top edge equal in height to the
panel when appearing on the monitor without a panel.
This change fixes this bug in Yakuake generating a list of windows which
have top edge struts intersecting the geometry of the current screen, and
then handing that list to the variant of KWindowSystem::workArea() that
takes a list of windows to ignore in computing the work area as parameter.
The same change ought to be applied to KRunner, or a new workArea()
variant that does this should be added to KWindowSystem for convenience.
Thanks to Lubos for useful pointers.
BUG:147601
CCMAIL:plasma-devel at kde.org
CCMAIL:llunak at kde.org
M +3 -0 ChangeLog
M +34 -3 app/mainwindow.cpp
--- trunk/extragear/utils/yakuake/ChangeLog #1130206:1130207
@@ -20,6 +20,9 @@
if if was the last tab that had been clicked.
* Fixed a bug causing the title bar corner images of a theme not to be shown
when they don't have an alpha channel.
+* Fixed a bug causing the window to appear at a distance away from the top
+ edge of the screen matching the height of a panel at the top edge of
+ another screen in a multi-screen setup.
Changes in 2.9.6:
--- trunk/extragear/utils/yakuake/app/mainwindow.cpp #1130206:1130207
@@ -961,17 +961,48 @@
QRect MainWindow::getDesktopGeometry()
{
+ QRect screenGeometry = KApplication::desktop()->screenGeometry(getScreen());
+
QAction* action = actionCollection()->action("view-full-screen");
if (action->isChecked())
- return KApplication::desktop()->screenGeometry(getScreen());
+ return screenGeometry;
+ int currentDesktop = KWindowSystem::windowInfo(winId(), NET::CurrentDesktop).desktop();
+
if (KApplication::desktop()->numScreens() > 1)
- return KWindowSystem::workArea().intersect(KApplication::desktop()->screenGeometry(getScreen()));
+ {
+ const QList<WId> allWindows = KWindowSystem::windows();
+ QList<WId> offScreenWindows;
- return KWindowSystem::workArea();
+ QListIterator<WId> i(allWindows);
+
+ while (i.hasNext())
+ {
+ WId windowId = i.next();
+
+ if (KWindowSystem::hasWId(windowId))
+ {
+ KWindowInfo windowInfo = KWindowSystem::windowInfo(windowId, NET::WMVisibleName, NET::WM2ExtendedStrut);
+
+ if (windowInfo.valid() && windowInfo.desktop() == currentDesktop)
+ {
+ NETExtendedStrut strut = windowInfo.extendedStrut();
+
+ QRect topStrut(strut.top_start, 0, strut.top_end, strut.top_width);
+
+ if (!topStrut.intersects(screenGeometry))
+ offScreenWindows << windowId;
}
+ }
+ }
+ return KWindowSystem::workArea(offScreenWindows, currentDesktop).intersect(screenGeometry);
+ }
+
+ return KWindowSystem::workArea(currentDesktop);
+}
+
void MainWindow::whatsThis()
{
QWhatsThis::enterWhatsThisMode();
More information about the Plasma-devel
mailing list