From dd496bf517a65b06eee2d2ed35613d23bb8cf270 Mon Sep 17 00:00:00 2001
From: Jens Nolte <jens@nightmarestudio.de>
Date: Wed, 20 Nov 2019 12:53:54 +0100
Subject: [PATCH] Pass click event data to event handler

---
 src/QBar/Core.hs   |  9 +++++----
 src/QBar/Server.hs | 26 +++++++++++++-------------
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/src/QBar/Core.hs b/src/QBar/Core.hs
index 97c3875..6998dd2 100644
--- a/src/QBar/Core.hs
+++ b/src/QBar/Core.hs
@@ -31,13 +31,14 @@ import Data.Colour.RGBSpace
 
 data Block = Block {
   values :: HM.HashMap T.Text T.Text,
-  clickAction :: Maybe (IO ())
+  clickAction :: Maybe (Click -> IO ())
 }
 instance Show Block where
   show Block{values} = show values
 
 data Click = Click {
-  name :: T.Text
+  name :: T.Text,
+  button :: Int
 } deriving Show
 $(deriveJSON defaultOptions ''Click)
 
@@ -170,8 +171,8 @@ sharedInterval barUpdateChannel seconds = do
           clickAction = Just (updateClickHandler result)
         }
         where
-          updateClickHandler :: Block -> IO ()
-          updateClickHandler block = do
+          updateClickHandler :: Block -> Click -> IO ()
+          updateClickHandler block _ = do
             -- Give user feedback that the block is updating
             let outdatedBlock = setColor updatingColor $ removePango block
             void $ atomically $ send output $ outdatedBlock
diff --git a/src/QBar/Server.hs b/src/QBar/Server.hs
index 0e8e76f..6fc85c1 100644
--- a/src/QBar/Server.hs
+++ b/src/QBar/Server.hs
@@ -28,7 +28,7 @@ import System.IO (stdin, stdout, stderr, hFlush, hPutStrLn)
 import System.Posix.Signals
 
 data Handle = Handle {
-  handleActionList :: IORef [(T.Text, IO ())],
+  handleActionList :: IORef [(T.Text, Click -> IO ())],
   handleActiveFilter :: IORef Filter
 }
 
@@ -91,9 +91,9 @@ renderLine MainOptions{verbose} Handle{handleActionList} blockFilter blocks prev
 
   return encodedOutput
   where
-    clickActionList :: [(T.Text, IO ())]
+    clickActionList :: [(T.Text, Click -> IO ())]
     clickActionList = mapMaybe getClickAction blocks
-    getClickAction :: Block -> Maybe (T.Text, IO ())
+    getClickAction :: Block -> Maybe (T.Text, Click -> IO ())
     getClickAction block = if hasBlockName && hasClickAction then Just (fromJust maybeBlockName, fromJust maybeClickAction) else Nothing
       where
         maybeBlockName = getBlockName block
@@ -106,7 +106,7 @@ createBarUpdateChannel = do
   event <- Event.newSet
   return (BarUpdateChannel $ Event.set event, event)
 
-handleStdin :: MainOptions -> IORef [(T.Text, IO ())] -> IO ()
+handleStdin :: MainOptions -> IORef [(T.Text, Click -> IO ())] -> IO ()
 handleStdin options actionListIORef = forever $ do
   line <- BSSC8.hGetLine stdin
 
@@ -116,17 +116,17 @@ handleStdin options actionListIORef = forever $ do
       BSSC8.hPutStrLn stderr line
       hFlush stderr
 
-    clickActionList <- readIORef actionListIORef
-    let maybeParsedClick = decode $ removeComma $ BS.fromStrict line
-    let clickAction' = getClickAction clickActionList maybeParsedClick
-    async (fromMaybe (return ()) clickAction') >>= link
+    let maybeClick = decode $ removeComma $ BS.fromStrict line
+    case maybeClick of
+      Just click -> do
+        clickActionList <- readIORef actionListIORef
+        let clickAction' = getClickAction clickActionList click
+        async ((fromMaybe discard clickAction') click) >>= link
+      Nothing -> return ()
 
   where
-    getClickAction :: [(T.Text, IO ())] -> Maybe Click -> Maybe (IO ())
-    getClickAction clickActionList maybeParsedClick = do
-      parsedClick <- maybeParsedClick
-      let blockName = name parsedClick
-      lookup blockName clickActionList
+    getClickAction :: [(T.Text, Click -> IO ())] -> Click -> Maybe (Click -> IO ())
+    getClickAction clickActionList click = lookup (name click) clickActionList
     removeComma :: C8.ByteString -> C8.ByteString
     removeComma line
       | C8.head line == ',' = C8.tail line
-- 
GitLab