When coding in a POSIX-compliant environment, you can usually write special escape codes to the console to change the text colour and so forth. However, this does not work on Windows.

(Ignore all references you see to enabling ANSI.SYS in your config.sys file; this applies only to 16-bit MS-DOS programs, *not* to 32-bit Windows programs.)

However - to my surprise - apparently the Win32 API provides a set of function calls that do in fact allow 32-bit applications to change the colours of the console on a character-by-character basis. However - wait for it - those *particular* functions aren't in Haskell's System.Win32.Console module. :-(

Obviously, I know nothing about C. However, after much hunting around, it turns out that for some reason, GHC appears to ship with a complete set of C header files for the Win32 API. (In other words, the necessary header file for accessing the functions I want is there.) After staggering through the (very unhelpful) FFI language specification, I was able to make it so that I can apparently call these functions from Haskell. I was not, however, able to find any way at all to import the symbolic constants necessary, so I was forced to reading through the source code of the raw C header files to find out what the numeric values of these are (!!!)

The long and short of it is, I now have a small Haskell library that enables me to print things in trippy colours on the screen from a normal Haskell CLI program. Yay for me! (Actually, you can also change the title on the window - so you can make your program say "My Fantastic Tool" instead of "C:\Documents and Settings\foo\Haskell\MyTool\MyTool.exe" in the titlebar. Again, this is for a normal Haskell console application with nothing done to it.)

Would anybody else be interested in having this code? (Obviously, it's pretty tiny.) For that matter, would the maintainer of System.Win32.Console be interested in adding the necessary dozen lines of code to that module?

Actually, now that I think about it, it would be kind of nice to have a magic package that writes out escape codes or calls the Win32 API depending on which platform your program is compiled on - in the style of System.FilePath. I don't know how to do that though... A nice idea, guys?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to