VolksForth/st/EDWINDOW.FB
2017-04-24 00:25:49 +02:00

1 line
18 KiB
Plaintext
Raw Blame History

\\ *** EDWINDOW.SCR *** 14sep86we Dieses File enth„lt das Editorfenster. Es kann als Beispiel f<>r die Programmierung eines eigenen Fensters benutzt werden. \ Window-Handling Loadscreen 30oct86we Onlyforth Gem also definitions 1 7 +thru \ VDI-Functions for window 24aug86we : bar ( x1 y1 x2 y2 -- ) ptsin 4 array! 1 function ! &11 2 0 VDI ; : swr_mode ( mode -- ) intin ! &32 0 1 VDI ; : sf_interior ( style -- ) intin ! &23 0 1 VDI ; : sf_style ( styleindex -- ) intin ! &24 0 1 VDI ; : sf_color ( color -- ) intin ! &25 0 1 VDI ; : sf_perimeter ( pervis -- ) intin ! &104 0 1 VDI ; : fbox ( x1 y1 x2 y2 -- ) 1 swr_mode 1 sf_interior 0 sf_color 0 sf_perimeter bar ; \ save and restore the screen 10sep86we ?head @ 1 ?head ! Create memMFDB2 7 , 0 , &640 , &400 , &40 , 0 , 1 , 0 , 0 , 0 , memMFDB2 scr>mem scr>mem2 ( Xleft Ytop Width Heigth -- ) memMFDB2 mem>scr mem2>scr ( Xleft Ytop Width Heigth -- ) : save_screen 0 0 cwidth &80 * cheight &25 * scr>mem2 ; : restore_screen 0 0 cwidth &80 * cheight &25 * mem2>scr ; \ Windowcomponents and Windowsize 30aug86we :name :move + :info + :uparrow + :dnarrow + :vslide + Constant wi_components : wi_x ( -- n ) dx cwidth * ; : wi_y ( -- n ) dy cheight * ; : wi_width ( -- n ) c/l cwidth * ; : wi_height ( -- n ) l/s cheight * ; : wi_size ( -- wx wy wwidth wheight ) 0 wi_components wi_x 1- wi_y 1- wi_width 2+ wi_height 2+ wind_calc intout 2+ 4@ ; \ Window's title and sliders 25sep86we Variable wi_handle : wi_string ( 0string function# -- ) swap >r wi_handle @ swap r> >absaddr swap 0 0 wind_set ; : wi_title ( 0string -- ) :wf_name wi_string ; : wi_status ( 0string -- ) :wf_info wi_string ; : vslide_size wi_handle @ :wf_vslize &1000 capacity / 0 0 0 wind_set ; : vslide ( scr# -- ) wi_handle @ :wf_vslide rot &1000 capacity dup 1- IF 1- THEN */ 0 0 0 wind_set ; \ Draw window on screen 30aug86we : small_big ( -- sx sy sw sh bx by bw bh ) little 4@ wi_size ; : growbox small_big graf_growbox ; : shrinkbox small_big graf_shrinkbox ; : wi_clear wi_x 1- wi_y 1- over wi_width 1+ + over wi_height 1+ + fbox ; \ Open and close window 30aug86we : wi_open ( -- ) save_screen growbox wi_components wi_size wind_create dup wi_handle ! pad dup off dup wi_title wi_status wi_size wind_open wi_clear ; : wi_close ( -- ) wi_handle @ dup wind_close wind_delete shrinkbox restore_screen ; \ redrawing the rest of screen 10sep86we : restore_rect ( x y w h -- ) 1- >r 1- r> mem2>scr ; : rect_update ( function# -- x y w h ) 0 swap wind_get intout 2+ 4@ ; : redraw_screen :wf_firstxywh rect_update BEGIN 2dup or WHILE restore_rect :wf_nextxywh rect_update REPEAT 2drop 2drop ; ?head ! 14sep86we \ Window-Handling Loadscreen 14sep86we Suchreihenfolge: Zuerst GEM, dann FORTH Gebraucht werden die Definitionen aus GEMDEFS.SCR Dieses Vokabular wird als erstes durchsucht. \ VDI-Functions for window 14sep86we F<>r das Fenster werden einige Funktionen aus VDI gebraucht, die auf diesem Screen zusammengestellt sind. Beschreibung siehe Beschreibung VDI (hoffentlich haben wir die schon!) Im Grunde wird nur eine Routine benutzt, mit der man ein weižes Rechteck zum L”schen des Fensterinhaltes erzeugen kann. Dies erledigt fbox \ save and restore the screen 14sep86we alle folgenden Funktionen sollen headerless kompiliert werden. Ein zweiter Speicherbereich wird gebraucht, um den Bildschirm beim Verlassen des Editors zu restaurieren. Dieses Verfahren ren ist erheblich schneller als die Neuausgabe des Bildschirms, braucht aber Speicherplatz (Wir hams ja!) Der gesamte Bildschirm wird in den daf<61>r vorgesehenen Speicher- bereich gerettet (aužerhalb des FORTH-Systems, versteht sich) Das Ganze umgekehrt stellt den Bildschirm wieder her. Diese Funktionen sind recht n<>tzlich, weil man Werte noch sehen kann, die z.B. bei LIST weggescrollt w<>rden. \ Windowcomponents and Windowsize 14sep86we Die Bestandteile des Fensters werden einfach aufaddiert und als Konstante zur Verf<72>gung gestellt. linke obere Ecke des Fensters in Bildschirmkoordinaten Breite des Fensters in Bildschirmkoordinaten H”he des Fensters in Bildschirmkoordinaten berechnet die Ausmaže des Fensters f<>r alle weiteren Funktionen unter Zuhilfenahme von WIND-CALC. Leider liefert diese Funktion bei Breite und H”he ein Pixel zu wenig. Digital Research allein mag wissen, warum ... \ Window's title and sliders 14sep86we Window-Handle des Fensters zur Ausgabe eines Textes in Titel- oder Infozeile Der String muž mit einer Null abgeschlossen sein. gibt 0string in der Titelzeile aus. gibt 0string in der Infozeile aus. Die Gr”že des vertikalen Sliders wird aus der Gesamtgr”že des Files, das editiert wird, berechnet. Die Position des vertikalen Sliders wird relativ zur Gesamtgr”že des Files eingestellt. \ Draw window on screen 14sep86we gibt die Gr”že eines kleinen Rechtecks sowie des ganzen Fensters zeichnet ein wachsendes Rechteck (nur f<>rs Auge ...) zeichnet ein schrumpfendes Rechteck ( s.o.) l”scht den Innenraum des Fenster durch šberschreiben mit einem weižen Rechteck. \ Open and close window 14sep86we ”ffnet das Editorfenster: Bildschirminhalt merken Fenster erzeugen mit entsprechender Gr”že und Attributen Titel- und Infozeile l”schen Fenster auf dem Bildschirm ausgeben und Inhalt l”schen schliežt das Editorfenster: Fenster vom Bildschirm und <20>berhaupt entfernen Bildschirm restaurieren. \ redrawing the rest of screen 14sep86we Rechteck per Pixelmove restaurieren liefert die Koordinaten eines neu zu zeichnenden Rechtecks. Der Screenmanager stellt eine Liste von Rechtecken zurVerf<72>gung, die nach einer Aktion ge„ndert worden sind. Durch diese Liste hangelt sich die Routine hindurch und erzeugt die Rechtecke per Pixelmove (schnell) neu.