home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ST-Computer Leser 2002 January
/
STC_CD_01_2002.iso
/
APP
/
MWHEEL
/
MWHEEL.TXT
< prev
next >
Wrap
Text File
|
2002-01-09
|
12KB
|
312 lines
MWheel V1.00
============
Geschrieben von Armin Diedering
Email: Armin@Diedering.de
Web: http://www.ardisoft.de/
Was ist MWheel?
===============
MWheel ist ein Programm, das Mausraddrehungen der betreffenden Application
meldet.
Im gegensatz zu Wheel von Holger Weets (ST-Guide) versendet MWheel keine
AES-Nachrichten (Message) sondern erweitert die Maustasten. Eine Radbewegung
wird als Maus-Klick interpretiert. Der Vorteil dabei ist, da₧ Radbewegungen
per wind_update(BEG_MCTRL) eingefangen werden können. Somit kann das Mausrad
auch in modale Dialoge verwendet werden.
MWheel ist kein Hardwaretreiber. MWheel stellt aber eine Schnittstelle zur
Verfügung, über der ein Hardwaretreiber Raddrehungen in das System
einbringen kann.
Installation
============
MWheel gehört in den AUTO-Ordner. Zu Testzwecken kann es auch
nachträglich vom Desktop aus gestartet werden.
MWheel benötigt zwingend das Programm Trapper von Manfred Lippert (Jinnee).
Dabei mu₧ MWheel nach Trapper ausgeführt werden.
Mit dem CPX-Modul MWheel.cpx kann MWheel configuriert werden (Drehrichtung,
Zeilen je Dreh usw.)
Freeware
========
MWheel darf beliebig - aber nur zusammen mit folgenden Dateien und
selbstredend unverändert - weitergegeben werden.
mwheel.prg MWheel
mwheel.cpx das Configurations-Tool
mwheel.txt dieser Text
mwheel.h ein Header-File für Programmierer
mwhl-mpc.prg ein Wheel-Treiber für Magic PC
mwhl-mpc.txt
mwhl-joy.prg der Joystick als Wheels
mwhl-joy.txt
Für Programmierer
=================
MWheel erweitert die AES-Funktionen appl_getinfo, evnt_button und
evnt_multi. Für evnt_button und evnt_multi werden dabei neue Bindings
erforderlich.
MWheel bindet Mausräder als zusätzliche Maustaste ein. Dadurch kann eine
Applikation per wind_update(BEG_MCTRL) Mausrad-Ereignisse einfangen.
Ansonsten geht die Meldung an die Applikation, über dessen Fenster sich der
Mauszeiger befindet.
appl_getinfo
------------
Bei appl_getinfo Opcode 8 wird in ap_gout3 ein Bit-Vektor der verfügbaren
Mausräder zurückgegeben.
evnt_button
-----------
Für evnt_button wird ein neues Binding erforderlich, weil dieser Funktion
ein zusätzlicher Parameter übergeben werden kann.
Deklaration: WORD evnt_button ( WORD ev_bclicks, WORD ev_bmask,
WORD ev_bstate, WORD *ev_bmx,
WORD *ev_bmy, WORD *ev_bbutton,
WORD *ev_bkstate, WORD *ev_bwhlpbuff );
Der Parameter ev_bwhlpbuff ist ein Zeiger auf den 16 WORDs (32 Byte) gro₧en
Wheel-Puffer. Wenn in ev_bbutton Bit-7 (0x80) gesetzt ist, dann sind die
Werte im Wheel-Buffer gültig. Im Wheel-Buffer wird für jedes verfügbare Rad
die Drehweite (vorzeichenbehaftet) eingetragen.
Soll auf ein Mausrad-Ereignis gewartet werden, dann mu₧ Bit-7 auch in
ev_bmask gesetzt werden.
GEM_Arrays: control control[0] 21 Opcode der Funktion
control+2 control[1] 3 # Einträge in int_in
control+4 control[2] 5 # Einträge in int_out
control+6 control[3] 1 # Einträge in addr_in
control+8 control[4] 0 # Einträge in addr_out
int_in int_in[0] ev_bclicks
int_in+2 int_in[1] ev_bmask
int_in+4 int_in[2] ev_bstate
int_out int_out[0] Return-Wert
int_out+2 int_out[1] ev_bmx
int_out+4 int_out[2] ev_bmy
int_out+6 int_out[3] ev_bbutton
int_out+8 int_out[4] ev_bkstate
addr_in addr_in[0] ev_bwhlpbuff
evnt_multi
----------
Für evnt_multi wird ebenfalls ein neues Binding erforderlich.
Deklaration WORD evnt_multi ( WORD ev_mflags, WORD ev_mbclicks,
WORD ev_mbmask, WORD ev_mbstate,
WORD ev_mm1flags, WORD ev_mm1x,
WORD ev_mm1y, WORD ev_mm1width,
WORD ev_mm1height, WORD ev_mm2flags,
WORD ev_mm2x, WORD ev_mm2y,
WORD ev_mm2width, WORD ev_mm2height,
WORD *ev_mmgpbuff, WORD ev_mtlocount,
WORD ev_mthicount, WORD *ev_mmox,
WORD *ev_mmoy, WORD *ev_mmbutton,
WORD *ev_mmokstate, WORD *ev_mkreturn,
WORD *ev_mbreturn, WORD *ev_mwhlpbuff );
Auch evnt_multi wird wie schon evnt_button um einen Parameter erweitert.
ev_mwhlpbuff entspricht hierbei ev_bwhlpbuff bei evnt_button.
GEM_Arrays: control control[0] 25 Opcode der Funktion
control+2 control[1] 16 # Einträge in int_in
control+4 control[2] 7 # Einträge in int_out
control+6 control[3] 2 # Einträge in addr_in
control+8 control[4] 0 # Einträge in addr_out
int_in int_in[0] ev_mflags
int_in+2 int_in[1] ev_mbclicks
int_in+4 int_in[2] ev_mbmask
int_in+6 int_in[3] ev_mbstate
int_in+8 int_in[4] ev_mm1flags
int_in+10 int_in[5] ev_mm1x
int_in+12 int_in[6] ev_mm1y
int_in+14 int_in[7] ev_mm1width
int_in+16 int_in[8] ev_mm1height
int_in+18 int_in[9] ev_mm2flags
int_in+20 int_in[10] ev_mm2x
int_in+22 int_in[11] ev_mm2y
int_in+24 int_in[12] ev_mm2width
int_in+26 int_in[13] ev_mm2height
int_in+28 int_in[14] ev_mtlocount
int_in+30 int_in[15] ev_mthicount
int_out int_out[0] Return-Wert
int_out+2 int_out[1] ev_mmox
int_out+4 int_out[2] ev_mmoy
int_out+6 int_out[3] ev_mmbutton
int_out+8 int_out[4] ev_mmokstate
int_out+10 int_out[5] ev_mkreturn
int_out+12 int_out[6] ev_mbreturn
addr_in addr_in[0] ev_mmgpbuff
addr_in+4 addr_in[1] ev_mwhlpbuff
Für Hardware-Maustreiber-Programmierer
======================================
MWheel trägt sich in den Cookie-Jar ein und verwendet dabei die ID 'MWHL'.
Der Cookie-Wert ist ein Zeiger auf folgende Struktur:
typedef struct
{
WORD mwhl_version;
char* mwhl_info;
WORD (*mwhl_wheeled)(WORD Value[16]);
WORD (*mwhl_service)(LONG Opcode, ...);
WORD mwhl_wheels;
LONG mwhl_control;
WORD mwhl_step[16];
WORD mwhl_direction;
WORD mwhl_delay;
}MWHL_Cookie;
mhwl_version: Version von MHweel im BCD Format (z.B. 0x0100 für v1.00)
mhwl_info: Nullterminierter String mit Programminformationen
mwhl_wheeled: Diese Funktion mu₧ ein Hardware-Treiber aufrufen um die
Rad-Ereignisse einzuspeisen. Die Funktion erwartet nach
C-Konvention die Parameter auf dem Stack übergeben (in
Pure-C schreibt man dafür "cdecl"). Der Rückgabewert wird
wie in C üblich über das Register D0 zurückgeliefert. Die
Funktion kann - nach C-Konvention - die Register
D0,D1,D2,A0 und A1 verändern.
Value: Ist ein Zeiger auf 16 WORDs, die die Drehweiten
enthalten.
Return: Wurden die Drehweiten angenommen, dann liefert
mwhl_wheeled E_OK. Anderenfalls ist ein Fehler
aufgetreten.
mwhl_service: Für diese Funktionen gelten die gleichen
Aufruf-Konventionen wie bei mwhl_wheeled. Diese Funktion
hat eine variable Anzahl von Parametern (abhängig von
Opcode).
mwhl_service ist z.Z. ohne Funktion.
Opcode: Legt fest, was die Funktion machen soll.
Return: von Opcode abhängig
mwhl_wheels: Ein Bit-Vektor der verfügbaren Mausräder. Dieser
Bit-Vektor wird bei appl_getinfo Opcode 8 in ap_gout3
zurückgegeben. Ein Maus-Treiber mu₧ hier die
entsprechenden Bits der von ihm unterstützten Räder
setzen.
mwhl_control: Für diverse Einstellungen
Bit-0 schaltet WM_ARROWED-Emulation Ein bzw. Aus
mwhl_step[16]: Für jedes Rad kann eine Scrollweite angegeben werden, die
bei einem Dreh gemeldet werden soll. Praktisch wird
einfach die Drehweite, die mit mwhl_wheeled gemeldet
wird, mit den Werten aus mwhl_step multipliziert.
Allerdings gilt das nur für Drehs innerhalb der
Delay-Zeit (siehe mwhl_delay). Daduch kann man durch
langsames Drehen des Rads fein scrollen.
mwhl_direction: Legt die Richtung der Radereignisse fest. Wird z.B. Bit-0
gesetzt, dann wird auch die Richtung von Rad-0 umgedreht.
mwhl_delay: Da eine Raddrehung wie ein Mausklick behandelt wird, wird
sie auch etwas verzögert gemeldet (Mausklicks werden in
der Regel verzögert gemeldet, damit das System
Doppelklicks registrieren kann). Um ein "Ruckeln" zu
vermeiden, wartet MWheel (wenn es ein Radereignis
gemeldet hat) direkt auf einen weiteren Dreh, der dann
ohne verzögerung weitergemeldet wird. Diese Wartezeit
wird mit mwhl_delay festgelegt (in ms).
Guideline
=========
Grundsätzlich sollte die Applikation kontextabhängig entscheiden, was mit
den gemeldeten Raddrehungen passieren soll und welches Rad (wenn es denn
mehrere gibt) für welche Aufgabe verwendet werden soll.
Trotzdem möchte ich hier ein paar grundlegende Richtlinien vorgeben (an die
sich ein Programm aber nicht unbedingt halten mu₧ aber sollte).
- Raddrehungen werden mit vorzeichenbehaftete Drehweiten gemeldet. Für das
Scrollen gilt folgendes:
- positive Werte scrollen nach oben bzw. rechts
- negative Werte scrollen nach unten bzw. links
- das Rad 0 ist das Haupt-Rad und ist universell (kontextabhängig)
- den Rädern 1-15 werden feste Funktionen zugeordnet
- Rad 0 ist standardmä₧ig für das vertikale scrollen verantwortlich
- der Kontext "Control-Taste" schaltet auf horizontales scrollen um
- Rad 1 ist für das horizontale scrollen verantwortlich
- Räder 2-15 sind noch unbelegt
Fragen und Antworten
====================
F: Was passiert mit Programmen, die nicht das neue Binding verwenden?
A: Wenn diese Programme evnt_multi verwenden und auf ein Message-Ereignis
(MU_MESAG) warten, dann bekommen sie von MWheel WM_ARROWED-Nachrichten
untergeschoben. Dieses Verhalten kann mit dem CPX-Modul abgeschaltet
werden.
F: Funktioniert MWheel auf jeder TOS-Plattform?
A: Ich gehe einmal stark davon aus. Getestet habe ich MWheel allerdings nur
mit MagiC und einem ATARI 1040 STFM mit TOS 1.02
History
=======
V1.01, 19.1.2002
----------------
- 2. Rad scrollt jetzt in beide Richtungen
V1.0, 17.12.2001
----------------
- Erste Version
Viel Spa₧ mit MWheel,
Armin Diedering