summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mcompatoms_p.h1
-rw-r--r--src/mcompositemanager.cpp69
-rw-r--r--src/mtexturepixmapitem_egl.cpp5
-rw-r--r--src/mwindowpropertycache.cpp56
-rw-r--r--src/mwindowpropertycache.h7
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;