include "draw.m"; draw:= load Draw Draw->PATH; Screen: adt { id: int; image: ref Image; fill: ref Image; display: ref Display; # where Screen resides allocate: fn(image, fill: ref Image, public: int): ref Screen; newwindow:fn(screen: self ref Screen, r: Rect, color:int): ref Image; top: fn(screen: self ref Screen, wins: array of ref Image); };
allocate: fn(image, fill: ref Image, public: int):The allocate function makes a new Screen object. The image argument provides the base image on which the windows will be made. The fill argument provides the Screen.fill image. Allocate does not affect the contents of image. It may be necessary after allocation to paint the base image with fill.
ref Screen;
Using a non-zero public argument allocates a public screen, while a zero public argument requests a private screen. Public screens may be attached by any process on any machine with access to the Display upon which the screen is allocated, enabling remote processes to create windows on the screen. Knowing only the id field of the original Screen, the remote process can call the Display.publicscreen function to acquire a handle to the screen. The image and fill fields of a Screen obtained this way are nil, but they are not needed for ordinary window management.
newwindow: fn(screen: self ref Screen, r: Rect, color:int): ref Image;The newwindow function allocates a window on the display at the specified rectangle; the return value is an Image.
top: fn(screen: self ref Screen, wins: array of ref Image);The top function organizes a group of windows on a screen. Given wins, an array of window images, it places the wins[0] element at the top,
wins[1] behind that, and so on, with the last element of wins in front of all the windows on the screen not in wins. Images in the array must be on the specified screen (nil elements are ignored).