backend/x11: set a blank cursor rather than hiding globally
This actually simplifies the logic since we no longer have to wait for enter/leave events, and also improves the UX when e.g. handling a crash with gdb attached. See #2659
This commit is contained in:
parent
04d89a8bc5
commit
966e653935
|
@ -613,6 +613,23 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display,
|
||||||
x11->display_destroy.notify = handle_display_destroy;
|
x11->display_destroy.notify = handle_display_destroy;
|
||||||
wl_display_add_destroy_listener(display, &x11->display_destroy);
|
wl_display_add_destroy_listener(display, &x11->display_destroy);
|
||||||
|
|
||||||
|
// Create an empty pixmap to be used as the cursor. The
|
||||||
|
// default GC foreground is 0, and that is what it will be
|
||||||
|
// filled with.
|
||||||
|
xcb_pixmap_t blank = xcb_generate_id(x11->xcb);
|
||||||
|
xcb_create_pixmap(x11->xcb, 1, blank, x11->screen->root, 1, 1);
|
||||||
|
xcb_gcontext_t gc = xcb_generate_id(x11->xcb);
|
||||||
|
xcb_create_gc(x11->xcb, gc, blank, 0, NULL);
|
||||||
|
xcb_rectangle_t rect = { .x = 0, .y = 0, .width = 1, .height = 1 };
|
||||||
|
xcb_poly_fill_rectangle(x11->xcb, blank, gc, 1, &rect);
|
||||||
|
|
||||||
|
x11->cursor = xcb_generate_id(x11->xcb);
|
||||||
|
xcb_create_cursor(x11->xcb, x11->cursor, blank, blank,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
xcb_free_gc(x11->xcb, gc);
|
||||||
|
xcb_free_pixmap(x11->xcb, blank);
|
||||||
|
|
||||||
return &x11->backend;
|
return &x11->backend;
|
||||||
|
|
||||||
error_event:
|
error_event:
|
||||||
|
|
|
@ -212,36 +212,6 @@ void handle_x11_xinput_event(struct wlr_x11_backend *x11,
|
||||||
x11->time = ev->time;
|
x11->time = ev->time;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case XCB_INPUT_ENTER: {
|
|
||||||
xcb_input_enter_event_t *ev = (xcb_input_enter_event_t *)event;
|
|
||||||
|
|
||||||
output = get_x11_output_from_window_id(x11, ev->event);
|
|
||||||
if (!output) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!output->cursor_hidden) {
|
|
||||||
xcb_xfixes_hide_cursor(x11->xcb, output->win);
|
|
||||||
xcb_flush(x11->xcb);
|
|
||||||
output->cursor_hidden = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case XCB_INPUT_LEAVE: {
|
|
||||||
xcb_input_leave_event_t *ev = (xcb_input_leave_event_t *)event;
|
|
||||||
|
|
||||||
output = get_x11_output_from_window_id(x11, ev->event);
|
|
||||||
if (!output) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (output->cursor_hidden) {
|
|
||||||
xcb_xfixes_show_cursor(x11->xcb, output->win);
|
|
||||||
xcb_flush(x11->xcb);
|
|
||||||
output->cursor_hidden = false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case XCB_INPUT_TOUCH_BEGIN: {
|
case XCB_INPUT_TOUCH_BEGIN: {
|
||||||
xcb_input_touch_begin_event_t *ev = (xcb_input_touch_begin_event_t *)event;
|
xcb_input_touch_begin_event_t *ev = (xcb_input_touch_begin_event_t *)event;
|
||||||
|
|
||||||
|
|
|
@ -381,11 +381,13 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
|
|
||||||
// The X11 protocol requires us to set a colormap and border pixel if the
|
// The X11 protocol requires us to set a colormap and border pixel if the
|
||||||
// depth doesn't match the root window's
|
// depth doesn't match the root window's
|
||||||
uint32_t mask = XCB_CW_BORDER_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP;
|
uint32_t mask = XCB_CW_BORDER_PIXEL | XCB_CW_EVENT_MASK |
|
||||||
|
XCB_CW_COLORMAP | XCB_CW_CURSOR;
|
||||||
uint32_t values[] = {
|
uint32_t values[] = {
|
||||||
0,
|
0,
|
||||||
XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY,
|
XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY,
|
||||||
x11->colormap,
|
x11->colormap,
|
||||||
|
x11->cursor,
|
||||||
};
|
};
|
||||||
output->win = xcb_generate_id(x11->xcb);
|
output->win = xcb_generate_id(x11->xcb);
|
||||||
xcb_create_window(x11->xcb, x11->depth->depth, output->win,
|
xcb_create_window(x11->xcb, x11->depth->depth, output->win,
|
||||||
|
@ -402,8 +404,6 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
XCB_INPUT_XI_EVENT_MASK_BUTTON_PRESS |
|
XCB_INPUT_XI_EVENT_MASK_BUTTON_PRESS |
|
||||||
XCB_INPUT_XI_EVENT_MASK_BUTTON_RELEASE |
|
XCB_INPUT_XI_EVENT_MASK_BUTTON_RELEASE |
|
||||||
XCB_INPUT_XI_EVENT_MASK_MOTION |
|
XCB_INPUT_XI_EVENT_MASK_MOTION |
|
||||||
XCB_INPUT_XI_EVENT_MASK_ENTER |
|
|
||||||
XCB_INPUT_XI_EVENT_MASK_LEAVE |
|
|
||||||
XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN |
|
XCB_INPUT_XI_EVENT_MASK_TOUCH_BEGIN |
|
||||||
XCB_INPUT_XI_EVENT_MASK_TOUCH_END |
|
XCB_INPUT_XI_EVENT_MASK_TOUCH_END |
|
||||||
XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE,
|
XCB_INPUT_XI_EVENT_MASK_TOUCH_UPDATE,
|
||||||
|
|
|
@ -47,7 +47,6 @@ struct wlr_x11_output {
|
||||||
|
|
||||||
struct wl_list buffers; // wlr_x11_buffer::link
|
struct wl_list buffers; // wlr_x11_buffer::link
|
||||||
|
|
||||||
bool cursor_hidden;
|
|
||||||
uint64_t last_msc;
|
uint64_t last_msc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,6 +67,7 @@ struct wlr_x11_backend {
|
||||||
xcb_depth_t *depth;
|
xcb_depth_t *depth;
|
||||||
xcb_visualid_t visualid;
|
xcb_visualid_t visualid;
|
||||||
xcb_colormap_t colormap;
|
xcb_colormap_t colormap;
|
||||||
|
xcb_cursor_t cursor;
|
||||||
uint32_t dri3_major_version, dri3_minor_version;
|
uint32_t dri3_major_version, dri3_minor_version;
|
||||||
|
|
||||||
size_t requested_outputs;
|
size_t requested_outputs;
|
||||||
|
|
Loading…
Reference in New Issue