home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
09
/
ami941.txt
< prev
next >
Wrap
Text File
|
1997-04-07
|
6KB
|
301 lines
E-13
<lead>Mam nadziejë, ûe trzynaste spotkanie z E nie bëdzie
pechowe. Proponujë od razu przejôê do poznawania tajników pracy
w systemie operacyjnym Amigi. Tym razem na tapecie znajdujâ sië
wiadomoôci IDCMP (Intuition Direct Communications Message Port
system).
<a>Rafaî Wiosna
<sr>Znowu miësko
<txt>IDCMP_VANILLAKEY -- wiadomoôci tego typu niosâ ze sobâ bajt,
oznaczajâcy wciôniëty klawisz. Podkreôlam -- bajt, wiadomoôci te
nie przesyîajâ kodów wielobajtowych, czyli takich, które
generowane sâ po wciôniëciu klawiszy specjalnych typu [Help],
[F1], [Del] itp. IDCMP_VANILLAKEY przesyîa bajty klawiszy,
uwzglëdniajâc wybrane obîoûenie klawiatury. Uûytkownicy,
preferujâcy niemiecki ukîad klawiatury, po wciôniëciu [Y] (przy
[X]) otrzymajâ w polu msg.code odpowiedniâ dla obîoûenia literë.
IDCMP_RAWKEY -- tymi wiadomoôciami Intuition przesyîa kod
klawisza, czyli tzw. scancode -- wartoôê przesyîana do komputera
z procesora klawiatury. Kody dla wciôniëcia klawisza i puszczenia
go sâ rozróûniane, tzn. jeûeli wciôniesz klawisz [A], to
otrzymasz dwie wiadomoôci -- pierwszâ wtedy, kiedy go wciôniesz
(w tym wypadku: $20), drugâ -- gdy go puôcisz ($A0). Rozróûniane
sâ one przez dodanie staîej IECODE_UP_PREFIX (o wartoôci $80) do
kodu klawisza (dla A bëdzie to $20+$80=$A0).
Oprócz numeru klawisza aplikacja otrzymuje informacjë o tym, jaki
kwalifikator zostaî wciôniëty, i to w obu wypadkach, RAW i
VANILLA. Na przykîad moûe to byê lewy lub prawy klawisz [Shift],
[Alt], [Amiga] itp. Kody tych klawiszy nie sâ przesyîane przez
wiadomoôci IDCMP_VANILLAKEY, ale wciôniëcie samego klawisza
kwalifikatora moûna rozpoznaê, uûywajâc wiadomoôci typu
IDCMP_RAWKEY. Kod kwalifikatora moûna znaleúê w polu
msg.qualifier, naleûy jednak pamiëtaê, ûe jest to pole typu INT
oraz ûe kwalifikatory, dotyczâce klawiszy, zajmujâ tylko
osiemnaôcie pierwszych bitów. Dlatego teû proponujë wykonywaê
instrukcjë:
<l>kwalifikator:=msg.qualifier AND $3FF
<txt>aby uzyskaê czysty kod kwalifikatora klawiszowego (lub
kwalifikatorów klawiszowych, wszak moûna wcisnâê np.
[Shift][Alt][A]). Oto wszystkie, które moûna otrzymaê z
Intuition:
<l>
IEQUALIFIER_LSHIFT $0001
IEQUALIFIER_RSHIFT $0002
IEQUALIFIER_CAPSLOCK $0004
IEQUALIFIER_CONTROL $0008
IEQUALIFIER_LALT $0010
IEQUALIFIER_RALT $0020
IEQUALIFIER_LCOMMAND $0040
IEQUALIFIER_RCOMMAND $0080
IEQUALIFIER_NUMERICPAD $0100
IEQUALIFIER_REPEAT $0200
<txt>Przypominam, ûe w programach naleûy stosowaê nazwy, a nie
wartoôci numeryczne!!! Kwalifikatory pozwalajâ odróûniê miëdzy
innymi klawisz naciôniëty na klawiaturze numerycznej od
"normalnego", np. szarâ gwiazdkë od kombinacji [Shift][8], a
takûe pozwalajâ na rozpoznanie rozpoczëcia automatycznego
powtarzania sië klawisza (kwalifikator REPEAT). Dodam, ûe mianem
COMMAND twórcy systemu Amigi nazywajâ klawisz ze stylizowanâ
literkâ "A".
Przykîadowo, jeûeli aplikacja reaguje na kombinacje klawiszy
[Alt] i [Help] rozpoznawanie takiej sytuacji naleûy rozwiâzaê,
dopisujâc do programu z ramki, zaraz po liniach TextF, coô
takiego:
<l>
IF klasa=IDCMP_RAWKEY
IF ((kod=$5F) AND (kwalif AND (IEQUALIFIER_LALT+IEQUALIFIER_RALT)))
TextF(30,85,'Wcisnâîeô dowolny [Alt] i [Help]')
ENDIF
ENDIF
<txt>Musisz teû pamiëtaê, aby dodaê do linii programu,
definiujâcej wczytywanie moduîów (linii z MODULE), nazwë
'devices/inputevent', w którym to pliku zdefiniowane sâ kody
kwalifikatorów.
Poczâwszy od systemu w wersji 36 (a wiëc od bety 2.0) moûna
zarzâdaê, aby aplikacja byîa zawiadamiana o obu typach wiadomoôci
zwiâzanych z klawiszami (RAW i VANILLA). W tym celu przy
otwieraniu okna trzeba umieôciê, w parametrze odpowiedzialnym za
wiadomoôci IDCMP, oba typy. Wtedy Twoje okno bëdzie otrzymywaîo
wiadomoôci typu IDCMP_VANILLAKEY, kiedy klawisz da sië "ugotowaê"
(z angielskiego -- raw znaczy surowy, natomiast niektórzy zamiast
vanilla uûywajâ sformuîowania cooked -- ugotowany), a jeûeli nie
-- to otrzymnasz wiadomoôê typu IDCMP_RAWKEY. Efektem ubocznym
jest fakt, ûe aplikacja nigdy nie dostanie wiadomoôci o
wyciôniëciu klawisza typu raw.
<sr>*
<txt>Za miesiâc dalszy ciâg wykîadu o IDCMP. Przy okazji
podajë informacjë, ûe powstaî ogólnopolski klub miîoôników
programowania w Amiga E. Kontakt: Jakub Dudek, ul. Szczytowa 6,
33-112 Tarnowiec, tel. (012) 210563 (wieczoren w weekendy),
e-mail:Jdudek@student.uci.agh.edu.pl lub
Jdudek@ucinvl.uci.agh.edu.pl
<przyp>Literatura: AutoDocs -- "intuition.doc", Commodore 1994
Includes -- "intuition/intuition.h", "intuition/gadgetclass.h",
"libraries/gadtools.h", Commodore 1994.
<l>
^- ->
-> Program ilustrujâcy dane otrzymywane z
-> wiadomoôci typu IDCMP_VANILLAKEY i IDCMP_RAWKEY
->
-> ************ (c) RW & Magazyn AMIGA 1995 ************
ENUM KONIEC,BLAD_OKNO
MODULE 'intuition/intuition'
DEF wnd:PTR TO window,klasa,kod,kwalif
PROC main() HANDLE
otworzGUI()
Colour(1,0)
REPEAT
zdarzenie()
TextF(30,35,'msg.class: \z\h[8] msg.code: \h[4] (\c)',klasa,kod,kod)
TextF(30,45,'msg.qualifier: \z\h',kwalif AND $3FF)
TextF(30,65,'IDCMP_VANILLAKEY -- \h[8]',IDCMP_VANILLAKEY)
TextF(30,75,'IDCMP_RAWKEY -- \h[8]',IDCMP_RAWKEY)
UNTIL klasa=IDCMP_CLOSEWINDOW
EXCEPT DO
zamknijGUI()
IF exception THEN WriteF('Nie mogë \s!\n',
ListItem(['','otworzyê okna'],exception))
ENDPROC
PROC otworzGUI()
IF (wnd:=OpenW(10,15,400,200,
IDCMP_CLOSEWINDOW+IDCMP_VANILLAKEY,
/*
** w powyûszej linii moûesz wpisaê RAWKEY zamiast
** VANILLAKEY lub kombinacjë obu czyli
** ICDMP_CLOSEWINDOW+IDCMP_VANILLAKEY+IDCMP_RAWKEY,
**
*/
WFLG_DRAGBAR+WFLG_DEPTHGADGET+
WFLG_CLOSEGADGET+WFLG_ACTIVATE,
'IDCM_VANILLAKEY i IDCMP_RAWKEY',
NIL,1,NIL))=NIL THEN Raise(BLAD_OKNO)
ENDPROC
PROC zamknijGUI()
IF wnd THEN CloseWindow(wnd)
ENDPROC
PROC zdarzenie()
DEF mes:PTR TO intuimessage
REPEAT
klasa:=0
IF mes:=GetMsg(wnd.userport)
klasa:=mes.class
kod:=mes.code
kwalif:=mes.qualifier
ReplyMsg(mes)
ELSE
WaitPort(wnd.userport)
ENDIF
UNTIL klasa
ENDPROC