home *** CD-ROM | disk | FTP | other *** search
/ ftp.uni-stuttgart.de/pub/systems/acorn/ / Acorn.tar / Acorn / acornet / fun / mags / hl-01-93.arc / !HL-01_93_Text_Text30 < prev    next >
Text File  |  1993-03-26  |  11KB  |  214 lines

  1.  
  2.  
  3.  
  4.  
  5. ÿÿÿÿÿÿÿÿÿÿ Programmieren des Wimp ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  6.  
  7.  
  8. Teil 1.
  9.  
  10.  
  11. In diesem Kurs werde ich den Window-Manager von RISC OS beschreiben. Dieser
  12. ist es ja bekanntlich, durch den alle diese Applikationen so sch÷n im
  13. Multitasking-betrieb zusammenlaufen. Wie das funktioniert, und worauf man
  14. dabei achten sollte, werde ich nach und nach in den Folgen dieses Kurses
  15. erlΣutern.
  16.  
  17. Ein gro▀er Vorteil unseres Window-Managers (im Folgenden nur noch WIMP
  18. genannt - von "Windows, Icons, Menus and Pointer") ist, da▀ er sehr vieles von
  19. sich aus macht, und wir als Programmierer oft nur noch nahezu symbolisch das
  20. Kommando geben, mit dem die Aktionen, die der WIMP schon vorgeplant hat, auch
  21. ausgefⁿhrt werden. Demnoch sind viele M÷glichkeiten vorhanden, Mist zu bauen,
  22. so da▀ z.B. kein Window erscheint, oder das Window nur ein schmaler Strich
  23. ist, oder Untermenus nicht erscheinen, sondern eine Fehlermeldung aufkommt.
  24.  
  25. Dies soll uns aber nicht abschrecken, diese Fehler sind - auch wenn es
  26. einem wΣhrend des Programmierens wie ein Werk des Teufels vorkommt - immer
  27. logisch begrⁿndet, und wenn Ihr nicht gerade einen Fehler im RISC OS
  28. aufgespⁿrt habt, so liegt der Fehler doch immer bei Euch.
  29.  
  30. Wer von Euch die PRMs hat (von RISC OS 2), dem wird vieles aus diesem Kurs
  31. bekannt vorkommen, denn viel mehr als was in den PRMs steht, kann ich hier
  32. auch nicht bringen; ich kann nur noch zusΣtzliche ErklΣrungen anbieten, wenn
  33. die PRMs sich mal wieder schwammig ⁿber ein heikles Thema hinwegreden, oder
  34. Beispiele geben, wenn in den PRMs ein komplexer Sachverhalt pl÷tzlich aufh÷rt
  35. und sich in hΣmischen Zⁿgen die Buchstaben der nΣchsten Kapitelⁿberschrift
  36. darbieten.
  37.  
  38. ------------------------------------------------------------------------------
  39. Wichtig sind bei der WIMP-Programmierung vor allem aber auch die Richtlinien
  40. fⁿr WIMP-Applikationen, damit sich alle RISC OS-Applikationen bei bestimmten
  41. Aktionen in etwa gleich verhalten - dies ist ja auch einer der viel
  42. gepriesenen Vorzⁿge einer graphischen BenutzeroberflΣche!
  43. ------------------------------------------------------------------------------
  44.  
  45.  
  46. Nun noch einiges Allgemeines:
  47. Ich werde hier alle Beispielprogrammabschnitte in BASIC geben, da es
  48. wirklich jeder Archimedes-Benutzer besitzt und auch gegenⁿber Assembler den
  49. Vorteil hat, da▀ es leichter zu ⁿbersehen ist, sowie da▀ es mehr Leute
  50. verstehen, wobei BASIC fⁿr viele Anwendungen geschwindigkeitsmΣ▀ig v÷llig
  51. ausreicht - viele bekannte Applikationen sind, assemblergestⁿtzt, in BASIC
  52. geschrieben, so z.B. !Translatr, !Creator, !FormEd; bei vielen anderen ist
  53. das gesamte WIMP-Interface in BASIC, der Rest dann in Assembler oder C
  54. geschrieben, so z.B. !ProArtisan oder !Atelier !!!!.
  55. Demnoch m÷chte ich dafⁿr plΣdieren, m÷glichst BASIC bei der endgⁿltigen
  56. Version Eurer Programme zu vermeiden, denn es macht einen schlechten
  57. Eindruck, sieht unprofessionell aus und, was am wichtigsten ist, man kann
  58. dann zu leicht an Euren Programmen herumpfuschen, was nicht sein sollte,
  59. wenn Eure Programme korrekt geschrieben sind und auf allen RISC OS-Rechnern
  60. laufen.
  61.  
  62. Nun aber fⁿr die Assemblerprogrammierer ein sehr interessanter Aspekt der
  63. WIMP-Programmierung, der sehr zur Vereinfachung des Programmes beitrΣgt:
  64. Der WIMP sorgt ja dafⁿr, da▀ alle Applikationen an das obere Ende des
  65. Applikation-Speicherbereiches geladen werden, was zur Folge hat, da▀ die
  66. Anfangsadressen der Programme nicht bekannt sind und deshalb das gesamte
  67. Programm relocable programmiert werden mⁿ▀te, d.h. ausschlie▀lich mit
  68. relativen Addressierungen. Dies ist jedoch nicht so, denn der WIMP sorgt
  69. dafⁿr, da▀ ein jedes Programm bei seiner Ausfⁿhrung "denkt", es liege bei
  70. &8000, und dementsprechend absolute Addressierungen auf diesen Bereich
  71. durchfⁿhren kann, welche dann umgerechnet werden und auf den richtigen
  72. Bereich, wo das Programm liegt, angewendet werden. Ich will micht hier gar
  73. nicht in Details verlieren, es ist ein Feature des MEMC, da▀ er
  74. Speicherbereiche "ummappen" kann, um diesen Effekt zu erreichen.
  75.  
  76. Die Funktionen des WIMPs werden mit Betriebssystemaufrufen benutzt, den sog.
  77. Software Interrupts, kurz SWI. Aus BASIC werden sie mit dem Befehl SYS
  78. aufgerufen. Von diesen Betriebssystemaufrufen gibt es eine ganze Menge, in 
  79. RISC OS 2 sind es ⁿber 400; den WIMP betreffend immerhin immer noch 52 SWIs,
  80. die dann immer noch mehrere Unter-Funktionen innehaben. Mit diesen SWIs wird
  81. der ganze WIMP gesteuert.
  82. Jeder SWI hat eine Nummer (die WIMP-SWIs von &400C0-&400F3), und weil diese
  83. Nummern extrem schlecht zu merken sind, auch noch einen beschreibenden Titel,
  84. den man anstelle der Nummber benuzten kann. So hei▀t z.B. der SWI &400C5
  85. "Wimp_OpenWindow", wobei das "Wimp_" hier das Prefix ist, welches angibt, von
  86. welchem Teil des Betriebssystems dieser SWI ist. Das Prefix "Wimp_" hei▀t
  87. dann hier, da▀ er von dem Module "Window Manager" ist. Alle SWIs, die den
  88. WIMP ansprechen, haben das Prefix "Wimp_", und analog haben z.B. alle SWIs,
  89. die den Fontmanager ansprechen, das Prefix "Font_". Nach diesem Prefix folgt
  90. dann der eigentliche SWI-Name, der eigentlich auch meist schon ganz gut
  91. erklΣrt, was denn der SWI eigentlich macht. So ÷ffnet der
  92.     SWI "Wimp_OpenWindow"
  93. auch ein Window, und man mu▀ nur noch sagen, welches Window, wo auf dem
  94. Bildschirm und wie gro▀. Diese Parameterⁿbergabe erfolgt in Assembler in den
  95. Registern, wobei meist in R1 der Pointer zu einem Block ⁿbergeben wird, wo
  96. dann die gewⁿnschten Informationen stehen, da doch oft mehr als nur die
  97. 16 Werte ⁿbergeben werden, die in die Register passen wⁿrden.
  98. In BASIC hingegen folgen die Parameter durch Kommata getrennt dem SWI-Namen,
  99. was dann z.B. so aussieht:
  100.  
  101. SYS "Wimp_Initialise",200,"TASK","Application"  TO  variable1%,variable2%
  102.  
  103. Dieser SWI, der das eigene Programm (hier mit dem Namen "Applikation") dem
  104. WIMP anmeldet, braucht 3 Informationen, um seine Aufgabe zu erfⁿllen; diese 3
  105. Informationen werden also mit ⁿbergeben. Aber der SWI tut noch mehr, er
  106. ⁿbergibt nΣmlich noch wieder Informationen zurⁿck an das Programm, die dann
  107. in den angegebenen Variablen nach dem "TO" abgelegt werden. Die Ergebnisse
  108. k÷nnen dann angeschaut und verwertet werden. 
  109.  
  110.  
  111.  
  112. Ein Programm braucht nicht mit dem Hintergedanken "Multitasking" geschrieben
  113. zu werden, nahezu nichts in einem Programm deutet darauf hin, da▀ noch andere
  114. Programme gleichzeitig laufen. Wenn ein Programm korrekt geschrieben worden
  115. ist, dann lΣuft es auch, egal ob noch andere Programme laufen, oder es das
  116. einzige Programm im Speicher ist. Die gro▀e Ausnahme ist hier der
  117. SWI "Wimp_Poll", der die einzige Verbindung mit der Au▀enwelt darstellt. Wird
  118. dieser SWI nicht benutzt, so lΣuft das Programm auch nicht multi-tasking,
  119. sondern single-tasking, d.h. alle anderen aktiven Programme werden
  120. eingefroren, bis doch wieder der SWI "Wimp_Poll" benutzt wird oder aber das
  121. Programm beendet wird. Dieser Umstand hat zur Folge, da▀ man zu einem
  122. sinnvollen Umgang mit diesem SWI finden sollte; ⁿbermΣ▀iges Anwenden hat zwar
  123. Multitasking in allen Situationen zur Folge, verlangsamt aber das Programm
  124. doch z.T. sehr; spΣrliches Anwenden hat Geschwindigkeitszuwachs, dafⁿr aber
  125. spartanisches Multitasking zur Folge. Bestes Beispiel sind wohl die
  126. File-Operations: wenn man von seinem Programm aus ein langes File (200KBytes)
  127. nachlΣdt, so kann man dies in einem Stⁿck tun, kann aber wΣhrend der ganzen
  128. Ladezeit (von Diskette ja noch recht lang) nichts tun; man kann aber auch die
  129. einzelnen Sektoren von Diskette laden, dafⁿr aber dann zwischen den Sektoren
  130. ein "Wimp_Poll" einfⁿgen, womit auch wΣhrend des Ladens ein Multitasking
  131. gewΣhrleistet ist, wie es z.B. bei RISC OS 3 z.B. beim Kopieren vorhanden ist.
  132. Es liegt nun am Programmierer, welcher der beiden M÷glichkeiten er wahrnimmt
  133. und welche der beiden ⁿberhaupt sinnvoll ist. Zudem ist die zweite immer
  134. schwieriger zu handhaben, es mⁿssen Vorsichtsma▀nahmen getroffen werden, was
  135. beim Laden z.B. nicht gemacht werden darf etc.
  136.  
  137.  
  138. Nun aber m÷chte ich schon anfangen mit dem ersten Beispielprogramm, welches
  139. das Gerⁿst darstellt, auf das alle WIMP-Applikationen basieren, eine
  140. Schleife, die so oder in Σhnlicher Form in allen WIMP-Programmen zu finden
  141. ist. Es geht hier um die sog. Polling-Schleife, die die einzige Verbindung
  142. nach au▀en darstellt:
  143.  
  144.  
  145. -----------------------------------------------
  146.  1  SYS "Wimp_Initialise"
  147.  2  DIM pollblock% 256
  148.  3  fertig% = FALSE
  149.  
  150.  4  REPEAT
  151.  5   SYS "Wimp_Poll",0,pollblock% TO eventcode%
  152.  6   CASE eventcode% OF
  153.  7    WHEN 0 : do nothing
  154.  8    WHEN 2 : open window
  155.  9    WHEN 3 : close window
  156. 10    WHEN 6 : mousebutton was pressed
  157.  
  158.       ...
  159.  
  160. 20   ENDCASE
  161. 21  UNTIL fertig% = TRUE
  162.  
  163. SYS "Wimp_CloseDown"
  164. -----------------------------------------------
  165.  
  166. Der SWI in Zeile 1 meldet die Applikation als Task beim WIMP an.
  167. In Zeile 2 wird dann ein Speicherblock von 256 Bytes reserviert, der dann zum
  168. ▄bergeben aller WIMP-Parameter benutzt wird. Die Anfangsadresse wird in der
  169. Variablen pollblock% abgelegt.
  170. In Zeile 3 wird dann die Endkennung auf logisch falsch gesetzt. Dies kann man
  171. vielfΣltig l÷sen, diese M÷glichkeit ist jedoch recht ⁿberschaubar, weshalb ich
  172. sie hier vorfⁿhre. Soll das Programm beendet werden, so wird einfach nur die
  173. Variable fertig% auf logisch wahr gesetzt (TRUE), und beim nΣchsten
  174. Schleifendurchlauf trifft die UNTIL-Bedingung aus Zeile 21 zu, und das
  175. Programm wird beendet.
  176. Zeile 4 und Zeile 21 bilden dann die Schleife, die ewig durchlaufen wird, bis
  177. einmal vom Programm aus die Variable fertig% auf TRUE gesetzt wird.
  178. Zeile 5 ruft dann die Pollroutine auf, ⁿbergibt u.a. die Adresse des
  179. Speicherblocks, in den etwaige Informationen geschrieben werden sollen, und
  180. verlΣ▀t dieses Programm. Jetzt ist die Zeit, in der die anderen Programme
  181. durchlaufen werden, jedes bekommt einmal die Kontrolle, einige machen
  182. vielleicht gar nichts, andere berechnen vielleicht ganze Fraktale, aber
  183. irgendwann kehrt der WIMP sich wieder unserem Programm zu, z.B. wenn ⁿber
  184. unserem Icon auf der Iconbar (das wir jetzt noch nicht installiert haben,
  185. aber gehen wir mal davon aus, wir hΣtten eines) der Benutzer die mittlere
  186. Maustaste gedrⁿckt hΣtte, um ein Menu auf den Bildschirm zu bringen. Nun
  187. stellt der WIMP fest: es wurde ein Mausklick getΣtigt. Diese Information
  188. wandelt er in eine Zahl um (die Zahl 6), nennt sie "eventcode" und ⁿbergibt
  189. sie an die Variable "eventcode%", die bei uns diese Information auffangen
  190. soll. Nun ist also eventcode%=6. Mit der CASE...ENDCASE-Konstruktion wird
  191. jetzt abgefragt, welchen Wert eventcode% innehat. Hier ist es 6, also wird
  192. der Befehl hinter "WHEN 6 :" abgearbeitet. ▄blicherweise steht dort nur ein
  193. Unterroutinenaufruf, der dann den Rest erledigt.
  194. Nach der Unterroutine fΣhrt das Programm fort, kommt zum UNTIL fertig% = TRUE,
  195. stellt fest, da▀ dies nicht der Fall ist, und kehrt zum ersten Befehl der
  196. Schleife zurⁿck, dem SWI "Wimp_Poll", verlΣ▀t also unser Programm wieder, um
  197. auch die anderen Programme zu Wort kommen zu lassen.
  198.  
  199. Haben wir jedoch in unserer Unterroutine die Variable fertig% auf TRUE
  200. gesetzt, so fΣhrt das Programm auch fort und stellt beim UNTIL fest,da▀ diese
  201. Aussage zutrifft und arbeitet den nΣchsten Befehl ab: 
  202.  
  203. SYS "Wimp_CloseDown"
  204.  
  205. Dieser Befehl beendet dieses Programm als Task, schlie▀t automatisch alle
  206. dazugeh÷rigen offenen Windows, l÷scht das Programm aus der Liste der aktiven
  207. Tasks und schlie▀lich auch aus dem Speicher.
  208. Das ist genau die Wirkung, die der "Quit"-Eintrag eines Applikation-Menus
  209. erzielt.
  210.  
  211.  
  212.                                                             - Martin Willers -
  213.  
  214.