packages feed

Monadoro-0.2.0.0: src/FullScreen.lhs

> module FullScreen where
>
> import Timer (secToTimestamp)
> import Control.Concurrent (threadDelay)
> import UI.NCurses
> import System.IO (
>                   hFlush,
>                   stdout)
> import System.Console.ANSI (clearLine,
>                             clearFromCursorToScreenEnd,
>                             setCursorColumn,
>                             hideCursor,
>                             showCursor,
>                             saveCursor,
>                             restoreCursor,
>                            )
>
> main :: IO ()
> main = ncurses_clock
>
> wait_seconds :: Int -> IO()
> wait_seconds 0 = do
>     putStr ""
> wait_seconds n = do
>     restoreCursor
>     putStr $ secToTimestamp $ n - 1
>     hFlush stdout
>     delay 1
>     wait_seconds $ n - 1

> delay :: Int -> IO()
> delay n = del n
> 
> del :: Int -> IO()
> del n = do
>     threadDelay $ n * 1000 * 1000

> ncurses_clock :: IO ()
> ncurses_clock = runCurses $ do
>     setEcho False
>     w <- defaultWindow
>     updateWindow w $ do
>         moveCursor 1 10
>         drawString "Hello world!"
>         moveCursor 3 10
>         drawString "(press q to quit)"
>         moveCursor 0 0
>     render
>     waitFor w (\ev -> ev == EventCharacter 'q' || ev == EventCharacter 'Q')
> 
> waitFor :: Window -> (Event -> Bool) -> Curses ()
> waitFor w p = loop where
>     loop = do
>         ev <- getEvent w Nothing
>         case ev of
>             Nothing -> loop
>             Just ev' -> if p ev' then return () else loop
>