void WaitFlip(bool block)
        {
            PollFD fds = new PollFD();
            fds.fd = fd;
            fds.events = PollFlags.In;

            EventContext evctx = new EventContext();
            evctx.version = EventContext.Version;
            evctx.page_flip_handler = PageFlipPtr;

            int timeout = block ? -1 : 0;

            while (is_flip_queued)
            {
                fds.revents = 0;
                if (Libc.poll(ref fds, 1, timeout) < 0)
                    break;

                if ((fds.revents & (PollFlags.Hup | PollFlags.Error)) != 0)
                    break;

                if ((fds.revents & PollFlags.In) != 0)
                    Drm.HandleEvent(fd, ref evctx);
                else
                    break;
            }

            // Page flip has taken place, update buffer objects
            if (!is_flip_queued)
            {
                IntPtr gbm_surface = WindowInfo.Handle;
                Gbm.ReleaseBuffer(gbm_surface, bo);
                bo = bo_next;
            }
        }
Ejemplo n.º 2
0
 public static extern int HandleEvent(int fd, ref EventContext evctx);