forked from pool/libqt5-qtbase
26d10f1197
Update to 5.6.0 + xcb fixes OBS-URL: https://build.opensuse.org/request/show/391423 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=53
72 lines
3.5 KiB
Diff
72 lines
3.5 KiB
Diff
From cc32b65569c3cd947a7d012d41379490c9bf80c0 Mon Sep 17 00:00:00 2001
|
|
From: David Rosca <nowrep@gmail.com>
|
|
Date: Wed, 16 Mar 2016 08:35:22 +0100
|
|
Subject: [PATCH 12/16] xcb: Merge _NET_WM_STATE hints instead of overwriting
|
|
|
|
This makes possible to set custom _NET_WM_STATE hints before
|
|
showing the window.
|
|
|
|
Change-Id: I86ad3863f7a8b3bb610a31b9af4b02c9d38eb111
|
|
Task-number: QTBUG-26978
|
|
Reviewed-by: Ilya Kotov
|
|
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
|
|
Reviewed-by: Uli Schlachter <psychon@znc.in>
|
|
(cherry picked from commit e4cea305ed2ba3c9f580bf9d16c59a1048af0e8a)
|
|
---
|
|
src/plugins/platforms/xcb/qxcbwindow.cpp | 32 ++++++++++++++++++++++++--------
|
|
1 file changed, 24 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
|
index 1dc066c692d5beaf632ead78784683c928d1c1e4..d2475a8b1329dee1034f5ac5e054e5318ca2ea09 100644
|
|
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
|
|
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
|
|
@@ -1091,21 +1091,37 @@ QXcbWindow::NetWmStates QXcbWindow::netWmStates()
|
|
void QXcbWindow::setNetWmStates(NetWmStates states)
|
|
{
|
|
QVector<xcb_atom_t> atoms;
|
|
- if (states & NetWmStateAbove)
|
|
+
|
|
+ xcb_get_property_cookie_t get_cookie =
|
|
+ xcb_get_property_unchecked(xcb_connection(), 0, m_window, atom(QXcbAtom::_NET_WM_STATE),
|
|
+ XCB_ATOM_ATOM, 0, 1024);
|
|
+
|
|
+ xcb_get_property_reply_t *reply =
|
|
+ xcb_get_property_reply(xcb_connection(), get_cookie, NULL);
|
|
+
|
|
+ if (reply && reply->format == 32 && reply->type == XCB_ATOM_ATOM && reply->value_len > 0) {
|
|
+ const xcb_atom_t *data = static_cast<const xcb_atom_t *>(xcb_get_property_value(reply));
|
|
+ atoms.resize(reply->value_len);
|
|
+ memcpy((void *)&atoms.first(), (void *)data, reply->value_len * sizeof(xcb_atom_t));
|
|
+ }
|
|
+
|
|
+ free(reply);
|
|
+
|
|
+ if (states & NetWmStateAbove && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_ABOVE)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_ABOVE));
|
|
- if (states & NetWmStateBelow)
|
|
+ if (states & NetWmStateBelow && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_BELOW)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_BELOW));
|
|
- if (states & NetWmStateFullScreen)
|
|
+ if (states & NetWmStateFullScreen && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_FULLSCREEN));
|
|
- if (states & NetWmStateMaximizedHorz)
|
|
+ if (states & NetWmStateMaximizedHorz && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_HORZ));
|
|
- if (states & NetWmStateMaximizedVert)
|
|
+ if (states & NetWmStateMaximizedVert && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MAXIMIZED_VERT));
|
|
- if (states & NetWmStateModal)
|
|
+ if (states & NetWmStateModal && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_MODAL)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_MODAL));
|
|
- if (states & NetWmStateStaysOnTop)
|
|
+ if (states & NetWmStateStaysOnTop && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_STAYS_ON_TOP));
|
|
- if (states & NetWmStateDemandsAttention)
|
|
+ if (states & NetWmStateDemandsAttention && !atoms.contains(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION)))
|
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
|
|
|
|
if (atoms.isEmpty()) {
|
|
--
|
|
2.6.6
|
|
|