I know that there isn't a whole lot of interest in reviving the
PolyML/Motif bindings idea,
but it does have the advantage (over GTK+ or QT for example) of already
existing! (a bird in the hand is worth two in the bush)...
...so, as part of my learning experience in PolyML, I set out to get a
program working
to draw on the screen. I saw comments in the XReference manual claiming
that there
are examples available, but searching google and the docs came up with
nothing beyond the API so I had to reinvent the wheel. Since I am new at
SML, I would appreciate
any comments or suggestions on improving this approach to drawing.
Here is what I have so far (and it works!)
-------------------------------------------------------
open XWindows ;
open Motif;
fun square x = x * x ;
fun odd x = x mod 2 = 1 ;
fun power base exp = if exp = 0 then 1
else
if odd exp then base * power base (exp-1)
else square (power base (exp div 2)) ;
fun draw1 w gc x1 y1 = let val p = XPoint {x=x1,y=y1}
in XDrawPoint w gc p ;
if x1 < 200 then draw1 w gc (x1 + 1) (y1 + 1)
else XDrawPoint w gc p
end;
fun draw2 w gc x1 y1 = let val p1 = XPoint {x=x1,y=y1} ;
val p2 = XPoint {x=x1+100,y=y1}
in XDrawLine w gc p1 p2 ;
if x1 < 100 then draw2 w gc (x1 + 1) (power x1 2)
else let val p = XPoint {x=50,y=95}
in XDrawString w gc p "PolyML"
end
end;
fun main() =
let
val pt = XPoint {x=0,y=0} ;
val rt = XRectangle {bottom=0,left=0,right=200,top=200} ;
val ar = Area {x=0,y=0,w=200,h=200} ;
val shell = XtAppInitialise "" "xlib" "xlib" [] [] ;
val display = XtDisplay shell ;
val dr = RootWindow display ;
val bp = BlackPixel display ;
val wp = WhitePixel display ;
val w = XCreateSimpleWindow dr pt ar 5 bp wp ;
val gc = XCreateGC w [] ;
fun hdraw (Expose {sendEvent,region,window,count},s) =
draw2 w gc 0 0
| hdraw (DeleteRequest {window},s) =
XDestroyWindow window ;
in
XMapWindow w ;
XSelectInput w [ExposureMask,ButtonPressMask] ;
XSetHandler w hdraw () ;
XFlush display
(* Posix.Process.pause() *)
end;
----------------------------------------------------
The Posix pause is needed if compiling with polyc to keep window open,
but in poly interactive it is not.
The attached image is what is produced.
-Dave Topham