void flush_wayland_fd(void *data) { struct pollfd fd = {0}; input_ctx_wayland_data_t *wl = (input_ctx_wayland_data_t*)data; wl_display_dispatch_pending(wl->dpy); wl_display_flush(wl->dpy); fd.fd = wl->fd; fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP; if (poll(&fd, 1, 0) > 0) { if (fd.revents & (POLLERR | POLLHUP)) { close(wl->fd); frontend_driver_set_signal_handler_state(1); } if (fd.revents & POLLIN) wl_display_dispatch(wl->dpy); if (fd.revents & POLLOUT) wl_display_flush(wl->dpy); } }
bool x11_alive(void *data) { while (XPending(g_x11_dpy)) { XEvent event; bool filter = false; /* Can get events from older windows. Check this. */ XNextEvent(g_x11_dpy, &event); filter = XFilterEvent(&event, g_x11_win); switch (event.type) { case ClientMessage: if (event.xclient.window == g_x11_win && (Atom)event.xclient.data.l[0] == g_x11_quit_atom) frontend_driver_set_signal_handler_state(1); break; case DestroyNotify: if (event.xdestroywindow.window == g_x11_win) frontend_driver_set_signal_handler_state(1); break; case MapNotify: if (event.xmap.window == g_x11_win) g_x11_has_focus = true; break; case UnmapNotify: if (event.xunmap.window == g_x11_win) g_x11_has_focus = false; break; case ButtonPress: switch (event.xbutton.button) { case 1: /* Left click */ #if 0 RARCH_LOG("Click occurred : [%d, %d]\n", event.xbutton.x_root, event.xbutton.y_root); #endif break; case 2: /* Grabbed */ /* Middle click */ break; case 3: /* Right click */ break; case 4: /* Grabbed */ /* Scroll up */ case 5: /* Scroll down */ x_input_poll_wheel(&event.xbutton, true); break; } break; case EnterNotify: g_x11_entered = true; break; case LeaveNotify: g_x11_entered = false; break; case ButtonRelease: break; case KeyPress: case KeyRelease: if (event.xkey.window == g_x11_win) x11_handle_key_event(&event, g_x11_xic, filter); break; } } return !((bool)frontend_driver_get_signal_handler_state()); }