/*
 * BRLTTY - A background process providing access to the console screen (when in
 *          text mode) for a blind person using a refreshable braille display.
 *
 * Copyright (C) 1995-2023 by The BRLTTY Developers.
 *
 * BRLTTY comes with ABSOLUTELY NO WARRANTY.
 *
 * This is free software, placed under the terms of the
 * GNU Lesser General Public License, as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any
 * later version. Please see the file LICENSE-LGPL for details.
 *
 * Web Page: http://brltty.app/
 *
 * This software is maintained by Dave Mielke <dave@mielke.cc>.
 */

#ifndef BRLTTY_INCLUDED_SCR_TYPES
#define BRLTTY_INCLUDED_SCR_TYPES

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

typedef enum {
  SCR_ATTR_FG_BLUE   = 0X01,
  SCR_ATTR_FG_GREEN  = 0X02,
  SCR_ATTR_FG_RED    = 0X04,
  SCR_ATTR_FG_BRIGHT = 0X08,
  SCR_ATTR_BG_BLUE   = 0X10,
  SCR_ATTR_BG_GREEN  = 0X20,
  SCR_ATTR_BG_RED    = 0X40,
  SCR_ATTR_BLINK     = 0X80,

  SCR_MASK_FG = SCR_ATTR_FG_RED | SCR_ATTR_FG_GREEN | SCR_ATTR_FG_BLUE | SCR_ATTR_FG_BRIGHT,
  SCR_MASK_BG = SCR_ATTR_BG_RED | SCR_ATTR_BG_GREEN | SCR_ATTR_BG_BLUE,

  SCR_COLOUR_FG_BLACK          = 0,
  SCR_COLOUR_FG_BLUE           = SCR_ATTR_FG_BLUE,
  SCR_COLOUR_FG_GREEN          = SCR_ATTR_FG_GREEN,
  SCR_COLOUR_FG_CYAN           = SCR_ATTR_FG_GREEN | SCR_ATTR_FG_BLUE,
  SCR_COLOUR_FG_RED            = SCR_ATTR_FG_RED,
  SCR_COLOUR_FG_MAGENTA        = SCR_ATTR_FG_RED | SCR_ATTR_FG_BLUE,
  SCR_COLOUR_FG_BROWN          = SCR_ATTR_FG_RED | SCR_ATTR_FG_GREEN,
  SCR_COLOUR_FG_LIGHT_GREY     = SCR_ATTR_FG_RED | SCR_ATTR_FG_GREEN | SCR_ATTR_FG_BLUE,
  SCR_COLOUR_FG_DARK_GREY      = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_BLACK,
  SCR_COLOUR_FG_LIGHT_BLUE     = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_BLUE,
  SCR_COLOUR_FG_LIGHT_GREEN    = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_GREEN,
  SCR_COLOUR_FG_LIGHT_CYAN     = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_CYAN,
  SCR_COLOUR_FG_LIGHT_RED      = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_RED,
  SCR_COLOUR_FG_LIGHT_MAGENTA  = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_MAGENTA,
  SCR_COLOUR_FG_YELLOW         = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_BROWN,
  SCR_COLOUR_FG_WHITE          = SCR_ATTR_FG_BRIGHT | SCR_COLOUR_FG_LIGHT_GREY,

  SCR_COLOUR_BG_BLACK      = 0,
  SCR_COLOUR_BG_BLUE       = SCR_ATTR_BG_BLUE,
  SCR_COLOUR_BG_GREEN      = SCR_ATTR_BG_GREEN,
  SCR_COLOUR_BG_CYAN       = SCR_ATTR_BG_GREEN | SCR_ATTR_BG_BLUE,
  SCR_COLOUR_BG_RED        = SCR_ATTR_BG_RED,
  SCR_COLOUR_BG_MAGENTA    = SCR_ATTR_BG_RED | SCR_ATTR_BG_BLUE,
  SCR_COLOUR_BG_BROWN      = SCR_ATTR_BG_RED | SCR_ATTR_BG_GREEN,
  SCR_COLOUR_BG_LIGHT_GREY = SCR_ATTR_BG_RED | SCR_ATTR_BG_GREEN | SCR_ATTR_BG_BLUE,

  SCR_COLOUR_DEFAULT = SCR_COLOUR_FG_LIGHT_GREY | SCR_COLOUR_BG_BLACK
} ScreenAttributes;

typedef struct {
  wchar_t text;
  ScreenAttributes attributes;
} ScreenCharacter;

typedef enum {
  SCQ_NONE = 0,
  SCQ_LOW,
  SCQ_POOR,
  SCQ_FAIR,
  SCQ_GOOD,
  SCQ_HIGH,
} ScreenContentQuality;

typedef struct {
  const char *unreadable;
  ScreenContentQuality quality;

  int number;		      /* screen number */
  short cols, rows;	/* screen dimensions */
  short posx, posy;	/* cursor position */

  unsigned char hasCursor:1;
  unsigned char hasSelection:1;
} ScreenDescription;

typedef struct {
  short left, top;	/* top-left corner (offset from 0) */
  short width, height;	/* dimensions */
} ScreenBox;

#define SCR_KEY_SHIFT     0X40000000
#define SCR_KEY_UPPER     0X20000000
#define SCR_KEY_CONTROL   0X10000000
#define SCR_KEY_ALT_LEFT  0X08000000
#define SCR_KEY_ALT_RIGHT 0X04000000
#define SCR_KEY_GUI       0X02000000
#define SCR_KEY_CHAR_MASK 0X00FFFFFF

#define SCR_KEY_UNICODE_ROW 0XF800

typedef enum {
  SCR_KEY_ENTER = SCR_KEY_UNICODE_ROW,
  SCR_KEY_TAB,
  SCR_KEY_BACKSPACE,
  SCR_KEY_ESCAPE,
  SCR_KEY_CURSOR_LEFT,
  SCR_KEY_CURSOR_RIGHT,
  SCR_KEY_CURSOR_UP,
  SCR_KEY_CURSOR_DOWN,
  SCR_KEY_PAGE_UP,
  SCR_KEY_PAGE_DOWN,
  SCR_KEY_HOME,
  SCR_KEY_END,
  SCR_KEY_INSERT,
  SCR_KEY_DELETE,
  SCR_KEY_FUNCTION,

  SCR_KEY_F1 = SCR_KEY_FUNCTION,
  SCR_KEY_F2,
  SCR_KEY_F3,
  SCR_KEY_F4,
  SCR_KEY_F5,
  SCR_KEY_F6,
  SCR_KEY_F7,
  SCR_KEY_F8,
  SCR_KEY_F9,
  SCR_KEY_F10,
  SCR_KEY_F11,
  SCR_KEY_F12,
  SCR_KEY_F13,
  SCR_KEY_F14,
  SCR_KEY_F15,
  SCR_KEY_F16,
  SCR_KEY_F17,
  SCR_KEY_F18,
  SCR_KEY_F19,
  SCR_KEY_F20,
  SCR_KEY_F21,
  SCR_KEY_F22,
  SCR_KEY_F23,
  SCR_KEY_F24,
} ScreenKey;

static inline int
isSpecialKey (ScreenKey key) {
  return (key & (SCR_KEY_CHAR_MASK & ~0XFF)) == SCR_KEY_UNICODE_ROW;
}

/* must be less than 0 */
#define SCR_NO_VT -1

typedef struct ScreenDriverStruct ScreenDriver;

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* BRLTTY_INCLUDED_SCR_TYPES */
