Knöpfe im neuen Gewand: 3D-Buttons unter MultiTOS konfigurieren

Wer kennt sie nicht, die neuen vielgeliebten und vielgehaßten 3D-Buttons des MultiTOS? Die einen meinen, sie seien schön, die anderen würden liebend gern auf sie verzichten. Die 3D-Buttons lassen sich zwar nicht abschalten, dafür aber in Grenzen konfigurieren und dem eigenen Geschmack anpassen.

Deshalb wird hier ein CPX-Modul vorgestellt, das genau diese Konfigurierung durchführt. Bevor jetzt jedoch irgend jemand direkt damit anfängt, die Listings abzutippen, muß darauf hingewiesen werden, daß entweder die in der ST-Computer vor einiger Zeit vorgestellte Header-Datei (siehe [1]) und das Make-Programm für CPX-Module ([3]) oder aber die offizielle Header-Datei und das PREFIX-Programm von ATARI benötigt werden, um das CPX-Modul com-pilieren und erstellen zu können. Da wohl die wenigsten „Nur-Anwender“ die offiziellen Programmierunterlagen [6] besitzen, wurde das vorliegende CPX-Modul mit den in der ST-Computer veröffentlichten und somit für alle zugänglichen Unterlagen erstellt. Um das Modul mit der Header-Datei von ATARI compilieren zu können. sind deshalb einige wenige Namensänderungen von Funktionen und Bezeichnern notwendig, was jedoch keine Schwierigkeit darstellen sollte.

Da das Prinzip und die Funktionsweise von CPX-Modulen in der ST-Computer bereits ausführlich dargestellt wurden (siehe [1]-[4]), soll jetzt an dieser Stelle nicht erneut darauf eingegangen werden. Vielmehr soll hier nur das Funktionsprinzip des nachfolgenden CPX-Moduls, BTNCOLOR.CPX genannt, vorgestellt werden.

Bunte Knöpfe

Das Modul nutzt zur Konfiguration der 3D-Buttons die neue AES-Funktion objc_sysvar(), die vorsichtshalber mit im nachfolgenden Quelltext eingebunden wurde, da sie zumindest zum Zeitpunkt der Erstellung dieses Moduls noch nicht in Pure C integriert war. Wer bereits für MultiTOS erweiterte Bibliotheken besitzt, kann sie in diesem Fall einfach aus dem Quelltext entfernen.

Die Definition und die einzelnen Parameter von objc_sysvar() wurden bereits in [5] vorgestellt, sollen aber des Verständnisses wegen hier noch einmal kurz erklärt werden. Zunächst der Prototyp der Funktion:

WORD objc_sysvar (WORD ob_smode, 
    WORD ob_swhich, WORD  ob_sival1, 
    WORD ob_sival2, WORD *ob_soval1, 
    WORD *ob_soval2);

Die Parameter haben dabei nachfolgende Bedeutung, wobei die verwendeten Konstanten im Listing BTNCOLOR.C definiert sind.

ob_smode
0 zur Abfrage der aktuellen Einstellung
1, um neue Werte einzustellen

ob_swhich
LK3DIND: Ist ob_smode = 0, enthält ob_soval1 nach Aufruf der Funktion eine 1, falls der Text bei Anklicken des Indikators verschoben wird, ansonsten eine 0. ob_soval2 enthält eine 1, falls sich die Farbe des Buttons bei Anklicken, ändert und eine 0, falls nicht.
Ist ob_smode = 1, sind dieselben Werte zur Einstellung in ob_sival1 bzw. ob_sival2 einzutragen.

LK3DACT: Für alle Parameter gilt genau dasselbe wie bei LK3DIND, nur daß sich die Werte in diesem Fall auf Aktivatoren beziehen.

INDBUTCOL: Ist ob_smode = 0, enthält ob_soval1 nach Aufruf der Funktion die Farbe eines nicht selektierten Indikators.
Ist ob_smode = 1, kann die Farbe über ob_sival1 eingestellt werden.

ACTBUTCOL: Hier gilt dasselbe wie für INDBUTCOL, nur für Aktivatoren.

BACKGRCOL: Hier gilt dasselbe wie für INDBUTCOL und ACTBUTCOL.

AD3DVALUE: Ist ob_smode = 0, enthält ob_soval1 nach Aufruf der Funktion die Anzahl der Pixel, um die ein 3D-Button in horizontaler Richtung nach jeder Seite vergrößert wird. ob_soval2 enthält die Anzahl der Pixel, um die ein 3D-Button in vertikaler Richtung nach oben und unten vergrößert wird.

Für ob_smode = 1 hat die Funktion keine Wirkung.

Einstellungssache

