module WM.Core where import Control.Concurrent (threadDelay) import Foreign (Ptr) import System.Environment (getArgs) import WM.Mruby import WM.XKutu data State = State { mruby_pointer :: Ptr MrbState, running :: Bool } deriving (Show) 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 mrb <- mrb_open runRuby mrb runtimeRb handle_args mrb loop $ State mrb True mrb_close 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 state = pure state handle_event (Just ev) state | event_btn ev == 24 = pure state {running = False} | otherwise = do print ev pure state loop :: State -> IO () loop state | not (running state) = pure () | otherwise = do flush threadDelay 10000 ev <- next_event handle_event ev state >>= loop