9#include <QtCore/QDebug>
10#include <QtCore/QRect>
11#include <QtGui/QScreen>
13#include <qpa/qplatformnativeinterface.h>
33 const QByteArray netSysTray = QByteArrayLiteral(
"_NET_SYSTEM_TRAY_S") + QByteArray::number(connection->primaryScreenNumber());
34 const xcb_atom_t selection = connection->internAtom(netSysTray.constData());
45 , m_selection(selection)
46 , m_trayAtom(trayAtom)
47 , m_connection(connection)
54 xcb_client_message_event_t trayRequest;
55 trayRequest.response_type = XCB_CLIENT_MESSAGE;
56 trayRequest.format = 32;
57 trayRequest.sequence = 0;
58 trayRequest.window = m_trayWindow;
59 trayRequest.type = m_trayAtom;
60 trayRequest.data.data32[0] = XCB_CURRENT_TIME;
62 trayRequest.data.data32[2] = window;
63 xcb_send_event(m_connection->xcb_connection(), 0, m_trayWindow, XCB_EVENT_MASK_NO_EVENT, (
const char *)&trayRequest);
70 m_trayWindow = m_connection->selectionOwner(m_selection);
72 m_connection->addWindowEventListener(m_trayWindow,
this);
73 const quint32 mask = XCB_CW_EVENT_MASK;
74 const quint32 value = XCB_EVENT_MASK_STRUCTURE_NOTIFY;
75 xcb_change_window_attributes(m_connection->xcb_connection(), m_trayWindow, mask, &value);
83 if (
const QPlatformScreen *ps = m_connection->primaryScreen())
84 emit systemTrayWindowChanged(ps->screen());
90 if (t->data.data32[1] == m_selection)
91 emitSystemTrayWindowChanged();
97 if (event->window == m_trayWindow) {
98 m_connection->removeWindowEventListener(m_trayWindow);
99 m_trayWindow = XCB_WINDOW_NONE;
100 emitSystemTrayWindowChanged();
106 xcb_visualid_t visual = netSystemTrayVisual();
107 if (visual == XCB_NONE)
108 visual = m_connection->primaryScreen()->screen()->root_visual;
114 if (m_trayWindow == XCB_WINDOW_NONE)
122 tray_atom, XCB_ATOM_VISUALID, 0, 1);
123 if (!systray_atom_reply)
126 xcb_visualid_t systrayVisualId = XCB_NONE;
127 if (systray_atom_reply->value_len > 0 && xcb_get_property_value_length(systray_atom_reply.get()) > 0) {
128 xcb_visualid_t * vids = (uint32_t *)xcb_get_property_value(systray_atom_reply.get());
129 systrayVisualId = vids[0];
132 return systrayVisualId;
137#include "moc_qxcbsystemtraytracker.cpp"
@ Atom_NET_SYSTEM_TRAY_OPCODE
@ Atom_NET_SYSTEM_TRAY_VISUAL
xcb_visualid_t visualId()
void requestSystemTrayWindowDock(xcb_window_t window) const
void notifyManagerClientMessageEvent(const xcb_client_message_event_t *)
void handleDestroyNotifyEvent(const xcb_destroy_notify_event_t *) override
xcb_window_t trayWindow()
#define Q_XCB_REPLY_UNCHECKED(call,...)
@ SystemTrayCancelMessage