E-13 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). Rafaî Wiosna Znowu miësko 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ë: kwalifikator:=msg.qualifier AND $3FF 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: 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 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: 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 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. * 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 Literatura: AutoDocs -- "intuition.doc", Commodore 1994 Includes -- "intuition/intuition.h", "intuition/gadgetclass.h", "libraries/gadtools.h", Commodore 1994. ^- -> -> 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