Hi,
Am 13.03.2015 um 10:55 schrieb 于清:
> Hi,
> This is a help request rather than a bug report, so if you are kind enough
> and have some spare time, pls help me find out why my xcb client won't work.
> All this xcb client trying to do is to create a system tray icon. I have read
> the xembed and systemtray's freedesktop specification and followed their
> instructions, but with awesome wm the tray icon is a seperate window on a
> ridiculous position(It seems to work in KDE somehow).
> I have tried to read awesome's source, but still can't understand why my code
> fails.
First of, your code fails here when trying to figure out the systray's depth.
However, the result of that calculation isn't used anyway, so an "#if 0" fixes
this.
The next problem is that awesome registers your systray window as both a regular
client and as a systray window. Skipping the MapWindow request fixes this as
well.
Patch is attached.
Cheers,
Uli
--
"Why make things difficult, when it is possible to make them cryptic
and totally illogical, with just a little bit more effort?" -- A. P. J.
--- xcbdemo.cpp.orig 2015-03-13 18:35:40.404285455 +0100
+++ xcbdemo.cpp 2015-03-13 22:53:52.958379071 +0100
@@ -153,6 +153,8 @@ int main(int argc, char* argv[])
return 1;
}
+ // All of this is not used
+#if 0
uint8_t traywnd_depth = 0xff;
auto tray_visualid_cookie = xcb_get_property_unchecked(connection, false, traywnd,
ATOMS[_NET_SYSTEM_TRAY_VISUAL], XCB_ATOM_VISUALID, 0, 1);
@@ -174,10 +176,12 @@ int main(int argc, char* argv[])
}
xcb_free(tray_visualid_reply);
if (traywnd_depth == 0xff) {
+ std::cerr << "can't figure out visual" << std::endl;
xcb_disconnect(connection);
return 1;
}
std::cerr << "traywnd_depth(32 means having alpha channel ): " << (int32_t)traywnd_depth << std::endl;
+#endif
/* Create the window */
uint32_t value_list[1] = {
@@ -273,7 +277,7 @@ int main(int argc, char* argv[])
xcb_change_window_attributes(connection, traywnd, XCB_CW_EVENT_MASK, value_list);
/* Map the window on the screen */
- xcb_map_window(connection, window);
+ //xcb_map_window(connection, window);
xcb_flush(connection);
/* Dock the window to system tray */