From ced31927effc976e3daa1af557336d86b8884ea5 Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Tue, 14 Dec 2021 17:24:56 +0100
Subject: [PATCH] Implement high-level wrapper for wl_display.sync

---
 src/Quasar/Wayland/Display.hs       | 11 +++++++++++
 src/Quasar/Wayland/Protocol.hs      |  4 +++-
 src/Quasar/Wayland/Protocol/Core.hs | 10 +++++++++-
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/Quasar/Wayland/Display.hs b/src/Quasar/Wayland/Display.hs
index c42353e..8350525 100644
--- a/src/Quasar/Wayland/Display.hs
+++ b/src/Quasar/Wayland/Display.hs
@@ -4,6 +4,8 @@ module Quasar.Wayland.Display (
 ) where
 
 import Control.Concurrent.STM
+import GHC.Records
+import Quasar.Awaitable
 import Quasar.Prelude
 import Quasar.Wayland.Protocol
 import Quasar.Wayland.Protocol.Display
@@ -23,3 +25,12 @@ newClientDisplay =
       wlDisplay,
       registry
     }
+
+instance HasField "sync" ClientDisplay (STM (Awaitable ())) where
+  getField display = do
+    var <- newAsyncVarSTM
+    wlCallback <- display.wlDisplay.sync
+    setEventHandler wlCallback EventHandler_wl_callback {
+      done = const $ putAsyncVarSTM_ var ()
+    }
+    pure $ toAwaitable var
diff --git a/src/Quasar/Wayland/Protocol.hs b/src/Quasar/Wayland/Protocol.hs
index 3c042cd..68e59f5 100644
--- a/src/Quasar/Wayland/Protocol.hs
+++ b/src/Quasar/Wayland/Protocol.hs
@@ -4,8 +4,10 @@ module Quasar.Wayland.Protocol (
   -- "Quasar.Wayland.Protocol.TH".
 
   Object,
-  getMessageHandler,
+  setEventHandler,
+  setRequestHandler,
   setMessageHandler,
+  getMessageHandler,
 
   -- ** Wayland types
   Fixed(..),
diff --git a/src/Quasar/Wayland/Protocol/Core.hs b/src/Quasar/Wayland/Protocol/Core.hs
index d38c423..b1e8dfb 100644
--- a/src/Quasar/Wayland/Protocol/Core.hs
+++ b/src/Quasar/Wayland/Protocol/Core.hs
@@ -17,8 +17,10 @@ module Quasar.Wayland.Protocol.Core (
   IsInterfaceSide(..),
   IsInterfaceHandler(..),
   Object(objectId),
-  getMessageHandler,
+  setEventHandler,
+  setRequestHandler,
   setMessageHandler,
+  getMessageHandler,
   NewObject,
   IsObject,
   IsMessage(..),
@@ -258,6 +260,12 @@ getMessageHandler object = maybe retry pure =<< readTVar object.messageHandler
 setMessageHandler :: Object s i -> MessageHandler s i -> STM ()
 setMessageHandler object = writeTVar object.messageHandler . Just
 
+setRequestHandler :: Object 'Server i -> RequestHandler i -> STM ()
+setRequestHandler = setMessageHandler
+
+setEventHandler :: Object 'Client i -> EventHandler i -> STM ()
+setEventHandler = setMessageHandler
+
 -- | Type alias to indicate an object is created with a message.
 type NewObject s i = Object s i
 
-- 
GitLab