#include <libraries/SysInfo.h>
#include <clib/all_protos.h>
#include <clib/screennotify_protos.h>
#include <clib/datatypes_protos.h>
#include <clib/locale_protos.h>
#include <clib/wbstart_protos.h>
#include <strings.h>

#define err_nomem       0
#define err_nowin       1
#define err_nopor       2
#define err_noboo       3
#define err_nodev       4
#define err_nosta       5
#define err_nopre       6
#define err_nolis       7

#define idle_none       0
#define idle_executive  1
#define idle_own        2

#define col_label       0
#define col_format      1
#define col_base        2
#define col_current     3
#define col_negative    4
#define col_bright      5
#define col_dark        6
#define col_bg          7

#define bg_none         0
#define bg_file         1
#define bg_snap         2

#define win_normal      0
#define win_fixed       1

#define win_front       1
#define win_back        2

#define bd_none         0
#define bd_simple       1
#define bd_standard     2
#define bd_double       3

#define ind_centered    0
#define ind_left        1
#define ind_right       2

#define typ_none            0
#define typ_all             1
#define typ_chip            2
#define typ_fast            3
#define typ_volume          4
#define typ_idle            5
#define typ_retina          6
#define typ_largest_chip    7
#define typ_largest_fast    8
#define typ_largest_total   9
#define typ_largest_retina  10
#define typ_clock_          11
#define typ_simplelauncher  12
#define typ_iconlauncher    13

#define typ_gauge       0
#define typ_histmeter   1
#define typ_clock       2

struct tm_gau_set
{
    UWORD   type;
    UWORD   gauge_type;

    UWORD   size_y;     /* in 100+x percent of the font size ! */

    char    font[128];
    UWORD   font_size;

    char    label[16];
    char    format[128];

    char    expansion[128]; /* used for image type and volume */
    UWORD   indent;

    UWORD   sty_3d;
    UWORD   sty_border;
    UWORD   sty_bg;
    UWORD   sty_shadow;
    UWORD   sty_nogauge;
    UWORD   sty_noformat;
    UWORD   sty_nobase;

    struct  GAU_Color Colors[8];

    struct  tm_gau_set *next;
};

struct tm_lau_set
{
    UWORD   type;
    UWORD   gauge_type;

    UWORD   size_y;     /* in 100+x percent of the font size ! */

    char    font[128];
    UWORD   font_size;

    char    label[16];
    char    dummy1[128];

    char    file[128]; /* used for image type and volume */
    UWORD   indent;

    UWORD   sty_xen;
    UWORD   sty_border;
    UWORD   sty_bg;
    UWORD   sty_shadow;
    UWORD   sty_down;
    UWORD   sty_transparent;
    UWORD   dummy4;

    struct  GAU_Color Colors[8];

    struct  tm_gau_set *next;
};


struct tm_sys_set
{
    ULONG   set_header;
    UWORD   set_version;

    UWORD   x_pos;
    UWORD   y_pos;
    UWORD   x_siz;
    UWORD   colums;

    char    pub_name[128];

    char    font_name[40];
    UWORD   font_size;

    UWORD   bg_type;
    char    bg_picture[126];
    BYTE    lay_falling;
    BYTE    pri;
    struct  GAU_Color bg_color;

    UWORD   vol_refresh;
    UWORD   mem_refresh;

    UWORD   start_wait;
    UWORD   start_usescreennotify;

    UWORD   win_move;
    UWORD   win_backfront;
    UWORD   win_border_x;
    UWORD   win_border_y;
    UWORD   win_space_x;
    UWORD   win_space_y;

    UWORD   bd_type;
    struct  GAU_Color bright_color;
    struct  GAU_Color dark_color;

    UWORD   Executive;

};

struct PathList
{
    BPTR NextPath;
    BPTR PathLock;
};

struct tm_data
{
    ULONG  dummy;
    struct tm_gau_set   *list;
    struct Window       *win;
    struct Screen       *scr;
    struct BitMap       *bg_bm;
    struct TextFont     *Font[64];
    BOOL   on_public;
    UWORD  executive;
    UWORD  labelpos;
    UWORD  gauge_y_size[64];
    UWORD  gauge_y_pos[64];
    UWORD  gauge_y_size_falling[64];
    UWORD  gauge_x_size;
    UWORD  min_x_size;
    UBYTE  num_of_gaug;
    UBYTE  num_of_rows;
    ULONG  bg_color;
    ULONG  bright_color;
    ULONG  dark_color;
    Object *dt_object;
    struct Gadget       *gdg[64];
    struct PathList     *GlobalPath;
    BOOL   vmm;
    BOOL   scrnot;
    struct MsgPort      *appport;
    struct AppWindow    *appwin;
};

