home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 09 / ami941.txt < prev    next >
Text File  |  1997-04-07  |  6KB  |  301 lines

  1. E-13
  2.  
  3. <lead>Mam nadziejë, ûe trzynaste spotkanie z E nie bëdzie
  4. pechowe. Proponujë od razu przejôê do poznawania tajników pracy
  5. w systemie operacyjnym Amigi. Tym razem na tapecie znajdujâ sië
  6. wiadomoôci IDCMP (Intuition Direct Communications Message Port
  7. system).
  8.  
  9. <a>Rafaî Wiosna
  10.  
  11. <sr>Znowu miësko
  12.  
  13. <txt>IDCMP_VANILLAKEY -- wiadomoôci tego typu niosâ ze sobâ bajt,
  14. oznaczajâcy wciôniëty klawisz. Podkreôlam -- bajt, wiadomoôci te
  15. nie przesyîajâ kodów wielobajtowych, czyli takich, które
  16. generowane sâ po wciôniëciu klawiszy specjalnych typu [Help],
  17. [F1], [Del] itp. IDCMP_VANILLAKEY przesyîa bajty klawiszy,
  18. uwzglëdniajâc wybrane obîoûenie klawiatury.  Uûytkownicy,
  19. preferujâcy niemiecki ukîad klawiatury, po wciôniëciu [Y] (przy
  20. [X]) otrzymajâ w polu msg.code odpowiedniâ dla obîoûenia literë.
  21.  
  22. IDCMP_RAWKEY -- tymi wiadomoôciami Intuition przesyîa kod
  23. klawisza, czyli tzw. scancode -- wartoôê przesyîana do komputera
  24. z procesora klawiatury. Kody dla wciôniëcia klawisza i puszczenia
  25. go sâ rozróûniane, tzn. jeûeli wciôniesz klawisz [A], to
  26. otrzymasz dwie wiadomoôci -- pierwszâ wtedy, kiedy go wciôniesz
  27. (w tym wypadku: $20), drugâ -- gdy go puôcisz ($A0).  Rozróûniane
  28. sâ one przez dodanie staîej IECODE_UP_PREFIX (o wartoôci $80) do
  29. kodu klawisza (dla A bëdzie to $20+$80=$A0).
  30.  
  31. Oprócz numeru klawisza aplikacja otrzymuje informacjë o tym, jaki
  32. kwalifikator zostaî wciôniëty, i to w obu wypadkach, RAW i
  33. VANILLA. Na przykîad moûe to byê lewy lub prawy klawisz [Shift],
  34. [Alt], [Amiga] itp. Kody tych klawiszy nie sâ przesyîane przez
  35. wiadomoôci IDCMP_VANILLAKEY, ale wciôniëcie samego klawisza
  36. kwalifikatora moûna rozpoznaê, uûywajâc wiadomoôci typu
  37. IDCMP_RAWKEY. Kod kwalifikatora moûna znaleúê w polu
  38. msg.qualifier, naleûy jednak pamiëtaê, ûe jest to pole typu INT
  39. oraz ûe kwalifikatory, dotyczâce klawiszy, zajmujâ tylko
  40. osiemnaôcie pierwszych bitów. Dlatego teû proponujë wykonywaê
  41. instrukcjë:
  42.  
  43. <l>kwalifikator:=msg.qualifier AND $3FF
  44.  
  45. <txt>aby uzyskaê czysty kod kwalifikatora klawiszowego (lub
  46. kwalifikatorów klawiszowych, wszak moûna wcisnâê np.
  47. [Shift][Alt][A]). Oto wszystkie, które moûna otrzymaê z
  48. Intuition:
  49.  
  50. <l>
  51. IEQUALIFIER_LSHIFT    $0001
  52.  
  53. IEQUALIFIER_RSHIFT    $0002
  54.  
  55. IEQUALIFIER_CAPSLOCK    $0004
  56.  
  57. IEQUALIFIER_CONTROL    $0008
  58.  
  59. IEQUALIFIER_LALT    $0010
  60.  
  61. IEQUALIFIER_RALT    $0020
  62.  
  63. IEQUALIFIER_LCOMMAND    $0040
  64.  
  65. IEQUALIFIER_RCOMMAND    $0080
  66.  
  67. IEQUALIFIER_NUMERICPAD    $0100
  68.  
  69. IEQUALIFIER_REPEAT    $0200
  70.  
  71. <txt>Przypominam, ûe w programach naleûy stosowaê nazwy, a nie
  72. wartoôci numeryczne!!! Kwalifikatory pozwalajâ odróûniê miëdzy
  73. innymi klawisz naciôniëty na klawiaturze numerycznej od
  74. "normalnego", np. szarâ gwiazdkë od kombinacji [Shift][8], a
  75. takûe pozwalajâ na rozpoznanie rozpoczëcia automatycznego
  76. powtarzania sië klawisza (kwalifikator REPEAT). Dodam, ûe mianem
  77. COMMAND twórcy systemu Amigi nazywajâ klawisz ze stylizowanâ
  78. literkâ "A".
  79.  
  80. Przykîadowo, jeûeli aplikacja reaguje na kombinacje klawiszy
  81. [Alt] i [Help] rozpoznawanie takiej sytuacji naleûy rozwiâzaê,
  82. dopisujâc do programu z ramki, zaraz po liniach TextF, coô
  83. takiego:
  84.  
  85. <l>
  86. IF klasa=IDCMP_RAWKEY
  87.  
  88.     IF ((kod=$5F) AND (kwalif AND (IEQUALIFIER_LALT+IEQUALIFIER_RALT)))
  89.  
  90.         TextF(30,85,'Wcisnâîeô dowolny [Alt] i [Help]')
  91.  
  92.     ENDIF
  93.  
  94. ENDIF
  95.  
  96. <txt>Musisz teû pamiëtaê, aby dodaê do linii programu,
  97. definiujâcej wczytywanie moduîów (linii z MODULE), nazwë
  98. 'devices/inputevent', w którym to pliku zdefiniowane sâ kody
  99. kwalifikatorów.
  100.  
  101. Poczâwszy od systemu w wersji 36 (a wiëc od bety 2.0) moûna
  102. zarzâdaê, aby aplikacja byîa zawiadamiana o obu typach wiadomoôci
  103. zwiâzanych z klawiszami (RAW i VANILLA). W tym celu przy
  104. otwieraniu okna trzeba umieôciê, w parametrze odpowiedzialnym za
  105. wiadomoôci IDCMP, oba typy. Wtedy Twoje okno bëdzie otrzymywaîo
  106. wiadomoôci typu IDCMP_VANILLAKEY, kiedy klawisz da sië "ugotowaê"
  107. (z angielskiego -- raw znaczy surowy, natomiast niektórzy zamiast
  108. vanilla uûywajâ sformuîowania cooked -- ugotowany), a jeûeli nie
  109. -- to otrzymnasz wiadomoôê typu IDCMP_RAWKEY. Efektem ubocznym
  110. jest fakt, ûe aplikacja nigdy nie dostanie wiadomoôci o
  111. wyciôniëciu klawisza typu raw.
  112.  
  113. <sr>*
  114.  
  115. <txt>Za miesiâc dalszy ciâg wykîadu o IDCMP. Przy okazji
  116. podajë informacjë, ûe powstaî ogólnopolski klub miîoôników
  117. programowania w Amiga E. Kontakt: Jakub Dudek, ul. Szczytowa 6,
  118. 33-112 Tarnowiec, tel. (012) 210563 (wieczoren w weekendy),
  119. e-mail:Jdudek@student.uci.agh.edu.pl lub
  120. Jdudek@ucinvl.uci.agh.edu.pl
  121.  
  122. <przyp>Literatura: AutoDocs -- "intuition.doc", Commodore 1994
  123.  
  124. Includes -- "intuition/intuition.h", "intuition/gadgetclass.h",
  125. "libraries/gadtools.h", Commodore 1994.
  126.  
  127. <l>
  128. ^- ->
  129.  
  130. -> Program ilustrujâcy dane otrzymywane z
  131.  
  132. -> wiadomoôci typu IDCMP_VANILLAKEY i IDCMP_RAWKEY
  133.  
  134. ->
  135.  
  136. -> ************ (c) RW & Magazyn AMIGA 1995 ************
  137.  
  138.  
  139.  
  140. ENUM    KONIEC,BLAD_OKNO
  141.  
  142.  
  143.  
  144. MODULE    'intuition/intuition'
  145.  
  146.  
  147.  
  148. DEF wnd:PTR TO window,klasa,kod,kwalif
  149.  
  150.  
  151.  
  152. PROC main() HANDLE
  153.  
  154.  
  155.  
  156.     otworzGUI()
  157.  
  158.  
  159.  
  160.     Colour(1,0)
  161.  
  162.  
  163.  
  164.     REPEAT
  165.  
  166.  
  167.  
  168.         zdarzenie()
  169.  
  170.  
  171.  
  172.         TextF(30,35,'msg.class: \z\h[8]  msg.code: \h[4] (\c)',klasa,kod,kod)
  173.  
  174.         TextF(30,45,'msg.qualifier: \z\h',kwalif AND $3FF)
  175.  
  176.         TextF(30,65,'IDCMP_VANILLAKEY -- \h[8]',IDCMP_VANILLAKEY)
  177.  
  178.         TextF(30,75,'IDCMP_RAWKEY     -- \h[8]',IDCMP_RAWKEY)
  179.  
  180.  
  181.  
  182.     UNTIL klasa=IDCMP_CLOSEWINDOW
  183.  
  184.  
  185.  
  186. EXCEPT DO
  187.  
  188.  
  189.  
  190.     zamknijGUI()
  191.  
  192.  
  193.  
  194.     IF exception THEN WriteF('Nie mogë \s!\n',
  195.  
  196.         ListItem(['','otworzyê okna'],exception))
  197.  
  198.  
  199.  
  200. ENDPROC
  201.  
  202.  
  203.  
  204. PROC otworzGUI()
  205.  
  206.  
  207.  
  208.     IF (wnd:=OpenW(10,15,400,200,
  209.  
  210.         IDCMP_CLOSEWINDOW+IDCMP_VANILLAKEY,
  211.  
  212. /*
  213.  
  214. **        w powyûszej linii moûesz wpisaê RAWKEY zamiast
  215.  
  216. **        VANILLAKEY lub kombinacjë obu czyli
  217.  
  218. **        ICDMP_CLOSEWINDOW+IDCMP_VANILLAKEY+IDCMP_RAWKEY,
  219.  
  220. **
  221.  
  222. */
  223.  
  224.         WFLG_DRAGBAR+WFLG_DEPTHGADGET+
  225.  
  226.         WFLG_CLOSEGADGET+WFLG_ACTIVATE,
  227.  
  228.         'IDCM_VANILLAKEY i IDCMP_RAWKEY',
  229.  
  230.         NIL,1,NIL))=NIL THEN Raise(BLAD_OKNO)
  231.  
  232.  
  233.  
  234. ENDPROC
  235.  
  236.  
  237.  
  238. PROC zamknijGUI()
  239.  
  240.  
  241.  
  242.     IF wnd THEN CloseWindow(wnd)
  243.  
  244.  
  245.  
  246. ENDPROC
  247.  
  248.  
  249.  
  250.  
  251.  
  252. PROC zdarzenie()
  253.  
  254.  
  255.  
  256. DEF mes:PTR TO intuimessage
  257.  
  258.  
  259.  
  260. REPEAT
  261.  
  262.  
  263.  
  264.     klasa:=0
  265.  
  266.  
  267.  
  268.     IF mes:=GetMsg(wnd.userport)
  269.  
  270.  
  271.  
  272.         klasa:=mes.class
  273.  
  274.         kod:=mes.code
  275.  
  276.         kwalif:=mes.qualifier
  277.  
  278.  
  279.  
  280.         ReplyMsg(mes)
  281.  
  282.  
  283.  
  284.     ELSE
  285.  
  286.  
  287.  
  288.         WaitPort(wnd.userport)
  289.  
  290.  
  291.  
  292.     ENDIF
  293.  
  294.  
  295.  
  296. UNTIL klasa
  297.  
  298.  
  299.  
  300. ENDPROC
  301.