diff options
author | Abdiel Janulgue <abdiel.janulgue@nokia.com> | 2010-11-15 13:12:20 +0200 |
---|---|---|
committer | Abdiel Janulgue <abdiel.janulgue@nokia.com> | 2010-11-15 13:12:20 +0200 |
commit | d96ffddc070645a43c3be68224c44ca0ed74c8e0 (patch) | |
tree | 642fe510e052087bed36917e7fcbe5525b5ee252 | |
parent | 9afe445e853bde382d5a927ce8e064d06c512b7c (diff) | |
parent | 3bc757ebd6638397c81994f7d31c6dea28f228df (diff) |
Merge branch 'master' of git@gitorious.org:meegotouch/meegotouch-compositor
-rw-r--r-- | debian/control | 2 | ||||
-rw-r--r-- | decorators/mdecorator/mdecoratorwindow.cpp | 17 | ||||
-rw-r--r-- | src/mcompositemanager.cpp | 23 | ||||
-rw-r--r-- | src/mdecoratorframe.cpp | 20 | ||||
-rw-r--r-- | src/mdecoratorframe.h | 5 | ||||
-rw-r--r-- | src/mtexturepixmapitem_p.cpp | 3 |
6 files changed, 59 insertions, 11 deletions
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 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) { diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index eef65bb..d8d6efd 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); } } @@ -2962,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)) @@ -2973,6 +2991,8 @@ void MCompositeManagerPrivate::redirectWindows() attr, geom); if (!p->is_valid) { delete p; + free(attr); + free(geom); continue; } prop_caches[kids[i]] = p; @@ -3415,6 +3435,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 @@ -80,6 +80,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. */ void setDecoratorWindow(Qt::HANDLE window); 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() |