diff --git a/plasma5-workspace.changes b/plasma5-workspace.changes index 5762add..29c3eb2 100644 --- a/plasma5-workspace.changes +++ b/plasma5-workspace.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Wed Mar 2 10:15:41 UTC 2016 - wbauer@tmo.at + +- Added xembedsniproxy-avoid-ghost-entry.patch from upstream: + prevents an empty icon being shown when e.g. fcitx is running + (boo#954623, kde#358719) + ------------------------------------------------------------------- Tue Mar 1 17:33:31 UTC 2016 - hrvoje.senjan@gmail.com diff --git a/plasma5-workspace.spec b/plasma5-workspace.spec index ac5f905..9445831 100644 --- a/plasma5-workspace.spec +++ b/plasma5-workspace.spec @@ -40,6 +40,7 @@ Patch3: kuiserver5_qApp.patch Patch4: plasmashell-disable-windowclosing-on-logout.patch # PATCHES 100-200 and above are from upstream 5.5 branch # PATCHES 201-300 and above are from upstream master/5.6 branch +Patch201: xembedsniproxy-avoid-ghost-entry.patch BuildRequires: kf5-filesystem BuildRequires: update-desktop-files BuildRequires: cmake(KF5Activities) >= 5.15.0 @@ -209,6 +210,7 @@ workspace. Development files. %patch2 -p1 %patch3 -p1 %patch4 -p1 +%patch201 -p1 %build %cmake_kf5 -d build -- -DKDE4_COMMON_PAM_SERVICE=xdm -DKDE_DEFAULT_HOME=.kde4 -DCMAKE_INSTALL_LOCALEDIR=share/locale/kf5 diff --git a/xembedsniproxy-avoid-ghost-entry.patch b/xembedsniproxy-avoid-ghost-entry.patch new file mode 100644 index 0000000..8ed6bcc --- /dev/null +++ b/xembedsniproxy-avoid-ghost-entry.patch @@ -0,0 +1,95 @@ +From: Weng Xuetian +Date: Tue, 09 Feb 2016 02:56:59 +0000 +Subject: Check whether there is any BadWindow error before monitor the event +X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=829158f830555c031755c6d4348e684779264342 +--- +Check whether there is any BadWindow error before monitor the event + +The tray window itself may be destroyed before we start monitor the +event of it. Check the returned error and skip this window if BadWindow +happens. + +FIXED-IN: 5.6.0 +BUG: 358719 +REVIEW: 127014 +--- + + +--- a/xembed-sni-proxy/fdoselectionmanager.cpp ++++ b/xembed-sni-proxy/fdoselectionmanager.cpp +@@ -83,7 +83,7 @@ + m_selectionOwner->claim(false); + } + +-void FdoSelectionManager::addDamageWatch(xcb_window_t client) ++bool FdoSelectionManager::addDamageWatch(xcb_window_t client) + { + qCDebug(SNIPROXY) << "adding damage watch for " << client; + +@@ -94,15 +94,27 @@ + m_damageWatches[client] = damageId; + xcb_damage_create(c, damageId, client, XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY); + +- QScopedPointer attr(xcb_get_window_attributes_reply(c, attribsCookie, Q_NULLPTR)); ++ xcb_generic_error_t *error = Q_NULLPTR; ++ QScopedPointer attr(xcb_get_window_attributes_reply(c, attribsCookie, &error)); ++ QScopedPointer getAttrError(error); + uint32_t events = XCB_EVENT_MASK_STRUCTURE_NOTIFY; + if (!attr.isNull()) { + events = events | attr->your_event_mask; + } ++ // if window is already gone, there is no need to handle it. ++ if (getAttrError && getAttrError->error_code == XCB_WINDOW) { ++ return false; ++ } + // the event mask will not be removed again. We cannot track whether another component also needs STRUCTURE_NOTIFY (e.g. KWindowSystem). + // if we would remove the event mask again, other areas will break. +- xcb_change_window_attributes(c, client, XCB_CW_EVENT_MASK, &events); +- ++ const auto changeAttrCookie = xcb_change_window_attributes_checked(c, client, XCB_CW_EVENT_MASK, &events); ++ QScopedPointer changeAttrError(xcb_request_check(c, changeAttrCookie)); ++ // if window is gone by this point, it will be catched by eventFilter, so no need to check later errors. ++ if (changeAttrError && changeAttrError->error_code == XCB_WINDOW) { ++ return false; ++ } ++ ++ return true; + } + + bool FdoSelectionManager::nativeEventFilter(const QByteArray& eventType, void* message, long int* result) +@@ -130,6 +142,11 @@ + if (m_proxies[unmappedWId]) { + undock(unmappedWId); + } ++ } else if (responseType == XCB_DESTROY_NOTIFY) { ++ const auto destroyedWId = reinterpret_cast(ev)->window; ++ if (m_proxies[destroyedWId]) { ++ undock(destroyedWId); ++ } + } else if (responseType == m_damageEventBase + XCB_DAMAGE_NOTIFY) { + const auto damagedWId = reinterpret_cast(ev)->drawable; + const auto sniProx = m_proxies[damagedWId]; +@@ -153,8 +170,9 @@ + return; + } + +- addDamageWatch(winId); +- m_proxies[winId] = new SNIProxy(winId, this); ++ if (addDamageWatch(winId)) { ++ m_proxies[winId] = new SNIProxy(winId, this); ++ } + } + + void FdoSelectionManager::undock(xcb_window_t winId) + +--- a/xembed-sni-proxy/fdoselectionmanager.h ++++ b/xembed-sni-proxy/fdoselectionmanager.h +@@ -48,7 +48,7 @@ + + private: + void init(); +- void addDamageWatch(xcb_window_t client); ++ bool addDamageWatch(xcb_window_t client); + void dock(xcb_window_t embed_win); + void undock(xcb_window_t client); +