void                DrawDTObject            (Object *src, UWORD s_x, UWORD s_y, struct RastPort *dest, UWORD d_x, UWORD d_y, WORD w, WORD h, BOOL really);
void                my_Refresh              (Class *cl,struct Gadget *o, Msg msg);
ULONG               newGauge                (Class *cl,struct Gadget *g,struct gpRender *msg,struct GaugeData *inst);
ULONG               getGauge                (Class *cl,struct Gadget *g,struct gpRender *msg);
void                setGauge                (Class *cl,struct Gadget *g,struct gpRender *msg);
void                disposeGauge            (Class *cl,struct Gadget *g,struct gpRender *msg);
ULONG               renderGauge             (Class *cl,struct Gadget *g,struct gpRender *msg);
ULONG               newLauncher             (Class *cl,struct Gadget *g,struct gpRender *msg);
ULONG               renderLauncher          (Class *cl,struct Gadget *g,struct gpRender *msg);
ULONG               getLauncher             (Class *cl,struct Gadget *g,struct gpRender *msg);
void                setLauncher             (Class *cl,struct Gadget *g,struct gpRender *msg);
ULONG               dispatchGaugeGadget     (Class *cl,Object *o,        Msg msg);
ULONG               dispatchLauncherGadget  (Class *cl,Object *o, Msg msg);
Class              *initGaugeGadgetClass    (void);
Class              *initLauncherGadgetClass (void);
ULONG               HookEntry               (void);
struct              TextFont *OpenTopaz     (void);
struct              Task *init_idle         (void);
void                free_idle               (void);
BOOL                freeGaugeGadgetClass    (Class *cl);
BOOL                freeLauncherGadgetClass (Class *cl);
void                my_RectFill             (struct RastPort *rp,WORD x,WORD y,WORD width,WORD height);
void                my_Blit                 (struct RastPort *src,WORD topx,WORD topy,struct RastPort *dest,WORD dtopx,WORD dtopy,WORD width,WORD height);
void                draw_border_new         (struct RastPort *rp,ULONG x,ULONG y,ULONG width,ULONG height,int b_col1,int b_col2 );
struct              Window *openWindow      (struct tm_sys_set *set,struct tm_data *data, Class *gclass, Class *lclass);
void                closeWindow             (struct tm_sys_set *set,struct tm_data *data);
void                fileBackground          (struct tm_sys_set *set,struct tm_data *data);
void                new_window_size         (struct tm_sys_set *set,struct tm_data *data);
void                allocGadgets            (struct tm_sys_set *set,struct tm_data *data, Class *gclass, Class *lclass);
void                removeGadgets           (struct tm_sys_set *set,struct tm_data *data);
void                drawBackground          (struct tm_sys_set *set,struct tm_data *data);
struct  Window     *snapBackground          (struct tm_sys_set *set,struct tm_data *data);
struct  tm_sys_set *handler                 (struct tm_sys_set *set,struct tm_data *data,struct MsgPort *broker_mp, CxObj *broker, ULONG cxsigflag, Class *gclass, Class *lclass);
int                 getNum                  (struct tm_gau_set *list);
BOOL                InitWorkbenchPath       (struct tm_data *data);
void                FreeWorkbenchPath       (struct tm_data *data);
void                GetPenNew               (struct Screen *scr,struct GAU_Color *col,ULONG number, BOOL *PorC, ULONG *Pens);
UWORD               obtainPen               (struct Screen *src, struct GAU_Color *scr);
void                FreePenNew              (struct Screen *scr, struct GAU_Color *col,ULONG number, ULONG *Pens);
UWORD               calcXPos                (UWORD i, struct tm_data *data, struct tm_sys_set *set);
UWORD               calcYPos                (UWORD i, struct tm_data *data, struct tm_sys_set *set);
void                BltT                    (struct BitMap *src, UWORD s_x, UWORD s_y, struct RastPort *dest, UWORD d_x, UWORD d_y, UWORD w, UWORD h, UBYTE t_col, UBYTE *mask);
int                 my_strlen               (char s[]);
UBYTE               long_2_string_with_thousand(ULONG num, char output[], char point, BOOL negative);
BOOL                CopyPathList            (struct PathList **pla, struct PathList **plc,struct PathList *oldpl);
void                FreePathList            (struct PathList *pla);
void                RunFile                 (struct lau_entry *entry, struct tm_data *data, struct WBArg *wbarg, ULONG numarg);
__saveds ULONG     *pAllocVec               (ULONG memSize);
__saveds void       pFreeVec                (ULONG *memory);
void                show                    (int what);
Object             *LoadImage               (char *file, struct Screen *scr);
struct  GAU_Color  *GetGaugePen             (WORD pen);
ULONG               Retina_AvailMem         (ULONG attributes);

