|
|
|
@ -708,22 +708,19 @@ static void incrementCursorImage(_GLFWwindow* window) |
|
|
|
|
|
|
|
|
|
static void handleEvents(int timeout) |
|
|
|
|
{ |
|
|
|
|
struct wl_display* display = _glfw.wl.display; |
|
|
|
|
struct pollfd fds[] = { |
|
|
|
|
{ wl_display_get_fd(display), POLLIN }, |
|
|
|
|
struct pollfd fds[] = |
|
|
|
|
{ |
|
|
|
|
{ wl_display_get_fd(_glfw.wl.display), POLLIN }, |
|
|
|
|
{ _glfw.wl.timerfd, POLLIN }, |
|
|
|
|
{ _glfw.wl.cursorTimerfd, POLLIN }, |
|
|
|
|
}; |
|
|
|
|
ssize_t read_ret; |
|
|
|
|
uint64_t repeats; |
|
|
|
|
|
|
|
|
|
while (wl_display_prepare_read(display) != 0) |
|
|
|
|
wl_display_dispatch_pending(display); |
|
|
|
|
while (wl_display_prepare_read(_glfw.wl.display) != 0) |
|
|
|
|
wl_display_dispatch_pending(_glfw.wl.display); |
|
|
|
|
|
|
|
|
|
// If an error different from EAGAIN happens, we have likely been
|
|
|
|
|
// disconnected from the Wayland session, try to handle that the best we
|
|
|
|
|
// can.
|
|
|
|
|
if (wl_display_flush(display) < 0 && errno != EAGAIN) |
|
|
|
|
// If an error other than EAGAIN happens, we have likely been disconnected
|
|
|
|
|
// from the Wayland session; try to handle that the best we can.
|
|
|
|
|
if (wl_display_flush(_glfw.wl.display) < 0 && errno != EAGAIN) |
|
|
|
|
{ |
|
|
|
|
_GLFWwindow* window = _glfw.windowListHead; |
|
|
|
|
while (window) |
|
|
|
@ -731,7 +728,8 @@ static void handleEvents(int timeout) |
|
|
|
|
_glfwInputWindowCloseRequest(window); |
|
|
|
|
window = window->next; |
|
|
|
|
} |
|
|
|
|
wl_display_cancel_read(display); |
|
|
|
|
|
|
|
|
|
wl_display_cancel_read(_glfw.wl.display); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -739,20 +737,21 @@ static void handleEvents(int timeout) |
|
|
|
|
{ |
|
|
|
|
if (fds[0].revents & POLLIN) |
|
|
|
|
{ |
|
|
|
|
wl_display_read_events(display); |
|
|
|
|
wl_display_dispatch_pending(display); |
|
|
|
|
wl_display_read_events(_glfw.wl.display); |
|
|
|
|
wl_display_dispatch_pending(_glfw.wl.display); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
wl_display_cancel_read(display); |
|
|
|
|
} |
|
|
|
|
wl_display_cancel_read(_glfw.wl.display); |
|
|
|
|
|
|
|
|
|
if (fds[1].revents & POLLIN) |
|
|
|
|
{ |
|
|
|
|
read_ret = read(_glfw.wl.timerfd, &repeats, sizeof(repeats)); |
|
|
|
|
if (read_ret == 8 && _glfw.wl.keyboardFocus) |
|
|
|
|
uint64_t repeats; |
|
|
|
|
|
|
|
|
|
if (read(_glfw.wl.timerfd, &repeats, sizeof(repeats)) == 8) |
|
|
|
|
{ |
|
|
|
|
for (uint64_t i = 0; i < repeats; ++i) |
|
|
|
|
if (_glfw.wl.keyboardFocus) |
|
|
|
|
{ |
|
|
|
|
for (uint64_t i = 0; i < repeats; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwInputKey(_glfw.wl.keyboardFocus, |
|
|
|
|
_glfw.wl.keyboardLastKey, |
|
|
|
@ -762,18 +761,18 @@ static void handleEvents(int timeout) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (fds[2].revents & POLLIN) |
|
|
|
|
{ |
|
|
|
|
read_ret = read(_glfw.wl.cursorTimerfd, &repeats, sizeof(repeats)); |
|
|
|
|
if (read_ret == 8) |
|
|
|
|
uint64_t repeats; |
|
|
|
|
|
|
|
|
|
if (read(_glfw.wl.cursorTimerfd, &repeats, sizeof(repeats)) == 8) |
|
|
|
|
incrementCursorImage(_glfw.wl.pointerFocus); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
wl_display_cancel_read(display); |
|
|
|
|
} |
|
|
|
|
wl_display_cancel_read(_glfw.wl.display); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|