从xlib移植到xcb的代码不起作用

时间:2015-01-07 10:36:55

标签: x11 ubuntu-14.04 xlib xcb

这是一个发送鼠标单击的示例代码(使用xlib)。为简单起见,将事件发送到全屏窗口(根和窗口坐标相同),并使用wmctrl获取窗口ID。

Display *display = XOpenDisplay(NULL);
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);
XEvent event;
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;
event.xbutton.root = RootWindow(display, DefaultScreen(display));
event.xbutton.window = 81788929;
event.xbutton.subwindow = 0;
event.xbutton.x_root = 300;
event.xbutton.y_root = 200;
event.xbutton.x = 300;
event.xbutton.y = 200;
event.xbutton.state = 0;

XSendEvent(display, PointerWindow, True, ButtonPressMask, &event);
XFlush(display);
XCloseDisplay(display);

以上代码工作正常。我将它移植到xcb:

Display *display = XOpenDisplay(NULL);
XWarpPointer(display, None, RootWindow(display, DefaultScreen(display)), 0, 0, 0, 0, 300, 200);


xcb_button_press_event_t event;
memset(&event, 0x00, sizeof(event));
event.event = 81788929;
event.same_screen = 1;
event.root = RootWindow(display, DefaultScreen(display));
event.root_x = 300;
event.root_y = 200;
event.event_x = 300;
event.event_y = 200;
event.child = 0;
event.state = 0;

xcb_connection_t *conn = XGetXCBConnection(display);
xcb_send_event(conn, false, 81788929, XCB_EVENT_MASK_BUTTON_PRESS, (char*)(&event));
xcb_flush(conn);
XCloseDisplay(display);

XCB代码无效:目标窗口无法获取任何事件。有什么问题?

EDIT1 当我使用以下代码进行连接时:

xcb_connection_t *conn;
xcb_screen_t     *screen;
conn = xcb_connect (NULL, NULL);
screen = xcb_setup_roots_iterator (xcb_get_setup (conn)).data;

以后:

event.root = screen->root;

它也不起作用。

1 个答案:

答案 0 :(得分:1)

您的代码中没有任何地方存在错误检查。无论如何,我怀疑XGetXCBConnection(display);没有返回有效的Xcb连接。为什么你会问?因为要实现这一点,Xlib必须构建为Xcb的包装器并正确设置内部结构。

我建议您创建连接并使用Xcb打开显示,看看是否能解决问题。