[Haskell-cafe] Rotating backdrop (aka learning Haskell)

Spencer Janssen sjanssen at cse.unl.edu
Tue May 20 04:57:59 EDT 2008


On Tue, May 20, 2008 at 09:15:57AM +0100, Yann Golanski wrote:
> To help me learn Haskell, I decided on a simple (AH!) problem: given a
> list of images, display a random one as my desktop backdrop.  After some
> time, change the image.  Simple?  
> 
> What I actually want to do is a little more specific: Read a list of
> images (one per line) from a file.  Given that a working day is about 8
> hours, I want to see all the images during the day.  So, the time
> between changes should be (nbr_of_images) / (8 * 60 * 60) seconds.  Of
> course, if the file changes (I add or remove any number of images) this
> need to change and be recalculated.  Clearly, I want some interaction
> with a pseudo-random number generator.
> 
> Because this is a learning exercise, I want to have a pretty GUI for
> this.  Three buttons: Exit (which quits the application), Reset
> (re-reads the file whether it changed or not) and Next (display the next
> image).  Then I want a counter and a progress bar telling me when the
> next change will occur. 
> 
> 1- Get a list out of a file:  I managed to do that using the following:
> 
> parseImageFile :: FilePath -> IO [String]
> parseImageFile file = do inpStr <- readFile file
>                          return $ filter (/="") (breaks (=='\n') inpStr)
> 
> Nice, simple and I understand what it is doing.  
> 
> 2- Get a random element from a list and remove it:  Okay, this I
> understand less well.  I looked at the solutions of problems 23 and 20
> in http://www.haskell.org/haskellwiki/99_questions so there is a
> skeleton there.   However, my list is IO [String].... Hum, monads.
> 
> Any pointers as to how to do that?
> 
> 3- Wait and do something later.... How, I have no idea how to do that!
> Help?

One way is System.Concurrent.threadDelay, though there might be another way
that integrates more nicely with wxHaskell.  Hopefully you can find it in their
documentation.

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html#v%3AthreadDelay

> 4- I guess that progress bars and updating text will be somewhere in the
> GUI (I chose wxHaskell)...  Again, no idea where.
> 
> 5- How do you call an external program in Haskell?  Either xv or
> Esetroot will do the job of displaying the image.  Is there a Haskell
> native way to do that?

Try the System.Cmd.system function.

http://www.haskell.org/ghc/docs/latest/html/libraries/process/System-Cmd.html#v%3Asystem

> Once this is done and I have commented to the code, I will be happy to
> put it onto the wiki as a teaching aid.
> 
> Thanks.
> 
> -- 
> yann at kierun.org             -= H+ =-             www.kierun.org
>    PGP:   009D 7287 C4A7 FD4F 1680  06E4 F751 7006 9DE2 6318

Cheers,
Spencer Janssen


More information about the Haskell-Cafe mailing list