Add transparency support for tray icon

The selection manager of tray may hold a property to indicate the tray
icon window visual. Try to use the visual with alpha channel when
composite is enabled.

REVIEW: 127009
wilder-5.14
Weng Xuetian 10 years ago
parent 1a13806d74
commit 49977bfb42
  1. 44
      xembed-sni-proxy/fdoselectionmanager.cpp
  2. 1
      xembed-sni-proxy/fdoselectionmanager.h
  3. 2
      xembed-sni-proxy/sniproxy.cpp
  4. 5
      xembed-sni-proxy/xcbutils.h

@ -171,6 +171,9 @@ void FdoSelectionManager::undock(xcb_window_t winId)
void FdoSelectionManager::onClaimedOwnership()
{
qCDebug(SNIPROXY) << "Manager selection claimed";
connect(KWindowSystem::self(), &KWindowSystem::compositingChanged, this, &FdoSelectionManager::compositingChanged);
compositingChanged();
}
void FdoSelectionManager::onFailedToClaimOwnership()
@ -182,5 +185,46 @@ void FdoSelectionManager::onFailedToClaimOwnership()
void FdoSelectionManager::onLostOwnership()
{
qCWarning(SNIPROXY) << "lost ownership of Systray Manager";
disconnect(KWindowSystem::self(), &KWindowSystem::compositingChanged, this, &FdoSelectionManager::compositingChanged);
qApp->exit(-1);
}
void FdoSelectionManager::compositingChanged()
{
xcb_connection_t *c = QX11Info::connection();
auto screen = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
auto trayVisual = screen->root_visual;
if (KWindowSystem::compositingActive()) {
xcb_depth_iterator_t depth_iterator = xcb_screen_allowed_depths_iterator(screen);
xcb_depth_t *depth = nullptr;
while (depth_iterator.rem) {
if (depth_iterator.data->depth == 32) {
depth = depth_iterator.data;
break;
}
xcb_depth_next(&depth_iterator);
}
if (depth) {
xcb_visualtype_iterator_t visualtype_iterator = xcb_depth_visuals_iterator(depth);
while (visualtype_iterator.rem) {
xcb_visualtype_t *visualtype = visualtype_iterator.data;
if (visualtype->_class == XCB_VISUAL_CLASS_TRUE_COLOR) {
trayVisual = visualtype->visual_id;
break;
}
xcb_visualtype_next(&visualtype_iterator);
}
}
}
xcb_change_property(c,
XCB_PROP_MODE_REPLACE,
m_selectionOwner->ownerWindow(),
Xcb::atoms->visualAtom,
XCB_ATOM_VISUALID,
32,
1,
&trayVisual);
}

@ -51,6 +51,7 @@ private:
void addDamageWatch(xcb_window_t client);
void dock(xcb_window_t embed_win);
void undock(xcb_window_t client);
void compositingChanged();
uint8_t m_damageEventBase;

@ -262,7 +262,7 @@ QImage SNIProxy::getImageNonComposite() const
return QImage();
}
xcb_image_t *image = xcb_image_get(c, m_windowId, 0, 0, geom->width, geom->height, 0xFFFFFF, XCB_IMAGE_FORMAT_Z_PIXMAP);
xcb_image_t *image = xcb_image_get(c, m_windowId, 0, 0, geom->width, geom->height, 0xFFFFFFFF, XCB_IMAGE_FORMAT_Z_PIXMAP);
// Don't hook up cleanup yet, we may use a different QImage after all
QImage naiveConversion = QImage(image->data, image->width, image->height, QImage::Format_ARGB32);

@ -109,14 +109,15 @@ public:
xembedAtom("_XEMBED"),
selectionAtom(xcb_atom_name_by_screen("_NET_SYSTEM_TRAY", QX11Info::appScreen())),
opcodeAtom("_NET_SYSTEM_TRAY_OPCODE"),
messageData("_NET_SYSTEM_TRAY_MESSAGE_DATA")
messageData("_NET_SYSTEM_TRAY_MESSAGE_DATA"),
visualAtom("_NET_SYSTEM_TRAY_VISUAL")
{}
Atom xembedAtom;
Atom selectionAtom;
Atom opcodeAtom;
Atom messageData;
Atom visualAtom;
};
extern Atoms* atoms;

Loading…
Cancel
Save