123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- {
- Copyright (c) 2017 Karoly Balogh
- Simple, resizable and movable GEM Window
- Example program for Free Pascal's Atari TOS bindings
- This example program is in the Public Domain under the terms of
- Unlicense: http://unlicense.org/
- **********************************************************************}
- {$APPTYPE GUI}
- program gemwin;
- uses
- aes, vdi, xbios;
- var
- win_h: smallint;
- win_name: pchar;
- win_info: pchar;
- vdi_h: smallint;
- const
- WIN_KIND = NAME or INFO or CLOSER or MOVER or SIZER or FULLER;
- function open_vwk: smallint;
- var
- work_in: array[0..16] of smallint;
- work_out: array[0..64] of smallint;
- dummy, i: smallint;
- handle: smallint;
- begin
- handle:=graf_handle(@dummy,@dummy,@dummy,@dummy);
- work_in[0]:=2+xbios_getrez();
- for i:=1 to 9 do work_in[i]:=1;
- work_in[10]:=2;
- v_opnvwk(@work_in, @handle, @work_out);
- open_vwk:=handle;
- end;
- function open_win: smallint;
- var
- handle: smallint;
- dim: TGRECT;
- begin
- handle:=wind_create(WIN_KIND, 0, 0, 0, 0);
- win_name:='FPC GEM Window';
- wind_set(handle, WF_NAME, hi(ptruint(win_name)), lo(ptruint(win_name)), 0, 0);
- win_info:='Move me and resize me...';
- wind_set(handle, WF_INFO, hi(ptruint(win_info)), lo(ptruint(win_info)), 0, 0);
- wind_get(0, WF_WORKXYWH, @dim.x, @dim.y, @dim.w, @dim.h);
- dim.x:=dim.x + (dim.w div 20);
- dim.y:=dim.y + (dim.h div 20);
- dim.w:=dim.w - (dim.w div 20) * 2;
- dim.h:=dim.h - (dim.h div 20) * 2;
- wind_open(handle, dim.x, dim.y, dim.w, dim.h);
- open_win:=handle;
- end;
- procedure wind_set_grect(wh: smallint; rect: PGRECT);
- var
- fsrect: TGRECT;
- begin
- if rect = nil then
- begin
- wind_get(0, WF_WORKXYWH, @fsrect.x, @fsrect.y, @fsrect.w, @fsrect.h);
- rect:=@fsrect;
- end;
- wind_set(wh,WF_CURRXYWH,rect^.x,rect^.y,rect^.w,rect^.h);
- end;
- function min(a, b: smallint): smallint;
- begin
- if a < b then
- min:=a
- else
- min:=b;
- end;
- function max(a, b: smallint): smallint;
- begin
- if a > b then
- max:=a
- else
- max:=b;
- end;
- function rc_intersect(p1: PGRECT; p2: PGRECT): boolean;
- var
- tx, ty, tw, th: smallint;
- begin
- tw:=min(p2^.x+p2^.w, p1^.x+p1^.w);
- th:=min(p2^.y+p2^.h, p1^.y+p1^.h);
- tx:=max(p2^.x, p1^.x);
- ty:=max(p2^.y, p1^.y);
- p2^.x:=tx;
- p2^.y:=ty;
- p2^.w:=tw-tx;
- p2^.h:=th-ty;
- rc_intersect:=(tw > tx) and (th > ty);
- end;
- procedure wind_redraw(wh: smallint; rect: PGRECT);
- var
- xyarray: array[0..3] of smallint;
- wrect: TGRECT;
- begin
- wind_update(BEG_UPDATE);
- v_hide_c(vdi_h);
- wind_get(wh,WF_WORKXYWH,@wrect.x,@wrect.y,@wrect.w,@wrect.h);
- if rc_intersect(rect,@wrect) then
- begin
- xyarray[0]:=wrect.x;
- xyarray[1]:=wrect.y;
- xyarray[2]:=wrect.x+wrect.w-1;
- xyarray[3]:=wrect.y+wrect.h-1;
- vsf_color(vdi_h,WHITE);
- v_bar(vdi_h,@xyarray);
- end;
- v_show_c(vdi_h,1);
- wind_update(END_UPDATE);
- end;
- procedure event_loop;
- var
- msg_buf: array[0..7] of smallint;
- begin
- repeat
- evnt_mesag(@msg_buf);
- case msg_buf[0] of
- WM_CLOSED:
- break;
- WM_REDRAW:
- wind_redraw(win_h,PGRECT(@msg_buf[4]));
- WM_MOVED,
- WM_SIZED:
- wind_set_grect(win_h,PGRECT(@msg_buf[4]));
- WM_FULLED:
- wind_set_grect(win_h,nil);
- end;
- until false;
- end;
- begin
- appl_init;
- vdi_h:=open_vwk;
- win_h:=open_win;
- event_loop;
- wind_close(win_h);
- wind_delete(win_h);
- v_clsvwk(vdi_h);
- appl_exit;
- end.
|