From d3ba9578e6f122c1b9bbb8e7026a8a2028ac8713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20H=E4m=E4l=E4inen?= Date: Fri, 12 Nov 2010 14:16:42 +0200 Subject: Revert "remove MDecoratorFrame::setOnlyStatusbar()" This reverts commit d4aff900d3fffe6be44ddb7c58fa5323907c4fea. --- src/mcompositemanager.cpp | 17 +++++++++++++++++ src/mdecoratorframe.cpp | 20 +++++++++++++++----- src/mdecoratorframe.h | 5 +++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index eef65bb..f450ada 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -486,6 +486,7 @@ static void fullscreen_wm_state(MCompositeManagerPrivate *priv, && priv->needDecoration(window, win->propertyCache())) { win->setDecorated(true); MDecoratorFrame::instance()->setManagedWindow(win); + MDecoratorFrame::instance()->setOnlyStatusbar(false); MDecoratorFrame::instance()->raise(); } else if (win && need_geometry_modify(window) && !availScreenRect.isEmpty()) { @@ -1223,10 +1224,13 @@ void MCompositeManagerPrivate::unmapEvent(XUnmapEvent *e) } else { if (cw->status() == MCompositeWindow::Hung) { MDecoratorFrame::instance()->setManagedWindow(cw, true); + MDecoratorFrame::instance()->setOnlyStatusbar(false); } else if (FULLSCREEN_WINDOW(cw) && device_state->ongoingCall()) { MDecoratorFrame::instance()->setManagedWindow(cw, true); + MDecoratorFrame::instance()->setOnlyStatusbar(true); } else { MDecoratorFrame::instance()->setManagedWindow(cw); + MDecoratorFrame::instance()->setOnlyStatusbar(false); } } } @@ -1296,8 +1300,10 @@ void MCompositeManagerPrivate::configureEvent(XConfigureEvent *e) item->status() != MCompositeWindow::Hung) { // ongoing call case MDecoratorFrame::instance()->setManagedWindow(item, true); + MDecoratorFrame::instance()->setOnlyStatusbar(true); } else { MDecoratorFrame::instance()->setManagedWindow(item); + MDecoratorFrame::instance()->setOnlyStatusbar(false); } MDecoratorFrame::instance()->decoratorItem()->setVisible(true); MDecoratorFrame::instance()->raise(); @@ -1529,6 +1535,7 @@ void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e) MDecoratorFrame::instance()->setManagedWindow(cw, true); } else if (FULLSCREEN_WINDOW(cw) && device_state->ongoingCall()) { MDecoratorFrame::instance()->setManagedWindow(cw, true); + MDecoratorFrame::instance()->setOnlyStatusbar(true); } else MDecoratorFrame::instance()->setManagedWindow(cw); } @@ -2415,6 +2422,7 @@ void MCompositeManagerPrivate::rootMessageEvent(XClientMessageEvent *event) && FULLSCREEN_WINDOW(ping_source)) { // ongoing call decorator MDecoratorFrame::instance()->setAutoRotation(false); + MDecoratorFrame::instance()->setOnlyStatusbar(true); } } } @@ -2660,10 +2668,16 @@ void MCompositeManagerPrivate::activateWindow(Window w, Time timestamp, // fullscreen window has decorator above it during ongoing call // and when it's jammed MDecoratorFrame::instance()->setManagedWindow(cw, true); + if (cw->status() == MCompositeWindow::Hung) + MDecoratorFrame::instance()->setOnlyStatusbar(false); + else + MDecoratorFrame::instance()->setOnlyStatusbar(true); } else if (cw->status() == MCompositeWindow::Hung) { MDecoratorFrame::instance()->setManagedWindow(cw, true); + MDecoratorFrame::instance()->setOnlyStatusbar(false); } else { MDecoratorFrame::instance()->setManagedWindow(cw); + MDecoratorFrame::instance()->setOnlyStatusbar(false); } } } else if (pc->isDecorator()) { @@ -2721,6 +2735,7 @@ void MCompositeManagerPrivate::callOngoing(bool ongoing_call) if (cw && FULLSCREEN_WINDOW(cw)) { cw->setDecorated(true); MDecoratorFrame::instance()->setManagedWindow(cw, true); + MDecoratorFrame::instance()->setOnlyStatusbar(true); } dirtyStacking(false); } else { @@ -2731,6 +2746,7 @@ void MCompositeManagerPrivate::callOngoing(bool ongoing_call) if (FULLSCREEN_WINDOW(i) && i->needDecoration()) i->setDecorated(false); } + MDecoratorFrame::instance()->setOnlyStatusbar(false); dirtyStacking(false); } } @@ -3415,6 +3431,7 @@ void MCompositeManagerPrivate::gotHungWindow(MCompositeWindow *w) // own the window so we could kill it if we want to. MDecoratorFrame::instance()->setManagedWindow(w, true); + MDecoratorFrame::instance()->setOnlyStatusbar(false); MDecoratorFrame::instance()->setAutoRotation(true); dirtyStacking(false); MDecoratorFrame::instance()->raise(); diff --git a/src/mdecoratorframe.cpp b/src/mdecoratorframe.cpp index f2a6079..7eaeffc 100644 --- a/src/mdecoratorframe.cpp +++ b/src/mdecoratorframe.cpp @@ -131,12 +131,7 @@ void MDecoratorFrame::setManagedWindow(MCompositeWindow *cw, void MDecoratorFrame::setDecoratorWindow(Qt::HANDLE window) { - unsigned char one = 1; decorator_window = window; - XChangeProperty(QX11Info::display(), decorator_window, - XInternAtom(QX11Info::display(), - "_MDECORATOR_ONLY_STATUSBAR", False), - XA_CARDINAL, 32, PropModeReplace, &one, 1); XMapWindow(QX11Info::display(), window); } @@ -216,3 +211,18 @@ void MDecoratorFrame::setAutoRotation(bool mode) remote_decorator->invoke("MAbstractDecorator", "RemoteSetAutoRotation", mode); } + +void MDecoratorFrame::setOnlyStatusbar(bool mode) +{ + if (decorator_window) { + long val = mode; + Atom a = XInternAtom(QX11Info::display(), + "_MDECORATOR_ONLY_STATUSBAR", False); + XChangeProperty(QX11Info::display(), decorator_window, a, XA_CARDINAL, + 32, PropModeReplace, (unsigned char *)&val, 1); + } + /* FIXME: replaced with a window property due to reliability problems + remote_decorator->invoke("MAbstractDecorator", + "RemoteSetOnlyStatusbar", mode); + */ +} diff --git a/src/mdecoratorframe.h b/src/mdecoratorframe.h index 31393ee..afb26e3 100644 --- a/src/mdecoratorframe.h +++ b/src/mdecoratorframe.h @@ -79,6 +79,11 @@ public: */ void setAutoRotation(bool mode); + /*! + * Sets the "only statusbar" mode. + */ + void setOnlyStatusbar(bool mode); + /*! * Sets the decorator window and maps that window if it is unmapped. */ -- cgit v1.2.3 From f34f14153ef1f9835a2322c06bed33ebbd87968f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20H=E4m=E4l=E4inen?= Date: Fri, 12 Nov 2010 17:25:56 +0200 Subject: fix couple of memory leaks spotted by Valgrind --- src/mcompositemanager.cpp | 6 +++++- src/mtexturepixmapitem_p.cpp | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index f450ada..d8d6efd 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -2978,8 +2978,10 @@ void MCompositeManagerPrivate::redirectWindows() xcb_get_geometry_reply_t *geom; geom = xcb_get_geometry_reply(xcb_conn, xcb_get_geometry(xcb_conn, kids[i]), 0); - if (!geom) + if (!geom) { + free(attr); continue; + } // Pre-create MWindowPropertyCache for likely application windows if (localwin != kids[i] && (attr->map_state == XCB_MAP_STATE_VIEWABLE || (geom->width == xres && geom->height == yres)) @@ -2989,6 +2991,8 @@ void MCompositeManagerPrivate::redirectWindows() attr, geom); if (!p->is_valid) { delete p; + free(attr); + free(geom); continue; } prop_caches[kids[i]] = p; diff --git a/src/mtexturepixmapitem_p.cpp b/src/mtexturepixmapitem_p.cpp index 035ff66..4c1e4c3 100644 --- a/src/mtexturepixmapitem_p.cpp +++ b/src/mtexturepixmapitem_p.cpp @@ -433,6 +433,9 @@ MTexturePixmapPrivate::~MTexturePixmapPrivate() if (windowp) XFreePixmap(QX11Info::display(), windowp); + + if (pastDamages) + delete pastDamages; } void MTexturePixmapPrivate::saveBackingStore() -- cgit v1.2.3 From 1a37e0e6988978bbc714f662b7207dad22b38da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20H=E4m=E4l=E4inen?= Date: Fri, 12 Nov 2010 15:31:16 +0200 Subject: fix boundingRect calculations in MDecoratorWindow --- decorators/mdecorator/mdecoratorwindow.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/decorators/mdecorator/mdecoratorwindow.cpp b/decorators/mdecorator/mdecoratorwindow.cpp index 6b96631..3c5428e 100644 --- a/decorators/mdecorator/mdecoratorwindow.cpp +++ b/decorators/mdecorator/mdecoratorwindow.cpp @@ -246,15 +246,24 @@ void MDecoratorWindow::setInputRegion() { static XRectangle prev_rect = {0, 0, 0, 0}; QRegion region; - region += statusBar->geometry().toRect(); + QRect r_tmp(statusBar->geometry().toRect()); + region += statusBar->mapToScene(r_tmp).boundingRect().toRect(); if (!only_statusbar) { - region += navigationBar->geometry().toRect(); - region += homeButtonPanel->geometry().toRect(); - region += escapeButtonPanel->geometry().toRect(); + r_tmp = QRect(navigationBar->geometry().toRect()); + region += navigationBar->mapToScene(r_tmp).boundingRect().toRect(); + r_tmp = QRect(homeButtonPanel->geometry().toRect()); + region += homeButtonPanel->mapToScene(r_tmp).boundingRect().toRect(); + r_tmp = QRect(escapeButtonPanel->geometry().toRect()); + region += escapeButtonPanel->mapToScene(r_tmp).boundingRect().toRect(); } const QRect fs(QApplication::desktop()->screenGeometry()); decoratorRect = region.boundingRect(); + // crop it to fullscreen to work around a weird issue + if (decoratorRect.width() > fs.width()) + decoratorRect.setWidth(fs.width()); + if (decoratorRect.height() > fs.height()) + decoratorRect.setHeight(fs.height()); if (!only_statusbar && decoratorRect.width() > fs.width() / 2 && decoratorRect.height() > fs.height() / 2) { -- cgit v1.2.3 From 3bc757ebd6638397c81994f7d31c6dea28f228df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20H=E4m=E4l=E4inen?= Date: Mon, 15 Nov 2010 11:26:29 +0200 Subject: add x11-utils to mcompositor-functional-tests dependencies --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 3326dca..abcde41 100644 --- a/debian/control +++ b/debian/control @@ -34,7 +34,7 @@ Description: commandline tools for testing mcompositor Package: mcompositor-functional-tests Architecture: any -Depends: libmeegotouchcore0, ci-testing, meego-env-dimming, meego-env-behave, python, contextkit-utils, aegis-dss-tools [arm armel], mcompositor-utils, ${shlibs:Depends} +Depends: libmeegotouchcore0, ci-testing, meego-env-dimming, meego-env-behave, python, contextkit-utils, aegis-dss-tools [arm armel], x11-utils, mcompositor-utils, ${shlibs:Depends} XB-Maemo-CI-Packages: mcompositor XB-Maemo-CI-Stage: fast Description: mcompositor functional testcases -- cgit v1.2.3