/*
  main.h - Common declarations and definitions

  created  19/01/10
  1.0      14/06/14
*/

#ifndef main_h
#define main_h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "kernel.h"
#include "swis.h"
#include "wimp.h"

#ifndef FALSE
#define FALSE 0
#define TRUE !FALSE
#endif

#ifndef NULL
#define NULL 0
#endif

#define LIMIT(lo,x,hi) \
  if((x) < (lo)) (x) = (lo); \
  else if((x) > (hi)) (x) = (hi)

// Saturates 'x' to 'lo' or 'hi'
#define LIMIT(lo,x,hi) \
  if((x) < (lo)) (x) = (lo); \
  else if((x) > (hi)) (x) = (hi)

typedef unsigned long long int Uint64;
typedef signed long long int Int64;

// error return values, negative where used, eg. return -PARAMETER_ERROR
enum err_msg_e
{
  CANNOT_OPEN_TEMPLATES_FILE,
  CANNOT_OPEN_SPRITES_FILE,
  INFO_TEMPLATE_NOT_FOUND,
  MAIN_TEMPLATE_NOT_FOUND
};

// windows
enum { WIN_INFO,
       WIN_MAIN,
       NUM_WINDOWS };

// menus
enum { MENU_ICONBAR,
       MENU_MAX };

// main window icons
#define ICON_DISPLAY   0

typedef struct ro_s
{
  unsigned int flags;
  int task_handle;
  win_data_t win_data[NUM_WINDOWS];
  int cur_menu;
  char *display;

  struct vdu_s
  {
    int width;
    int height;
  } vdu;

} ro_t;
// ro.flags bits
#define QUIT           0
#define MESSAGES_OPEN  1
#define TEMPLATES_OK   2

// main.c
extern ro_t ro;

void create_driver(void);
void remove_driver(void);
void midi_out_port(int status, int data1, int data2, int n);
void midi_in_port(void);

void rectangle(char *dest, int x1, int y1, int x2, int y2, int colour);


#endif
