typedef struct { int16_t frames; int16_t delay; MFORM form[32]; } ANI_MOUSE;
Querverweis: graf_mouse
typedef struct { int8_t name[13]; int8_t desc[17]; APFLG flags; KEYCODE open_key; KEYCODE reserve_key[3]; } APPFLAGS;
Querverweis: x_appl_flags
typedef union { struct { unsigned multitask :1; unsigned special_types:1; unsigned round_buttons:1; unsigned kbd_equivs :1; unsigned undo_equivs :1; unsigned off_left :1; unsigned exit_redraw :1; unsigned AES40_msgs :1; unsigned limit_handles:1; unsigned limit_memory :1; unsigned keep_deskmenu:1; unsigned clear_memory :1; unsigned maximize_wind:1; unsigned unused :3; /* Reserved for future use */ unsigned mem_limit :16; /* Kb to limit memory allocation */ } s; unsigned long l; } APFLG;
Querverweis: x_appl_flags APPFLAGS
Diese Struktur ist wie folgt definiert:
typedef struct { int32_t type; /* Art des Ereignisses */ int32_t what; /* genaue Beschreibung des Ereignisses */ } APPLRECORD
Für die Komponenten gilt dabei:
type Bedeutung | what | ||||||||||||
0 Timer-Event | Anzahl von 50-Millisekunden Ticks | ||||||||||||
1 Button-Event | Status der Maustaste (High-Word), und zwar: 0 = nicht gedrückt,
1 = gedrückt:
Das (low-WORD) ist immer auf 1 gesetzt | ||||||||||||
2 Maus-Event | X-Koordinate (High-Word), Y-Koordinate (Low-Word). | ||||||||||||
3 Tastatur-Event |
|
Hinweis: Unter PC-GEM belegt jedes Ereignis nur 6 Bytes, da die Komponente type von APPLRECORD dort als int16_t definiert ist.
Querverweis: appl_tplay appl_trecord
Ein Bit-Image kann immer dort eingesetzt werden, wo ein nicht anwählbares Icon stehen könnte; der entscheidende Unterschied ist nämlich, daß es zu einem Bit-Image keine Maske gibt.
typedef struct { int16_t *bi_pdata; /* Zeiger auf die Grafikdaten */ int16_t bi_wb; /* Breite des Bildes in Bytes */ int16_t bi_hl; /* Höhe in Zeilen */ int16_t bi_x; /* x-Position */ int16_t bi_y; /* y-Position */ int16_t bi_color; /* Farbe */ } BITBLK;
Hinweis: Die Breite eines Bit-Images (Komponente bi_wb) muß stets durch 2 teilbar sein.
Querverweis: OBJECT Objektarten des AES
Diese Struktur ist wie folgt definiert:
typedef struct cicon_data { int16_t num_planes; /* Anzahl der Planes für die folgenden Daten */ int16_t *col_data; /* Zeiger auf Farb-Bitmap in Standardform */ int16_t *col_mask; /* Zeiger auf einzelne Farb-Plane Maske */ int16_t *sel_data; /* Zeiger auf Farb-Bitmap des selekt. Icons */ int16_t *sel_mask; /* Zeiger auf einzelne Plane-Maske des Icons */ struct cicon_data *next_res; /* Zeiger auf Icon anderer Auflösung */ } CICON;
Querverweis: CICONBLK ICONBLK OBJECT
Diese Struktur ist wie folgt definiert:
typedef struct cicon_blk { ICONBLK monoblk; /* Default: monochrome Icons */ CICON *mainlist; /* Farb-Icons für verschiedene Auflösungen */ } CICONBLK;
Querverweis: OBJECT Objektstruktur im AES
typedef struct clrcat { int16_t cc_foreground /* Foreground colour */ int16_t cc_background /* Background colour */ int16_t cc_style /* Fill style */ int16_t cc_pattern /* Fill pattern */ } CLRCAT;
The CLRCAT is used internally by ViewMAX/2 and later to store the colour categories.
Querverweise: X_BUF_V2
typedef void *DIALOG;
typedef struct _dither_mode { struct _dither_mode *next; /* Zeiger auf Nachfolger */ int32_t length; /* Strukturlänge */ int32_t format; /* Datenformat */ int32_t reserved; /* reserviert */ int32_t dither_id; /* Kennung */ int32_t color_modes; /* unterstützte Farbtiefen */ int32_t reserved1; /* reserviert */ int32_t reserved2; /* reserviert */ int8_t name[32]; /* Name des Rasterverfahrens */ } DITHER_MODE;
Querverweis: Druckdialoge pdlg_add_printers
typedef struct _drv_entry { struct _drv_entry *next; /* Zeiger auf Nachfolger */ } DRV_ENTRY;
typedef struct { int32_t magic; /* 'pdnf' */ int32_t length; /* Strukturlänge */ int32_t format; /* Datenformat */ int32_t reserved; /* reserviert */ int16_t driver_id; /* Treibernummer fürs VDI */ int16_t driver_type; /* Treibertyp */ int32_t reserved1; /* reserviert */ int32_t reserved2; /* reserviert */ int32_t reserved3; /* reserviert */ PRN_ENTRY *printers; /* zum Treiber gehörenden Drucker */ DITHER_MODE *dither_modes; /* unterstützte Rasterverfahren */ int32_t reserved4; /* reserviert */ int32_t reserved5; /* reserviert */ int32_t reserved6; /* reserviert */ int32_t reserved7; /* reserviert */ int32_t reserved8; /* reserviert */ int32_t reserved9; /* reserviert */ int8_t device[128]; /* Ausgabedatei des Druckertreibers */ } DRV_INFO;
Querverweis: Druckdialoge pdlg_add_printers
typedef struct { int16_t mwhich; /* Art der Ereignisse */ int16_t mx; /* x-Koordinate des Mauszeigers */ int16_t my; /* y-Koordinate des Mauszeigers */ int16_t mbutton; /* gedrückte Maustaste */ int16_t kstate; /* Status der Sondertasten (kbshift) */ int16_t key; /* Scancode der gedrückten Taste */ int16_t mclicks; /* Anzahl der Mausklicks */ int16_t reserved[9]; /* reserviert */ int16_t msg[16]; /* Message-Buffer */ } EVNT;
Querverweis: fnts_evnt fslx_evnt wdlg_evnt
typedef struct _fnts_item { struct _fnts_item *next; /* Zeiger auf den nächsten Font oder 0L */ UTXT_FN display; /* Anzeige-Funktion für eigene Fonts */ int32_t id; /* ID des Fonts */ int16_t index; /* muß 0 sein, da kein VDI-Font */ int8_t mono; /* Flag für äquidistante Fonts */ int8_t outline; /* Flag für Vektorfont */ int16_t npts; /* Anzahl der vordefinierten Punkthöhen */ int8_t *full_name; /* Zeiger auf den vollständigen Namen */ int8_t *family_name; /* Zeiger auf den Familiennamen */ int8_t *style_name; /* Zeiger auf den Stilnamen */ int8_t *pts; /* Zeiger auf Feld mit Punkthöhen */ int32_t reserved[4]; /* reserviert, müssen 0 sein */ } FNTS_ITEM;
Querverweis: fnts_add Zeichensatzauswahl
typedef void *FNT_DIALOG;
typedef int16_t (cdecl *HNDL_OBJ) ( void *dialog, EVNT *events, int16_t obj, int16_t clicks, void *data );
Dabei gilt:
Parameter | Bedeutung | ||||
dialog | Zeiger auf eine Dialogstruktur. Auf diese sollte nicht direkt, sondern nur mit Hilfe der wdlg_xxx Funktionen zugegriffen werden. | ||||
events | Zeiger auf die EVNT-Strukur, die bei wdlg_evnt übergeben wurde (falls der Parameter obj >= 0 ist), oder NULL. | ||||
obj |
Von diesen Funktionsnummern muß nur auf HNDL_CLSD reagiert werden; alle anderen Ereignisse können je nach Bedarf beachtet werden. | ||||
clicks | Anzahl der Mausklicks, falls es sich bei obj um eine Objektnummer handelt. | ||||
data | Falls der Parameter obj eine positive Objektnummer ist, wird hier die Variable user_data aus der Funktion wdlg_create übergeben. Anderenfalls ist der Wert von der entsprechenden Funktionsnummer abhängig. |
Hinweis: Die Funktion wird aufgerufen, wenn auf ein EXIT- oder TOUCHEXIT Objekt geklickt wurde (in diesem Fall ist obj eine positive Objektnummer) oder wenn ein den Dialog betreffendes Ereignis eingetreten ist (dann ist obj negativ und enthält eine entsprechende Funktionsnummer (s.o.)).
Die Parameter werden über den Stack übergeben und die Routine darf die Register d0-d2/a0-a2 verändern. Falls die Funktion mit einer unbekannten Funktionsnummer in obj aufgerufen wird oder eine der obigen Funktionsnummern ignoriert werden soll, muß der Wert 1 zurückgeliefert werden.
Querverweis: Beispiel-Implementation wdlg_create
/* Der folgende Code ist ein Beispiel für eine Implementation der handle_exit Funktion, wie sie z.B. als Parameter bei wdlg_create vorkommt. */ int16_t cdecl handle_exit ( void *dialog, EVNT *events, int16_t obj, int16_t clicks, void *data ) { /* * Ereignis oder Objektnummer? * Alle Ereignisse außer HNDL_CLSD werden bei diesem Beispiel * ignoriert */ if ( obj < 0 ) { if ( obj == HNDL_CLSD ) /* Closer betätigt? */ return( 0 ); /* beenden */ if ( obj == HNDL_EDIT ) { /* In Fensterdialogen kann es nützlich sein, Tasten- kombinationen mit Control in Eingabefeldern zu igno- rieren, damit Shortcuts wie z.B. Ctrl-U, Ctrl-W oder Ctrl-Q in der Eventschleife des Programms abgearbei- tet werden können. In diesem Fall sollte nach HNDL_EDIT eine 0 zurückgeliefert werden, damit die Taste nicht von objc_edit bearbeitet wird. */ } } else { /* ein Objekt ist angewählt worden */ switch ( obj ) /* Aktionen einleiten (falls nötig) */ { case ... . . . case MY_EXIT_OBJECT: ..... return( 0 ); /* beenden */ } } return( 1 ); /* weitermachen */ }
data ist die bei wdlg_init übergebene Variable. Falls handle_exit den Wert 0 zurückliefert, legt wdlg_create keine Dialog-Struktur an (Fehler). Die Variable code wird in clicks übergeben.
Querweise: HNDL_OBJ wdlg_create
data ist user_data. Falls handle_exit den Wert 0 zurückliefert, wird der Dialog geschlossen - wdlg_evnt liefert den Wert 0 zurück. events zeigt auf die bei wdlg_evnt übergebene EVNT-Struktur.
Hinweis: Dieser Code wird nur dann übergeben, wenn ein Nachrichtencode zwischen 20 und 39 empfangen wurde, der nicht mit den anderen Opcodes bearbeitet wird. Er wird z.B. für die Ikonifizierung benötigt.
Achtung: Dieser Opcode wird erst seit der MagiC Version 4.50 vom 18.04.96 unterstützt.
Querweise: HNDL_OBJ wdlg_create
data ist die bei wdlg_open übergebene Variable. Die Variable code wird in clicks übergeben.
Querweise: HNDL_OBJ wdlg_create
data ist user_data. Falls handle_exit den Wert 0 zurückliefert, wird der Dialog geschlossen - wdlg_evnt liefert den Wert 0 zurück.
events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data ist user_data. Falls handle_exit den Wert 0 zurückliefert, wird der Dialog geschlossen - wdlg_evnt liefert den Wert 0 zurück.
events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data ist user_data. Falls handle_exit den Wert 0 zurückliefert, wird der Dialog geschlossen - wdlg_evnt liefert den Wert 0 zurück.
events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data ist user_data. Falls handle_exit den Wert 0 zurückliefert, wird der Dialog geschlossen - wdlg_evnt liefert den Wert 0 zurück.
events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data zeigt auf ein Wort mit dem Tastencode. Falls handle_exit den Wert 1 zurückliefert, wird der Tastendruck verarbeitet, bei 0 ignoriert.
events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data zeigt auf ein Wort mit dem Tastencode. events zeigt auf die bei wdlg_evnt überg. EVNT-Struktur.
Querweise: HNDL_OBJ wdlg_create
data zeigt auf ein Wort mit der Objektnummer des neuen Edit-Felds.
Querweise: HNDL_OBJ wdlg_create
typedef struct { uint16_t *ib_pmask; /* Zeiger auf die Icon-Maske */ uint16_t *ib_pdata; /* Zeiger auf das Icon-Bild */ int8_t *ib_ptext; /* Zeiger auf den Icon-Text */ uint16_t ib_char; /* Zeichen das im Icon erschei- nen soll, sowie Vorder- und Hintergrundfarbe des Icons */ uint16_t ib_xchar; /* x-Koordinate des Buchstabens */ uint16_t ib_ychar; /* y-Koordinate des Buchstabens */ uint16_t ib_xicon; /* x-Koordinate des Icons */ uint16_t ib_yicon; /* y-Koordinate des Icons */ uint16_t ib_wicon; /* Breite des Icons */ uint16_t ib_hicon; /* Höhe des Icons */ int16_t ib_xtext; /* x-Koordinate des Textes */ int16_t ib_ytext; /* y-Koordinate des Textes */ uint16_t ib_wtext; /* Breite des Textes */ uint16_t ib_htext; /* Höhe des Textes */ uint16_t ib_resvd; /* reserviert */ } ICONBLK;
Hinweise zu einzelnen Komponenten:
ib_pmask: Zeiger auf ein Feld von 16-Bit-Werten, in denen das Bit-Image der Icon-Maske abgelegt ist. Die Icon-Maske legt fest, an welchen Stellen das Icon überhaupt gezeichnet werden soll und welche Pixel transparent bleiben sollen. Erzielt wird dieser Effekt dadurch, daß der Iconhintergrund zunächst mit den Bits der Maske 'undiert' und dann mit den Icondaten 'geodert' wird.
ib_char:
Bits | Bedeutung |
15..12 | Vordergrundfarbe des Icons |
11..08 | Hintergrundfarbe des Icons |
7.. 0 | Zeichen das im Icon erscheinen soll |
ib_resvd: unbenutzt, wird allerdings von den meisten RCS-Programmen beim Schreiben in die Resourcedatei aufgenommen.
Für Farbicon unter PC GEM gilt:
In a colour icon, ib_pdata and ib_pmask point to MFDB objects.
Otherwise, they point to the lines of the bitmap.
typedef struct _lbox_item { struct _lbox_item *next; /* Zeiger auf den nächsten Eintrag */ /* in der Scroll-Liste */ int16_t selected; /* Objekt selektiert? */ int16_t data1; /* Daten für das Programm */ void *data2; void *data3; } LBOX_ITEM;
Hinweis: Die Struktur kann aber, wenn bei den Aufrufen entsprechend gecastet wird, durchaus wie das folgende Beispiel aussehen:
typedef struct { void *next; int16_t selected; ... ab hier nach Belieben der Applikation... } LB_EXAMPLE;
Es ist lediglich darauf zu achten, daß als erstes Element ein Zeiger auf den Nachfolger, und als zweites Element ein Wort das angibt, ob der entsprechende Eintrag selektiert ist, vorhanden ist.
Querverweis:
lbox_create lbox_free_list lbox_get_idx lbox_get_item
lbox_get_items
typedef void *LIST_BOX;
Diese Struktur dient der Beschreibung eines Papierformates, und ist wie folgt definiert:
typedef struct _media_size { struct _media_size *next; /* Zeiger auf Nachfolger */ int32_t size_id; /* Kennung des Papierformats */ int8_t name[32]; /* Name des Papierformats */ } MEDIA_SIZE;
Querverweis: Druckdialoge pdlg_add_printers
Diese Struktur dient der Beschreibung eines Papiertyps bzw. Druckmediums, und ist wie folgt definiert:
typedef struct _media_type { struct _media_type *next; /* Zeiger auf Nachfolger */ int32_t type_id; /* Kennung des Papierformats */ int8_t name[32]; /* Name des Papierformats */ } MEDIA_TYPE;
Querverweis: Druckdialoge pdlg_add_printers
typedef struct { OBJECT *mn_tree; /* Adresse des Menü-Objektbaumes */ int16_t mn_menu; /* Index des Parent-Objektes */ int16_t mn_item; /* Anfangs-Menüeintrag (bestimmt */ /* die Position des Menüs */ int16_t mn_scroll; /* 0 = nicht scrollen */ /* >0 = scrollen */ int16_t mn_keystate; /* Tastaturstatus (Shift, Control */ /* bzw. Alternate) */ } MENU;
Querverweis: AES menu_attach menu_popup
Die Struktur MFORM legt das Aussehen des Mauszeigers fest, und ist wie folgt definiert:
typedef struct mfstr { int16_t mf_xhot; /* X-Pos. Aktionspunkt */ int16_t mf_yhot; /* Y-Pos. Aktionspunkt */ int16_t mf_nplanes; /* Anzahl der Planes */ int16_t mf_fg; /* Maskenfarbe */ int16_t mf_bg; /* Zeigerfarbe */ int16_t mf_mask[16]; /* Maskenform */ int16_t mf_data[16]; /* Zeigerform */ } MFORM;
Querverweis: AES graf_mouse
typedef struct { int32_t display; /* Anzeigeverzögerung */ int32_t drag; /* Auswahlverzögerung */ int32_t delay; /* Einfachklick Scroll-Verzögerung */ int32_t speed; /* Scroll-Verzögerung */ int16_t height; /* Scroll-Höhe (Anzahl der darzu- */ /* stellenden Einträge) */ } MN_SET;
Alle Verzögerungszeiten werden in Millisekunden gemessen.
Querverweis: AES menu_settings
typedef struct { int16_t ob_next; /* das nächste Objekt */ int16_t ob_head; /* erstes Kind */ int16_t ob_tail; /* letztes Kind */ uint16_t ob_type; /* Objektart */ uint16_t ob_flags; /* Manipulationsflags */ uint16_t ob_state; /* Objektstatus */ void *ob_spec; /* mehr unter Objektart */ int16_t ob_x; /* x-Koordinate des Objekts */ int16_t ob_y; /* y-Koordinate des Objekts */ int16_t ob_width; /* Breite des Objekts */ int16_t ob_height; /* Höhe des Objekts */ } OBJECT;
ob_next: | Nummer das folgenden Objekts gleicher Ebene oder -falls es das letzte Element in der Ebene ist - es Parent-Objekt. |
ob_head: | Nummer des erstes Kind des Objekts, falls keines -1 |
ob_next: | Nummer des letzen Kind des Objekts, falls keines -1 |
ob_type: | Objektarten des AES |
ob_flags: | Objektflags des AES |
ob_state: | Objektstati des AES |
Querverweis: Objektstruktur im AES
typedef struct { OBJECT *pb_tree; /* Zeiger auf den Objektbaum */ int16_t pb_obj; /* Nummer des Objekts */ int16_t pb_prevstate; /* vorheriger Objektstatus */ int16_t pb_currstate; /* neuer Objektstatus */ int16_t pb_x; /* x-Position des Objektes */ int16_t pb_y; /* y-Position des Objektes */ int16_t pb_w; /* Breite des Objektes */ int16_t pb_h; /* Höhe des Objektes */ int16_t pb_xc; /* x-Position des Clipping-Bereichs */ int16_t pb_yc; /* y-Position des Clipping-Bereichs */ int16_t pb_wc; /* Breite des Clipping-Bereichs */ int16_t pb_hc; /* Höhe des Clipping-Bereichs */ int32_t pb_parm; /* Parameter der USERBLK-Struktur */ } PARMBLK;
Hinweis: Das Objekt muß nur neu gezeichnet werden, wenn alter und neuer Status identisch sind; anderenfalls reicht ein 'Update' des Objektbaums aus. Ferner sollten folgende Punkte beachtet werden:
die eigene Funktion muß im Datenregister d0 dem AES zurückliefern, welche Aspekte des Objektstatus noch aktualisiert werden müssen. Damit ist es nicht unbedingt nötig, in der eigenen Ausgabefunktion den Code zum invertieren des Objektes auszuprogrammieren. Im allgemeinen wird man einige Bits des Objektstatus selbst bearbeiten wollen, und andere dem AES überlassen.
die Funktion erhält den PARMBLK-Zeiger auf dem Stack, und muß daher in Pure-C als 'cdecl' deklariert werden.
ein vollständiges Neuzeichnen des Objektes ist nur dann nötig, wenn die Komponenten pb_prevstate und pb_currstate gleich sind; anderenfalls hat sich nur der Objektstatus geändert (zum Beispiel durch Anklicken).
die eigene Funktion wird de facto als Unterprogramm der AES ausgeführt. Daher sollte man im Hinblick auf die Stackbenutzung vorsichtig sein. Außerdem darf man natürlich keine weiteren AES-Aufrufe machen, da das AES nicht re-entrant ist. Aufrufe der VDI-Eingabefunktionen sind hingegen an dieser Stelle erlaubt.
die Komponente pb_parm dient dazu, der eigenen Funktion weitere Informationen (wie etwa einen Zeiger auf einen String) mit auf den Weg zu geben.
man sollte sich nie zu weit von der ursprünglichen Optik von GEM entfernen. Abgerundete Rechtecke oder kursive Texte passen sicherlich nicht in das normale Erscheinungsbild einer GEM-Applikation.
typedef int32_t (cdecl *PDLG_HNDL)( struct _prn_settings *settings, struct _pdlg_sub *sub, int16_t exit_obj );
Querverweis: Druckdialoge pdlg_add_sub_dialogs PDLG_SUB
typedef int32_t (cdecl *PDLG_INIT) (struct _prn_settings *settings, struct _pdlg_sub *sub );
Querverweis: Druckdialoge pdlg_add_sub_dialogs PDLG_SUB
typedef int32_t (cdecl *PDLG_RESET) ( struct _prn_settings *settings, struct _pdlg_sub *sub );
Querverweis: Druckdialoge pdlg_add_sub_dialogs PDLG_SUB
Diese Struktur dient der Beschreibung einer Geräteeinstellung, und ist wie folgt definiert:
typedef struct _pdlg_sub { struct _pdlg_sub *next; /* Zeiger auf Nachfolger */ int32_t length; /* Strukturlänge */ int32_t format; /* Datenformat */ int32_t reserved; /* reserviert */ void *drivers; /* nur für interne Dialoge */ int16_t option_flags; /* verschiedene Flags */ int16_t sub_id; /* Kennung des Unterdialogs */ DIALOG *dialog; /* Zeiger auf die Struktur des Fensterdialogs oder 0L */ OBJECT *tree; /* Zeiger auf den Objektbaum */ int16_t index_offset; /* Offset des Unterdialogs */ int16_t reserved1; /* reserviert */ int32_t reserved2; /* reserviert */ int32_t reserved3; /* reserviert */ int32_t reserved4; /* reserviert */ PDLG_INIT init_dlg; /* Initialisierungsfunktion */ PDLG_HNDL do_dlg; /* Behandlungsfunktion */ PDLG_RESET reset_dlg; /* Zurücksetzfunktion */ int32_t reserved5; /* reserviert */ OBJECT *sub_icon; /* Zeiger auf das Icon der Listbox */ OBJECT *sub_tree; /* Objektbaum des Unterdialogs */ int32_t reserved6; /* reserviert */ int32_t reserved7; /* reserviert */ int32_t private1; /* dialogeigene Informationen-1 */ int32_t private2; /* dialogeigene Informationen-2 */ int32_t private3; /* dialogeigene Informationen-3 */ int32_t private4; /* dialogeigene Informationen-4 */ } PDLG_SUB;
Querverweis: Druckdialoge pdlg_add_sub_dialogs
typedef struct { OBJECT *tree; /* Popup-Menü */ int16_t obnum; /* aktuelles Objekt von*/ } POPINFO;
Hinweis: Die Komponente tree zeigt auf einen Objektbaum, der etwa für form_popup als Eingabe dienen könnte. D.h. die Box sollte als Objekt 0 eine G_BOX oder G_IBOX enthalten, die von den anderen Objekten vollständig bedeckt wird. Objekte die nicht auswählbar sind, sollten wie im Dropdownmenü den Status DISABLED erhalten.
Alle wählbaren Objekte müssen den Status SELECTABLE haben. Zusätzlich müssen bei der Verwendung durch G_POPUP alle selektierbaren Objekte vom Typ G_STRING (bzw. G_SHORTCUT) oder G_BUTTON sein und mit zwei Leerstellen beginnen, letzteres wegen des Häkchens, das von form_button bzw. form_do automatisch gesetzt wird!
Wichtig ist, daß ob_x und ob_y von Objekt 0 des Menüs relativ zum G_POPUP-Objekt angegeben werden, d.h. sie werden meistens beide 0 sein. Es wird empfohlen, einen Schatten und einen Rand der Stärke -1 anzugeben.
typedef void *PRN_DIALOG;
typedef struct _prn_entry { struct _prn_entry *next; /* Zeiger auf Nachfolger */ int32_t length; /* Strukturlänge */ int32_t format; /* Datenformat */ int32_t reserved; /* reserviert */ int16_t driver_id; /* Treiberkennung */ int16_t driver_type; /* Treibertyp */ int32_t printer_id; /* Druckerkennung */ int32_t printer_capabilities; /* Druckereigenschaften */ int32_t reserved1; /* reserviert */ int32_t flags; /* verschiedene Flags */ struct _pdlg_sub *sub_dialogs; /* Zeiger auf Unterdialoge */ PRN_SWITCH setup_panel; /* Unterdialog bei Druckerwechsel initialisieren */ PRN_SWITCH close_panel; /* Unterdialog bei Druckerwechsel schließen */ PRN_MODE *modes; /* Liste vorhand. Auflösungen */ MEDIA_SIZE *papers; /* Liste vorhand. Papierformate */ PRN_TRAY *input_trays; /* Liste der Einzüge */ PRN_TRAY *output_trays; /* Liste der Auswürfe */ int8_t name[32]; /* Name des Druckers */ } PRN_ENTRY;
Querverweis: Druckdialoge pdlg_add_printers
Diese Struktur dient der Beschreibung eines Druckermodus, und ist wie folgt definiert:
typedef struct _prn_mode { struct _prn_mode *next; /* Zeiger auf Nachfolger */ int32_t mode_id; /* Modus (Index innerhalb der Datei) */ int16_t hdpi; /* horizontale Auflösung in dpi */ int16_t vdpi; /* vertikale Auflösung in dpi */ int32_t mode_capabilities; /* Moduseigenschaften */ int32_t color_capabilities; /* einstellbare Farbmodi */ int32_t dither_flags; /* Flags, die angeben, ob der korrespondierende Farbmodus mit oder ohne Dithern ansprechbar ist */ MEDIA_TYPE *paper_types; /* geeignete Papiertypen */ int32_t reserved; /* reserviert */ int8_t name[32]; /* Modusname */ } PRN_MODE;
Querverweis: Druckdialoge pdlg_add_printers
typedef struct _prn_settings { int32_t magic; /* 'pset' */ int32_t length; /* (+) Strukturlänge */ int32_t format; /* Strukturtyp */ int32_t reserved; /* reserviert */ int32_t page_flags; /* (+) Flags, u.a. gerade/ungerade Seiten 0x0001 = nur Seiten mit gerader Nummer 0x0002 = dto. mit ungeraden Nummern */ int16_t first_page; /* (+) erste zu druckende Seite (min.1) */ int16_t last_page; /* (+) dto. letzte Seite (max. 9999) */ int16_t no_copies; /* (+) Anzahl der Kopien */ int16_t orientation; /* (+) Drehung 0x0000 = Ausrichtung unbekannt und nicht verstellbar 0x0001 = Seite im Hochformat ausgeben 0x0002 = Seite im Querformat ausgeben */ int32_t scale; /* (+) Skalierung: 0x10000L = 100% */ int16_t driver_id; /* (+) VDI-Gerätenummer */ int16_t driver_type; /* Typ des eingestellten Treibers */ int32_t driver_mode; /* Flags, u.a. für Hintergrunddruck */ int32_t reserved1; /* reserviert */ int32_t reserved2; /* reserviert */ int32_t printer_id; /* Druckernummer */ int32_t mode_id; /* Modusnummer */ int16_t mode_hdpi; /* horizontale Auflösung in dpi */ int16_t mode_vdpi; /* vertikale Auflösung in dpi */ int32_t quality_id; /* Druckmodus (hardwäremäßige Qualität, z.B. Microweave oder Econofast) */ int32_t color_mode; /* Farbmodus */ int32_t plane_flags; /* Flags für auszugebende Farbebenen (z.B. nur cyan) */ int32_t dither_mode; /* Rasterverfahren */ int32_t dither_value; /* Parameter für das Rasterverfahren */ int32_t size_id; /* Papierformat */ int32_t type_id; /* Papiertyp (normal, glossy) */ int32_t input_id; /* Papiereinzug */ int32_t output_id; /* Papierauswurf */ int32_t contrast; /* Kontrast: 0x10000L = normal */ int32_t brightness; /* Helligkeit: 0x1000L = normal */ int32_t reserved3; /* reserviert */ int32_t reserved4; /* reserviert */ int32_t reserved5; /* reserviert */ int32_t reserved6; /* reserviert */ int32_t reserved7; /* reserviert */ int32_t reserved8; /* reserviert */ int8_t device[128]; /* Dateiname für den Ausdruck */ #ifdef __PRINTING__ TPrint mac_settings; /* Einstellung des Mac-Druckertreibers */ #else struct { uint8_t inside[120]; } mac_settings; #endif } PRN_SETTINGS;
Hinweis: Die mit (+) gekennzeichneten Strukturelemente können von der Applikation ausgelesen werden. Auf alle anderen Einträge sollte nicht zugegriffen werden. Daten wie z.B. die Druckerauflösung oder die Farbanzahl sollten nicht der Einstellstruktur entnommen werden, sondern beim Start des Ausdrucks vom Drucker erfragt werden (es wäre z.B. möglich, daß der Druckertreiber durch Speichermangel gezwungen wird, die Druckauflösung gegenüber der in PRN_SETTINGS eingetragenen Einstellung zu verringern).
Querverweis: Druckdialoge pdlg_open
typedef int32_t (cdecl *PRN_SWITCH) ( struct _drv_entr *drivers, struct _prn_settings *settings, struct _prn_entry *old_printer, struct _prn_entry *new_printer );
Hinweis: Die Komponente old_printer kann auch 0L sein!
Querverweis: Druckdialoge pdlg_add_printers
Diese Struktur dient der Beschreibung eines Einzugs bzw. Auswurfs, und ist wie folgt definiert:
typedef struct _prn_tray { struct _prn_tray *next; /* Zeiger auf Nachfolger */ int32_t tray_id; /* Nummer des Einzugs/Auswurfs */ int8_t name[32]; /* Name des Schachts */ } PRN_TRAY;
Querverweis: Druckdialoge pdlg_add_printers
typedef struct { uint16_t rsh_vrsn; /* Null */ uint16_t rsh_object; /* Position des Objekt-Feldes */ uint16_t rsh_tedinfo; /* Position der TEDINFO-Strukturen */ uint16_t rsh_iconblk; /* Position der ICONBLK-Strukturen */ uint16_t rsh_bitblk; /* Position der BITBLK-Strukturen */ uint16_t rsh_frstr; /* Position der freien Strings */ uint16_t rsh_string; /* unbenutzt */ uint16_t rsh_imdata; /* Position der Image-Daten */ uint16_t rsh_frimg; /* Position der freien Images */ uint16_t rsh_trindex; /* Position der Objektbaumtabelle */ uint16_t rsh_nobs; /* Gesamtzahl der Objekte */ uint16_t rsh_ntree; /* Gesamtzahl der Objektbäume */ uint16_t rsh_nted; /* Gesamtzahl der TEDINFO-Strukturen */ uint16_t rsh_nib; /* Gesamtzahl der ICONBLK-Strukturen */ uint16_t rsh_nbb; /* Gesamtzahl der BITBLK-Strukturen */ uint16_t rsh_nstring; /* Gesamtzahl der Strings */ uint16_t rsh_nimages; /* Gesamtzahl der Images */ uint16_t rsh_rssize; /* Gesamtlänge der RSC-Datei */ } RSHDR;
Hinweis: Alle Positionsangaben sind relativ zum Dateianfang zu verstehen. Noch ein Wort zu den 'freien Strings': zu diesen gehören nicht nur die Zeichenketten, in denen sich die Daten für die Alarmboxen befinden, sondern auch alle anderen Strings, die ein Programm zu seiner Arbeit benutzt. Ein Beispiel dafür wäre der Dateiname einer einzulesenden Datei oder ein Eintrag, der mit menu_text in einem Menü vorgenommen wird.
Diesem Kopf folgen die eigentlichen Resource-Daten. Man beachte dabei, daß eine Resource-Datei aufgrund der Verwendung von 16-Bit-Werten als Zeiger nur eine Gesamtgröße von maximal 64 Kbyte erreichen kann. Dateien dieses Formats werden von allen RCS-Programmen abgespeichert.
Anwender des Programms Interface und RSM (Resource Master) können auch mit Resource-Dateien > 64 Kbyte arbeiten. Auch das Betriebssystem MagiC unterstützt ab Version 3 Resourcedateien von mehr als 64 Kbyte; das Laden der Resource erfolgt wie üblich per rsrc_load, der Rest wird völlig transparent vom System übernommen.
Querverweis: rsrc_rcfix RSXHDR
typedef struct { uint16_t rsh_vrsn; /* should be 3 */ uint16_t rsh_extvrsn; /* not used */ /* initialized to 'IN' für Interface, */ /* 'RM' für ResourceMaster */ uint32_t rsh_object; uint32_t rsh_tedinfo; uint32_t rsh_iconblk; /* list of ICONBLKS */ uint32_t rsh_bitblk; uint32_t rsh_frstr; uint32_t rsh_string; uint32_t rsh_imdata; /* image data */ uint32_t rsh_frimg; uint32_t rsh_trindex; uint32_t rsh_nobs; /* Counts of various structs */ uint32_t rsh_ntree; uint32_t rsh_nted; uint32_t rsh_nib; uint32_t rsh_nbb; uint32_t rsh_nstring; uint32_t rsh_nimages; uint32_t rsh_rssize; /* Gesamtlänge der RSC-Datei */ } RSXHDR;
typedef struct { int8_t scancode; int8_t nclicks; int16_t objnr; } SCANX;
Hinweis: Die Struktur enthält die Zuordnung für die Taste mit dem Scancode scancode, bei deren Betätigung ein nclicks-facher Mausklick auf das Objekt mit der Nummer objnr ausgeführt wird. Das Ende der Tabelle wird durch einen Scancode von Null markiert.
Querverweis: AES MagiC XDO_INF Scan-Code Tabelle
typedef int16_t (cdecl *SET_ITEM)( LIST_BOX *box, OBJECT *tree, struct _lbox_item *item, int16_t obj_index, void *user_data, GRECT *rect, int16_t first );
Dabei gilt:
Parameter | Bedeutung |
box | Zeiger auf die Listbox-Struktur |
tree | Zeiger auf den Objektbaum des Dialogs |
item | Zeiger auf LBOX_ITEM-Struktur des zu setzenden Eintrags |
obj_index | Nummer des zu setzenden Objektes |
user_data | Zeiger der bei lbox_create übergeben wurde |
rect | Rechteck für das Objekt-Redraw (oder NULL) |
first | Nummer des ersten sichtbaren Elements für Slider-B |
Hinweis: Bei einer Listbox, die nur Text-Strings enthält, ist dies typischerweise eine Funktion, die einen String, auf den die LBOX_ITEM Struktur verweist, in das Objekt obj_index kopiert. Der Parameter rect ist 0L, wenn ein Redraw der Dialogbox durchgeführt wird oder wenn lbox_update aufgerufen wurde. Er ist hingegen nicht 0L, wenn der Anwender ein Objekt selektiert oder deselektiert hat, und zeigt auf das GRECT für den Redraw.
Der Rückgabewert der Funktion ist die Nummer des Startobjekts für die Funktion objc_draw bzw. wdlg_redraw.
Bei Einträgen in der Listbox, die aus mehreren Objekten bestehen, ist es manchmal sinnvoll bei Selektion/Deselektion eines Objekts das Redrawrechteck zu verkleinern oder das Startobjekt zu ändern, um unnötige Zeichenoperationen und unnötiges Geflacker zu vermeiden. In den meisten Fällen rufen die Listbox-Routinen nach der oben beschriebenen Funktion die Routinen objc_draw bzw. wdlg_redraw auf, um den geänderten Inhalt anzuzeigen.
Der Parameter first enthält die Nummer des ersten sichtbaren Elements für Slider B, wenn die Listbox 2 Slider hat. Bei einer (vertikalen) Listbox mit Text-Strings und zwei Slidern gibt man z.B. beim Aufruf von lbox_create die Anzahl der sichtbaren Zeichen in visible_b, die gesamte Stringlänge in entries_b und den Index des ersten sichtbaren Zeichens in first_b an. Wird der Text horizontal gescrollt, wird die Funktion für alle sichtbaren Strings aufgerufen und der Bereich neugezeichnet bzw. verschoben. Wenn die Listbox nur einen Slider hat, ist first immer 0.
Querverweis: Listboxen lbox_create
typedef struct { int16_t dummy; /* ein Nullwort */ int32_t magic; /* 'SHEL', wenn Shell... */ int16_t isfirst; /* erster Aufruf der Shell */ int32_t lasterr; /* letzter Fehler */ int16_t wasgr; /* Programm war Grafikapp. */ } SHELTAIL;
Hinweis: Diese Informationen bekommt ein alternatives Desktop von MagiC beim Programmstart übermittelt (per shel_read zu ermitteln). Gibt die Shell einen negativen Fehlercode zurück, so wird MAGXDESK wieder aktiviert.
Wenn die Komponente isfirst gesetzt ist, ist der Status etwa aus der DESKTOP.INF-Datei zu lesen, anderenfalls aus einer temporären Datei bzw. dem Shell-Puffer.
Die Komponente lasterr entspricht dem Rückgabewert des vorher gelaufenen Programms. Wenn dies ein GEM-Programm war, ist der Fehler bereits per Alertbox angezeigt worden. Das Langwort ist negativ, wenn der Fehler beim Pexec selbst auftrat; ein Programm-Rückgabewert besitzt immer ein High-Word von 0.
Querverweis: AES GEM shel_wdef
typedef void (cdecl *SLCT_ITEM)( LIST_BOX *box, OBJECT *tree, struct _lbox_item *item, void *user_data, int16_t obj_index, int16_t last_state );
Dabei gilt:
Parameter | Bedeutung |
box | Zeiger auf Listbox-Struktur |
tree | Zeiger auf den Objektbaum des Dialogs |
item | Zeiger auf die LBOX_ITEM-Struktur des ausgewählten Eintrags |
user_data | Zeiger der bei lbox_create übergeben wurde |
obj_index | ist die Nummer des angewählten Objekts. Bei einem Doppelklick ist ähnlich wie nach form_do das oberste Bit gesetzt. Wenn obj_index 0 ist, heißt das, daß dem Eintrag kein Objekt zugeordnet ist; er ist nicht sichtbar. Normalerweise ist das nur der Fall, wenn gescrollt wird und durch Auswahl eines neuen Objekts die (mittlerweile nicht mehr sichtbare) Selektion gelöscht werden muß. |
last_state | ist der vorhergehende Status des Objekts. last_state kann auch den gleichen Wert wie item->selected haben. In diesem Fall kann die Funktion slct normalerweise sofort verlassen werden. |
Querverweis: lbox_create
typedef struct { int8_t *string; /* etwa "TOS|KAOS|MAG!X" */ int16_t num; /* Nr. der aktuellen Zeichenkette */ int16_t maxnum; /* maximal erlaubtes*/ } SWINFO;
Querverweis: AES GEM G_SWBUTTON
Die TEDINFO-Struktur wird benutzt um ein Textobjekt näher zu beschreiben, und ist wie folgt definiert:
typedef struct { int8_t *te_ptext; /* Zeiger auf einen String */ int8_t *te_ptmplt; /* Zeiger auf die Stringmaske */ int8_t *te_pvalid; /* Zeiger auf den Gültigkeitsstring */ int16_t te_font; /* Zeichensatz */ int16_t te_fontid; /* GDOS Font-ID */ int16_t te_just; /* Justierung des Textes: 0 = linksbündig 1 = rechtsbündig 2 = zentriert */ int16_t te_color; /* Farbe */ int16_t te_fontsize; /* GDOS Font-Größe in Punkten */ int16_t te_thickness; /* Rahmenbreite */ int16_t te_txtlen; /* Maximale Länge des Textes */ int16_t te_tmplen; /* Länge der Stringmaske */ } TEDINFO;
Dabei gilt es, die folgenden Einzelheiten zu beachten:
te_ptext: Wenn das erste Zeichen ein Klammeraffe (!) ist, werden alle folgenden Zeichen als Platzhalter angesehen, und der zunächst ausgegebene String besteht aus Leerzeichen. Folge: Der Klammeraffe kann niemals am Anfang eines Edit-Feldes stehen!
te_ptmplt: Schablone (template). Sie wird nur bei G_FTEXT und G_FBOXTEXT verwendet, d.h. bei G_TEXT und G_BOXTEXT kann hier ein Null-Zeiger stehen. Bei der Ausgabe werden alle '_' Zeichen in der Schablone sukzessive durch die Zeichen in te_ptext ersetzt, d.h. es wird eine Misch-Zeichenkette gebildet. I.A. wird die Schablone also soviele '_' Zeichen enthalten, wie der Puffer für te_ptext lang ist (ohne abschließendes Nullbyte).
te_pvalid: String, der für jedes Zeichen in te_ptext eine Zeichenkette enthält, die über die Gültigkeit verschiedener Zeichen an dieser Stringposition Auskunft gibt. Es gilt:
Zeichen | Bedeutung |
1 - 9 | Accept any digit from 0 to that number. This is handy for doing octal ('7') or binary ('1') validation. (Geneva) |
9 | nur Ziffern |
A | nur Großbuchstaben/Leerzeichen |
a | nur Buchstaben/Leerzeichen |
N | Großbuchstaben, Ziffern, Leerzeichen |
n | Buchstaben, Ziffern, Leerzeichen |
F | alle Zeichen, die zu einem Dateinamen gehören und '*', '?' und ':'. |
f | alle Zeichen, die zu einem Dateinamen, ohne '*', '?' und ':'. |
h | Hexadezimale Zeichen. (Geneva) |
H | Hexadezimal Zeichen. Kleinbuchstaben a - f werden in Großbuchstaben A - F umgewandelt. (Geneva) |
P | alle Zeichen, die zu einem Pfadnamen gehören |
p | analog 'P', aber ohne die Zeichen '?' und '*' |
m | alle Zeichen, die für einen langen Dateinamen gültig sind; d.h. alle Zeichen außer Steuerzeichen (ASCII < 32), sowie außer ':' und '\'. Dieser Code wird z.Zt. nur von MagiC unterstützt. |
X | alle Zeichen |
x | alle Zeichen, Kleinbuchstaben werden automatisch in Großbuchstaben umgewandelt. (Geneva) |
te_font:
3 = normal
5 = kleiner Zeichensatz
Für weiters siehe unten.
te_fontid:
Für weiters siehe unten.
te_color: Für die Farbe des begrenzenden Rechteckes gilt die folgende Belegung:
Bit | Bedeutung | ||||||
12..15 | Rahmenfarbe (0..15) | ||||||
08..11 | Textfarbe (0..15) | ||||||
7 | Text (0 = transparent, 1 = deckend) | ||||||
4.. 6 | Intensität
| ||||||
0.. 3 | Innenfarbe (0..15) |
te_thickness: Für den Rahmen sind folgende Werte
gültig:
Wert | Bedeutung |
0 | kein Rahmen |
1.. 128 | Rand liegt 1 bis 128 Pixel im Inneren |
-1..-127 | Rand liegt 1 bis 127 Pixel außerhalb des Objektes |
Hinweis: Die Komponenten te_fontid und te_fontsize waren bisher reserviert. Ab AES-Version 4.1 ist es möglich, beliebige GDOS-Fonts für TEDINFO-Objekte zu benutzen.
Dazu ist über die Komponente te_font die Art des Zeichensatzes zu spezifizieren:
te_font | Bedeutung |
0 | SpeedoGDOS Font |
1 | SpeedoGDOS Font (monospaced) |
2 | GDOS Bitmap-Font |
3 | System-Zeichensatz |
5 | kleiner System-Zeichensatz |
Für Werte im Bereich 0..2 von te_font kann dann über die Komponenten te_fontid bzw. te_fontsize der gewünschte Zeichensatz und die gewünschte Punktgröße eingestellt werden.
Das Vorhandensein der neuen Möglichkeiten kann am einfachsten per appl_getinfo (Opcode 13) ermittelt werden.
Querverweis: AES GEM OBJECT XTED Scrollende Eingabefelder
typedef struct { int16_t cdecl (*ub_code)(PARMBLK *parmblock); int32_t ub_parm; } USERBLK;
Hinweis: Die Funktion ub_code wird bei jedem Aufruf von objc_draw und objc_change für das entsprechende Objekt aufgerufen. Die Komponente ub_parm kann als optionaler Parameter angesehen werden.
Diese Funktion ist wie folgt deklariert:
typedef void (cdecl *UTXT_FN) (int16_t x, int16_t y, int16_t *clip_rect, int32_t id, int32_t pt, int32_t ratio, int8_t *string);
Querverweis: AES fnts_add FNTS_ITEM Zeichensatzauswahl
Übergabe-Struktur zum Einklinken
typedef struct { int16_t version; /* Versionsnummer der Struktur */ int32_t wsizeof; /* Größe der WINDOW-Struktur */ int16_t whshade; /* Höhe eines ge-shade-ten Fensters */ void (*wbm_create)( WININFO *w ); void (*wbm_skind) ( WININFO *w ); void (*wbm_ssize) ( WININFO *w ); void (*wbm_sslid) ( WININFO *w, int16_t vertical ); void (*wbm_sstr) ( WININFO *w ); void (*wbm_sattr) ( WININFO *w, int16_t chbits ); void (*wbm_calc) ( int16_t kind, int16_t *fg ); int16_t (*wbm_obfind)( WININFO *w, int16_t x, int16_t y ); } WINFRAME_HANDLER;
Querverweis:
sys_set_winframe_manager WININFO WINFRAME_SETTINGS
typedef struct { int16_t flags; int16_t h_inw; void *finfo_inw; } WINFRAME_SETTINGS;
Bits von flags:
#define NO_BDROP 1
Querverweis:
sys_set_winframe_manager WINFRAME_HANDLER WININFO
WINDOW-Struktur für MagiC-Kernel
typedef struct { int16_t state; int16_t attr; void *own; /* (APPL *) */ int16_t kind; /* von wind_create() */ char *name; /* Zeiger auf Titelzeile */ char *info; /* Zeiger auf Infozeile */ GRECT curr; GRECT prev; GRECT full; GRECT work; GRECT overall; /* Umriß */ GRECT unic; GRECT min; /* Minimale Größe */ int16_t oldheight; /* alte Höhe vor Shading */ int16_t hslide; /* horizontale Schieberposition */ int16_t vslide; /* vertikale Schieberposition */ int16_t hslsize; /* horizontale Schiebergröße */ int16_t vslsize; /* vertikale Schiebergröße */ void *wg; /* Rechteckliste */ void *nextwg; /* nächstes Rechteck der Liste */ int16_t whdl; OBJECT tree[N_OBJS]; int16_t is_sizer; int16_t is_info; int16_t is_rgtobjects; int16_t is_botobjects; TEDINFO ted_name; TEDINFO ted_info; } WININFO;
Bits von state:
#define OPENED 1
#define COVERED 2
#define ACTIVE 4
#define LOCKED 8
#define ICONIFIED 32
#define SHADED 64
Querverweis:
sys_set_winframe_manager WINFRAME_HANDLER WINFRAME_SETTINGS
Diese Struktur ist wie folgt definiert:
typedef struct { int16_t dst_apid; /* ID der Ziel-Applikation */ int16_t unique_flg; /* Nachrichten überschreiben? */ void *attached_mem; /* Zeiger auf Speicherblock */ int16_t *msgbuf; /* Nachrichenpuffer */ } XAESMSG;
Hinweis: Die Komponente unique_flg gibt an, ob gleichartige Nachrichten (d.h. solche mit gleichem Nachrichtentyp msgbuf[0]) von der neuen Nachricht überschrieben werden sollen.
Wenn attached_mem nicht NULL ist, wird damit ein per Malloc allozierter Speicherblock angegeben, der die erweiterten Nachrichten-Informationen enthält. Die Länge dieses Blocks ist beliebig und für das System uninteressant, sie könnte z.B. als erstes Langwort des Blocks oder in msgbuf [4,5] übergeben werden. Das System weist den Speicherblock der Zielapplikation zu und übermittelt dessen Adresse in msgbuf[6,7].
Wichtig: Die aufrufende Applikation muß davon ausgehen, daß msgbuf[6,7] nach dem Aufruf von appl_write zerstört sind. Das System behält sich vor, den Inhalt des Speicherblocks umzukopieren und den übergebenen Block freizugeben. Der Aufrufer darf nach dem appl_write nicht mehr auf den Block zugreifen und ihn auf gar keinen Fall freigeben!
Gibt appl_write einen Fehlercode zurück, so ist der Block nicht übergeben worden und gehört nach wie vor der aufrufenden Applikation. Ein Fehler tritt dann auf, wenn:
die Zielapplikation ungültig (nicht existent oder eingefroren) ist
der Nachrichtenpuffer der Zielapplikation voll ist
die Zielapplikation kein Prozeß ist (z.B. der SCRENMGR) und ein attached memory block angegeben worden ist.
Querverweis: AES appl_write GEM
typedef struct { SCANX *unsh; /* Tabellen für UnShift-Kombinationen */ SCANX *shift; /* Tabellen für Shift-Kombinationen */ SCANX *ctrl; /* Tabellen für Control-Kombinationen */ SCANX *alt; /* Tabellen für Alternate-Kombinationen */ void *resvd; /* reserviert */ } XDO_INF;
Hinweis: In dieser Struktur liegen Zeiger auf Tabellen, die einem Scancode eine Objektnummer der Dialogbox zuordnen. Hiermit ist es auf einfache Weise möglich, Dialoge vollständig über die Tastatur zu bedienen. Der Parameter resvd ist für spätere Zwecke reserviert, und muss immer NULL sein.
Querverweis: AES form_keybd form_xdo MagiC Scan-Code Tabelle
typedef struct { int16_t font_id; int16_t point_size; int16_t gadget_wid; int16_t gadget_ht; } XFONTINFO;
Querverweis: x_appl_font
typedef int16_t (cdecl XFSL_FILTER) (int8_t *path, int8_t *name, XATTR *xa);
Querverweis: fslx_do fslx_open
typedef struct { int8_t *command; int32_t limit; int32_t nice; int8_t *defdir; int8_t *env; } XSHW_COMMAND;
Querverweis: shel_write
Diese Struktur wird im Zusammenhang mit scrollbaren Texteditfeldern benötigt.
typedef struct _xted { int8_t *xte_ptmplt; int8_t *xte_pvalid; int16_t xte_vislen; int16_t xte_scroll; } XTED;
Querverweis: Scrollende Eingabefelder TEDINFO
typedef struct x_buf_v2 { int16_t buf_len /* Length of the structure, including this word. Future */ /* versions of this structure (X_BUF_V3 etc.) may be bigger. */ int16_t arch /* 16 for 16-bit AES, 32 for hypothetical 32-bit AES. */ CLRCAT *cc /* Address of an array of 16 CLRCAT structures. */ /* This is so that they can be read by a program; in */ /* ViewMAX, the colours could be set but not reread. */ OBJECT *w_active /* Address of an object tree (19 elements) used to */ /* draw window elements. Included so a program can */ /* change symbols on window buttons. */ int8_t *info /* Address of a 0-terminated ASCII string (at most */ /* 40 characters, no newlines) describing the AES */ int32_t abilities /* A bitmapped field describing what optional functions */ /* this AES provides: */ /* ABLE_GETINFO 1 bit 0 : xapp_getinfo supported */ /* ABLE_PROP 2 bit 1 : prop_get, prop_put and prop_del supported */ /* ABLE_WTREE 4 bit 2 : wind_get and wind_set can change glyphs */ /* ABLE_X3D 8 bit 3 : GEM/5 3D using DRAW3D */ /* ABLE_XSHL 16 bit 4 : xshl_getshell & xshl_putshell */ /* ABLE_PROP2 32 bit 5 : prop_gui_get, prop_gui_set */ /* ABLE_EMSDESK 64 bit 6 : xgrf_dtimage supports EMS */ /* ABLE_XBVSET 128 bit 7 : supports 32 disc drives */ } X_BUF_V2;
An initialised X_BUF_V2 is one in which all members are 0 except buf_len. This initialised buffer is then passed to appl_init. On return, if arch is 0 then the structure was not filled in by the AES; otherwise it was. The buf_len field may be reduced, if the AES was expecting an earlier version of the structure (ie, X_BUF_V1); this should not be a problem because the structures are forward and backward compatible.
Querverweis: appl_init