#ifndef __UTILS_H
#define __UTILS_H

#include <intuition/intuition.h>
#include <devices/timer.h>
#include <exec/ports.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <libraries/notifyintuition.h>
#include <workbench/startup.h>

#define ERRORNOMEM  1
#define ERRORNOPORT 2
#define ERRORUNKNOWNCMD 3
#define OK         -1
#define TITLE      "BackClock V2.0"


struct RGB {
  UBYTE R,
        G,
        B,
        pad ;
  ULONG reg ;
} ;
#define NUM_COLORS 4
#define COL_SEC    0
#define COL_MIN    1
#define COL_HEU    2
#define COL_TIC    3

#define IDCMP IDCMP_CHANGEWINDOW|IDCMP_NEWSIZE

struct specWin {
  ULONG posX ;
  ULONG posY ;
  ULONG width ;
  ULONG height ;
  struct RGB cmap[NUM_COLORS] ;  
} ;

struct prjSt {
  struct Window * win ;                   // remplit par OpenWindow()
  struct DateStamp * date ;                                     // date au format interne
  char   datestr[10] ;                                                                  // date au format ASCII
  UBYTE  heu ;                                                                                          // heure
  UBYTE  min ;                                                                                          // minute
  UBYTE  sec ;                                                                                          // secondes
  UBYTE  oldH ;                                                                                 // derniere heure affichée
  UBYTE  oldM ;                                                                                 //     "     min      " 
  UBYTE  oldS ;                                                                                 //     "     sec      " 
  struct timerequest * treq ;                                                   // requete I/O timer.device
  struct MsgPort     * trport ;                                         // port rply timer
  UBYTE  timerok ;                                                                              // ouverture timer ok
  struct IntNotifyRequest * Notify ;                            // requete notify
  struct MsgPort          * notifyPort ;                        // port reply notify
  struct specWin backWin ;
  ULONG  lastError ;
  struct Screen * wb ;                          // lock to WB
  struct RastPort * RP1 ;                       // tmp rp 1
  struct RastPort * RP2 ;                       // tmp rp 2
} ;
struct backMsg {
  struct Message execmsg ;
  ULONG Class ; 
  APTR  ptrPrj ; // pointeur sur prj à retourner lors d'un BC_GetPrj
  LONG  error ;  // contient l'erreur de retour
} ;

/* differentes classes
 */
#define BC_Quit          0x00000001 // recu demande d'arret externe
#define BC_GetPrj        0x00000002 // recu l'envoi adresse prj
#define BC_Refresh       0x00000003 // recu demande de rafraichissement
#define BC_SaveConf      0x00000004 // reçu demande de sauvegarde prefs
#define BC_UseConf       0x00000005 // reçu demande d'utiliser nouvelle prefs
#define BC_SetWindow     0x00000006 // pos & taille window changées
#define BC_RefreshColors 0x00000007 // colors changed

typedef prjSt idWin ;

// gadget systemes
struct Gadget szgdg = {
  NULL,
  0,0, 100, 15,
  GFLG_GADGHNONE,
  GACT_RELVERIFY,
  GTYP_WDRAGGING,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  10,
  NULL
} ;
struct Gadget tagdg = {
  NULL,
  0,0, 0, 0,
  GFLG_GADGHNONE,
  GACT_RELVERIFY,
  GTYP_SIZING,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  11,
  NULL
} ;
ULONG top = NULL ;


// proto  
idWin * init(WBArg *) ;
void close(idWin *) ;
void getDate(idWin *) ;
void writeDate(idWin *) ;
extern void DateToByte(register __a0 char *, register __a1 idWin *) ;
void initwin(idWin * prj) ;
void processwin(idWin* prj) ;
void effacer(idWin * prj) ;
void retracer(idWin * prj) ;
void runtimer(idWin * prj) ;
void setArgs(idWin * prj, LONG * args) ;
int exists() ;
void ez_req(UBYTE *, UBYTE *, UBYTE *, APTR) ;
#endif
