{-# LANGUAGE OverloadedStrings #-}
module System.Taffybar.Widget.Layout
  (
  
  
    LayoutConfig(..)
  , defaultLayoutConfig
  , layoutNew
  ) where
import           Control.Monad.Trans.Class
import           Control.Monad.Trans.Reader
import qualified Data.Text as T
import qualified GI.Gtk as Gtk
import           GI.Gdk
import           System.Taffybar.Context
import           System.Taffybar.Information.X11DesktopInfo
import           System.Taffybar.Util
import           System.Taffybar.Widget.Util
newtype LayoutConfig = LayoutConfig
  { formatLayout :: T.Text -> TaffyIO T.Text
  }
defaultLayoutConfig :: LayoutConfig
defaultLayoutConfig = LayoutConfig return
xLayoutProp :: String
xLayoutProp = "_XMONAD_CURRENT_LAYOUT"
layoutNew :: LayoutConfig -> TaffyIO Gtk.Widget
layoutNew config = do
  ctx <- ask
  label <- lift $ Gtk.labelNew (Nothing :: Maybe T.Text)
  _ <- widgetSetClassGI label "layout-label"
  
  
  let callback _ = liftReader postGUIASync $ do
        layout <- runX11Def "" $ readAsString Nothing xLayoutProp
        markup <- formatLayout config (T.pack layout)
        lift $ Gtk.labelSetMarkup label markup
  subscription <- subscribeToPropertyEvents [xLayoutProp] callback
  do
    ebox <- Gtk.eventBoxNew
    Gtk.containerAdd ebox label
    _ <- Gtk.onWidgetButtonPressEvent ebox $ dispatchButtonEvent ctx
    Gtk.widgetShowAll ebox
    _ <- Gtk.onWidgetUnrealize ebox $ flip runReaderT ctx $ unsubscribe subscription
    Gtk.toWidget ebox
dispatchButtonEvent :: Context -> EventButton -> IO Bool
dispatchButtonEvent context btn = do
  pressType <- getEventButtonType btn
  buttonNumber <- getEventButtonButton btn
  case pressType of
    EventTypeButtonPress ->
        case buttonNumber of
          1 -> runReaderT (runX11Def () (switch 1)) context >> return True
          2 -> runReaderT (runX11Def () (switch (-1))) context >> return True
          _ -> return False
    _ -> return False
switch :: Int -> X11Property ()
switch n = do
  cmd <- getAtom xLayoutProp
  sendCommandEvent cmd (fromIntegral n)