summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbdiel Janulgue <abdiel.janulgue@nokia.com>2010-11-15 13:12:20 +0200
committerAbdiel Janulgue <abdiel.janulgue@nokia.com>2010-11-15 13:12:20 +0200
commitd96ffddc070645a43c3be68224c44ca0ed74c8e0 (patch)
tree642fe510e052087bed36917e7fcbe5525b5ee252
parent9afe445e853bde382d5a927ce8e064d06c512b7c (diff)
parent3bc757ebd6638397c81994f7d31c6dea28f228df (diff)
Merge branch 'master' of git@gitorious.org:meegotouch/meegotouch-compositor
-rw-r--r--debian/control2
-rw-r--r--decorators/mdecorator/mdecoratorwindow.cpp17
-rw-r--r--src/mcompositemanager.cpp23
-rw-r--r--src/mdecoratorframe.cpp20
-rw-r--r--src/mdecoratorframe.h5
-rw-r--r--src/mtexturepixmapitem_p.cpp3
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()