diff options
author | Ole Loots <ole@monochrom.net> | 2012-11-18 23:22:43 +0100 |
---|---|---|
committer | Ole Loots <ole@monochrom.net> | 2012-11-18 23:22:43 +0100 |
commit | c415f9bf989f83c7ced6bb930e3421dab6f4093b (patch) | |
tree | 24c552b5f1d8194b518538d04587f8b2c556a2f0 /atari/gemtk | |
parent | e042008f2b7295243d2e6c72f948febe3cad0516 (diff) | |
download | netsurf-c415f9bf989f83c7ced6bb930e3421dab6f4093b.tar.gz netsurf-c415f9bf989f83c7ced6bb930e3421dab6f4093b.tar.bz2 |
Start to remove windom, wip.
- Refactored menu event handling.
- Load plain GEM resources.
- Refactored Event handling
Diffstat (limited to 'atari/gemtk')
-rwxr-xr-x | atari/gemtk/dragdrop.c | 516 | ||||
-rwxr-xr-x | atari/gemtk/dragdrop.h | 4 | ||||
-rw-r--r-- | atari/gemtk/gemtk.h | 100 | ||||
-rw-r--r-- | atari/gemtk/guiwin.c | 301 | ||||
-rw-r--r-- | atari/gemtk/guiwin.h | 5 | ||||
-rw-r--r-- | atari/gemtk/msgbox.c | 84 | ||||
-rw-r--r-- | atari/gemtk/msgbox.h | 5 | ||||
-rw-r--r-- | atari/gemtk/utils.c | 45 | ||||
-rw-r--r-- | atari/gemtk/utils.h | 5 |
9 files changed, 1065 insertions, 0 deletions
diff --git a/atari/gemtk/dragdrop.c b/atari/gemtk/dragdrop.c new file mode 100755 index 000000000..d9fd9c723 --- /dev/null +++ b/atari/gemtk/dragdrop.c @@ -0,0 +1,516 @@ +/* +* Routine pour Drag and drop sous MultiTos +* source: D&D Atari, demo OEP (Alexander Lorenz) +* +* Struktur OEP (oep.apid): AES-ID der Applikation +* +* (Tab = 4) +*/ + +#ifdef __PUREC__ +#include <tos.h> +#else +#include <osbind.h> +#include <mintbind.h> +#include <signal.h> +#endif + +#include <string.h> +#include <stdio.h> + +//#include "windom.h" +#include "gemtk.h" +#include "cflib.h" + +#ifndef EACCDN +#define EACCDN (-36) +#endif + +#ifndef FA_HIDDEN +#define FA_HIDDEN 0x02 +#endif + +static char pipename[] = "U:\\PIPE\\DRAGDROP.AA"; +static long pipesig; + +/* +* Routinen fr den Sender +*/ + +/* +* Erzeugt Pipe fr D&D +* +* Eingabeparameter: +* pipe - Pointer auf 2 Byte Buffer fr Pipeextension +* +* Ausgabeparameters: +* keine +* +* Returnwert: +* >0: Filehandle der Pipe +* -1: Fehler beim Erzeugen der Pipe +*/ + +short ddcreate(short *pipe) +{ + long fd = -1; + + pipename[17] = 'A'; + pipename[18] = 'A' - 1; + + do /* ouvre un pipe inoccup‚ */ + { + pipename[18]++; + if (pipename[18] > 'Z') + { + pipename[17]++; + if (pipename[17] > 'Z') + break; + else + pipename[18] = 'A'; + } + + /* FA_HIDDEN fr Pipe notwendig! */ + + fd = Fcreate(pipename, FA_HIDDEN); + + } while (fd == (long) EACCDN); + + if (fd < 0L) + return(-1); + + *pipe = (pipename[17] << 8) | pipename[18]; + + + /* Signalhandler konfigurieren */ + + ddgetsig(&pipesig); + + + return((short) fd); +} + + + +/* +* Sendet AP_DRAGDROP an Empf„ngerapplikation +* +* Eingabeparameter: +* apid - AES-ID der Emf„ngerapp. +* fd - Filehandle der D&D-Pipe +* winid - Handle des Zielfensters (0 fr Desktopfenster) +* mx/my - Maus X und Y Koord. +* (-1/-1 fr einen fake Drag&Drop) +* kstate - Sondertastenstatus +* pipename - Extension der D&D-Pipe +* +* Ausgabeparameter: +* keine +* +* Returnwert: +* >0: kein Fehler +* -1: Empf„ngerapp. gibt DD_NAK zurck +* -2: Empf„ngerapp. antwortet nicht (Timeout) +* -3: Fehler bei appl_write() +*/ + +short ddmessage(short apid, short fd, short winid, short mx, short my, short kstate, short pipeid) +{ + char c; + short i, msg[8]; + long fd_mask; + + + /* AES-Message define and post */ + + msg[0] = AP_DRAGDROP; + msg[1] = _AESapid; + msg[2] = 0; + msg[3] = winid; + msg[4] = mx; + msg[5] = my; + msg[6] = kstate; + msg[7] = pipeid; + + i = appl_write(apid, 16, msg); + + if (i == 0) + { + ddclose(fd); + return(-3); + } + + + /* receiver reaction */ + + fd_mask = (1L << fd); + i = Fselect(DD_TIMEOUT, &fd_mask, 0L, 0L); + if (!i || !fd_mask) + { + /* Timeout eingetreten */ + + ddclose(fd); + return(-2); + } + + + /* le recepteur refuse (lecture du pipe) */ + + if (Fread(fd, 1L, &c) != 1L) + { + ddclose(fd); + return(-1); + } + + if (c != DD_OK) + { + ddclose(fd); + return(-1); + } + + return(1); +} + + + +/* +* Liest die 8 "bevorzugten" Extensionen der Empf„ngerapplikation +* +* Eingabeparameter: +* fd - Filehandle der D&D-Pipe +* +* Ausgabeparameters: +* exts - 32 Bytebuffer fr die 8 bevorzugten Extensionen +* der Zielapp. +* +* Returnwert: +* >0: kein Fehler +* -1: Fehler beim Lesen aus der Pipe +*/ + +short ddrexts(short fd, char *exts) +{ + if (Fread(fd, DD_EXTSIZE, exts) != DD_EXTSIZE) + { + ddclose(fd); + return(-1); + } + + return(1); +} + + + +/* +* Testet, ob der Empf„nger einen Datentyp akzeptiert +* +* Eingabeparameter: +* fd - Filehandle (von ddcreate()) +* ext - Zeiger auf Datentyp (4 Bytes zB. "ARGS") +* text - Zeiger auf Datenbeschreibung (optional, zB. "DESKTOP args") +* name - Zeiger auf Datendateiname (optional, zB. "SAMPLE.TXT") +* size - Anzahl Bytes der zu sendenden Daten +* +* Ausgabeparameter: +* keine +* +* Returnwert: +* DD_OK - Empf„nger akzeptiert Datentyp +* DD_NAK - Empf„nger brach Drag&Drop ab +* DD_EXT - Empf„nger lehnt Datentyp ab +* DD_LEN - Empf„nger kann Datenmenge nicht verarbeiten +* DD_TRASH - Drop erfolgte auf Mlleimer +* DD_PRINTER - Drop erfolgte auf Drucker +* DD_CLIPBOARD - Drop erfolgte auf Clipboard +*/ + +short ddstry(short fd, char *ext, char *text, char *name, long size) +{ + char c; + short hdrlen, i; + + /* 4 Bytes fr "ext", 4 Bytes fr "size", + 2 Bytes fr Stringendnullen */ + + hdrlen = (short) (4 + 4 + strlen(text)+1 + strlen(name)+1); + + + /* Header senden */ + + if (Fwrite(fd, 2L, &hdrlen) != 2L) + return(DD_NAK); + + i = (short) Fwrite(fd, 4L, ext); + i += (short) Fwrite(fd, 4L, &size); + i += (short) Fwrite(fd, strlen(text)+1, text); + i += (short) Fwrite(fd, strlen(name)+1, name); + + if (i != hdrlen) + return(DD_NAK); + + + /* auf die Antwort warten */ + + if (Fread(fd, 1L, &c) != 1L) + return(DD_NAK); + + return(c); +} + + + +/* Routinen fr Sender und Empf„nger */ + +/* +* Pipe schliežen (Drag&Drop beenden/abbrechen) +*/ + +void ddclose(short fd) +{ + /* Signalhandler restaurieren */ + + ddsetsig(pipesig); + + + Fclose(fd); +} + + +/* +* Signalhandler fr D&D konfigurieren +* +* Eingabeparameter: +* oldsig - Zeiger auf 4 Byte Puffer fr alten Handlerwert +* +* Ausgabeparameter: +* keine +* +* Returnwerte: +* keine +*/ + +void ddgetsig(long *oldsig) +{ + *oldsig = (long) Psignal(SIGPIPE, (void *) SIG_IGN); +} + + +/* +* Signalhandler nach D&D restaurieren +* +* Eingabeparameter: +* oldsig - Alter Handlerwert (von ddgetsig) +* +* Ausgabeparameter: +* keine +* +* Returnwerte: +* keine +*/ + +void ddsetsig(long oldsig) +{ + if (oldsig != -32L) + Psignal(SIGPIPE, (void *) oldsig); +} + + + +/* Routinen fr Empf„nger */ + +/* +* Drag&Drop Pipe ”ffnen +* +* Eingabeparameter: +* ddnam - Extension der Pipe (letztes short von AP_DRAGDROP) +* ddmsg - DD_OK oder DD_NAK +* +* Ausgabeparameter: +* keine +* +* Returnwerte: +* >0 - Filehandle der Drag&Drop pipe +* -1 - Drag&Drop abgebrochen +*/ + +short ddopen(short ddnam, char ddmsg) +{ + long fd; + + pipename[17] = (ddnam & 0xff00) >> 8; + pipename[18] = ddnam & 0x00ff; + + fd = Fopen(pipename, 2); + + if (fd < 0L) + return(-1); + + + /* Signalhandler konfigurieren */ + + ddgetsig(&pipesig); + + + if (Fwrite((short) fd, 1L, &ddmsg) != 1L) + { + ddclose((short) fd); + return(-1); + } + + return((short) fd); +} + + + +/* +* Schreibt die 8 "bevorzugten" Extensionen der Applikation +* +* Eingabeparameter: +* fd - Filehandle der D&D-Pipe +* exts - Liste aus acht 4 Byte Extensionen die verstanden +* werden. Diese Liste sollte nach bevorzugten Datentypen +* sortiert sein. Sollten weniger als DD_NUMEXTS +* Extensionen untersttzt werden, muž die Liste mit +* Nullen (0) aufgefllt werden! +* +* Ausgabeparameter: +* keine +* +* Returnwert: +* >0: kein Fehler +* -1: Fehler beim Schreiben in die Pipe +*/ + +short ddsexts(short fd, char *exts) +{ + if (Fwrite(fd, DD_EXTSIZE, exts) != DD_EXTSIZE) + { + ddclose(fd); + return(-1); + } + + return(1); +} + + + +/* +* N„chsten Header vom Sender holen +* +* Eingabeparameter: +* fd - Filehandle der Pipe (von ddopen()) +* +* Ausgabeparameters: +* name - Zeiger auf Buffer fr Datenbeschreibung (min. DD_NAMEMAX!) +* file - Zeiger auf Buffer fr Datendateiname (min. DD_NAMEMAX!) +* whichext- Zeiger auf Buffer fr Extension (4 Bytes) +* size - Zeiger auf Buffer fr Datengr”že (4 Bytes) +* +* Returnwert: +* >0: kein Fehler +* -1: Sender brach Drag&Drop ab +* +* On lit dans le pipe qui normalement est constitu‚ de: +* 1 short: taille du header +* 4 CHAR: type de donn‚e (extension) +* 1 long: taille des donn‚es +* STRING: description des donn‚es +* STRING: nom du fichiers +* soit au minimun 11 octets (cas ou les string sont r‚duites … \0) +* les string sont limit‚ a 128 octets +*/ + +short ddrtry(short fd, char *name, char *file, char *whichext, long *size) +{ + char buf[DD_NAMEMAX * 2]; + short hdrlen, i, len; + + if (Fread(fd, 2L, &hdrlen) != 2L) + return(-1); + + + if (hdrlen < 9) /* il reste au minimum 11 - 2 = 9 octets a lire */ + { + /* sollte eigentlich nie passieren */ + + return(-1); /* erreur taille incorrecte */ + } + + if (Fread(fd, 4L, whichext) != 4L) /* lecture de l'extension */ + return(-1); + + if (Fread(fd, 4L, size) != 4L) /* lecture de la longueurs des donn‚es */ + return(-1); + + hdrlen -= 8; /* on a lu 8 octets */ + + if (hdrlen > DD_NAMEMAX*2) + i = DD_NAMEMAX*2; + else + i = hdrlen; + + len = i; + + if (Fread(fd, (long) i, buf) != (long) i) + return(-1); + + hdrlen -= i; + + strncpy(name, buf, DD_NAMEMAX); + + i = (short) strlen(name) + 1; + + if (len - i > 0) + strncpy(file, buf + i, DD_NAMEMAX); + else + file[0] = '\0'; + + + /* weitere Bytes im Header in den Mll */ + + while (hdrlen > DD_NAMEMAX*2) + { + if (Fread(fd, DD_NAMEMAX*2, buf) != DD_NAMEMAX*2) + return(-1); + + hdrlen -= DD_NAMEMAX*2; + } + + if (hdrlen > 0) + { + if (Fread(fd, (long) hdrlen, buf) != (long) hdrlen) + return(-1); + } + + return(1); +} + + + +/* +* Sendet der Senderapplikation eine 1 Byte Antwort +* +* Eingabeparameter: +* fd - Filehandle der Pipe (von ddopen()) +* ack - Byte das gesendet werden soll (zB. DD_OK) +* +* Ausgabeparameter: +* keine +* +* Returnwert: +* >0: kein Fehler +* -1: Fehler (die Pipe wird automatisch geschlossen!) +*/ + +short ddreply(short fd, char ack) +{ + if (Fwrite(fd, 1L, &ack) != 1L) + { + ddclose(fd); + return(-1); + } + + return(1); +} + + diff --git a/atari/gemtk/dragdrop.h b/atari/gemtk/dragdrop.h new file mode 100755 index 000000000..38466137b --- /dev/null +++ b/atari/gemtk/dragdrop.h @@ -0,0 +1,4 @@ +#ifndef DD_H_INCLUDED +#define DD_H_INCLUDED + +#endif diff --git a/atari/gemtk/gemtk.h b/atari/gemtk/gemtk.h new file mode 100644 index 000000000..fe59209fe --- /dev/null +++ b/atari/gemtk/gemtk.h @@ -0,0 +1,100 @@ +#ifndef GEMTK_H_INCLUDED
+#define GEMTK_H_INCLUDED
+ +#include <gem.h> +#include <mint/osbind.h> +#include <mint/cookie.h> +#include <stdint.h>
+
+/* System type detection added by [GS] */
+/* detect the system type, AES + kernel */ +#define SYS_TOS 0x0001
+#define SYS_MAGIC 0x0002
+#define SYS_MINT 0x0004
+#define SYS_GENEVA 0x0010
+#define SYS_NAES 0x0020
+#define SYS_XAAES 0x0040
+#define sys_type() (_systype_v ? _systype_v : _systype())
+#define sys_MAGIC() ((sys_type() & SYS_MAGIC) != 0)
+#define sys_NAES() ((sys_type() & SYS_NAES) != 0)
+#define sys_XAAES() ((sys_type() & SYS_XAAES) != 0) + +#define TOS4VER 0x03300 /* this is assumed to be the last single tasking OS */ + +extern unsigned short _systype_v; + +/* + Utils +*/ +unsigned short _systype (void); +OBJECT *get_tree( int idx ); + +/*
+* MultiTOS Drag&Drop
+*/
+short ddcreate(short *pipe);
+short ddmessage(short apid, short fd, short winid, short mx, short my, short kstate, short pipename);
+short ddrexts(short fd, char *exts);
+short ddstry(short fd, char *ext, char *text, char *name, long size);
+void ddclose(short fd);
+void ddgetsig(long *oldsig);
+void ddsetsig(long oldsig);
+short ddopen(short ddnam, char ddmsg);
+short ddsexts(short fd, char *exts);
+short ddrtry(short fd, char *name, char *file, char *whichext, long *size);
+short ddreply(short fd, char ack);
+ +/* + Message box +*/ +#define MSG_BOX_ALERT 1 +#define MSG_BOX_CONFIRM 2 + +short msg_box_show(short type, const char * msg); + +/* + Guiwin +*/ +#define GW_FLAG_PREPROC_WM 0x01 // let guiwin API handle some events +#define GW_FLAG_RECV_PREPROC_WM 0x02 // get notified even when pre-processed +#define GW_FLAG_HAS_VTOOLBAR 0x04 // the attached toolbar is vertical + +#define GW_STATUS_ICONIFIED 0x01 +#define GW_STATUS_SHADED 0x02 + +struct gui_window_s; +typedef struct gui_window_s GUIWIN; + +typedef short (*guiwin_event_handler_f)(GUIWIN *gw, + EVMULT_OUT *ev_out, short msg[8]); +enum guwin_area_e { + GUIWIN_AREA_WORK = 0, + GUIWIN_AREA_TOOLBAR, + GUIWIN_AREA_CONTENT +}; + +GUIWIN * guiwin_add(short handle, uint32_t flags, + guiwin_event_handler_f handler); +GUIWIN *guiwin_find(short handle); +short guiwin_remove(GUIWIN *win); +GUIWIN *guiwin_validate_ptr(GUIWIN *win); +//short guiwin_set_event_handler(guiwin_event_handler_f); +short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, + short msg[8]); +void guiwin_get_grect(GUIWIN *win, enum guwin_area_e mode, GRECT *dest); +short guiwin_get_handle(GUIWIN *win); +uint32_t guiwin_get_state(GUIWIN *win); +void guiwin_set_toolbar(GUIWIN *win, OBJECT *toolbar, short idx, + uint32_t flags); + +/* +* AES Scroller Object +*/ + +#ifndef POINT_WITHIN +#define POINT_WITHIN(_x,_y, r) ((_x >= r.g_x) && (_x <= r.g_x + r.g_w ) \ + && (_y >= r.g_y) && (_y <= r.g_y + r.g_h)) +#endif + +
+#endif // GEMTK_H_INCLUDED
diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c new file mode 100644 index 000000000..6d525c698 --- /dev/null +++ b/atari/gemtk/guiwin.c @@ -0,0 +1,301 @@ +//#include "global.h" + +#include <stdint.h> +#include <assert.h> +#include <cflib.h> + +#include <mt_gem.h> +#include "gemtk.h" + +//#define DEBUG_PRINT(x) printf x +#define DEBUG_PRINT(x) + +struct gui_window_s { + short handle; + guiwin_event_handler_f handler_func; + uint32_t flags; + uint32_t state; + OBJECT * toolbar; + short toolbar_idx; + struct gui_window_s *next, *prev; +}; + +static GUIWIN * winlist; + +static short preproc_wm(GUIWIN * gw, EVMULT_OUT *ev_out, short msg[8]) +{ + GRECT g, tb_area, tb_area_ro; + short retval = 1; + + switch(msg[0]) { + + case WM_TOPPED: + wind_set(gw->handle, WF_TOP, 1, 0, 0, 0); + break; + + case WM_MOVED: + wind_get_grect(gw->handle, WF_CURRXYWH, &g); + wind_set(gw->handle, WF_CURRXYWH, msg[4], msg[5], g.g_w, g.g_h); + break; + + case WM_SIZED: + case WM_REPOSED: + wind_get_grect(gw->handle, WF_CURRXYWH, &g); + wind_set(gw->handle, WF_CURRXYWH, g.g_x, g.g_y, msg[6], msg[7]); + break; + + case WM_FULLED: + wind_get_grect(0, WF_WORKXYWH, &g); + wind_set_grect(gw->handle, WF_CURRXYWH, &g); + break; + + case WM_ICONIFY: + wind_set(gw->handle, WF_ICONIFY, msg[4], msg[5], msg[6], msg[7]); + gw->state |= GW_STATUS_ICONIFIED; + break; + + case WM_UNICONIFY: + wind_set(gw->handle, WF_UNICONIFY, msg[4], msg[5], msg[6], msg[7]); + gw->state &= ~(GW_STATUS_ICONIFIED); + break; + + case WM_SHADED: + gw->state |= GW_STATUS_SHADED; + break; + + case WM_UNSHADED: + gw->state &= ~(GW_STATUS_SHADED); + break; + + case WM_REDRAW: + guiwin_get_grect(gw, GUIWIN_AREA_TOOLBAR, &tb_area_ro); + tb_area = tb_area_ro; + if(rc_intersect((GRECT*)&msg[4], &tb_area)){ + wind_get_grect(gw->handle, WF_FIRSTXYWH, &g); + while (g.g_h > 0 || g.g_w > 0) { + gw->toolbar[gw->toolbar_idx].ob_x = tb_area_ro.g_x; + gw->toolbar[gw->toolbar_idx].ob_y = tb_area_ro.g_y; + objc_draw(gw->toolbar, gw->toolbar_idx, 8, g.g_x, g.g_y, + g.g_w, g.g_h); + wind_get_grect(gw->handle, WF_NEXTXYWH, &g); + } + } + break; + + default: + retval = 0; + break; + } + return(retval); +} + +short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, short msg[8]) +{ + GUIWIN *dest; + short retval = 0; + + if( (ev_out->emo_events & MU_MESAG) != 0 ) { + DEBUG_PRINT(("guiwin_handle_event_multi_fast: %d\n", msg[0])); + switch (msg[0]) { + case WM_REDRAW: + case WM_CLOSED: + case WM_TOPPED: + case WM_ARROWED: + case WM_HSLID: + case WM_VSLID: + case WM_FULLED: + case WM_SIZED: + case WM_REPOSED: + case WM_MOVED: + case WM_NEWTOP: + case WM_UNTOPPED: + case WM_ONTOP: + case WM_BOTTOM: + case WM_ICONIFY: + case WM_UNICONIFY: + case WM_ALLICONIFY: + case WM_TOOLBAR: + case AP_DRAGDROP: + case AP_TERM: + case AP_TFAIL: + dest = guiwin_find(msg[3]); + if (dest) { + DEBUG_PRINT(("Found WM_ dest: %p (%d), flags: %d, cb: %p\n", dest, dest->handle, dest->flags, dest->handler_func)); + if (dest->flags&GW_FLAG_PREPROC_WM) { + retval = preproc_wm(dest, ev_out, msg); + if(((retval == 0)||(dest->flags&GW_FLAG_RECV_PREPROC_WM))) { + retval = dest->handler_func(dest, ev_out, msg); + } + } + else { + if (dest->handler_func) { + retval = dest->handler_func(dest, ev_out, msg); + } + } + + } + break; + } + } + if( (ev_out->emo_events & MU_BUTTON) != 0){ + short info[4]; + + wind_get( 0, WF_TOP, &info[0], &info[1], &info[2], &info[3]); + if(info[0] != 0 && info[1] == gl_apid){ + dest = guiwin_find(info[0]); + if (dest) { + DEBUG_PRINT(("Found MU_BUTTON dest: %p (%d), flags: %d, cb: %p\n", dest, dest->handle, dest->flags, dest->handler_func)); + if(dest->toolbar != NULL && dest->handler_func != NULL){ + GRECT tb_area; + guiwin_get_grect(dest, GUIWIN_AREA_TOOLBAR, &tb_area); + if (POINT_WITHIN(ev_out->emo_mouse.p_x, + ev_out->emo_mouse.p_y, tb_area)) { + // send WM_TOOLBAR message + short obj_idx = 0; + short msg_out[8] = {WM_TOOLBAR, gl_apid, 0, dest->handle, + obj_idx, ev_out->emo_mclicks, ev_out->emo_kmeta, 0}; + short oldevents = ev_out->emo_events; + ev_out->emo_events = MU_MESAG; + dest->handler_func(dest, ev_out, msg_out); + ev_out->emo_events = oldevents; + retval = 1; + } + } + /* + if (dest->flags&GW_FLAG_PREPROC_WM) { + preproc_wm(dest, ev_in, ev_out, msg); + } + if (dest->handler_func) { + retval = dest->handler_func(dest, ev_in, ev_out, msg); + } + */ + } + } + } + return(retval); +} + +GUIWIN * guiwin_add(short handle, uint32_t flags, guiwin_event_handler_f cb) +{ + GUIWIN *win = malloc(sizeof(GUIWIN)); + + assert(win!=NULL); + DEBUG_PRINT(("guiwin_add: %d, %p, cb: %p\n", handle, win, cb)); + + win->handle = handle; + win->handler_func = cb; + win->flags = flags; + if (winlist == NULL) { + winlist = win; + win->next = NULL; + win->prev = NULL; + } else { + GUIWIN *tmp = winlist; + while( tmp->next != NULL ) { + tmp = tmp->next; + } + tmp->next = win; + win->prev = tmp; + win->next = NULL; + } + return(win); +} + +GUIWIN *guiwin_find(short handle) +{ + GUIWIN *g; + DEBUG_PRINT(("guiwin_find: handle: %d\n", handle)); + for( g = winlist; g != NULL; g=g->next ) { + DEBUG_PRINT(("guiwin search: %d\n", g->handle)); + if(g->handle == handle) { + DEBUG_PRINT(("guiwin_find: %p\n", g)); + return(g); + } + } + return(NULL); +} + +GUIWIN *guiwin_validate_ptr(GUIWIN *win) +{ + GUIWIN *g; + for( g = winlist; g != NULL; g=g->next ) { + DEBUG_PRINT(("guiwin guiwin_validate_ptr check: %p\n", g)); + if(g == win) { + DEBUG_PRINT(("guiwin_validate_ptr valid: %p\n", g)); + return(g); + } + } + return(NULL); +} + +short guiwin_remove(GUIWIN *win) +{ + win = guiwin_validate_ptr(win); + if (win == NULL) + return(-1); + + /* unlink the window: */ + if(win->prev != NULL ) { + win->prev->next = win->next; + } else { + winlist = win->next; + } + if (win->next != NULL) { + win->next->prev = win->prev; + } + + free(win); + return(0); +} + +void guiwin_get_grect(GUIWIN *win, enum guwin_area_e mode, GRECT *dest) +{ + wind_get_grect(win->handle, WF_WORKXYWH, dest); + if (mode == GUIWIN_AREA_CONTENT) { + GRECT tb_area; + guiwin_get_grect(win, GUIWIN_AREA_TOOLBAR, &tb_area); + if (win->flags & GW_FLAG_HAS_VTOOLBAR) { + dest->g_x += tb_area.g_w; + dest->g_w -= tb_area.g_w; + } else { + dest->g_y += tb_area.g_h; + dest->g_w -= tb_area.g_h; + } + dbg_grect("guiwin_get_grect content", dest); + } + else if (mode == GUIWIN_AREA_TOOLBAR) { + if (win->toolbar != NULL) { + if (win->flags & GW_FLAG_HAS_VTOOLBAR) { + dest->g_w = win->toolbar[win->toolbar_idx].ob_width; + } else { + dest->g_h = win->toolbar[win->toolbar_idx].ob_height; + } + } else { + dest->g_h = 0; + dest->g_w = 0; + } + dbg_grect("guiwin_get_grect toolbar", dest); + } +} + +short guiwin_get_handle(GUIWIN *win) +{ + return(win->handle); +} + +uint32_t guiwin_get_state(GUIWIN *win) +{ + return(win->state); +} + +void guiwin_set_toolbar(GUIWIN *win, OBJECT *toolbar, short idx, uint32_t flags) +{ + win->toolbar = toolbar; + win->toolbar_idx = idx; + if(flags & GW_FLAG_HAS_VTOOLBAR){ + win->flags |= GW_FLAG_HAS_VTOOLBAR; + } +} + + + diff --git a/atari/gemtk/guiwin.h b/atari/gemtk/guiwin.h new file mode 100644 index 000000000..dba112cd6 --- /dev/null +++ b/atari/gemtk/guiwin.h @@ -0,0 +1,5 @@ +#ifndef OPKG_GUI_GUIWIN_H +#define OPKG_GUI_GUIWIN_H + + +#endif /* OPKG_GUIWIN_H */ diff --git a/atari/gemtk/msgbox.c b/atari/gemtk/msgbox.c new file mode 100644 index 000000000..770e0af15 --- /dev/null +++ b/atari/gemtk/msgbox.c @@ -0,0 +1,84 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <gem.h> +#include "gemtk.h" + +#ifndef min +# define min(x,y) ((x<y) ? x : y ) +#endif + +short msg_box_show(short type, const char * msg) +{ + #define MSG_BOX_STR_SIZE 256 + short retval=0, i=0, z=0, l=0; + char c; + int len_msg = strlen(msg); + + // TODO: localize strings + const char *str_yes = "Yes"; + const char *str_no = "No"; + const char *str_ok = "OK"; + char msg_box_str[MSG_BOX_STR_SIZE]; + char *dst = msg_box_str; + + memset(msg_box_str, 0, MSG_BOX_STR_SIZE); + + strncat(msg_box_str, "[1]", MSG_BOX_STR_SIZE); + strncat(msg_box_str, "[", MSG_BOX_STR_SIZE); + + dst = msg_box_str + strlen(msg_box_str); + + for (i=0; i<min(len_msg,40*5); i++) { + + c = msg[i]; + + if(c==0) + break; + + if (z==40) { + if(l==4){ + break; + } + z = 0; + l++; + *dst = (char)'|'; + dst++; + } + + if ((c=='\r' || c=='\n') && *dst != '|') { + if(l==4){ + break; + } + z = 0; + l++; + *dst = '|'; + dst++; + } + else { + z++; + *dst = c; + dst++; + } + } + strncat(msg_box_str, "][", MSG_BOX_STR_SIZE); + + if(type == MSG_BOX_CONFIRM){ + strncat(msg_box_str, str_yes, MSG_BOX_STR_SIZE); + strncat(msg_box_str, "|", MSG_BOX_STR_SIZE); + strncat(msg_box_str, str_no, MSG_BOX_STR_SIZE); + } else { + strncat(msg_box_str, str_ok, MSG_BOX_STR_SIZE); + } + strncat(msg_box_str, "]", MSG_BOX_STR_SIZE); + + retval = form_alert(type, msg_box_str); + if(type == MSG_BOX_CONFIRM){ + if(retval != 1){ + retval = 0; + } + } + return(retval); + + #undef MSG_BOX_STR_SIZE +} diff --git a/atari/gemtk/msgbox.h b/atari/gemtk/msgbox.h new file mode 100644 index 000000000..7a46900ef --- /dev/null +++ b/atari/gemtk/msgbox.h @@ -0,0 +1,5 @@ +#ifndef GUIMSG_H_INCLUDED
+#define GUIMSG_H_INCLUDED + +
+#endif // GUIMSG_H_INCLUDED
diff --git a/atari/gemtk/utils.c b/atari/gemtk/utils.c new file mode 100644 index 000000000..4a24d8261 --- /dev/null +++ b/atari/gemtk/utils.c @@ -0,0 +1,45 @@ +#include <stdlib.h> +#include <stdint.h> +#include <gem.h> +#include "gemtk.h" + +/* -------------------------------------------------------------------------- */
+/* GEM Utillity functions: */
+/* -------------------------------------------------------------------------- */ + +unsigned short _systype_v;
+unsigned short _systype (void)
+{
+ int32_t * cptr = NULL;
+ _systype_v = SYS_TOS;
+
+ cptr = (int32_t *)Setexc(0x0168, -1L);
+ if (cptr == NULL ) {
+ return _systype_v; /* stone old TOS without any cookie support */
+ }
+ while (*cptr) {
+ if (*cptr == C_MgMc || *cptr == C_MgMx ) {
+ _systype_v = (_systype_v & ~0xF) | SYS_MAGIC;
+ } else if (*cptr == C_MiNT ) {
+ _systype_v = (_systype_v & ~0xF) | SYS_MINT;
+ } else if (*cptr == C_Gnva /* Gnva */ ) {
+ _systype_v |= SYS_GENEVA;
+ } else if (*cptr == C_nAES /* nAES */ ) {
+ _systype_v |= SYS_NAES;
+ }
+ cptr += 2;
+ }
+ if (_systype_v & SYS_MINT) { /* check for XaAES */
+ short out = 0, u;
+ if (wind_get (0, (((short)'X') <<8)|'A', &out, &u,&u,&u) && out) {
+ _systype_v |= SYS_XAAES;
+ }
+ }
+ return _systype_v;
+} + +OBJECT *get_tree( int idx) {
+ OBJECT *tree;
+ rsrc_gaddr(R_TREE, idx, &tree);
+ return tree;
+} diff --git a/atari/gemtk/utils.h b/atari/gemtk/utils.h new file mode 100644 index 000000000..7ebbcf228 --- /dev/null +++ b/atari/gemtk/utils.h @@ -0,0 +1,5 @@ +#ifndef UTILS_H_INCLUDED
+#define UTILS_H_INCLUDED
+
+
+#endif // UTILS_H_INCLUDED
|