#ifndef __buffer_h
#define __buffer_h

#include "pinboard.h"

// we need to be able to buffer CLI requests for the Wimp task

typedef enum {
  BUFFER_ENTRY_EMPTY,
  BUFFER_ADD_TINYDIR,
  BUFFER_REMOVE_TINYDIR,
  BUFFER_ADD_PIN,
  BUFFER_SET_OPTIONS,
  BUFFER_SET_BACKDROP,
  BUFFER_CLEAR_PINBOARD,
  BUFFER_ICONSPRITES,
  BUFFER_ADD_XPIN,
  BUFFER_ADD_XTINYDIR,
  BUFFER_SET_STICKY,
  BUFFER_SET_WATERMARK,

  BUFFER_UPCALL_INFO,
  BUFFER_UPCALL_DELETE,
  BUFFER_UPCALL_RENAME
} buffer_entry_type;

typedef struct {
  int x;
  int y;
  int locked;
  char path[1];
} _buffer_add_pin;

typedef struct {
  char path[1];
} _buffer_add_tinydir,
  _buffer_remove_tinydir;

typedef struct {
  int fsnumber;
  char path[1];
} _buffer_upcall_info,
  _buffer_upcall_delete,
  _buffer_upcall_rename;

typedef struct {
  int snap_to_grid;
  int disable_adjust;
  IconizeSetting iconise_corner;
  IconizeStack iconise_stack;
  IconizeSetting tidy_corner;
  IconizeStack tidy_stack;
  autosave_type autosave;
  overwrite_type overwrite;
  _iconsize iconsize;
} _buffer_set_options;

typedef struct {
  int relocate; // if set, then relocate sticky store rather than loading a file
  char data[1]; // font string followed by filename.  A single NUL is used for either if not specified.
} _buffer_set_sticky;

typedef struct {
  char filename[1];
} _buffer_iconsprites;

typedef struct {
  int enable;
  watermark_type location;
  int x_offset,y_offset;
  char filename[1];
} _buffer_set_watermark;

typedef enum {
  TEXT_TYPE_DEFAULT,
  TEXT_TYPE_BLEND,
  TEXT_TYPE_OUTLINE
} text_type;

typedef struct {
  int colour;
  int text_colour;
  int outline_colour;
  text_type render_type;
  char remove;
  char cacheJPEG;
  char style; // tile/centre/scale
  char path[1];
} _buffer_set_backdrop;

typedef struct {
  int snap_to_grid;
  int iconise_to_iconbar;
} _buffer_clear_pinboard;

typedef struct {
    int size;
    buffer_entry_type type;
} _buffer_hdr;


typedef struct {
  _buffer_hdr hdr;
  
  union {
    _buffer_add_tinydir add_tinydir;
    _buffer_remove_tinydir remove_tinydir;
    _buffer_add_pin add_pin;
    _buffer_set_options set_options;
    _buffer_set_backdrop set_backdrop;
    _buffer_set_sticky set_sticky;
    _buffer_clear_pinboard clear_pinboard;
    _buffer_set_watermark watermark;
    _buffer_iconsprites iconsprites;

    _buffer_upcall_info upcall_info;
    _buffer_upcall_delete upcall_delete;
    _buffer_upcall_rename upcall_rename;
  } data;
} buffer_entry;

_kernel_oserror *buffer_init(void);
_kernel_oserror *buffer_final(void);
_kernel_oserror *buffer_push(int size,buffer_entry **new_entry); // add to end of list
_kernel_oserror *buffer_shift(buffer_entry **new_entry); // get from start of pile
_kernel_oserror *buffer_remove(buffer_entry *entry); // remove from pile (mark as empty and tidy if all list freed)

extern int buffer_area;
extern char *buffer_address;

#endif
