mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-02 03:45:58 +01:00
backend/x11: create per-window present event contexts
The Present protocol states: > An event context is associated with a specific window; using an existing > event context with a different window generates a Match error. Instead of a global event context, use a per-window event context to fix this error: [backend/x11/backend.c:608] X11 error: op Present (SelectInput), code Match (no extension), sequence 63, value 4194307 Closes: https://github.com/swaywm/wlroots/issues/2577
This commit is contained in:
parent
23b6f3e3f5
commit
caeed70f28
3 changed files with 5 additions and 4 deletions
|
@ -564,8 +564,6 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
x11->present_event_id = xcb_generate_id(x11->xcb);
|
|
||||||
|
|
||||||
wlr_input_device_init(&x11->keyboard_dev, WLR_INPUT_DEVICE_KEYBOARD,
|
wlr_input_device_init(&x11->keyboard_dev, WLR_INPUT_DEVICE_KEYBOARD,
|
||||||
&input_device_impl, "X11 keyboard", 0, 0);
|
&input_device_impl, "X11 keyboard", 0, 0);
|
||||||
wlr_keyboard_init(&x11->keyboard, &keyboard_impl);
|
wlr_keyboard_init(&x11->keyboard, &keyboard_impl);
|
||||||
|
|
|
@ -86,6 +86,8 @@ static void output_destroy(struct wlr_output *wlr_output) {
|
||||||
wl_list_remove(&output->link);
|
wl_list_remove(&output->link);
|
||||||
wlr_buffer_unlock(output->back_buffer);
|
wlr_buffer_unlock(output->back_buffer);
|
||||||
wlr_swapchain_destroy(output->swapchain);
|
wlr_swapchain_destroy(output->swapchain);
|
||||||
|
// A zero event mask deletes the event context
|
||||||
|
xcb_present_select_input(x11->xcb, output->present_event_id, output->win, 0);
|
||||||
xcb_destroy_window(x11->xcb, output->win);
|
xcb_destroy_window(x11->xcb, output->win);
|
||||||
xcb_flush(x11->xcb);
|
xcb_flush(x11->xcb);
|
||||||
free(output);
|
free(output);
|
||||||
|
@ -398,7 +400,8 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
|
|
||||||
uint32_t present_mask = XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY |
|
uint32_t present_mask = XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY |
|
||||||
XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY;
|
XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY;
|
||||||
xcb_present_select_input(x11->xcb, x11->present_event_id, output->win,
|
output->present_event_id = xcb_generate_id(x11->xcb);
|
||||||
|
xcb_present_select_input(x11->xcb, output->present_event_id, output->win,
|
||||||
present_mask);
|
present_mask);
|
||||||
|
|
||||||
xcb_change_property(x11->xcb, XCB_PROP_MODE_REPLACE, output->win,
|
xcb_change_property(x11->xcb, XCB_PROP_MODE_REPLACE, output->win,
|
||||||
|
|
|
@ -34,6 +34,7 @@ struct wlr_x11_output {
|
||||||
struct wl_list link; // wlr_x11_backend::outputs
|
struct wl_list link; // wlr_x11_backend::outputs
|
||||||
|
|
||||||
xcb_window_t win;
|
xcb_window_t win;
|
||||||
|
xcb_present_event_t present_event_id;
|
||||||
|
|
||||||
struct wlr_swapchain *swapchain;
|
struct wlr_swapchain *swapchain;
|
||||||
struct wlr_buffer *back_buffer;
|
struct wlr_buffer *back_buffer;
|
||||||
|
@ -68,7 +69,6 @@ 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_present_event_t present_event_id;
|
|
||||||
|
|
||||||
size_t requested_outputs;
|
size_t requested_outputs;
|
||||||
size_t last_output_num;
|
size_t last_output_num;
|
||||||
|
|
Loading…
Reference in a new issue