Das CPX-Modul BTNCOLOR.CPX macht nun intensiven Gebrauch von objc_sysvar(), um die derzeit gültigen Einstellungen des Betriebssystems auszulesen und gegebenenfalls neue Werte einzustellen. Zunächst werden beim Booten des CPX-Moduls die abgespeicherten Einstellungen ans Betriebssystem gemeldet, so daß sich nach dem Booten bereits alle Buttons in der eingestellten Form befinden. Bei Aufruf des CPX-Moduls werden alle Werte erneut ermittelt, da in der Zwischenzeit andere Programme diese bereits verändert haben können. Anschließend hat der Anwender dann die Möglichkeit, alle Einstellungen im Dialog auf einfache Weise zu ändern und seinen Wünschen anzupassen. Dazu steht der in Abbildung 1 dargestellte Dialog zur Verfügung, der sich bei Anwahl des CPX-Moduls öffnet. Alle Werte lassen sich einfach über Pull-Down-Menüs einstellen und nachfolgend auf ihre Wirkung hin in einem Testdialog überprüfen, bis eine ansprechende Form und das gewünschte Verhalten gefunden wurden. Zur dauerhaften Veränderung können die Einstellungen im CPX-Modul gespeichert werden, so daß sie nach dem Booten wieder zur Verfügung stehen. Natürlich ist auch eine temporäre Änderung ohne Speichern möglich; in diesem Fall haben alle Änderungen jedoch nur auf neu gezeichnete Buttons Auswirkung.

Abb. 3: Das fertige CPX-Modul im Kontrollfeld
Abb. 2: Die Einträge für den CPX-Header

Abbildung 2 zeigt schließlich noch alle Einstellungen für das CPX-Modul, so wie sie im CPX-Building-Tool (aus [3]) bzw. PREFIX-Programm von ATARI einzutragen sind. Anschließend präsentiert sich das CPX-Modul wie in Abbildung 3 dargestellt im Kontrollfeld.

Zur weiteren Funktionsweise des Moduls soll an dieser Stelle nichts gesagt werden, da es ausführlich dokumentiert und auch leicht verständlich ist. Wer sich intensiver mit der CPX-Program-mierung beschäftigen möchte, sei auf [l]-[4] oder die offiziellen ATARI-Unterlagen ([6]) verwiesen.

Literatur:

[1] Uwe Hax, Oliver Scholz: CPX - The Final Frontier - Dem variablen Kontrollfeld auf der Spur (Episode 1), ST-Computer 3/91

[2] Uwe Hax, Oliver Scholz: CPX - Its Continuing Mission - Dem variablen Kontrollfeld auf der Spur (Episode 2), ST-Computer 4/91

[3] Uwe Hax, Oliver Scholz: CPX - To Boldly Go Where No One Has Gone Before - Dem variablen Kontrollfeld auf der Spur (Episode 3), ST-Computer 5/91

[4] Uwe Hax, Oliver Scholz: CPX - Supplemental - Dem variablen Kontrollfeld auf der Spur (Episode 4), ST-Computer 9/91

[5] Uwe Seimet: Stichproben - Das AES von MultiTOS und Falcon, ST-Computer 6/93

[6] XControl - Extensible Control Panel, ATARI Corporation 1991

;********************************************* 
; BTNCOLOR.PRJ
;---------------------------------------------
; Projektdatei fur BTNCOLOR.C 
; Autor: Uwe Hax 
; (C) 1993 by MAXON
;********************************************* 

btncolor.cp
=
btncolor.c 
pcstdlib.lib 
pcgemlib.lib 
pctoslib.lib

/***********************************************/ /* BTNCOLOR.RSH / /---------------------------------------------/ / Resource-Datei für BTNCOLOR.C / / Autor: Uwe Hax / / (C) 1993 by MAXON */ /***********************************************/

BYTE *rs_strings[] = { "Hintergrund", "Verhalten von", "Farbe:", "Hellgrau ", "Hineindrücken:", "Farbe ändern:", "Nein", "Nein", "(C)", "", "", "1993", "", "", "BY", "", "", "UWE HAX", "", "", "Test", "Vergrößerung:", "(ALLE 3D-OBJEKTE)", "", "", "hor: 0", "vert: 0", "Sichern", "Ok","Abbruch", "Das Verhalten von", "3D-Buttons läßt sich", "erst ab AES-Version", "3.40 einstellen.", "Ok", "Aktivator", "Indikator","Ok" };

