summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-07-27 13:27:12 +0300
committerKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2010-07-27 13:28:29 +0300
commit58e79afa1f52c04e7c523ecad6ea0e09d62b5a29 (patch)
tree3631e6980c85efe37dcf2295175d94e2f9340714 /src
parentb9fe6272ce987cc93f940a0ad5be31bd9afeadc1 (diff)
pre-create MWindowPropertyCaches for likely application windows in startup.
Diffstat (limited to 'src')
-rw-r--r--src/mcompositemanager.cpp36
-rw-r--r--src/mcompositemanager_p.h4
-rw-r--r--src/mwindowpropertycache.cpp15
3 files changed, 35 insertions, 20 deletions
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp
index 1b96afe..3404fa0 100644
--- a/src/mcompositemanager.cpp
+++ b/src/mcompositemanager.cpp
@@ -1229,9 +1229,6 @@ void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e)
return;
}
prop_caches[e->window] = pc;
- // required to get property changes happening before mapping
- XSelectInput(dpy, e->window, PropertyChangeMask);
- XShapeSelectInput(dpy, e->window, ShapeNotifyMask);
// we know the parent due to SubstructureRedirectMask on root window
pc->setParentWindow(RootWindow(dpy, 0));
}
@@ -2455,7 +2452,10 @@ void MCompositeManagerPrivate::redirectWindows()
qCritical("XQueryTree failed");
return;
}
-
+ int xres = ScreenOfDisplay(QX11Info::display(),
+ DefaultScreen(QX11Info::display()))->width;
+ int yres = ScreenOfDisplay(QX11Info::display(),
+ DefaultScreen(QX11Info::display()))->height;
for (i = 0; i < children; ++i) {
xcb_get_window_attributes_reply_t *attr;
attr = xcb_get_window_attributes_reply(xcb_conn,
@@ -2467,11 +2467,23 @@ void MCompositeManagerPrivate::redirectWindows()
xcb_get_geometry(xcb_conn, kids[i]), 0);
if (!geom)
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))
+ && !prop_caches.contains(kids[i])) {
+ // attr and geom are freed later
+ MWindowPropertyCache *p = new MWindowPropertyCache(kids[i],
+ attr, geom);
+ prop_caches[kids[i]] = p;
+ p->setParentWindow(RootWindow(QX11Info::display(), 0));
+ } else {
+ free(attr);
+ free(geom);
+ }
if (attr->map_state == XCB_MAP_STATE_VIEWABLE &&
localwin != kids[i] &&
(geom->width > 1 && geom->height > 1)) {
- // attr and geom are freed later
- MCompositeWindow* window = bindWindow(kids[i], attr, geom);
+ MCompositeWindow* window = bindWindow(kids[i]);
if (window) {
window->setNewlyMapped(false);
window->setVisible(true);
@@ -2479,9 +2491,6 @@ void MCompositeManagerPrivate::redirectWindows()
continue;
grab_pointer_keyboard(kids[i]);
}
- } else {
- free(attr);
- free(geom);
}
}
if (kids)
@@ -2614,9 +2623,7 @@ void MCompositeManagerPrivate::roughSort()
stacking_list = QList<Window>::fromVector(v);
}
-MCompositeWindow *MCompositeManagerPrivate::bindWindow(Window window,
- xcb_get_window_attributes_reply_t *wa,
- xcb_get_geometry_reply_t *geom)
+MCompositeWindow *MCompositeManagerPrivate::bindWindow(Window window)
{
Display *display = QX11Info::display();
@@ -2629,11 +2636,8 @@ MCompositeWindow *MCompositeManagerPrivate::bindWindow(Window window,
MWindowPropertyCache *wpc;
if (prop_caches.contains(window)) {
wpc = prop_caches.value(window);
- if (wa) free(wa);
- if (geom) free(geom);
} else {
- // MWindowPropertyCache frees wa
- wpc = new MWindowPropertyCache(window, wa, geom);
+ wpc = new MWindowPropertyCache(window);
prop_caches[window] = wpc;
}
wpc->setIsMapped(true);
diff --git a/src/mcompositemanager_p.h b/src/mcompositemanager_p.h
index 7944a19..5f8d6e8 100644
--- a/src/mcompositemanager_p.h
+++ b/src/mcompositemanager_p.h
@@ -70,9 +70,7 @@ public:
~MCompositeManagerPrivate();
static Window parentWindow(Window child);
- MCompositeWindow *bindWindow(Window w,
- xcb_get_window_attributes_reply_t *attr = 0,
- xcb_get_geometry_reply_t *geom = 0);
+ MCompositeWindow *bindWindow(Window w);
QGraphicsScene *scene();
void prepare();
diff --git a/src/mwindowpropertycache.cpp b/src/mwindowpropertycache.cpp
index 85a228d..eaac9a3 100644
--- a/src/mwindowpropertycache.cpp
+++ b/src/mwindowpropertycache.cpp
@@ -78,6 +78,13 @@ MWindowPropertyCache::MWindowPropertyCache(Window w,
}
is_valid = true;
+ if (!isMapped()) {
+ // required to get property changes happening before mapping
+ // (after mapping, MCompositeManager sets the window's input mask)
+ XSelectInput(QX11Info::display(), window, PropertyChangeMask);
+ XShapeSelectInput(QX11Info::display(), window, ShapeNotifyMask);
+ }
+
xcb_is_decorator_cookie = xcb_get_property(xcb_conn, 0, window,
ATOM(_MEEGOTOUCH_DECORATOR_WINDOW),
XCB_ATOM_CARDINAL, 0, 1);
@@ -370,7 +377,13 @@ bool MWindowPropertyCache::propertyEvent(XPropertyEvent *e)
XCB_ATOM_WM_HINTS, XCB_ATOM_WM_HINTS, 0, 10);
return true;
} else if (e->atom == ATOM(_NET_WM_WINDOW_TYPE)) {
- qWarning("_NET_WM_WINDOW_TYPE for 0x%lx changed", window);
+ if (window_type == MCompAtoms::INVALID)
+ // collect the old reply
+ windowType();
+ window_type = MCompAtoms::INVALID;
+ xcb_window_type_cookie = xcb_get_property(xcb_conn, 0, window,
+ ATOM(_NET_WM_WINDOW_TYPE),
+ XCB_ATOM_ATOM, 0, MAX_TYPES);
} else if (e->atom == ATOM(_NET_WM_ICON_GEOMETRY)) {
if (!icon_geometry_valid)
// collect the old reply