module WM.Core where import Control.Concurrent (threadDelay) import Control.Exception (bracket) import Foreign (Ptr) import System.Environment (getArgs) import WM.Layout import WM.Mruby import WM.XKutu data State = State { mruby_pointer :: !(Ptr MrbState), running :: !Bool, root :: !(Maybe Tile) } deriving (Show) newState :: Ptr MrbState -> State newState ptr = State { mruby_pointer = ptr, running = True, root = Nothing } run :: IO () run = do is_started <- deploy print is_started add_keybind 24 0 w_id <- draw_rectangle 10 100 10 10 0x500070 geom <- get_geometry w_id print geom screen_info <- get_screen print screen_info pointer_info <- get_pointer print pointer_info bracket mrb_open mrb_close $ \mrb -> do loadRubyLibs mrb handle_args mrb loop (newState mrb) handle_args :: Ptr MrbState -> IO () handle_args mrb = do args <- getArgs case args of [] -> pure () ["--script", file] -> do script <- readFile file runRuby mrb script _ -> putStrLn "unknown arguments" handle_event :: Maybe Event -> State -> IO State handle_event Nothing s = pure s handle_event (Just ev) s | event_btn ev == 24 = pure s {running = False} | otherwise = print ev >> pure s loop :: State -> IO () loop state | not (running state) = pure () | otherwise = do flush threadDelay 10000 ev <- next_event handle_event ev state >>= loop