WORD IMAG0[] = { 0x007F, 0xFE00, 0x0000, 0x0300, 0x01BF, 0xFD80, 0x037F, 0xFEC0, 0x06FF, 0xFF60, 0x0DFF, 0xFFB0, 0x1BFF, 0xFFD8, 0x37FF, 0xFFEC, 0x6FFF, 0xFFF6, 0xDFFF, 0xFFFB, 0xB181, 0x860D, 0xA081, 0x0205, 0xA4E7, 0x3265, 0xA7E7, 0x3265, 0xA3E7, 0x3265, 0xB1E7, 0x3205, 0xB8E7, 0x320D, 0xBCE7, 0x327D, 0xA4E7, 0x327D, 0xA0E7, 0x027D, 0xB1E7, 0x867D, 0xBFFF, 0xFFFD, 0xDFFF, 0xFFFB, 0x6FFF, 0xFFF6, 0x37FF, 0xFFEC, 0x1BFF, 0xFFD8, 0x0DFF, 0xFFB0, 0x06FF, 0XFF60, 0x037F, 0xFEC0, 0x01BF, 0xFD80, 0x00C0, 0x0300, 0x007F, 0xFE00 };

LONG rs_frstr[] = { 0 };

BITBLK rs_bitblk[] = { 0L, 4, 32, 0, 0, 1 } ;

LONG rs_frimg[] = { 0 };

ICONBLK rs_iconblk[] = { 0 };

TEDINFO rs_tedinfo[] = { 8L, 9L, 10L, 5, 6, 0, 0x1180, 0x0, -1, 4,1, 11L, 12L, 13L, 5, 6, 0, 0x1180, 0x0, -1, 5,1, 14L, 15L, 16L, 5, 6, 0, 0x1180, 0x0, -1, 3,1, 17L, 18L, 19L, 5, 6, 0, 0x1180, 0x0, -1, 8,1, 22L, 23L, 24L, 5, 6, 0, 0x1180, 0x0, -1, 18,1 };

OBJECT rs_object[] = { -1, 1, 26, G_BOX, NONE, NORMAL, 0XFF11411, 0,0, 288,11, 4, 2, 3, G_BOX, NONE, NORMAL, 0xFF1101L, 768,768, 799,3841, 3, -1, -1, G_BUTTON, TOUCHEXIT, SHADOWED, 0x0L, 1295,1792, 14,1, 1, -1, -1, G_STRING, NONE, NORMAL, 0x1L, 1,2048, 13,1, 13, 5, 8, G_BOX, NONE, NORMAL, 0xFF1101L, 768,1538, 1304,1540, 6, -1, -1, G_STRING, NONE, NORMAL, 0x2L, 1, 1536, 6,1, 7, -1, -1, G_BOX, NONE, SHADOWED, 0xFF1175L, 1035,768, 2,1, 8, -1, -1, G_BUTTON, TOUCHEXIT, SHADOWED, 0x3L, 1293,768, 10,1, 4, 9, 12, G_BOX, NONE, NORMAL, 0x1101L, 512,2305, 24,3074, 10, -1, -1, G_STRING, NONE, NORMAL, 0x4L, 1536,512, 14,1, 11, -1, -1, G_STRING, NONE, NORMAL, 0x5L, 1536,2049, 13,1, 12, -1, -1, G_BUTTON, TOUCHEXIT, SHADOWED,0x6L, 783,2049, 8,1, 8, -1, -1, G_BUTTON, TOUCHEXIT, SHADOWED, 0x7L, 783,256, 8,1, 18, 14, 17, G_BOX, NONE, NORMAL, 0xFF1101L, 1305,1538, 262,1538, 15, -1, -1, G_TBXT, NONE, NORMAL, 0x0L, 2,512, 1794,3072, 16, -1, -1, G_TEXT, NONE, NORMAL, 0x1L, 1025,2560, 3,3072, 17, -1, -1, G_TEXT, NONE, NORMAL, 0x2L, 770,769, 770,2560, 13, -1, -1, G_TEXT, NONE, NORMAL, 0x3L, 768,2305, 517,3072, 19, -1, -1, G_BUTTON, 0x605, NORMAL, 0x14L, 1561,2309, 1797,1, 24, 20, 23, G_BOX, NONE, NORMAL, 0xFF1101L, 768,519, 799,3841, 21, -1, -1, G_STRING, NONE, NORMAL, 0x15L, 1536,512, 13,1, 22, -1, -1, G_TEXT, NONE, NORMAL, 0x4L, 1792,513, 1548,2816, 23, -1, -1, G_STRING, NONE, NORMAL, 0x19L, 1039,1792, 6,1, 19, -1, -1, G_STRING, NONE, NORMAL, 0x1AL, 791,1792, 7,1, 26, 25, 25, G_BOX, NONE, NORMAL, 0xFF1101L, 0,1033, 11,3073, 24, -1, -1, G_BUTTON, 0x605, NORMAL, 0x1BL, 257,1536, 1544,1, 0, 27, 28, G_BOX, NONE, NORMAL, 0xFF1101L, 11,1033, 21,3073, 28, -1, -1, G_BUTTON, 0x607, NORMAL, 0x1CL, 257,1536, 1544,1, 26, -1, -1, G_BUTTON, 0x625, NORMAL, 0x1DL, 779,1536, 1544,1, -1, 1, 6, G_BOX, 0x400, OUTLINED, 0x21100L, 0,0, 1052,7, 2, -1, -1, G_IMAGE, NONE, NORMAL, 0x0L, 1025,2048, 4,2, 3, -1, -1, G_STRING, NONE, NORMAL, 0x1EL, 7,2048, 17,1, 4, -1, -1, G_STRING, NONE, NORMAL, 0x1FL, 7,2049, 20,1, 5, -1, -1, G_STRING, NONE, NORMAL, 0x20L, 7,2050, 19,1, 6, -1, -1, G_STRING, NONE, NORMAL, 0x21L, 7,2051, 16,1, 0, -1, -1, G_BUTTON, 0x627, NORMAL, 0x22L, 11,2053, 8,1, -1, 1, 3, G_BOX, 0x400, OUTLINED, 0x21100L, 0,0, 20,8, 2, -1, -1, G_BUTTON, 0x601, NORMAL, 0x23L, 4,3, 12,1, 3, -1, -1, G_BUTTON, 0x201, NORMAL, 0x24L, 4,1, 12,1, 0, -1, -1, G_BUTTON, 0x27, NORMAL, 0x25L, 5,6, 10,1 };

