home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 48
/
Amiga_Dream_48.iso
/
Atari
/
c
/
libs
/
nkcc-293.lzh
/
DOC
/
GERMAN.DOC
< prev
next >
Wrap
Text File
|
1995-11-09
|
30KB
|
679 lines
NKCC - NORMALIZED KEY CODE CONVERTER
=============================================================================
Version 2.93
von Harald Siegmund Copyright (c) 1989-1995
Die NKCC Library ist Freeware. Das Archiv darf nur in unveränderter Form
weitergegeben werden. Wird NKCC in einer Applikation eingebaut, so bitte
ich um einen kurzen Vermerk im Info-Dialog (z.B. "NKCC Tastaturroutinen
von Harald Siegmund" oder ähnliches). Vielen Dank!
-----------------------------------------------------------------------------
History:
1989:
14. Mai: erste Version (NKCC 1.00)
... (ich hatte keine Lust, die englischsprachige History zu übersetzen;
wen's interessiert, kann die fehlenden Einträge in ENGLISH.DOC
nachlesen)
1995:
31. Okt: Übersetzung der Dokumentation ins Deutsche.
Korrektur in der Beschreibung des Tastenformats: die Bit-Nummern
von NKF_LSH und NKF_RSH waren falsch angegeben.
9. Nov: Version 2.93:
Die zusätzlichen Tasten auf der Mac-Tastatur werden nun
unterstützt.
-----------------------------------------------------------------------------
Entwickleradresse:
adequate systems
Gesellschaft für angemessene Systemlösungen mbH
z.Hd. Harald Siegmund
Brauereistr. 2
D-67549 Worms
E-mail : Harald_Siegmund@kl.maus.de (Internet-Adresse)
Mausnet: Harald Siegmund@KL
-----------------------------------------------------------------------------
Neue Versionen von NKCC werden immer abgelegt in:
Maus KL (0631-17901) !! Programmteil für Nichtzahler gesperrt !!
Archiv NKCC.LZH !! von 7 - 9 und 17 - 19 Uhr !!
FTP server ftp.uni-kl.de [131.246.94.94]
File pub/atari/programming/nkcc.lzh
=============================================================================
Inhalt:
1. Was ist eigentlich NKCC?
2. Dateien, die zum Paket gehören
3. Das normalisierte Tastenformat
4. Wie wird NKCC aufgerufen?
5. NKCC in TOS-Applikationen
6. NKCC in GEM-Applikationen
7. Der Button Event Handler
8. Sonstige Funktionen
9. Symboltabelle
1. Was ist eigentlich NKCC?
=============================================================================
NKCC ist ein NME-Produkt (Not macht erfinderisch), da₧ bei dem verzweifelten
Versuch entstanden ist, eine flexible und länderunabhängige Tastenmakro-
verwaltung zu schreiben. Vorgabe war, möglichst *alle* Kombinationen von
Shift (links/rechts), Control und Alternate mit einer anderen Taste
erfassen zu können, unabhängig davon, ob die Applikation auf einem
deutschen, saudi-arabischen, isländischen oder wasauchimmer-TOS mit
entsprechender Tastenbelegung läuft.
Kein Problem? Von wegen! Wenn man sich die von TOS/GEM zurückgelieferten
Tastencodes anschaut, kann einem das kalte Grauen kommen:
a) Alternate plus eine Buchstabentaste liefert lediglich den Scancode des
Taste zurück, der von der Belegung der Tastatur (Landessprache!)
abhängt. Als ASCII-Code meldet das OS immer eine 0.
b) Bei einigen Tasten variiert der Scancode abhängig davon, welche
Zusatztasten gedrückt sind! Ein Beispiel: auf der deutschen
Tastatur hat die Taste "1 !" den Scancode 2. Wird zusätzlich Alternate
gedrückt, ändert sich der Scancode zu $78 und als ASCII-Code erhält
man eine Null.
c) Der Cursortastenblock ist eine einzige Katastrophe. Hier kann man nur
darauf hoffen, da₧ auf allen Tastaturen die gleichen Scancodes
geliefert werden. Bei einigen Tasten - nicht allen - ändert sich der
Scancode, wenn zusätzlich Control gedrückt wird! Der ASCII-Code hängt
vom Zustand der Zusatztasten (Shift, Control) sowie der aktuellen
Mondphase ab und spottet jeder Regel.
d) Einige Tastenkombinationen lassen sich so ohne weiteres gar nicht
auseinanderhalten, da sie den gleichen Tastencode produzieren.
So sind in den meisten Fällen die Tastencodes für Alternate+irgendeine
Taste identisch mit Alternate+Shift+irgendeine Taste.
Die Lösung für all diese Probleme hei₧t NKCC.
Ok, nicht ganz so dramatisch:
*Eine* Lösung für all diese Probleme hei₧t NKCC. ;-)
Die Hauptaufgabe von NKCC liegt in der Konvertierung von Tastencodes in
ein sinnvolles, scancode- und damit landesspracheunabhängiges Format.
Mit NKCC können praktisch alle Tastenkombinationen unterschieden werden.
Ausnahmen bilden lediglich jene Kombinationen, die zu Sonderzwecken
im Betriebssystem eingesetzt werden (zum Bleistift das altbekannte
Alternate+Help, das die Hardcopy-Routine des Systems anwirft).
So nebenbei hat NKCC noch einige Zusatzfunktionen in petto:
a) Deadkeys
Mit diesem Mechanismus ist es möglich, defekte Tasten wiederzubeleben.
Scherz beiseite: Deadkeys braucht man, um akzentuierte Zeichen einzugeben,
die nicht auf der Tastatur anzutreffen sind. Der Mechanismus funktioniert
so: als erstes wird die Akzent-Taste gedrückt. NKCC liefert diese nicht
sofort an die Applikation, sondern wartet erst einmal auf die nächste
Taste. Das hei₧t, bei der Eingabe der Akzent-Taste passiert erst einmal
gar nichts, deshalb der Name "Deadkey" ("tote Taste"). Wenn der nächste
Tastencode ankommt, versucht NKCC die Akzent-Taste damit zu verbinden
und einen einzigen Tastencode zu erzeugen, der dann an die Applikation
gemeldet wird. Ist eine Kombination nicht möglich, so werden beide
Codes nacheinander unverändert zurückgegeben. Hier ein Beispiel:
~ danach A wird verschmolzen zu ╖
~ danach X kommen als ~ und X aus NKCC heraus, da es kein
X mit Akzent Tilde gibt
NKCC unterstützt folgende Deadkeys:
^ + aeiou = âêîôû Akzent Circumflex
~ + nNaoAo = ñÑ░▒╖╕ Akzent Tilde
' + eEaiou = éÉáíóú Akzent Akut
` + aeiouA = àèìòù╢ Akzent Gravis
╣ + aeiouyAOU = äëïöüÿÄÖÜ Akzent Umlaut
" + aeiouyAOU = äëïöüÿÄÖÜ Akzent Umlaut (*)
° + aA = åÅ Akzent Angström
, + cC = çÇ Akzent Cedille
/ + oO24 = │▓½¼ kein Akzent, trotzdem nützlich
(*) Das Anführungszeichen (") wird als Synonym für die Umlautpunkte (╣)
verwendet. So gibt es z.B. auf einer holländischen Tastatur weder
das Umlautzeichen noch Umlaute.
b) Direkte Eingabe von ASCII-Codes
Das funktioniert folgenderma₧en: Alternate-Taste drücken und halten,
dann auf der Zehnertastatur den ASCII-Code eingeben. Nach Eingabe von
drei Ziffern oder Loslassen der Alternate-Taste wird ein Tastencode
produziert, der den eingegebenen ASCII-Code enthält. Bei Werten über
255 werden die oberen Bits abgeschnitten (bei Eingabe von 260 = $104
erhält man als ASCII-Code $04).
c) Control Key Emulation
Tastenkombinationen wie z.B. Control+A kommen normalerweise genauso
aus NKCC heraus, d.h.: ASCII-Code = 65 ("A"), Control-Flag ist gesetzt.
Mit der Control Key Emulation kann dieser Teil des Formatkonverters
umgeschaltet werden. Anstelle von "Control + Taste" erhält man dann
einen ASCII-Code von 0 bis 31 *ohne* Control-Flag.
Folgende Kombinationen werden von der Emulation beeinflu₧t:
Control + @ -> $00
Control + A...Z -> $01...$1A
Control + [ -> $1B
Control + \ -> $1C
Control + ] -> $1D
Control + ^ -> $1E
Control + _ -> $1F
Achtung:
Nicht alle Kombinationen sind auf allen Tastaturen verfügbar. Zum
Beispiel ist es auf der deutschen Tastatur nicht möglich, die
Zeichen @ [ \ ] zusammen mit Control einzugeben. Das hat folgenden
Grund: sobald die Control-Taste bei der Eingabe gedrückt wird,
wird ein geschrotteter ASCII-Code vom Betriebssystem an NKCC übermittelt.
Da diese Zeichen nur durch Drücken von Alternate erzeugt werden können,
steht ihr ASCII-Code aber auch nicht in einer der TOS-Tastaturtabellen.
NKCC bleibt nichts anderes übrig, auf den ASCII-Code der Normalbelegung
zurückzugreifen, d.h. einen der Umlaute. Dadurch spricht die Control
Key Emulation natürlich nicht an.
Jeder einzelne Deadkey sowie die anderen speziellen Features können
separat ein- und ausgeschaltet werden.
Neugierig geworden? Das Programm DEMO.TOS zeigt, was NKCC aus
Tastendrücken so machen kann. Einfach starten und ein wenig auf
der Tastatur klimpern.
2. Dateien, die zum Paket gehören
=============================================================================
Im NKCC-Archiv sollten folgende Files enthalten sein:
READ_ME.TXT die Datei, die eh niemand liest
SOURCE\NKCC.S der Quellcode von NKCC
HEADERS\NKCC.I ein Assembler Include-File mit globalen Definitionen
HEADERS\NKCC.H ein C Header-File mit globalen Definitionen
LIB\NKCC.O NKCC als linkfertiges Object File (DRI-Format)
LIB\NKCC_TOS.O NKCC ohne die GEM-Routinen und -Symbole als Object File
DOC\NKCC.TXT Auzug aus NKCC.S mit Dokumentation der Routinen
DOC\GERMAN.DOC die Datei, die Sie gerade lesen
DOC\ENGLISH.DOC die Doku in englischer Sprache
DOC\NEWS.TXT hier sind alle Änderungen am NKCC-Paket dokumentiert
DEMO\DEMO.C Quellcode des Demo-Programms
DEMO\DEMO.TOS Demo-Programm
3. Das normalisierte Tastenformat
=============================================================================
Tastencodes werden von NKCC als 16 Bit Integer zurückgeliefert. Im nieder-
wertigen Byte steckt der ASCII-Teil des Tastencodes, das höherwertige Byte
enthält eine Reihe von Flags. Die genaue Belegung sieht so aus:
Bit Symbolischer Name Inhalt
------------------------------------------------------------
0... 7 ASCII-Code/Funktionscode
8 NKF_RSH Flag für rechte Shift-Taste
9 NKF_LSH Flag für linke Shift-Taste
10 NKF_CTRL Flag für Control-Taste
11 NKF_ALT Flag für Alternate-Taste
12 NKF_CAPS CapsLock-Status
13 NKF_NUM Flag: Zehnerblock
14 NKF_RESVD reserviert, mu₧ ignoriert werden!
15 NKF_FUNC Funktionsflag
Bit 8...11 geben an, ob die jeweilige Taste gedrückt war. In Bit 12 steht,
ob CapsLock zur Zeit aktiv ist oder nicht. Ist Bit 13 gesetzt, befindet
sich die Taste auf dem Zehnerblock. Bit 14 wird für interne Zwecke
verwendet und mu₧ auf jeden Fall ignoriert werden. Achtung: im ersten
Parameter der Funktion nkc_cmp() hat dieses Bit eine spezielle Bedeutung
(siehe entsprechendes Kapitel).
Schlie₧lich gibt es noch Bit 15, da₧ angibt, ob es sich um eine
funktionsbezogene Taste (Bit gesetzt) oder ein druckbares Zeichen (Bit
gelöscht) handelt. Das Bit wird in folgenden Fällen gesetzt:
a) eine der folgenden "Funktionstasten" wurde gedrückt:
Esc, Tab, Backspace, Delete, Return,
Help, Undo, Insert, ClrHome, Cursor hoch, Cursor runter, Cursor links,
Cursor rechts,
Enter,
F1, F2, F3, F4, F5, F6, F7, F8, F9, F10
Page up, Page down, End, F11, F12, F14 (nur auf der Mac-Tastatur!)
Der ASCII-Code solcher Tasten ist immer kleiner als 32 und als NK_...
in den Header Files definiert (z.B. NK_ESC für die Escape-Taste).
b) irgendeine Taste wird zusammen mit Alternate und/oder Control gedrückt
In diesem Fall wird immer die CapsLock-Version der Taste als ASCII-Teil
zurückgeliefert. Zum Beispiel erhält man bei Control+A als ASCII-Code
ein "A" zurück, niemals ein "a".
Das Funktionsflag steckt absichtlich in Bit 15, damit sich Tastencodes (die
als signed 16 Bit Integer definiert sind) sehr einfach in die beiden
Kategorien einordnen lassen:
wenn Tastencode < 0
dann handelt es sich um eine Funktion
sonst
handelt es sich um ein druckbares Zeichen
Der ASCII-Code eines druckbaren Zeichens kann übrigens alle Werte von
0 bis 255 enthalten.
Einige Tastenkombinationen können niemals von NKCC zurückgeliefert werden:
a) Tasten, die vom System zurückgehalten werden. Dazu gehören zum Beispiel:
- Alternate + Cursortasten (dienen zur Maussteuerung)
- Alternate + Help (startet den Hardcopy-Mechanismus)
- Alternate + Control + Tab (schaltet unter MagiC den Task um)
usw.
b) Tasten, die beim Halten von Alternate andere Zeichen liefern. Dazu gehören
z.B. Alternate @ \ [ { ] } auf der deutschen Tastatur, die man durch
Drücken von Alternate und/oder Shift sowie einer Umlauttaste erhält.
Der ASCII-Code wird korrekt zurückgeliefert, das Alternate-Flag wird aber
nie gesetzt. So kann es z.B. die Tastenkombination "Alternate + @" auf
der deutschen Tastatur nicht geben.
Werden vom Deadkey-Handler oder durch Eingabe des ASCII-Codes auf der
Zehnertastatur Zeichen erzeugt, dann können nur das CapsLock- sowie das
reservierte Flag in dem resultierenden Tastencode gesetzt sein. Alle anderen
Flags sind immer 0. Analog dazu ist das Control-Flag immer gelöscht, wenn
durch das Einschalten der Control Key Emulation ein druckbares Zeichen
(z.B. Control A) erzeugt wird.
Verarbeitung ungültiger Scancodes
Ältere Versionen von NKCC produzierten schlicht und ergreifend Müll,
wenn eine Taste mit einem ungültigen bzw. unbekannten Scancode vom
Betriebssystem zurückgeliefert wurde. Ab Version 2.92 kommt NKCC auch
mit solchen Tastencodes klar und konvertiert sie korrekt in das
normalisierte Format. Dabei wird folgende Variation des Formats benutzt:
Funktionsflag = 1
Alternate Flag = 0
Control Flag = 0
ASCII code >= 32
Diese Kombinationen können über die reguläre Tastatur niemals produziert
werden: es handelt sich um ein druckbares Zeichen, das als funktionelle
Taste markiert ist, aber ohne Alternate und Control.
Und wozu braucht man das? Nun, einerseits reagiert NKCC damit auf eine
vernünftige Art und Weise auf unbekannte Scancodes. Andererseits lie₧en
sich damit sehr einfach die Makrotasten des Graphiktabletts einbinden,
für das ich im Frühjar '94 einen Treiber schrieb. :-) Dieser Treiber
speist in den BIOS Tastaturpuffer Makrotasten ein, die folgendes
Format haben:
Scancode = $84...$FF (Empfehlung: $FF benutzen)
ASCII Code = $20...$FF (ASCII Codes < $20 werden von NKCC auf $20 gesetzt)
Die Flags für CapsLock und die Shift-Tasten übernimmt der Treiber direkt
vom System. Alternate und Control werden ebenfalls verarbeitet. Da beide
Flags aber nicht gesetzt sein dürfen, werden ihre Inhalte zum
Zehnerblock-Flag zusammengeodert.
Das hat alles nicht direkt mit NKCC zu tun, kann aber als Anregung
verstanden werden, falls man selbst etwas ähnliches vorhat. Au₧erdem
verhalten sich die Rückkonverter-Funktionen in NKCC passend dazu:
Wird solch ein normalisierter Tastencode mit nkc_n2gem() oder nkc_n2tos()
wieder zurückkonvertiert, erhält man als Scancode immer $FF. War das
Zehnerblock-Flag gesetzt, sind im Ergebnis sowohl das Alternate- als auch
das Control-Flag gesetzt.
4. Wie wird NKCC aufgerufen?
=============================================================================
Der Umgang mit NKCC ist eigentlich sehr einfach. Es müssen nur ein paar
Funktionen aufgerufen werden:
a) Initialisierung
Ganz am Anfang mu₧ ein Aufruf von nkc_init() erfolgen. Die Funktion
bekommt drei Parameter übergeben:
- ein Langwort mit Flags (definiert als NKI_... in den Header Files)
NKI_BUTHND aktiviert den Button Event Handler
NKI_BHTOS zusätzlich: nur bei bestimmten TOS-Versionen
(siehe Kapitel "Der Button Event Handler")
Beide Flags werden von der TOS-Version von NKCC (die
bereits assembliert als NKCC_TOS.O vorliegt) ignoriert.
NKI_NO200HZ hält NKCC davon ab, sich in den 200 Hz Timer für die
Funktion nkc_timer() einzuklinken. Hinweis: wird der
Button Event Handler eingeschaltet, so ignoriert NKCC
dieses Flag, da die Timer Interrupt-Routine für den
Handler benötigt wird.
Die beiden folgenden Parameter von nkc_init() werden nur bei eingeschaltetem
Button Event Handler ausgewertet und sollten ansonsten 0 sein:
- das Handle einer geöffneten virtuellen VDI Screen Workstation
- ein Zeiger auf das AES global-Array der Applikation
unter Pure C ist dies: _GemParBlk.global (definiert in AES.H)
nkc_init() liefert ein 16 bit Integer mit der Versionsnummer von NKCC
als 4 Ziffer BCD zurück (z.B. $0292 = Version 2.92).
Beispiele:
nkc_init(0,0,NULL); Default, ohne Button Event Handler
nkc_init(NKI_NO200HZ,0,NULL); jetzt klinkt sich NKCC nirgendswo mehr ein
<handle> wurde von v_opnvwk zurückgeliefert
nkc_init(NKI_BUTHND,handle,_GemParBlk.global);
b) NKCC abmelden
Mit der Funktion nkc_exit() klinkt sich NKCC wieder aus dem System aus.
Der Aufruf mu₧ auch dann erfolgen, wenn weder 200 Hz Timer noch Button
Event Handler installiert waren! Die Funktion liefert einen Fehlerstatus
zurück, wenn eine andere Applikation die XBRA-Kette der im System
eingeklinkten Routinen zerstört hat. Ist dieser Status < 0, dann darf
die Applikation auf keinem Fall beendet werden, da NKCC sich nicht mehr
aus den Vektoren aushängen kann.
c) Konfigurieren
Mit der Funktion nkc_set() lassen sich bestimmte Einstellungen vornehmen.
Die Funktion erhält als Parameter ein Langwort mit Flags. Ein gesetztes
Flag aktiviert die jeweilige Funktion, ein gelöschtes Flag schaltet sie ab.
NKS_ALTNUM direkte ASCII-Code Eingabe per Alternate+Ziffernblock
NKS_CTRL Control Key Emulation (liefert z.B. "ASCII 1" anstelle von
"Control-Taste + ASCII 'A'")
NKS_D_... schaltet den jeweiligen Deadkey ein
d) Vergleicher
Zum Vergleichen von Tastencodes kann die Funktion nkc_cmp() verwendet
werden. Die Routine erhält zwei Parameter: den Referenz-Tastencode sowie
den Test-Tastencode (der vom Benutzer eingegeben wurde). Einige Bits
des Referenz-Tastencodes haben eine spezielle Bedeutung:
NKF_IGNUM (entspricht NKF_RESVD)
Wenn gesetzt, dann wird das Zehnerblock-Flag ignoriert (d.h. es spielt
keine Rolle, ob z.B. eine Zahlentaste auf der Haupttastatur oder auf
dem Zehnerblock gedrückt wurde).
NKF_CAPS
Wenn gesetzt, wird keine Unterscheidung zwischen Gro₧- und Kleinbuchstaben
vorgenommen.
NKF_SHIFT ( *beide* Shift-Tasten; entspricht NKF_LSH|NKF_RSH)
Wenn *beide* Shift-Tastenflags im Referenz-Tastencode gesetzt sind, wird
lediglich überprüft, ob im Test-Tastencode *irgendein* Shift-Tastenflag
gesetzt ist.
In den nächsten beiden Kapiteln steht, welche Funktionen zur Abfrage
von Tastenereignissen existieren und wie sie verwendet werden. Im
Kapitel "Sonstige Funktionen" sind weitere Routinen beschrieben, die bei
der Entwicklung von NKCC als Nebenprodukt entstanden sind, aber unter
Umständen sehr nützlich sein können.
5. NKCC in TOS-Applikationen
=============================================================================
Für reine textorientierte Konsole-Applikationen sollte die TOS-Version
von NKCC verwendet werden (NKCC_TOS.O), da der inaktive GEM-Teil in
diesem Fall nur Ballast darstellen würde. Folgende Funktionen existieren:
nkc_conin()
basiert auf der GEMDOS-Funktion Crawcin() und arbeitet genau wie diese,
mit der Ausnahme da₧ Tastencodes im normalisierten Format zurückgeliefert
werden. Durch eine geringfügige Modifikation des NKCC-Quellcodes kann
die Funktion auch auf Cconin() (Eingabe mit Echo) oder Bconin()
(BIOS-Funktion) abgebildet werden.
nkc_cstat()
wird anstelle der GEMDOS-Funktion Cconis() (Tastaturstatus abfragen)
verwendet. Die Routine prüft, ob der Tastaturpuffer leer ist (Status 0)
oder nicht (Status -1).
6. NKCC in GEM-Applikationen
=============================================================================
Für GEM-Applikationen stellt NKCC ein komplettes Binding zur AES-Funktion
evnt_multi() zur Verfügung. Die Routine trägt den Namen nkc_multi() und
unterscheidet sich vom Original in folgenden Punkten:
a) Tastencodes werden im normalisierten Format zurückgeliefert
b) die Tastenflags für Shift/Control/Alternate/CapsLock ("ev_mmokstate")
werden so geschoben, da₧ sie mit den NKF_...-Konstanten maskiert
werden können
Für evnt_keybd() gibt es in NKCC keine Entsprechung.
Erweiterung für Assembler-Programmierer - von Gerd Knops
Das NKCC evnt_multi-Binding kann auch von Assemblerroutinen leicht
aufgerufen werden:
- die AES Parameter-Arrays werden geladen (hierzu müssen die Arrays
von NKCC benutzt werden! -> siehe Kapitel "Symboltabelle")
- nkc_amulti() wird aufgerufen. Die Funktion entspricht folgendem Code:
move.l #aespb,d1 ; Zeiger auf Parameterblock laden
move #200,d0 ; opcode: AES
trap #2 ; AES aufrufen
rts ; und wieder zurück
7. Der Button Event Handler
=============================================================================
Lang lang ist's her...
... da veröffentlichte Atari die langerwartete Version 1.04 des ST-
Betriebssystems TOS. Dummerweise bauten die Jungs aus Sunnyvale einen
Fehler in den AES Multi Event Handler ein, der sich beim Warten auf
Timer-Events mit sehr kurzen Zeiten bemerkbar macht. Ist der Timer
nämlich genau dann abgelaufen, wenn der Benutzer gerade mitten in einem
Mausklick ist, behauptet evnt_multi(), da₧ ein Timer-Event UND ein
Button-Event aufgetreten sind. Unter Umständen ist es so niemals
möglich, einen Doppelklick in die Applikation hineinzubekommen, da
der Multi Event Handler die halbfertigen Mausklicks bereits an
die Applikation meldet (als Einfachklicks).
Nach langem Herumexperimentieren habe ich mich schlie₧lich dazu
durchgerungen, einen eigenen Button Event Handler zu schreiben und
in NKCC einzubauen.
Der NKCC Button Event Handler wird beim Aufruf von nkc_init() durch
das Flag NKI_BUTHND aktiviert. Zusätzlich gibt es noch das Flag
NKI_BHTOS: wenn gesetzt, erfolgt die Installation nur dann, wenn
eine fehlerhafte TOS-Version erkannt wurde.
Zum Betrieb des Button Event Handlers wird au₧erdem das Handle einer
geöffneten virtuellen VDI Screen Workstation benötigt, da NKCC
die VDI-Funktion vex_butv() aufruft. Die Workstation darf nicht vor
dem Aufruf von nkc_exit() geschlossen werden!
Wenn schon einen eigenen Button Event Handler, dann gleich mit ein paar
Zusatzfunktionen:
- MU_XTIMER Flag (wird mit den anderen MU_... Flags als Ereignis-Maske
an nkc_multi() übergeben)
Ist dieses Flag (zusätzlich zu MU_TIMER) gesetzt, werden keine
Timer-Events geliefert, wenn der Screen Manager vom System zur
Zeit die Kontrolle über den Bildschirm hat (z.B. beim Ausklappen
von Drown Down Menüs oder Schieben eines Fensters).
- Negations-Flag ($100 der Button-Maske)
In der c't Ausgabe 3/90 oder 4/90 stand ein Artikel über dieses
Flag, das bereits in der ersten TOS-Version eingebaut war aber nie
dokumentiert wurde - sehr zum Ärger vieler Programmierer. Denn mit
diesem Flag lassen sich beide Maustasten ohne gro₧en Aufwand
simultan abfragen. Wenn gesetzt, wird die "wahr"-Bedingung für
Button-Events invertiert. Das lä₧t sich am einfachsten an einem
Beispiel erklären:
mask = evnt_multi(MU_BUTTON,2,3,3,...
Soll maximal Doppelklicks (2) abfragen für beide Buttons (3), die Buttons
müssen gedrückt sein (3). Funktioniert aber nicht, denn es wird getestet:
Knopf #0 gedrückt UND Knopf #1 gedrückt.
Mit Negations-Flag sieht das dann so aus:
mask = evnt_multi(MU_BUTTON,0x102,3,0,...
Hiermit werden wiederum Doppelklicks abgefragt (2) für beide
Buttons (3). Diesmal wird jedoch auf Loslassen (0) getestet und
das Ergebnis invertiert (0x1..). Also:
Nicht ( Knopf #0 losgelassen UND Knopf #1 losgelassen )
oder in anderen Worten:
Knopf #0 gedrückt ODER Knopf #1 gedrückt
Ist doch nett, oder? :-)
8. Sonstige Funktionen
=============================================================================
Bei der Entwicklung von NKCC entstanden einige Funktionen, die nützlich
genug waren, um exportiert zu werden. Es handelt sich hierbei um:
nkc_timer()
liefert den aktuellen Wert des 200 Hz Timers zurück. Die Funktion ist
sehr schnell, da sie nur eine Variable laden mu₧ und dann sofort zurück-
kehrt.
Hinweis: bei ausgeschaltetem Timer (NKI_NO200HZ bei nkc_init()) erhält
man als Ergebnis immer 0.
nkc_kstate()
liefert den aktuellen Wert der Shift-Tasten, Control, Alternate und
CapsLock als NKF_... Flags. Ebenfalls sehr schnell.
nkc_tconv()
Das Kernstück von NKCC: der Tastencode-Konverter, der 32 Bit BIOS
Tastencodes in das normalisierte Format umwandelt. Die Spezialfunktionen
(Deadkeys etc.) werden von dieser Routine nicht gehandhabt (sondern
von nkc_conin() und nkc_multi()/nkc_amulti()).
nkc_gconv()
Eine Variation von nkc_tconv(). Anstelle des BIOS Tastencodes wird dieser
Routine ein 16 Bit GEM-Tastencode übergeben. ACHTUNG!! Aufgrund der
fehlenden Flags (Shift/Control/Alternate/CapsLock) können nicht alle
Tastencodes eindeutig konvertiert werden. Es handelt sich hierbei
um ein Problem von GEM, das für verschiedene Kombinationen ein und
denselben Tastencode vorsieht (über das Problem habe ich mich im ersten
Kapitel ja schon ausgelassen). Die Funktion wurde nur für den "Notfall"
eingebaut, wenn die Flags nicht mehr zur Verfügung stehen. Wann immer
möglich sollte nkc_tconv() verwendet werden.
nkc_n2tos()
konvertiert normalisierte Tastencodes zurück in's 32 Bit BIOS Format.
nkc_n2gem()
konvertiert normalisierte Tastencodes zurück in's 16 Bit GEM Format.
nkc_vlink()
Hiermit lä₧t sich eine Routine mit XBRA Header in einen Vektor einklinken.
Der Vektor kann entweder als Adresse (z.B. $502 für die Hardcopy-
Routine) oder als Nummer angegeben werden (z.B. 2 für den Busfehler-
Vektor).
nkc_vunlink()
Das Gegenstück zu nkc_vlink(): eine XBRA-Funktion wird aus einem Vektor
wieder ausgeklinkt.
nkc_toupper()
konvertiert Zeichen über eine Tabelle von Klein- nach Gro₧buchstaben.
Sonderzeichen wie "ä" oder "é" werden korrekt behandelt.
nkc_tolower()
konvertiert Zeichen von Gro₧- nach Kleinbuchstaben.
Genaueres zu den einzelnen Routinen steht in NKCC.TXT.
9. Symboltabelle
=============================================================================
Folgende Symbole werden von NKCC exportiert:
(Klammern hinter dem Namen identifizieren diesen als Funktion)
nkc_init() Initialisierung, optional Button Event Handler installieren
nkc_exit() Deinitialisierung; NKCC klinkt sich aus dem System aus
nkc_set() Sonderfunktionen einstellen
nkc_conin() raw console character input (basierend auf Crawcin())
nkc_cstat() sample console input status (basierend auf Cconis())
* nkc_multi() Binding zur GEM-Funktion evnt_multi()
* nkc_amulti() dito für in Assembler geschriebene Programme
nkc_tconv() Tastencodekonverter (32 Bit BIOS -> normalisiert)
nkc_gconv() Tastencodekonverter (16 Bit GEM -> normalisiert)
nkc_n2tos() Tastencodekonverter (normalisiert -> 32 Bit BIOS)
nkc_n2gem() Tastencodekonverter (normalisiert -> 16 Bit GEM)
nkc_kstate() Status von Shift/Control/Alternate/CapsLock erfragen
nkc_timer() aktuellen Wert des 200 Hz Timers erfragen
nkc_cmp() Tastencodes vergleichen
nkc_vlink() XBRA-Funktion in Vektor einklinken
nkc_vunlink() XBRA-Funktion aus Vektor ausklinken
nkc_toupper() Konvertierung Klein- nach Gro₧buchstaben
nkc_tolower() Konvertierung Gro₧- nach Kleinbuchstaben
* nkc_contrl AES/VDI control array
* nkc_intin AES/VDI integer input array
* nkc_intout AES/VDI integer output array
* nkc_adrin AES address input array
* nkc_adrout AES address output array
* nkc_ptsin VDI pointers input array
* nkc_ptsout VDI pointers output array
(nkc_amulti() wertet diese Arrays aus)
* nur in der GEM-Version von NKCC (NKCC.O).
=============================================================================
Dateiende