bar/wayland: don't use wl_display_dispatch()

wl_display_dispatch() calls poll(), which is unnecessary since we
already know the FD is readable.

Use the more lower level wl_display_read_events() +
wl_display_dispatch_pending().

These require wl_display_prepare_read() to have been called.
This commit is contained in:
Daniel Eklöf 2020-01-03 21:24:26 +01:00
parent 6bef3b8e2f
commit edfe7e70f9
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -141,6 +141,7 @@ update_cursor_surface(struct wayland_backend *backend)
backend->pointer.surface, 0, 0, INT32_MAX, INT32_MAX); backend->pointer.surface, 0, 0, INT32_MAX, INT32_MAX);
wl_surface_commit(backend->pointer.surface); wl_surface_commit(backend->pointer.surface);
wl_display_flush(backend->display);
} }
static void static void
@ -735,9 +736,6 @@ setup(struct bar *_bar)
backend->render_scheduled = false; backend->render_scheduled = false;
//wl_surface_commit(backend->surface);
//wl_display_roundtrip(backend->display);
/* Prepare a buffer + pixman image for bar to draw to */ /* Prepare a buffer + pixman image for bar to draw to */
backend->next_buffer = get_buffer(backend); backend->next_buffer = get_buffer(backend);
assert(backend->next_buffer != NULL && backend->next_buffer->busy); assert(backend->next_buffer != NULL && backend->next_buffer->busy);
@ -818,14 +816,7 @@ loop(struct bar *_bar,
backend->bar_expose = expose; backend->bar_expose = expose;
backend->bar_on_mouse = on_mouse; backend->bar_on_mouse = on_mouse;
#if 0 while (wl_display_prepare_read(backend->display) != 0)
while (wl_display_prepare_read(backend->display) != 0){
//printf("initial wayland event\n");
wl_display_dispatch_pending(backend->display);
}
wl_display_flush(backend->display);
#endif
wl_display_dispatch_pending(backend->display); wl_display_dispatch_pending(backend->display);
wl_display_flush(backend->display); wl_display_flush(backend->display);
@ -836,12 +827,8 @@ loop(struct bar *_bar,
{.fd = backend->pipe_fds[0], .events = POLLIN}, {.fd = backend->pipe_fds[0], .events = POLLIN},
}; };
wl_display_flush(backend->display);
//printf("polling\n");
poll(fds, sizeof(fds) / sizeof(fds[0]), -1); poll(fds, sizeof(fds) / sizeof(fds[0]), -1);
if (fds[0].revents & POLLIN) { if (fds[0].revents & POLLIN) {
//wl_display_cancel_read(backend->display);
break; break;
} }
@ -857,7 +844,6 @@ loop(struct bar *_bar,
if (fds[2].revents & POLLIN) { if (fds[2].revents & POLLIN) {
uint8_t command; uint8_t command;
//wl_display_cancel_read(backend->display);
if (read(backend->pipe_fds[0], &command, sizeof(command)) if (read(backend->pipe_fds[0], &command, sizeof(command))
!= sizeof(command)) != sizeof(command))
{ {
@ -866,27 +852,19 @@ loop(struct bar *_bar,
} }
assert(command == 1); assert(command == 1);
//printf("refresh\n");
expose(_bar); expose(_bar);
#if 0
while (wl_display_prepare_read(backend->display) != 0) {
//printf("queued wayland events\n");
wl_display_dispatch_pending(backend->display);
}
wl_display_flush(backend->display);
#endif
} }
if (fds[1].revents & POLLIN) { if (fds[1].revents & POLLIN) {
#if 0
//printf("wayland events\n");
wl_display_read_events(backend->display); wl_display_read_events(backend->display);
while (wl_display_prepare_read(backend->display) != 0)
wl_display_dispatch_pending(backend->display); wl_display_dispatch_pending(backend->display);
#endif wl_display_flush(backend->display);
//printf("wayland events\n");
wl_display_dispatch(backend->display);
} }
} }
wl_display_cancel_read(backend->display);
} }
static void frame_callback( static void frame_callback(
@ -918,6 +896,7 @@ frame_callback(void *data, struct wl_callback *wl_callback, uint32_t callback_da
struct wl_callback *cb = wl_surface_frame(backend->surface); struct wl_callback *cb = wl_surface_frame(backend->surface);
wl_callback_add_listener(cb, &frame_listener, bar); wl_callback_add_listener(cb, &frame_listener, bar);
wl_surface_commit(backend->surface); wl_surface_commit(backend->surface);
wl_display_flush(backend->display);
backend->pending_buffer = NULL; backend->pending_buffer = NULL;
backend->render_scheduled = true; backend->render_scheduled = true;
@ -957,6 +936,7 @@ commit(const struct bar *_bar)
struct wl_callback *cb = wl_surface_frame(backend->surface); struct wl_callback *cb = wl_surface_frame(backend->surface);
wl_callback_add_listener(cb, &frame_listener, bar); wl_callback_add_listener(cb, &frame_listener, bar);
wl_surface_commit(backend->surface); wl_surface_commit(backend->surface);
wl_display_flush(backend->display);
backend->render_scheduled = true; backend->render_scheduled = true;
} }