[Wayland] Modify wayland event polling 50/124050/1
authorWonsik, Jung <sidein@samsung.com>
Mon, 10 Apr 2017 04:53:23 +0000 (13:53 +0900)
committerWonsik, Jung <sidein@samsung.com>
Mon, 10 Apr 2017 04:59:36 +0000 (13:59 +0900)
Modify wayland event polling in wayaland backend.
This patch is made by referring the below.

https://wayland.freedesktop.org/docs/html/apb.html#Client-classwl__display

Change-Id: Ia070b96e285b595b223752386099484b753b0d9f

src/video/wayland/SDL_waylandevents.c
src/video/wayland/SDL_waylandsym.h

index e1eaa58..4ca9483 100644 (file)
@@ -71,15 +71,30 @@ Wayland_PumpEvents(_THIS)
 {
     SDL_VideoData *d = _this->driverdata;
     struct pollfd pfd[1];
+    int ret = 0;
 
     pfd[0].fd = WAYLAND_wl_display_get_fd(d->display);
     pfd[0].events = POLLIN;
-    poll(pfd, 1, 0);
 
-    if (pfd[0].revents & POLLIN)
+    while (WAYLAND_wl_display_prepare_read(d->display) != 0) {
+         WAYLAND_wl_display_dispatch_pending(d->display);
+    }
+    WAYLAND_wl_display_flush(d->display);
+
+    ret = poll(pfd, 1, 0);
+    if (ret < 0) {
+        WAYLAND_wl_display_cancel_read(d->display);
+    }
+    else {
+        WAYLAND_wl_display_read_events(d->display);
+    }
+
+    if (pfd[0].revents & POLLIN) {
         WAYLAND_wl_display_dispatch(d->display);
-    else
+    }
+    else {
         WAYLAND_wl_display_dispatch_pending(d->display);
+    }
 }
 
 static void
index 6b66aff..5b355b5 100644 (file)
@@ -50,6 +50,9 @@ SDL_WAYLAND_SYM(void, wl_list_remove, (struct wl_list *))
 SDL_WAYLAND_SYM(int, wl_list_length, (const struct wl_list *))
 SDL_WAYLAND_SYM(int, wl_list_empty, (const struct wl_list *))
 SDL_WAYLAND_SYM(void, wl_list_insert_list, (struct wl_list *, struct wl_list *))
+SDL_WAYLAND_SYM(int, wl_display_prepare_read, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_cancel_read, (struct wl_display *))
+SDL_WAYLAND_SYM(int, wl_display_read_events, (struct wl_display *))
 
 /* These functions are available in Wayland >= 1.4 */
 SDL_WAYLAND_MODULE(WAYLAND_CLIENT_1_4)