module Main where import Graphics.UI.Gtk (initGUI, mainGUI) import System.Gnome.GConf (GConf, gconfGetDefault, gconfSet) import System.Glib.MainLoop (timeoutAdd, timeoutRemove, HandlerId) import System.Directory (getHomeDirectory, getDirectoryContents, doesFileExist) import System.Random import System.Environment import Control.Monad (filterM) import Data.IORef main :: IO () main = do random_generator <- getStdGen random_generator_ior <- newIORef random_generator home <- getHomeDirectory args <- getArgs let seconds = case length args of 0 -> 50 :: Int _ -> read (head args) :: Int minutes = case length args of n | n < 2 -> 1440 _ -> read (head $ drop 1 args) :: Int picture_directory = case length args of n | n == 3 -> head $ drop 2 args n | n > 3 -> error "Usage: gnome_desktop [redisplay-seconds] [reread-minutes] [directory]" n | otherwise -> "Pictures" pictures = home ++ "/" ++ picture_directory ++ "/" set_timeouts random_generator_ior seconds minutes pictures initGUI mainGUI set_timeouts :: IORef StdGen -> Int -> Int -> FilePath -> IO () set_timeouts random_generator_ior seconds minutes pictures = do real_files <- get_pictures pictures conf <- gconfGetDefault set_picture conf real_files (length real_files) random_generator_ior picture_timeout <- timeoutAdd (set_picture conf real_files (length real_files) random_generator_ior) (seconds * 1000) timeout_handler_ior <- newIORef picture_timeout timeoutAdd (read_directory seconds pictures conf timeout_handler_ior random_generator_ior) (minutes * 60000) return () read_directory :: Int -> FilePath -> GConf -> IORef HandlerId -> IORef StdGen -> IO Bool read_directory seconds pictures conf timeout_handler_ior random_generator_ior = do real_files <- get_pictures pictures handler_id <- readIORef timeout_handler_ior timeoutRemove handler_id handler_id <- timeoutAdd (set_picture conf real_files (length real_files) random_generator_ior) (seconds * 1000) return True get_pictures :: FilePath -> IO [FilePath] get_pictures pictures = do files <- getDirectoryContents pictures let abs_files = map (absolute_file pictures) files filterM doesFileExist abs_files set_picture :: GConf -> [FilePath] -> Int -> IORef StdGen -> IO Bool set_picture conf files len random_generator_ior = do g <- readIORef random_generator_ior let (n, g') = randomR (1, len) g file = head $ drop (n - 1) files writeIORef random_generator_ior g' gconfSet conf "/desktop/gnome/background/picture_filename" file return True absolute_file :: FilePath -> FilePath -> FilePath absolute_file pictures file = pictures ++ file