aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuha Lintula <juha.lintula@nokia.com>2010-12-03 13:49:32 +0200
committerDominik Kapusta <dominik.kapusta@teleca.com>2010-12-08 12:53:09 +0100
commit485250c0a510b4f830f563e7e9cd4841e047eaa9 (patch)
treef7087da90ca1603c269a03ee16bdfe9c9c2170ba
parent6aac0c3a96fc09b216632e9a9bb624ea470ec5f0 (diff)
Fixes: NB#204882 - Prestarted applications not visible in the switcher after launching it more than once
RevBy: Antti Kervinen Details: NET_WM_STATE_SKIP_TASKBAR is removed from the library. Windows of the prestarted applications are not visible in the switcher anymore because those are not mapped at all. This also removes race condition which is the reason for the bug 204882.
-rw-r--r--src/corelib/core/mapplication.cpp97
-rw-r--r--src/corelib/core/mapplication_p.h4
-rw-r--r--src/corelib/widgets/mwindow.cpp12
-rw-r--r--src/corelib/widgets/mwindow_p.h3
4 files changed, 0 insertions, 116 deletions
diff --git a/src/corelib/core/mapplication.cpp b/src/corelib/core/mapplication.cpp
index 71b09659..59b0714d 100644
--- a/src/corelib/core/mapplication.cpp
+++ b/src/corelib/core/mapplication.cpp
@@ -84,49 +84,6 @@ void MApplicationPrivate::setX11PrestartPropertyForWindows(bool set)
}
}
-void MApplicationPrivate::removeWindowsFromSwitcher(bool remove)
-{
- Q_FOREACH(MWindow * win, MApplication::windows()) {
- removeWindowFromSwitcher(win->effectiveWinId(), remove);
- }
-}
-
-void MApplicationPrivate::removeWindowFromSwitcher(Window window, bool remove)
-{
- static Atom stateAtom = XInternAtom(QX11Info::display(),
- "_NET_WM_STATE", True);
- static Atom skipAtom = XInternAtom(QX11Info::display(),
- "_NET_WM_STATE_SKIP_TASKBAR", True);
-
- Display *dpy = QX11Info::display();
- if (stateAtom != None) {
- MWindow *win = windowForId(window);
-
- if (remove) {
- win->d_ptr->removeWindowFromSwitcherInProgress = true;
- XChangeProperty(dpy, window, stateAtom,
- XA_ATOM, 32, PropModeAppend,
- reinterpret_cast<unsigned char *>(&skipAtom), 1);
- } else if (win && !win->d_ptr->skipTaskbar && hasXStateAtom(window, skipAtom)) {
- // Do not remove SKIP_TASKBAR if it was requested from outside
- XEvent ev;
- memset(&ev, 0, sizeof(ev));
- ev.xclient.type = ClientMessage;
- ev.xclient.display = dpy;
- ev.xclient.window = window;
- ev.xclient.message_type = XInternAtom(dpy, "_NET_WM_STATE", False);
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = 0;
- ev.xclient.data.l[1] = skipAtom;
- ev.xclient.data.l[2] = 0;
-
- win->d_ptr->removeWindowFromSwitcherInProgress = true;
- XSendEvent(dpy, QX11Info::appRootWindow(), False, SubstructureRedirectMask | SubstructureNotifyMask,
- &ev);
- XSync(dpy, False);
- }
- }
-}
MWindow * MApplicationPrivate::windowForId(Window window)
{
@@ -137,37 +94,6 @@ MWindow * MApplicationPrivate::windowForId(Window window)
}
return NULL;
}
-
-bool MApplicationPrivate::hasXStateAtom(Window window, Atom atom)
-{
- Atom type;
- int format;
- bool found;
- long max_len = 1024;
- unsigned long nItems;
- unsigned long bytesAfter;
- unsigned char *data = NULL;
-
- static Atom stateAtom = XInternAtom(QX11Info::display(),
- "_NET_WM_STATE", True);
-
- if (XGetWindowProperty(QX11Info::display(), window, stateAtom, 0, max_len, False,
- XA_ATOM, &type, &format, &nItems, &bytesAfter,
- &data) == Success && data) {
- found = false;
- for (unsigned long i = 0; !found && i < nItems; i++) {
- if (data[i] == atom) {
- found = true;
- }
- }
- XFree (data);
- return found;
- } else {
-
- return false;
- }
-}
-
#endif
MApplication *MApplication::instance()
@@ -214,10 +140,6 @@ void MApplicationPrivate::releasePrestart()
}
#ifdef Q_WS_X11
- // Ensure that windows are visible in the switcher again
- if (prestartModeIsLazyShutdown()) {
- removeWindowsFromSwitcher(false);
- }
setX11PrestartPropertyForWindows(false);
#endif
}
@@ -237,9 +159,6 @@ void MApplicationPrivate::restorePrestart()
}
#ifdef Q_WS_X11
- // Explicitly remove windows from the switcher because they
- // are hidden but should look like closed
- removeWindowsFromSwitcher(true);
setX11PrestartPropertyForWindows(true);
#endif
}
@@ -529,9 +448,6 @@ void MApplicationPrivate::handleXPropertyEvent(XPropertyEvent *xevent)
// flag for corresponding window because we need to combine this
// information with VisibilityNotify's.
- // Applications can set themselves _NET_WM_STATE_SKIP_TASKBAR to avoid window
- // being displayed in taskbar. We need to handle this situation too.
-
MWindow *window = windowForId(xevent->window);
if (window && xevent->state == PropertyNewValue) {
Atom type;
@@ -539,8 +455,6 @@ void MApplicationPrivate::handleXPropertyEvent(XPropertyEvent *xevent)
unsigned long nItems;
unsigned long bytesAfter;
unsigned char *data = NULL;
- static Atom stateAtom = XInternAtom(QX11Info::display(),
- "_NET_WM_STATE", True);
if (xevent->atom == visibleAtom) {
// Read value of the property. Should be 1 or 0.
@@ -559,17 +473,6 @@ void MApplicationPrivate::handleXPropertyEvent(XPropertyEvent *xevent)
XFree(data);
}
- } else if (xevent->atom == stateAtom) {
- /* Check if it comes from MTF itself */
- if (window->d_ptr->removeWindowFromSwitcherInProgress) {
- window->d_ptr->removeWindowFromSwitcherInProgress = false;
- } else {
- /* Check if SKIP_TASKBAR was set or removed */
- window->d_ptr->skipTaskbar = MApplicationPrivate::hasXStateAtom(xevent->window,
- XInternAtom(QX11Info::display(),
- "_NET_WM_STATE_SKIP_TASKBAR",
- True));
- }
}
}
}
diff --git a/src/corelib/core/mapplication_p.h b/src/corelib/core/mapplication_p.h
index 1236ca45..d87ea501 100644
--- a/src/corelib/core/mapplication_p.h
+++ b/src/corelib/core/mapplication_p.h
@@ -68,14 +68,10 @@ private:
#ifdef Q_WS_X11
static void setWindowVisibility(MWindow *window, bool visible);
- static void removeWindowsFromSwitcher(bool remove);
- static void removeWindowFromSwitcher(Window window, bool remove);
static void setX11PrestartPropertyForWindows(bool set);
static MWindow * windowForId(Window window);
- static bool hasXStateAtom(Window window, Atom atom);
void handleXVisibilityEvent(XVisibilityEvent *xevent);
void handleXPropertyEvent(XPropertyEvent *xevent);
- Atom stateAtom;
Atom visibleAtom;
Atom minimizeAnimationAtom;
#endif
diff --git a/src/corelib/widgets/mwindow.cpp b/src/corelib/widgets/mwindow.cpp
index 7db40fd3..9cf4f91b 100644
--- a/src/corelib/widgets/mwindow.cpp
+++ b/src/corelib/widgets/mwindow.cpp
@@ -98,10 +98,6 @@ MWindowPrivate::MWindowPrivate() :
allowedPaintEventsWhenInvisible(5),
q_ptr(NULL)
{
-#ifdef Q_WS_X11
- removeWindowFromSwitcherInProgress = false;
- skipTaskbar = false;
-#endif
MWindow *window = MApplication::activeWindow();
@@ -688,10 +684,6 @@ void MWindowPrivate::handleCloseEvent(QCloseEvent *event)
if (MApplication::prestartMode() == M::LazyShutdownMultiWindow ||
MApplication::prestartMode() == M::LazyShutdown) {
-#ifdef Q_WS_X11
- MApplicationPrivate::removeWindowFromSwitcher(q->effectiveWinId(), true);
-#endif
-
// Check if all windows are closed. If so,
// return to the prestarted state.
bool allWindowsLogicallyClosed = true;
@@ -1434,10 +1426,6 @@ void MWindow::setVisible(bool visible)
d->isLogicallyClosed = false;
}
-#ifdef Q_WS_X11
- MApplicationPrivate::removeWindowFromSwitcher(effectiveWinId(), false);
-#endif
-
} else {
MOnDisplayChangeEvent ev(false, sceneRect());
onDisplayChangeEvent(&ev);
diff --git a/src/corelib/widgets/mwindow_p.h b/src/corelib/widgets/mwindow_p.h
index 0966b987..fd567270 100644
--- a/src/corelib/widgets/mwindow_p.h
+++ b/src/corelib/widgets/mwindow_p.h
@@ -63,9 +63,6 @@ public:
qreal getX11Property(const char *propertyName) const;
void setX11PrestartProperty(bool set);
void setX11OrientationAngleProperty(M::OrientationAngle angle);
-
- bool removeWindowFromSwitcherInProgress;
- bool skipTaskbar;
#endif
void _q_onPixmapRequestsFinished();