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 Verfgung, 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 ausgefhrt 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 fr Programmierer mwhl-mpc.prg ein Wheel-Treiber fr Magic PC mwhl-mpc.txt mwhl-joy.prg der Joystick als Wheels mwhl-joy.txt Fr Programmierer ================= MWheel erweitert die AES-Funktionen appl_getinfo, evnt_button und evnt_multi. Fr 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 verfgbaren Mausr„der zurckgegeben. evnt_button ----------- Fr 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 gltig. Im Wheel-Buffer wird fr jedes verfgbare 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 ---------- Fr 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 Fr 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 fr 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 dafr "cdecl"). Der Rckgabewert wird wie in C blich ber das Register D0 zurckgeliefert. 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: Fr 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 verfgbaren Mausr„der. Dieser Bit-Vektor wird bei appl_getinfo Opcode 8 in ap_gout3 zurckgegeben. Ein Maus-Treiber muž hier die entsprechenden Bits der von ihm untersttzten R„der setzen. mwhl_control: Fr diverse Einstellungen Bit-0 schaltet WM_ARROWED-Emulation Ein bzw. Aus mwhl_step[16]: Fr 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 fr 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) fr 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. Fr 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 fr das vertikale scrollen verantwortlich - der Kontext "Control-Taste" schaltet auf horizontales scrollen um - Rad 1 ist fr 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