|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 16640 (0x4100)
Types: TextFile
Names: »STEFHEJ.PAS«
└─⟦4fbcde1e4⟧ Bits:30003931/GEM_Development-A.imd Disketter indleveret af Steffen Jensen (Piccolo/Piccoline)
└─⟦this⟧ »STEFHEJ.PAS«
(************************************************************************)
(* File: hello.pas *)
(************************************************************************)
(* *)
(* GGGGG EEEEEEEE MM MM *)
(* GG EE MMMM MMMM *)
(* GG GGG EEEEE MM MM MM *)
(* GG GG EE MM MM *)
(* GGGGG EEEEEEEE MM MM *)
(* *)
(************************************************************************)
(* *)
(* +--------------------------+ *)
(* ø Digital Research, Inc. ø *)
(* ø 60 Garden Court ø *)
(* ø Monterey, CA. 93940 ø *)
(* +--------------------------+ *)
(* *)
(* The source code contained in this listing is a non-copyrighted *)
(* work which can be freely used. In applications of this source *)
(* code you are requested to acknowledge Digital Research, Inc. as *)
(* the originator of this code. *)
(* *)
(* Author: Tom Rolander *)
(* PRODUCT: GEM Sample Desk Top Accessory *)
(* Module: HELLO *)
(* Version: February 15, 1985 *)
(* *)
(************************************************************************)
(*
\f
Page*)
(*------------------------------*)
(* includes *)
(*------------------------------*)
(*$Igempcon.i*)
(*$Igemptype.i*)
(*$Igempvar.i*)
(*$Ivdibnd.pas*)
(*$Igempatyp.i*)
(*$Igempavar.i*)
(*$Iaesbnd.pas*)
(*$Icstring.pas*)
(*------------------------------*)
(* defines *)
(*------------------------------*)
CONST
ARROW= 0;
HOUR_GLASS= 2;
DESK= 0;
END_UPDATE= 0;
BEG_UPDATE= 1;
LONG0:ADDRESS = (lo:0;hi:0);
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Data Structures ****)
(**** ****)
(************************************************************************)
(************************************************************************)
TYPE
GRECT = Record
g_x,g_y,g_w,g_h : integer;
End;
VAR
(*------------------------------*)
(* Local *)
(*------------------------------*)
gl_wchar:integer; (* character width *)
gl_hchar:integer; (* character height *)
gl_wbox:integer; (* box (cell) width *)
gl_hbox:integer; (* box (cell) height *)
gem_handle:integer; (* GEM vdi handle *)
vdi_handle:integer; (* hello vdi handle *)
work_out:ARRAY_57; (* open virt workstation values *)
work_area:GRECT; (* current window work area *)
gl_apid:integer; (* application ID *)
gl_rmsg:ARRAY_8; (* message buffer *)
ad_rmsg:ADDRESS; (* LONG pointer to message bfr *)
gl_itemhello:integer; (* hello menu item *)
gl_xfull:integer; (* full window 'x' *)
gl_yfull:integer; (* full window 'y' *)
gl_wfull:integer; (* full window 'w' width *)
gl_hfull:integer; (* full window 'h' height *)
ev_which:integer; (* event message returned value *)
hello_whndl :integer; (* hello window handle *)
type_size:integer; (* system font cell size *)
dummy:integer;
b:boolean;
CONST
MESS_NLINES=3; (* maximum lines in message *)
MESS_WIDTH=20; (* maximum width of message *)
TYPE
MESS = array(.0..MESS_NLINES.) OF CharString;
VAR
message: MESS; (* message for window *)
wdw_title: CharString; (* blank window title *)
cs : CharString;
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Local Procedures ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* min *)
(*------------------------------*)
FUNCTION
min(a, b:integer):integer; (* return min of two values *)
begin
if a<b then min:=a else min:=b;
end;
(*------------------------------*)
(* max *)
(*------------------------------*)
FUNCTION
max(a, b:integer):integer; (* return max of two values *)
Begin
if a>b then max:=a else max:=b;
End;
(*------------------------------*)
(* rc_intersect *)
(*------------------------------*)
FUNCTION
rc_intersect(VAR p1, p2:GRECT):BOOLEAN; (* compute inter of two rectangles *)
VAR
tx, ty, tw, th:integer;
Begin
tw := min(p2.g_x + p2.g_w, p1.g_x + p1.g_w);
th := min(p2.g_y + p2.g_h, p1.g_y + p1.g_h);
tx := max(p2.g_x, p1.g_x);
ty := max(p2.g_y, p1.g_y);
p2.g_x := tx;
p2.g_y := ty;
p2.g_w := tw - tx;
p2.g_h := th - ty;
rc_intersect:=( (tw > tx) AND (th > ty) );
End;
(*------------------------------*)
(* grect_to_array *)
(*------------------------------*)
PROCEDURE grect_to_array(area:GRECT;VAR arrayy:ARRAY_4);
(* convert x,y,w,h to upr lt x,y and *)
(* lwr rt x,y *)
Begin
arrayy(.0.) := area.g_x;
arrayy(.1.) := area.g_y;
arrayy(.2.) := area.g_x + area.g_w - 1;
arrayy(.3.) := area.g_y + area.g_h - 1;
End;
(*------------------------------*)
(* do_open *)
(*------------------------------*)
FUNCTION
do_open(wh, org_x, org_y, x, y, w, h:integer):integer;
(* grow and open specified wdw *)
VAR
ret_code:integer;
Begin
dummy:=graf_mouse(2,LONG0);
dummy:=graf_growbox(org_x, org_y, 21, 21, x, y, w, h);
ret_code := wind_open(wh, x, y, w, h);
dummy:=graf_mouse(ARROW,LONG0);
do_open:=ret_code;
End;
(*------------------------------*)
(* do_close *)
(*------------------------------*)
FUNCTION
do_close(wh, org_x, org_y:integer):integer;
(* close and shrink specified window *)
VAR
x, y, w, h: Integer;
a : ADDRESS;
Begin
a.hi:=0;a.lo:=0;
dummy:=graf_mouse(2,a);
dummy:=wind_get(wh, 5 (*WF_CXYWH*), x, y, w, h);
dummy:=wind_close(wh);
dummy:=graf_shrinkbox(org_x, org_y, 21, 21, x, y, w, h);
dummy:=graf_mouse(ARROW,a);
End;
(*------------------------------*)
(* set_clip *)
(*------------------------------*)
FUNCTION
set_clip(clip_flag:integer; VAR s_area:GRECT):integer;
(* set clip to specified area *)
VAR
pxy: ARRAY_4;
Begin
grect_to_array(s_area, pxy);
dummy:=vs_clip(vdi_handle, clip_flag, pxy);
End;
(*------------------------------*)
(* align_x *)
(*------------------------------*)
FUNCTION
align_x(x:INTEGER):INTEGER; (* forces word alignment for column positon, *)
(* rounding to nearest word *)
Begin
if (x AND $000c) >0 then align_x:=(x and $fff0)+$0010
else align_x:= (x and $fff0);
End;
(*------------------------------*)
(* wdw_size *)
(*------------------------------*)
FUNCTION
wdw_size(VAR box:GRECT; w, h:integer):integer;
(* compute window size for given w * h chars *)
VAR
pw, ph:integer;
Begin
dummy:=vst_height(vdi_handle, type_size,
gl_wchar,gl_hchar,gl_wbox,gl_hbox);
pw := w * gl_wbox + 1;
ph := h * gl_hbox + 1;
dummy:=wind_calc(0 (*WC_BORDER*), $000B,
gl_wfull div 2-pw div 2, gl_hfull div 2-ph div 2,
pw, ph, box.g_x, box.g_y, box.g_w, box.g_h);
box.g_x := align_x(box.g_x) - 1;
End;
(*------------------------------*)
(* disp_message *)
(*------------------------------*)
FUNCTION
disp_mesag(strptr:mess; clip_area:GRECT):integer; (* display message applying input clip *)
VAR
pxy : ARRAY_4;
ycurr : integer;
i : integer;
Begin
dummy:=set_clip(1 (*TRUE*), clip_area);
dummy:=vsf_interior(vdi_handle, 1);
dummy:=vsf_color(vdi_handle, WHITE);
grect_to_array(work_area, pxy);
dummy:=graf_mouse(256 (*M_OFF*), LONG0);
dummy:=vr_recfl(vdi_handle, pxy); (* clear entire message area *)
dummy:=vsl_color(vdi_handle,BLACK);
dummy:=vswr_mode(vdi_handle,1 (*MD_REPLACE*));
dummy:=vsl_type (vdi_handle,1 (*FIS_SOLID*));
dummy:=vswr_mode(vdi_handle, 1);
ycurr := work_area.g_y - 1;
i:=0;
while (strptr(.i.)<>'')do (* loop through text strings *)
Begin
ycurr := ycurr + gl_hbox;
dummy:=v_gtext(vdi_handle, work_area.g_x, ycurr, strptr(.i.));
i:=i+1;
End;
dummy:=graf_mouse(257 (*M_ON*), LONG0);
dummy:=set_clip(0 (*FALSE*), clip_area);
End;
(*------------------------------*)
(* do_redraw *)
(*------------------------------*)
FUNCTION
do_redraw(wh:integer;area:GRECT):integer; (* redraw message applying area clip *)
VAR
box: GRECT;
Begin
dummy:=graf_mouse(256 (*M_OFF*), LONG0);
dummy:=wind_get(wh,11 (* WF_FIRSTXYWH*)
,box.g_x,box.g_y,box.g_w,box.g_h);
while ( box.g_w<>0) AND (box.g_h<>0) do
Begin
if (rc_intersect(area, box)) THEN
Begin
if (wh = hello_whndl) THEN
Begin
dummy:=disp_mesag(message, box);
End;
End;
dummy:=wind_get(wh, 12 (*WF_NEXTXYWH*),
box.g_x,box.g_y,box.g_w,box.g_h);
End;
dummy:=graf_mouse(257 (*M_ON*), LONG0);
End;
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Message Handling ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* hndl_mesag *)
(*------------------------------*)
FUNCTION hndl_mesag:boolean;
VAR
box: GRECT;
done: BOOLEAN;
wdw_hndl: INTEGER;
a: ADDRESS;
g: GRECT;
CONST
mm:CharString =
'Æ3ÅÆFatal Error !øWindow not availableøfor Hello.ÅÆ Abort Å'@0;
Begin
done := FALSE;
wdw_hndl := gl_rmsgÆ3Å; (* wdw handle of mesag *)
Case ( gl_rmsgÆ0Å ) of (* switch on type of msg*)
40 (*AC_OPEN*): (* do accessory open *)
Begin
if ( (gl_rmsgÆ4Å = gl_itemhello) AND
(hello_whndl=0) ) then (* unless already open *)
Begin
dummy:=graf_mouse(HOUR_GLASS, LONG0);
(* 0x0B = NAME ø CLOSER ø MOVER *)
hello_whndl := wind_create($000B, align_x(gl_xfull)-1, gl_yfull, gl_wfull, gl_hfull);
if (hello_whndl = -1) then
Begin
dummy:=graf_mouse(ARROW, LONG0);
a.hi:=seg(mm);a.lo:=ofs(mm)+1;
dummy:=form_alert(1,a);
hello_whndl := 0;
hndl_mesag:=TRUE;
End;
a.hi:=seg(cs);a.lo:=ofs(cs);
dummy:=wind_set(hello_whndl, 2 (*WF_NAME*), a.lo,a.hi, 0, 0);
dummy:=wdw_size(box, MESS_WIDTH, MESS_NLINES);
dummy:=do_open(hello_whndl, gl_wfull div 2,
gl_hfull div 2, box.g_x, box.g_y, box.g_w, box.g_h);
dummy:=wind_get(hello_whndl, 4 (*WF_WXYWH*),
work_area.g_x, work_area.g_y,
work_area.g_w, work_area.g_h);
dummy:=disp_mesag(message, work_area);
dummy:=graf_mouse(ARROW,LONG0);
End
else
Begin
dummy:=graf_mouse(ARROW,LONG0);
dummy:=wind_set(hello_whndl, 10 (*WF_TOP*),
0, 0, 0, 0);
End;
End;
41 (*AC_CLOSE*): (* do accessory close *)
Begin
if ( (gl_rmsgÆ3Å = gl_itemhello) AND
(hello_whndl<>0) ) then
Begin
hello_whndl := 0; (* reset window handle *)
End;
End;
20 (*WM_REDRAW*): (* do redraw wdw contnts*)
Begin
g.g_x:=gl_rmsgÆ4Å;
g.g_y:=gl_rmsgÆ5Å;
g.g_w:=gl_rmsgÆ6Å;
g.g_h:=gl_rmsgÆ7Å;
dummy:=do_redraw(wdw_hndl, g);
End;
21 (*WM_TOPPED*): (* do window topped *)
Begin
dummy:=wind_set(wdw_hndl, 10 (*WF_TOP*), 0, 0, 0, 0);
End;
22 (*WM_CLOSED*): (* do window closed *)
Begin
dummy:=do_close(hello_whndl, gl_wfull div 2, gl_hfull div 2);
dummy:=wind_delete(hello_whndl);
hello_whndl := 0;
done := TRUE;
End;
28 (*WM_MOVED*): (* do window move *)
Begin
dummy:=wind_set(wdw_hndl,5 (*WF_CXYWH*),
align_x(gl_rmsgÆ4Å)-1, gl_rmsgÆ5Å, gl_rmsgÆ6Å, gl_rmsgÆ7Å);
dummy:=wind_get(hello_whndl,4 (*WF_WXYWH*),
work_area.g_x, work_area.g_y, work_area.g_w, work_area.g_h);
End;
OTHERWISE
(**);
End; (* switch *)
hndl_mesag:=done;
End; (* hndl_mesag *)
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Hello Event Handler ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* hello *)
(*------------------------------*)
Procedure hello;
VAR
done: BOOLEAN;
Begin
(**) (* loop handling user *)
(**) (* input until done *)
done := FALSE; (* -or- if DESKACC *)
while(NOT done) do (* then forever *)
Begin
ev_which := evnt_mesag(ad_rmsg);(* wait for message *)
dummy:=wind_update(BEG_UPDATE); (* begin window update *)
done := hndl_mesag; (* handle event message *)
dummy:=wind_update(END_UPDATE); (* end window update *)
End;
End;
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Termination ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* hello_term *)
(*------------------------------*)
Procedure hello_term;
Begin
dummy:=v_clsvwk( vdi_handle ); (* close virtual work station *)
dummy:=appl_exit; (* application exit *)
End;
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Initialization ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* hello_init *)
(*------------------------------*)
FUNCTION hello_init:BOOLEAN;
VAR
i : INTEGER;
work_in: intin_ARRAY;
attributes: ARRAY_10;
Begin
gl_itemhello := 0;
hello_whndl := 0;
messageÆ0Å := 'Hej !'; (* message for window *)
messageÆ1Å := 'verden !';
messageÆ2Å := 'Hilsen Steffen';
messageÆ3Å := ''; (* null pointer terminates input*)
wdw_title := ''; (* blank window title *)
MakeCString(wdw_title,cs);
gl_apid := appl_init; (* initialize libraries *)
for i:=0 TO 9 do
Begin
work_inÆiÅ:=1;
End;
work_inÆ10Å:=2;
gem_handle := graf_handle(gl_wchar,gl_hchar,gl_wbox,gl_hbox);
vdi_handle := gem_handle;
dummy:=v_opnvwk(work_in,vdi_handle,work_out); (* open virtual work stn*)
dummy:=vqt_attributes(vdi_handle, attributes); (* get text attributes *)
type_size := attributesÆ7Å; (* get system font hbox *)
if (vdi_handle = 0) then
hello_init:=FALSE;
(**) (* init. message address*)
ad_rmsg.hi := seg(gl_rmsgÆ0Å);
ad_rmsg.lo := ofs(gl_rmsgÆ0Å);
dummy:=wind_get(DESK,4 (*WF_WXYWH*), gl_xfull, gl_yfull, gl_wfull, gl_hfull);
hello_init:=TRUE;
End;
(*
\f
Page*)
(************************************************************************)
(************************************************************************)
(**** ****)
(**** Main Program ****)
(**** ****)
(************************************************************************)
(************************************************************************)
(*------------------------------*)
(* GEMAIN *)
(*------------------------------*)
Begin
if (hello_init) then (* initialization *)
Begin
gl_rmsgÆ0Å := 40 (*AC_OPEN*);
gl_rmsgÆ4Å := gl_itemhello;
b:=hndl_mesag;
hello;
hello_term; (* termination *)
End;
End.«eof»