diff options
-rw-r--r-- | src/mcompatoms_p.h | 1 | ||||
-rw-r--r-- | src/mcompositemanager.cpp | 69 | ||||
-rw-r--r-- | src/mtexturepixmapitem_egl.cpp | 5 | ||||
-rw-r--r-- | src/mwindowpropertycache.cpp | 56 | ||||
-rw-r--r-- | src/mwindowpropertycache.h | 7 |
5 files changed, 78 insertions, 60 deletions
diff --git a/src/mcompatoms_p.h b/src/mcompatoms_p.h index dac6567..3558c0a 100644 --- a/src/mcompatoms_p.h +++ b/src/mcompatoms_p.h @@ -109,7 +109,6 @@ public: int getPid(Window w); long getWmState(Window w); bool hasState(Window w, Atom a); - QRectF iconGeometry(Window w); QVector<Atom> getAtomArray(Window w, Atom array_atom); unsigned int get_opacity_prop(Display *dpy, Window w, unsigned int def); double get_opacity_percent(Display *dpy, Window w, double def); diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index 0e9f0d4..3b48882 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -213,25 +213,6 @@ bool MCompAtoms::hasState(Window w, Atom a) return states.indexOf(a) != -1; } -QRectF MCompAtoms::iconGeometry(Window w) -{ - Atom actual; - int format; - unsigned long n, left; - unsigned char *data; - int result = XGetWindowProperty(QX11Info::display(), w, atoms[_NET_WM_ICON_GEOMETRY], 0L, 4L, False, - XA_CARDINAL, &actual, &format, - &n, &left, &data); - if (result == Success && data != NULL) { - unsigned long *geom = (unsigned long *) data; - QRectF r(geom[0], geom[1], geom[2], geom[3]); - XFree((void *) data); - return r; - - } - return QRectF(); // empty -} - QVector<Atom> MCompAtoms::getAtomArray(Window w, Atom array_atom) { QVector<Atom> ret; @@ -309,27 +290,6 @@ double MCompAtoms::get_opacity_percent(Display *dpy, Window w, double def) return opacity * 1.0 / OPAQUE; } -int MCompAtoms::globalAlphaFromWindow(Window w) -{ - Atom actual; - int format; - unsigned long n, left; - - unsigned char *data = 0; - int result = XGetWindowProperty(QX11Info::display(), w, atoms[_MEEGOTOUCH_GLOBAL_ALPHA], 0L, 1L, False, - XA_CARDINAL, &actual, &format, - &n, &left, &data); - if (result == Success && data != NULL) { - unsigned int i; - memcpy(&i, data, sizeof(unsigned int)); - XFree((void *) data); - double opacity = i * 1.0 / OPAQUE; - return (opacity * 255); - } - - return 255; -} - Atom MCompAtoms::getAtom(const unsigned int name) { return atoms[name]; @@ -1225,16 +1185,21 @@ void MCompositeManagerPrivate::configureRequestEvent(XConfigureRequestEvent *e) void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e) { - MWindowPropertyCache *pc = new MWindowPropertyCache(e->window); - if (!pc->is_valid) { - delete pc; - return; - } Display *dpy = QX11Info::display(); - // required to get property changes happening before mapping - XSelectInput(dpy, e->window, PropertyChangeMask); + MWindowPropertyCache *pc; + if (prop_caches.contains(e->window)) + pc = prop_caches.value(e->window); + else { + pc = new MWindowPropertyCache(e->window); + if (!pc->is_valid) { + delete pc; + return; + } + prop_caches[e->window] = pc; + // required to get property changes happening before mapping + XSelectInput(dpy, e->window, PropertyChangeMask); + } - prop_caches[e->window] = pc; MCompAtoms::Type wtype = pc->windowType(); const XWindowAttributes* a = pc->windowAttributes(); if (!hasDock) { @@ -1642,7 +1607,6 @@ void MCompositeManagerPrivate::checkStacking(bool force_visibility_check, prev_only_mapped = QList<Window>(only_mapped); checkInputFocus(timestamp); - XSync(QX11Info::display(), False); } if (order_changed || force_visibility_check) { int xres = ScreenOfDisplay(QX11Info::display(), @@ -1757,7 +1721,7 @@ void MCompositeManagerPrivate::mapEvent(XMapEvent *e) // TODO: this should probably be done on the focus level. Rewrite this // once new stacking code from Kimmo is done // FIXME: this works only if this window is on top - int g_alpha = atom->globalAlphaFromWindow(win); + int g_alpha = wpc->globalAlpha(); if (g_alpha == 255) toggle_global_alpha_blend(0); else if (g_alpha < 255) @@ -1905,7 +1869,7 @@ void MCompositeManagerPrivate::rootMessageEvent(XClientMessageEvent *event) } if (i && i->pc->windowState() == IconicState) { i->setZValue(windows.size() + 1); - QRectF iconGeometry = atom->iconGeometry(raise); + QRectF iconGeometry = i->pc->iconGeometry(); i->setPos(iconGeometry.topLeft()); i->restore(iconGeometry, needComp); if (!device_state->displayOff() && should_be_pinged(i)) @@ -1953,7 +1917,6 @@ void MCompositeManagerPrivate::rootMessageEvent(XClientMessageEvent *event) XSendEvent(QX11Info::display(), close_window, False, NoEventMask, &ev); setExposeDesktop(true); - XSync(QX11Info::display(), False); MCompositeWindow *check_hung = w; if (check_hung) { @@ -2049,7 +2012,7 @@ void MCompositeManagerPrivate::clientMessageEvent(XClientMessageEvent *event) // Delayed transition is only available on platforms // that have selective compositing. This is triggered // when windows are rendered off-screen - i->iconify(atom->iconGeometry(lower), needComp); + i->iconify(i->pc->iconGeometry(), needComp); if (i->needDecoration()) i->startTransition(); i->stopPing(); diff --git a/src/mtexturepixmapitem_egl.cpp b/src/mtexturepixmapitem_egl.cpp index ff93efc..bb3920a 100644 --- a/src/mtexturepixmapitem_egl.cpp +++ b/src/mtexturepixmapitem_egl.cpp @@ -262,17 +262,12 @@ void MTexturePixmapItem::cleanup() { eglDestroyImageKHR(d->eglresource->dpy, d->egl_image); d->egl_image = EGL_NO_IMAGE_KHR; - XSync(QX11Info::display(), FALSE); if (!d->custom_tfp) d->eglresource->texman->closeTexture(d->textureId); else d->eglresource->texman->closeTexture(d->ctextureId); -#if (QT_VERSION < 0x040600) - eglMakeCurrent(d->eglresource->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); -#endif - XFreePixmap(QX11Info::display(), d->windowp); } diff --git a/src/mwindowpropertycache.cpp b/src/mwindowpropertycache.cpp index c478041..918695d 100644 --- a/src/mwindowpropertycache.cpp +++ b/src/mwindowpropertycache.cpp @@ -28,7 +28,9 @@ MWindowPropertyCache::MWindowPropertyCache(Window w, XWindowAttributes *wa) : transient_for((Window)-1), wm_protocols_valid(false), + icon_geometry_valid(false), has_alpha(false), + global_alpha(-1), is_decorator(false), wmhints(0), attrs(0), @@ -136,7 +138,11 @@ bool MWindowPropertyCache::propertyEvent(XPropertyEvent *e) } return true; } else if (e->atom == ATOM(_NET_WM_WINDOW_TYPE)) { - printf("_NET_WM_WINDOW_TYPE for 0x%lx\n", window); + qWarning("_NET_WM_WINDOW_TYPE for 0x%lx changed", window); + } else if (e->atom == ATOM(_NET_WM_ICON_GEOMETRY)) { + icon_geometry_valid = false; + } else if (e->atom == ATOM(_MEEGOTOUCH_GLOBAL_ALPHA)) { + global_alpha = -1; } else if (e->atom == ATOM(WM_PROTOCOLS)) { wm_protocols_valid = false; } else if (e->atom == ATOM(WM_STATE)) { @@ -186,3 +192,51 @@ const QList<Atom>& MWindowPropertyCache::supportedProtocols() } return wm_protocols; } + +const QRectF &MWindowPropertyCache::iconGeometry() +{ + if (icon_geometry_valid) + return icon_geometry; + Atom actual; + int format; + unsigned long n, left; + unsigned char *data; + int result = XGetWindowProperty(QX11Info::display(), window, + ATOM(_NET_WM_ICON_GEOMETRY), 0L, 4L, False, + XA_CARDINAL, &actual, &format, + &n, &left, &data); + if (result == Success && data != NULL) { + unsigned long *geom = (unsigned long *) data; + QRectF r(geom[0], geom[1], geom[2], geom[3]); + XFree((void *) data); + icon_geometry = r; + } else + icon_geometry = QRectF(); // empty + icon_geometry_valid = true; + return icon_geometry; +} + +#define OPAQUE 0xffffffff +int MWindowPropertyCache::globalAlpha() +{ + if (global_alpha != -1) + return global_alpha; + Atom actual; + int format; + unsigned long n, left; + unsigned char *data = 0; + int result = XGetWindowProperty(QX11Info::display(), window, + ATOM(_MEEGOTOUCH_GLOBAL_ALPHA), + 0L, 1L, False, + XA_CARDINAL, &actual, &format, + &n, &left, &data); + if (result == Success && data != NULL) { + unsigned int i; + memcpy(&i, data, sizeof(unsigned int)); + XFree((void *) data); + double opacity = i * 1.0 / OPAQUE; + global_alpha = opacity * 255; + } else + global_alpha = 255; + return global_alpha; +} diff --git a/src/mwindowpropertycache.h b/src/mwindowpropertycache.h index c722964..ac0c795 100644 --- a/src/mwindowpropertycache.h +++ b/src/mwindowpropertycache.h @@ -117,6 +117,8 @@ public: const XWindowAttributes* windowAttributes() const { return attrs; }; + const QRectF &iconGeometry(); + /*! * Returns value of _MEEGO_STACKING_LAYER. The value is between [0, 6]. */ @@ -134,6 +136,8 @@ public: bool isDecorator() const { return is_decorator; } + int globalAlpha(); + bool is_valid; private: @@ -141,7 +145,10 @@ private: Window transient_for; QList<Atom> wm_protocols; bool wm_protocols_valid; + bool icon_geometry_valid; + QRectF icon_geometry; bool has_alpha; + int global_alpha; bool is_decorator; QList<Atom> net_wm_state; QRect req_geom, real_geom; |