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>
This commit is contained in:
parent
458bf6b858
commit
e4cea305ed
@ -1091,21 +1091,37 @@ QXcbWindow::NetWmStates QXcbWindow::netWmStates()
|
|||||||
void QXcbWindow::setNetWmStates(NetWmStates states)
|
void QXcbWindow::setNetWmStates(NetWmStates states)
|
||||||
{
|
{
|
||||||
QVector<xcb_atom_t> atoms;
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
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));
|
atoms.push_back(atom(QXcbAtom::_NET_WM_STATE_DEMANDS_ATTENTION));
|
||||||
|
|
||||||
if (atoms.isEmpty()) {
|
if (atoms.isEmpty()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user