[Haskell-cafe] Windows console
Andrew Coppin
andrewcoppin at btinternet.com
Tue Sep 9 15:15:08 EDT 2008
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?
More information about the Haskell-Cafe
mailing list