diff options
author | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-07-27 13:27:12 +0300 |
---|---|---|
committer | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-07-27 13:28:29 +0300 |
commit | 58e79afa1f52c04e7c523ecad6ea0e09d62b5a29 (patch) | |
tree | 3631e6980c85efe37dcf2295175d94e2f9340714 /src | |
parent | b9fe6272ce987cc93f940a0ad5be31bd9afeadc1 (diff) |
pre-create MWindowPropertyCaches for likely application windows in startup.
Diffstat (limited to 'src')
-rw-r--r-- | src/mcompositemanager.cpp | 36 | ||||
-rw-r--r-- | src/mcompositemanager_p.h | 4 | ||||
-rw-r--r-- | src/mwindowpropertycache.cpp | 15 |
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 |