#ifndef PROTO2_H
#define PROTO2_H

#include "vncproto.h"

#define SERVER_CURSOR_MAX_WIDTH 32
#define SERVER_CURSOR_MAX_HEIGHT 32

#define YN(X) ((X)?"Yes":"No")
#define EN(X) ((X)?"Enabled":"Disabled")

#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))

#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))

typedef struct {
  char w,h,x,y;
  char data[SERVER_CURSOR_MAX_WIDTH*SERVER_CURSOR_MAX_HEIGHT/4];
} pointer_shape;

typedef struct {
  int16_t left,bottom,right,top;
} pointer_bbox_t;

#define POINTER_BBOX_RESET(B) do { (B)->left = (B)->bottom = -32768; (B)->top = (B)->right = 32767; } while (0)

typedef struct {
  void *framebuffer;
  int width;
  int height;
  int bpl; /* Number of valid bytes in screen line */
  int stride; /* Stride between two screen lines (LineLength mode var) */
  PIXEL_FORMAT format; /* Actual format of the framebuffer */
  PIXEL_FORMAT desiredformat; /* Ideal format for new clients to use */
  int xeig;
  int yeig;
} servscreen;

/* OS state */
typedef struct
{
  int mouse_x, mouse_y, mouse_buttons;
  servscreen myscreen; // Our idea of what we think the RISC OS screen mode is
  bool sprite_redirection; // True if screen is currently redirected to sprite
  pointer_shape pointer_shapes[5]; // Pointer shapes. Width of 0 = undefined
  int current_pointer; // Current pointer shape (0=disabled)
  bool palette_dirty;
  pointer_bbox_t pointer_bbox;
} os_state_t;

extern os_state_t os_state;
extern void *private_word;

#endif
