我正在使用Linux上的遗留应用程序,该应用程序使用ClientMessage在协作进程之间进行消息传递。 XClientMessageEvent结构提供了一个联合,以方便用于自定义数据:
union {
char b[20];
short s[10];
long l[5];
} data;
手册页声称:" b,s和l成员表示20个8位值,10个16位值和5个32位值的数据。 "
如果在32位系统上进行编译,这一切都很好。只是不同的访问工会的20个字节,对吧?好吧,在64位系统上," long l [5]"成员占用40个字节。
我的测试显示,如果发送方将这些视为64位长并使用它们,则接收方只获取"数据的前20个字节"结构体。最后20个字节丢失(显示为接收器的零)。
由于应用程序非常依赖于使用short和long来打包这个联合,我被卡住了。
我正在使用:xorg-x11-server-Xorg-1.15.0-22.el6.centos.x86_64
有没有人有解决这个问题的经验?我只是没有正确理解这一点吗?
对我来说,这似乎是X中的一个错误。 64位X11已经存在了很长时间。我只是在网上看到另一个提到这个问题。
答案 0 :(得分:0)
我在64位上使用了XClientMessage,这非常适合全屏:
XClientMessageEvent xevent;
memset (&xevent, 0, sizeof (xevent));
xevent.type = ClientMessage;
xevent.window = mw;
xevent.message_type = XInternAtom (m_display, "_NET_WM_FULLSCREEN_MONITORS", False);
xevent.format = 32;
xevent.data.l[0] = m_fullScreen;
xevent.data.l[1] = m_fullScreen;
xevent.data.l[2] = m_fullScreen;
xevent.data.l[3] = m_fullScreen;
xevent.data.l[4] = 1; // source indication
XSendEvent (m_display, DefaultRootWindow (m_display), False, SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *) & xevent);
您是否也设置了xevent.format
?它没有记录,但我想它曾经暗示过使用3个成员b,s或l中的哪一个。