LONG rs_trindex[] = { 0L, 29L,36L };

struct foobar { WORD dummy; WORD *image; } rs_imdope[] = { 0, &IMAG0[0] } ;

define NUM_FRSTR 0

define NUM_FRIMG 0

define NUM_OBS 40

define NUM_TREE 3



/***********************************************/ /* BTNCOLOR.H / /---------------------------------------------/ / Resource-Indices für BTNCOLOR.C / / Autor: Uwe Hax / / (C) 1993 by MAXON */ /***********************************************/

define DIALOG 0 /* Formular/Dialog */

define D_TYPE 2 /* BUTTON in DIALOG */

define D_COLOR 6 /* BOX in DIALOG */

define D_COLTEXT 7 /* BUTTON in DIALOG */

define D_FRAME 8 /* BOX in DIALOG */

define D_MOVETEXT 9 /* STRING in DIALOG */

define D_CHANGETEXT 10 /* STRING in DIALOG */

define D_CHANGE 11 /* BUTTON in DIALOG */

define D_MOVE 12 /* BUTTON in DIALOG *7

define D_TEST 18 /* BUTTON in DIALOG */

define D_HORIZONTAL 22 /* STRING in DIALOG */

define D_VERTICAL 23 /* STRING in DIALOG */

define D_SAVE 25 /* BUTTON in DIALOG */

define D_OK 27 /* BUTTON in DIALOG */

define D_CANCEL 28 /* BUTTON in DIALOG */

define ALERT 1 /* Formular/Dialog */

define TEST 2 /* Formular/Dialog */

define T_ACTIVATOR 1 /* BUTTON in TEST */

define T_INDICATOR 2 /* BUTTON in TEST */

define T_OK 3 /* BUTTON in TEST */



/***********************************************/ /* BTNCOLOR.C / /---------------------------------------------/ / CPX-Modul zur Einstellung der 3D-Buttons / / ab AES-Version 3.40 / / Autor: Uwe Hax / / (C) 1993 by MAXON */ /***********************************************/

include <portab.h>

include <aes.h>

include <string.h>

include <stdio.h>

include <scdlib.h>

/* * Definitionen zur besseren Lesbarkeit */

define EOS '\0'

define FALSE 0

define TRUE 1

define INDICATOR 0

define ACTIVATOR 1

define BACKGROUND 2

define MESSAGE -1

define OK_BUTTON 1

/* * Definitionen für objc_sysvar() */

define LK3DIND 1

define LK3DACT 2

define INDBUTCOL 3

define ACTBUTCOL 4

define BACKGRCOL 5

define AD3DVALUE 6

/* * Deklaration der zu sichernden Variablen * und Definition */

typedef struct { WORD ind_move, act_move; WORD ind_change, act_change; WORD ind_color, act_color; WORD background; WORD horizontal, vertical; } SETTINGS;

SETTINGS settings = { FALSE, TRUE, TRUE, FALSE, LWHITE, LWHITE, LWHITE, 2, 2 };

/* * Restliche Include-Dateien */

include "btncolor.rsh"

include "btncolor.h"

include "xcontrcl.h"

/* * sonstige globale Variablen */

WORD errno; CPX_PARAMS *params; OBJECT *dialog, *alert, *test;

WORD current_type = INDICATOR;

/* * Texte für Popup-Menus */

char * types[3] = { " Indikator ", " Aktivator ", " Hintergrund " };

