mirror of
https://codeberg.org/dnkl/yambar.git
synced 2025-04-19 19:25:41 +02:00
bar/wayland: error handling when dispatching Wayland events
This commit is contained in:
parent
a59d3cfbd6
commit
1d9297593e
1 changed files with 34 additions and 12 deletions
|
@ -1212,13 +1212,19 @@ loop(struct bar *_bar,
|
||||||
{
|
{
|
||||||
struct private *bar = _bar->private;
|
struct private *bar = _bar->private;
|
||||||
struct wayland_backend *backend = bar->backend.data;
|
struct wayland_backend *backend = bar->backend.data;
|
||||||
|
bool send_abort_to_modules = true;
|
||||||
|
|
||||||
pthread_setname_np(pthread_self(), "bar(wayland)");
|
pthread_setname_np(pthread_self(), "bar(wayland)");
|
||||||
|
|
||||||
backend->bar_on_mouse = on_mouse;
|
backend->bar_on_mouse = on_mouse;
|
||||||
|
|
||||||
while (wl_display_prepare_read(backend->display) != 0)
|
while (wl_display_prepare_read(backend->display) != 0) {
|
||||||
wl_display_dispatch_pending(backend->display);
|
if (wl_display_dispatch_pending(backend->display) < 0) {
|
||||||
|
LOG_ERRNO("failed to dispatch pending Wayland events");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wl_display_flush(backend->display);
|
wl_display_flush(backend->display);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -1230,16 +1236,13 @@ loop(struct bar *_bar,
|
||||||
|
|
||||||
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) {
|
||||||
|
/* Already done by the bar */
|
||||||
|
send_abort_to_modules = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[1].revents & POLLHUP) {
|
if (fds[1].revents & POLLHUP) {
|
||||||
LOG_INFO("disconnected from wayland");
|
LOG_INFO("disconnected from wayland");
|
||||||
if (write(_bar->abort_fd, &(uint64_t){1}, sizeof(uint64_t))
|
|
||||||
!= sizeof(uint64_t))
|
|
||||||
{
|
|
||||||
LOG_ERRNO("failed to signal abort to modules");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1253,9 +1256,10 @@ loop(struct bar *_bar,
|
||||||
ssize_t r = read(backend->pipe_fds[0], &command, sizeof(command));
|
ssize_t r = read(backend->pipe_fds[0], &command, sizeof(command));
|
||||||
if (r < 0 && errno == EAGAIN)
|
if (r < 0 && errno == EAGAIN)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (r != sizeof(command)) {
|
if (r != sizeof(command)) {
|
||||||
LOG_ERRNO("failed to read from command pipe");
|
LOG_ERRNO("failed to read from command pipe");
|
||||||
break;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(command == 1);
|
assert(command == 1);
|
||||||
|
@ -1271,15 +1275,33 @@ loop(struct bar *_bar,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[1].revents & POLLIN) {
|
if (fds[1].revents & POLLIN) {
|
||||||
wl_display_read_events(backend->display);
|
if (wl_display_read_events(backend->display) < 0) {
|
||||||
|
LOG_ERRNO("failed to read events from the Wayland socket");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (wl_display_prepare_read(backend->display) != 0) {
|
||||||
|
if (wl_display_dispatch_pending(backend->display) < 0) {
|
||||||
|
LOG_ERRNO("failed to dispatch pending Wayland events");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (wl_display_prepare_read(backend->display) != 0)
|
|
||||||
wl_display_dispatch_pending(backend->display);
|
|
||||||
wl_display_flush(backend->display);
|
wl_display_flush(backend->display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_display_cancel_read(backend->display);
|
out:
|
||||||
|
if (!send_abort_to_modules)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (write(_bar->abort_fd, &(uint64_t){1}, sizeof(uint64_t))
|
||||||
|
!= sizeof(uint64_t))
|
||||||
|
{
|
||||||
|
LOG_ERRNO("failed to signal abort to modules");
|
||||||
|
}
|
||||||
|
|
||||||
|
//wl_display_cancel_read(backend->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Add table
Reference in a new issue