fouts@AMES-NAS.ARPA (07/27/86)
This file contains the readme for my OSS Pascal demo ----- CUT HERE ----- pager.pas is a simple application in OSS Personal Pascal for the Atari ST. I wrote it on a monochrome 1040, but it should work on any system at any resolution. My intent was to experiment with the GEM interface from Pascal, and try to write some kind of "template" program I could use as a basis for more sophisticated programs later. Pager is a multiple window file viewer. Files may be opened or closed, and viewing can scroll forward or backward. Pager is organized around the simplest possible event driven loop: Initialize While still running get an event deal with it Clean up Pager will handle all of the events returned by Get_Event, although it ignores the right mouse button, only performs limited menu service, and only pays attention to the first cursor rectangle event. Pager also uses built in dialogs, as well as alert boxes, and responds to menu entries. It also demonstrates XBIOS calls as well as timer events. It does not build it's own dialogs, and doesn't use mouse position information. Pager starts by offering the user an alert box which allows him to immediately abort the program. If he chooses to continue, pager opens the first file, using the built in "Item Selector" dialog. In order to spread the overhead of reading files around, the entire file is not read in immediatly, but rather only enough to fill the default window, which is full screen size. Pager than enters it's procesing loop, which consists mostly of waiting for events to occur and then responding to them. An unusual event that pager responds to is a ten second interval. If no activity has happened within the last ten seconds, pager will put an alert box up indicating how long it has been since pager has started. This alert is simply a demonstration of the interval timer, as well as using XBIOS calls to access supervisor memory. The events which pager responds to are message events, keyboard events, timer events, 'rectangle' events, and button pushed events. Since pager is a template, I made up a silly use for the rectangle and button events. The cursor takes one of four shapes, depending on the mouse being in or out of the front window, and the left mouse button being down or up. In pager, these cursor shapes don't have any real meaning, they are just window dressing. Most keyboard events (key strokes) are ignored. However, the HELP key causes a HELP alert box to be posted, which would contain something a litte more useful in a serious program, and the UNDO key causes the quit alert box to be posted. Most of the work occurs in message events, which fall into several catagories. There are selection events, redraw events, top events, close events, fulled events, arrowed events, horizontal events, veritical events, size events, and move events. A selection event occurs when the mouse is clicked on a menu selection. Pager allows desk accessories to work and has four menu entries of its own. A menu event can be used to open a new file, to close an open file (and it's window,) to quit the program, or to get an "about pager" alert box. A close event occurs when the close box has been clicked, and causes pager to close the file, close the window, and free up any related storage. A full event occurs when the full box has been clicked. Pager uses the full box as a toggle event. If the window is already full, than it is resized to be the last size it was set to by other than a full. If it's not full, then it's set to cover the entire screen. Since windows start out as full screen size, pager starts with the assumption that the first 'small' size for a window should be 1/4 the screen size, located in the upper left hand quarter of the window. Size events simply cause the window to grow or shrink, in response to clicking the size box and dragging. Pager allows the window to assume any size. Move events simply cause the window to be displaced, in response to clicking the title bar and dragging. Pager will allow the window to be placed anywhere GEM will put it. Arrow events occur from clicking in the elevator bar, or on the arrows at the ends of the elevator bar. Pager responds to arrow clicks by moving the page up or down one line, or by moving the display left or right one character. Pager responds to elevator bar clicks by moving the page up, down, left or right one window full, as appropriate. Because files are only read as needed, the code for keeping track of the position in the file is a fairly crude, although it appears to be bug free. However, the code for calculating the position and size of the elevator cars is slightly buggy, suffering from some calculation round off errors which cause the cars to sometimes do nonintuitive things. Also, until the file has been entirely input, it is not possible to know the full size of the file, so a heuristic is used for the vertical elevator. One full window size is added to the currently known size of the file when calculating the postion and offset of the elevator, so there will always be room to click on either side of the bar until the entire file has been read. Once the entire file is read, the actual file size is used. Horizontal and Vertical events occur when the elevator car has been clicked and drug to a new location. In this event, Pager calculates the correct viewing offset according to the new positions of the elevator cars and redisplays accordingly. There is room for much improvement in this area, since "scrolling" consists of erasing and redrawing the entire window, rather than moving the still visible part and adding new data. The most interesting event Pager has to deal with is the Redraw event, which occurs when a portion of a window which was previously invisible becomes visible. As you are probably aware, GEM keeps lists of 'visible' rectangles which make up each of the windows. The most efficent way to update a window would be to only redraw the portions which weren't visible before, but which are now. Unfortunately, what Pager does is to go through the list of visible rectangles, setting the clipping region to the part just made visible and redrawing the entire window. This is the second area where there is much room for improvement. Pager tries to be relitively bug free and robust, and seems to succede moderately well, (except for the elevator calculations mentioned before.) However, one are where I systematically did an unsafe bit of coding was in obtaining memory. None of the places where new is called to obtain more memory, is there a check for failure. This will probably lead to unpleasentness eventually, and I will probably fix it one of these days. In writing pager, I discovered that the built in read procedure will not read character data from other than a text type. Since I was considering using random file access to facilitate memory management, I wrote a "Get_string" routine, which will allow me to expand to random access if I need it. Overall, I have been very impressed with Personal Pascal. I have managed to fairly sophisticated programming using only it, it's manual, and the ABACUS "Internals" manual. It is reasonably bug free; I only found two problems with it while writing pager. It is reasonably easy to learn; I've only had it for two weeks, and pager is only about six hours work. (Although I have had a lot of pascal experience before.) It runs reasonably quickly; pager only takes about fifty seconds to compile and link using a ram disk on my 1040ST. The support from OSS is good. and the price is right. I've also been very impressed with the 1040ST. I've got a MacUgly (used to have a girl's name) sitting on my desk at work, complete with full blown Aztec C, and I still haven't managed to get anything as complete at pager working using it's interface. (I also have a lot of C experience, since hacking Unix kernels is my living.) All in all, I'm glad I've got the beasty. Marty