diff options
author | Abdiel Janulgue <abdiel.janulgue@nokia.com> | 2010-05-18 20:06:59 +0300 |
---|---|---|
committer | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2010-05-19 12:52:34 +0300 |
commit | 6c0c0004c476435b5d78e5fbb568e456230e2ca2 (patch) | |
tree | c1097180c2314ba8c5079f33f6843a94626385e5 | |
parent | 8992f656cc847591b5a419e2718da202390c6e86 (diff) |
Changes: Fix issue where WM_STATE is changed even if previous value is the same. This is causing
multiple WM_STATE property events to be sent to the window
RevBy: TrustMe
-rw-r--r-- | src/mcompositemanager.cpp | 4 | ||||
-rw-r--r-- | src/mcompositewindow.cpp | 22 | ||||
-rw-r--r-- | src/mcompositewindow.h | 6 |
3 files changed, 30 insertions, 2 deletions
diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index da0beb4..bff12a9 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -1919,6 +1919,10 @@ void MCompositeManagerPrivate::callOngoing(bool ongoing_call) void MCompositeManagerPrivate::setWindowState(Window w, int state) { + MCompositeWindow* i = COMPOSITE_WINDOW(w); + if(i && i->windowState() == state) + return; + CARD32 d[2]; d[0] = state; d[1] = None; diff --git a/src/mcompositewindow.cpp b/src/mcompositewindow.cpp index 7fefe78..b83ceb9 100644 --- a/src/mcompositewindow.cpp +++ b/src/mcompositewindow.cpp @@ -51,7 +51,8 @@ MCompositeWindow::MCompositeWindow(Qt::HANDLE window, QGraphicsItem *p) wm_protocols_valid(false), window_obscured(false), wmhints(0), - win_id(window) + win_id(window), + window_state(NormalState) { memset(&req_geom, 0, sizeof(req_geom)); anim = new MCompWindowAnimator(this); @@ -322,8 +323,25 @@ bool MCompositeWindow::propertyEvent(XPropertyEvent *e) wmhints = 0; } return true; - } else if (e->atom == ATOM(WM_PROTOCOLS)) + } else if (e->atom == ATOM(WM_PROTOCOLS)) { wm_protocols_valid = false; + } else if (e->atom == ATOM(WM_STATE)) { + Atom type; + int format; + unsigned long length, after; + uchar *data = 0; + int r = XGetWindowProperty(QX11Info::display(),window(), + ATOM(WM_STATE), 0, 2, + False, AnyPropertyType, &type, &format, + &length, &after, &data); + int w_state = 0; + if (r == Success && data && format == 32) { + unsigned long *wstate = (unsigned long *) data; + window_state = *wstate; + XFree((char *)data); + return true; + } + } return false; } diff --git a/src/mcompositewindow.h b/src/mcompositewindow.h index 426fc30..bb16b85 100644 --- a/src/mcompositewindow.h +++ b/src/mcompositewindow.h @@ -261,6 +261,11 @@ public: void setOriginalGeometry(const QRect geometry) { origGeometry = geometry; } + + /*! + * Returns the WM_STATE of this window + */ + int windowState() const { return window_state; } QRect originalGeometry() const { return origGeometry; } @@ -423,6 +428,7 @@ private: // Main ping timer QTimer *t_ping; Qt::HANDLE win_id; + int window_state; friend class MTexturePixmapPrivate; }; |