char * status[2] = { " Nein ", " Ja " };

char * colors[16] = { " Weiß ", " Schwarz ", " Rot ", " Grün ", " Blau ", " Zyan ", " Gelb ", " Magenta ", " Hellgrau ", " DGrau ", " DRot ", " DGrün ", " DBlau ”, " DZyan ", " DGelb ", " DMagenta " };

/* * Prototypen */

CPX_INFO * cdecl init (CPX_PARAMS *par); WORD objc_sysvar (WORD ob_smode, WORD ob_swhich, WORD ob_sival1, WORD ob_sival2, WORD *ob_soval1, WORD *ob_soval2); OBJECT *get_traddr(WORD tree_index); WORD cdecl main (GRECT *curr_wind); WORD popup (char **texts, WORD items, WORD object); VOID into_resource (WORD type); VOID objc_exdraw (OBJECT *tree, WORD object); VOID cut (char *string); VOID wind_center(OBJECT *tree,WORD *x,WORD *y, WORD *w,WORD *h); VOID set_settings (SETTINGS *settings); VOID handle_type (VOID); VOID handle_color (VOID); VOID handle_move (VOID); VOID handle_change (VOID); VOID handle_test (SETTINGS *save); VOID handle_save (VOID);

/***********************************************/ /* Initialisierung des Moduls: / / Übergabeparameter: Zeiger auf die zur / / Verfügung stehenden Funktionen / / 1. Aufruf bei Laden des Headers / / (par->booting == TRUE) / / Rückgabe: 0 bei Set-Only, 1 sonst / / 2. Aufruf bei Laden des eigentlichen / / Programms (par->booting == FALSE) / / Rückgabe: Adresse der CPX_INFO-Struktur */ (****************************************»******/

CPX_INFO * cdecl init (CPX_PARAMS *par) { static CPX_INFO info={ main,0L,0L,0L,0L,0L, 0L,0L,0L,0L };

appl_init();

if (par->booting)
{
    /*
     * Bei Laden des Headers alle
     * Parameter setzen 
     */

    if (_GemParBlk.global[0] >= 0x340) 
        set_settings(&settings);

    /*
     * weitermachen 
     */

    return( (CPX_INFO *) 1L) ;
}
else
{
    /*
     * Aufruf bei Laden des Programms:
     * Resource relozieren 
     */

    params = par; /* Zeiger retten */ 
    if (!params->rsc_init)
    {
        (*(params->do_resource)) (NUM_OBS,NUM_FRSTR, 
          NUM_FRIMG,NUM_TREE,rs_object,rs_tedinfo, 
          rs_strings,rs_iconblk,rs_bitblk,rs_frstr, 
          rs_frimg, rs_trindex, rs_imdope);

        /*
         * globale Variablen initialisieren 
         */

        dialog = get_traddr(DIALOG); 
        test = get_traddr(TEST); 
        alert = get_traddr(ALERT);
    } /* if */

    /*
     * Adresse der CPX_INFO-Struktur
     * zurückgeben 
     */

    return (&info);
} /* else */

} /* init */

/***********************************************/ /* Aufruf nach Doppelclick auf das Icon im / / Auswahlfenster: Zeichnen der Dialogbox, / / Behandlung der Buttons / / Übergabeparameter: Koordinaten des Fenster- / / arbeitsbereichs / / Rückgabe: FALSE, wenn der Dialog mittels / / do_form() abgearbeitet wurde, / / TRUE, falls eigene Event-Routinen / / benutzt werden sollen */ /***********************************************/

WORD cdecl main (GRECT *curr_wind) ( SETTINGS save; WORD dummy, button; WORD msg_buff[8]; WORD abort_flag = FALSE; WORD x,y,w,h;

appl_init();

/*
 * Koordinaten der Dialogbox setzen 
 */

dialog[ROOT].ob_x = curr_wind->g_x; 
dialog[ROOT].ob_y = curr_wind->g_y;

/*
 * Fehlermeldung bei falscher AES-Version 
 */

if (_GemParBlk.global[0] < 0x340)
{
    wind_center(alert, &x, &y, &w, &h); 
    objc_exdraw(alert, ROOT);
    (*params->do_form)(alert, 0, msg_buff); 
    return (FALSE);
} /* if */

/*
 * aktuelle Systemparameter einlesen 
 */

objc_sysvar(FALSE, LK3DIND, 0, 0, &settings.ind_move, &settings.ind_change); 
objc_sysvar(FALSE, LK3DACT, 0, 0, &settings.act_move, &settings.act_change); 
objc_sysvar{FALSE, INDBUTCOL, 0, 0, &settings.ind_color, &dummy); 
objc_sysvar(FALSE, ACTBUTCOL, 0, 0, &settings.act_color, &dummy); 
objc_sysvar(FALSE, BACKGRCOL, 0, 0, &settings.background, &dummy); 
objc_sysvar(FALSE, AD3DVALUE, 0, 0, &settings.horizontal, &settings.vertical); 
save = settings;

/*
 * Parameter für Indikator in Dialog eintragen
 * und Dialog zeichnen 
 */

into_resource(INDICATOR); 
objc_exdraw(dialog, ROOT);

/*
 * Dialog abarbeiten, bis ein Exit-Objekt
 * angeklickt wurde 
 */

do
{
    button = (*params->do_form)(dialog, 0, msg_buff);

    if (button >= 0)
        button &= 0x7fff;

    switch (button)
    {
        case D_TYPE: 
            handle_type(); 
            break;

        case D_COLTEXT: 
            handle_color(); 
            break;

        case D_MOVE: 
            handle_move(); 
            break;

        case D_CHANGE: 
            handle_change(); 
            break;

        case D_TEST:
            handle_test(&save); 
            break;

        case D_SAVE: 
            handle_save(); 
            break;

        case D_OK:
            set_settings(&settings); 
            abort_flag = TRUE; 
            break;

        case D_CANCEL:
            abort_flag = TRUE; 
            break;

        case MESSAGE:
            switch (msg_buff[0])
            {
                case WM_CLOSED:
                    set_settings(&settings);

                case AC_CLOSE:
                    abort_flag = TRUE; 
                    break;
            }
            break;
    } /* switch */
}
while (!abort_flag);
dialog[button].ob_state &= ~SELECTED;

return (FALSE);

} /* main */

/***********************************************/ /* Alle Einstellungen für 3D-Buttons ans / / AES weitermelden. / / Übergabeparameter: Struktur mit allen Ein- / / stellungen */ /***********************************************/

VOID set_settings (SETTINGS *settings) { WORD dummy;

objc_sysvar(TRUE, LK3DIND, settings->ind_move, settings->ind_change, &dummy, &dummy); 
objc_sysvar(TRUE, LK3DACT, settings->act_move, settings->act_change, &dummy, &dummy); 
objc_sysvar(TRUE, INDBUTCOL, settings->ind_color, 0, &dummy, &dummy); 
objc_sysvar(TRUE, ACTBUTCOL, settings->act_color, 0, &dummy, &dummy); 
objc_sysvar(TRUE, BACKGRCOL, settings->background, 0, &dummy, &dummy);

} /* set_settings */

/***********************************************/ /* Alle Einstellungen für einen der drei / / Button-Typen in den Dialog eintragen / / Übergabeparameter: Button-Typ */ /***********************************************/

VOID into_resource (WORD type) { WORD color;

/*
 * Typ-Name und Vergrößerung der Buttons
 * eintragen.
 */

strncpy(dialog[D_TYPE].ob_spec.free_string, &types[type][2], 11); 
dialog[D_HORIZONTAL].ob_spec.free_string[5] = settings.horizontal + '0'; 
dialog[D_VERTICAL].ob_spec.free_string[6] = settings.vertical + 'O';

/*
 * Je nach Button-Typ Parameter eintragen.
 */

switch (type)
{
    case INDICATOR:
        color = settings.ind_color; 
        strncpy(dialog[D_MOVE].ob_spec.free_string, &status[settings.ind_move][2], 4);
        strncpy(dialog[D_CHANGE].ob_spec.free_string, &status[settings.ind_change][2], 4); 
        dialog[D_FRAME].ob_flags &= ~HIDETREE; 
        break;

    case ACTIVATOR:
        color = settings.act_color;
        strncpy(dialog[D_MOVE].ob_spec.free_string, &status[settings.act_move][2], 4);
        strncpy(dialog[D_CHANGE].ob_spec.free_string, &status[settings.act_change][2], 4); 
        dialog[D_FRAME].ob_flags &= ~HIDETREE; 
        break;

    case BACKGROUND:
        color = settings.background;
        dialog[D_FRAME].ob_flags |= HIDETREE;
        break;

} /* switch */

/*
 * Ende der Strings abschneiden, damit der Text
 * im Button zentriert ist.
 */

cut(dialog[D_MOVE].ob_spec.free_stringj; 
cut(dialog[D_CHANGE].ob_spec.free_string);

/*
 * Farbe eintragen 
 */

dialog[D_COLOR].ob_spec.obspec.interiorcol = color;
strncpy(dialog[D_COLTEXT].ob_spec.free_string, &colors[color][2], 8); 
cut(dialog[D_COLTEXT].ob_spec.free_string);

} /* into_resource */

/***********»***********************************/ /* Adresse eines Objektbaums ermitteln. / / (neue rsrc_gaddr()-Routine) / / Übergabeparamter: Baum-Index / / Rückgabe: Zeiger auf Diajogbox */ /***********************************************/

OBJECT *get_traddr(WORD tree_index) { WORD i,j;

for (i = 0,j = 0; i <= tree_index; i++) 
    while (rs_object[j++].ob_next != -1);

return (&rs_object[--j]);

}

/**«********************************************/ /* Popup-Menü darstellen. / / Übergabeparameter: Textliste, Anzahl der / / Einträge, Objektindex des/ / zugehörigen Buttons / / Rückgabe: angeklickter Eintrag */ /***********************************************/

WORD popup (char **texts, WORD items,WORD object) { WORD checked; GRECT button, window; WORD i;

/*
 * Aktuellen Eintrag ermitteln.
 */

checked = -1;
for (i = 0; i < items; i++) 
    if (!strncmp(&texts[i][2],dialog[object].ob_spec.free_string, 2))
    {
        checked = i; 
        break;
    } /* if */

/*
 * Größen festlegen.
 */

objc_offset(dialog, object, &button.g_x, &button.g_y); 
button.g_w = dialog[object].ob_width; 
button.g_h = dialog[object].ob_height; 
window = *(GRECT *)&dialog[ROOT].ob_x;

/*
 * Pull-Down-Menü zeichnen lassen und Index des
 * angeklickten Eintrags zurückliefern 
 */

checked = (*params->do_pulldown)(texts, items, checked, IBM, &button, &window);

return (checked);

} /* popup_type */

/***********************************************/ /* Erweitere objc_draw()-Routine. / / Übergabeparameter: Objektbaum, Objektindex */ /***********************************************/

VOID objc_exdraw (OBJECT *tree, WORD object) { WORD x, y, w, h;

objc_offset(tree, object, &x, &y); 
w = tree[object].ob_width;
h = tree[object].ob_height;
if (tree(objectj.ob_state & OUTLINED)
{
    x -= 3; 
    y -= 3;
    w += 6; 
    h += 6;
} /* if */
objc_draw(tree, ROOT, MAX_DEPTH, x, y, w, h);

} /* objc_exdraw */

/***********************************************/ /* Einen String nach dem ersten Leerzeichen / / durchsuchen und durch ein EOS ersetzen. / / Dadurch wird ein Text im Button zentriert. / / Übergabeparameter: Button-String */ /***********************************************/

VOID cut (char string) { while (string != EOS) { if (string == ' ') { *string = EOS; break; } / if / string++; } / while / } / cut */

/***********************************************/ /* Dialogbox im Fenster zentrieren / / Übergabeparameter: Zeiger auf Dialogbox, / / Koordinaten / / Rückgabe: indirekt über Koordinaten */ /***********************************************/

VOID wind_center(OBJECT *tree,WORD *x,WORD *y, WORD *w,WORD *h) { tree[ROOT].ob_x = dialog[ROOT].ob_x + (dialog[ROOT].ob_width - tree[ROOT].ob_width) / 2; tree[ROOT].ob_y = dialog[ROOT].ob.y + (dialog[ROOT].ob_height - tree[ROOT].ob_height) / 2;

*x = tree[ROOT].ob_x;
*y = tree[ROOT].ob_y;
*w = tree[ROOT].ob_width;
*h = tree[ROOT].ob_height;

}

/***********************************************/ /* Auf das Anklicken des Typ-Buttons reagieren,/ / d.h. Popup-Menü darstellen und neue Werte / / in den Dialog eintragen. */ /***********************************************/

VOID handle_type (VOID) { WORD index, hidden;

index = popup(types, 3, D_TYPE); 
if (index >= 0)
{
    current_type = index;
    hidden = dialog[D_FRAME].ob_flags & HIDETREE; 
    into_resource(index); 
    objc_exdraw(dialog, D_TYPE); 
    objc_exdraw(dialog, D_COLOR); 
    objc_exdraw(dialog, D_COLTEXT); 
    if (hidden != (dialog[D_FRAME].ob_flags & HIDETREE))
    {
        objc_exdraw(dialog, D_FRAME);
    }
    else
    {
        objc_exdraw(dialog, D_MOVE); 
        objc_exdraw(dialog, D_CHANGE);
    } /* if */
} /* if */

} /* handle_type */

/***********************************************/ /* Auf das Anklicken des Farb-Buttons reagie- / / ren, d.h. Popup-Menü darstellen und neuen / / Wert in den Dialog übernehmen. */ /***********************************************/

VOID handle_color (VOID) { WORD index;

index = popup(colors, 16, D_COLTEXT); 
if (index >= 0)
{
    dialog[D_COLOR].ob_spec.obspec.interiorcol = index; 
    strncpy(dialog[D_COLTEXT].ob_spec.free_string,&colors[index][2], 8); 
    cut(dialog[D_COLTEXT].ob_spec.free_string); 
    objc_exdraw(dialog, D_COLOR); 
    objc_exdraw(dialog, D_COLTEXT);

    switch (current_type)
    {
        case INDICATOR:
            settings.ind_color = index; 
            break;

        case ACTIVATOR:
            settings.act_color = index; 
            break;

        case BACKGROUND:
            settings.background = index; 
            break;
    } /* switch */
} /* if */

} /* handle_color */

/***********************************************/ /* Auf das Anklicken des Buttons zur Einstel- / / lung der Textverschiebung reagieren, d.h. / / Popup-Menü darstellen und neuen Wert in / / den Dialog übernehmen. */ /***********************************************/

VOID handle_move (VOID) { WORD index;

index = popup(status, 2, D_MOVE); 
if (index >= 0)
{
    strncpy(dialog[D_MOVE].ob_spec.free_string,&status[index][2], 4); 
    cut(dialog[D_MOVE].ob_spec.free_string); 
    objc_exdraw(dialog, D_MOVE);

    switch (current_type)
    {
        case INDICATOR:
            settings.ind_move = index; 
            break;

        case ACTIVATOR:
            settings.act_move = index; 
            break;

    } /* switch */
} /* if */

} /* handle_raove */

/***********************************************/ /* Auf das Anklicken des Buttons zur Einstel- / / lung der Farbänderung reagieren, d.h. / / Popup-Menü darstellen und neuen Wert in / / den Dialog übernehmen. */ /***********************************************/

VOID handle_change (VOID) { WORD index;

index = popup(status, 2, D_CHANGE); 
if (index >= 0)
{
    strncpy(dialog[D_CHANGE].ob_spec.free_string,&status[index][2], 4); 
    cut(dialog[D_CHANGE].ob_spec.free_string); 
    objc_exdraw(dialog, D_CHANGE);

    switch (current_type)
    {
        case INDICATOR:
            settings.ind_change = index; 
            break;

        case ACTIVATOR:
            settings.act_change = index; 
            break;
    } /* switch */
} /* if */

} /* handle_change */

/***********************************************/ /* Auf das Anklicken des Test-Buttons reagie- / / ren, d.h. Test-Dialog darstellen und bear- / / beiten. / / Übergabeparameter: Struktur mit allen Ein- / / stellungen */ /***********************************************/

VOID handle_test (SETTINGS *save) { WORD dummy;

wind_center(test, &dummy, &dummy, &dummy, &dummy);

set_settings(&settings); 
objc_exdraw(test, ROOT); 
form_do(test, 0); 
set_settings(save);

test[T_INDICATOR].ob.State &= ~SELECTED; 
test[T_ACTIVATOR].ob_State &= ~SELECTED; 
test[T_OK].ob_state &= ~SELECTED; 
dialog[D_TEST].ob_state &= -SELECTED;

objc_exdraw(dialog, ROOT);

} /* handle_text */

/***********************************************/ /* Alle eingestellten Parameter speichern. */ /***********************************************/

VOID handle_save (VOID) { if ((params->alert)(0) == OK_BUTTON) (params->write_config)(&settings,sizeof(SETTINGS)); dialog[D_SAVE].ob_state &= ~SELECTED; objc_exdraw(dialog, ROOT); } /* handle_save */

/***********************************************/ /* objc_sysvar()-Routine ab AES 3.4, da sie in / / den meisten Compilern noch nicht integriert / / ist. */ /***********************************************/

WORD objc_sysvar (WORD ob_smode, WORD ob_swhich, WORD ob_sival1, WORD ob_sival2, WORD *ob_soval1,WORD *ob_soval2) { AESPB aespb;

aespb.contrl = _GemParBlk.contrl;
aespb.global = _GemParBlk.global;
aespb.intin  = _GemParBlk.intin;
aespb.intout = _GemParBlk.intout;
aespb.addrin = (WORD *)_GemParBlk.addrin;
aespb.addrout= (WORD *)_GemParBlk.addrout;

_GemParBlk.contrl[0] = 48;
_GemParBlk.contrl[1] = 4;
_GemParBlk.contrl[2] = 3;
_GemParBlk.contrl[3] = 0;
_GemParBlk.contrl[4] = 0;

_GemParBlk.intin[0] = ob_smode;
_GemParBlk.intin[1] = ob_swhich;
_GemParBlk.intin[2] = ob_sival1;
_GemParBlk.intin[3] = ob_sival2;

_crystal(&aespb);

*ob_soval1 = _GemParBlk.intout[1];
*ob_soval2 = _GemParBlk.intout[2];

return(_GemParBlk.intout[0]);

} /* objc_sysvar */ ~~~~~~~~~~~~~~~~~~~~~


Uwe Hax
Links

Copyright-Bestimmungen: siehe Über diese Seite