/*
 * 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_TERMINAL
#define BRLTTY_INCLUDED_SCR_TERMINAL

#include <sys/ipc.h>

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

extern int makeTerminalKey (key_t *key, const char *path);

typedef enum {
  TERM_MSG_INPUT_TEXT       = 't', // driver->emulator - UTF-8
  TERM_MSG_SEGMENT_UPDATED  = 'u', // emulator->driver - no content
  TERM_MSG_EMULATOR_EXITING = 'x', // emulator->driver - no content
} TerminalMessageType;

extern int getMessageQueue (int *queue, key_t key);

typedef struct {
  uint8_t red;
  uint8_t green;
  uint8_t blue;
} ScreenSegmentColor;

typedef struct {
  uint32_t text;

  ScreenSegmentColor foreground;
  ScreenSegmentColor background;
  uint8_t alpha;

  unsigned char blink:1;
  unsigned char underline:1;
} ScreenSegmentCharacter;

typedef struct {
  uint32_t charactersOffset;
} ScreenSegmentRow;

typedef struct {
  uint32_t headerSize;
  uint32_t segmentSize;

  uint32_t screenHeight;
  uint32_t screenWidth;

  uint32_t cursorRow;
  uint32_t cursorColumn;

  uint32_t screenNumber;
  uint32_t commonFlags;
  uint32_t privateFlags;

  uint32_t rowsOffset;
  uint32_t rowSize;

  uint32_t charactersOffset;
  uint32_t characterSize;
} ScreenSegmentHeader;

extern int getScreenSegment (int *identifier, key_t key);
extern ScreenSegmentHeader *attachScreenSegment (int identifier);
extern int detachScreenSegment (ScreenSegmentHeader *segment);

extern ScreenSegmentHeader *getScreenSegmentForKey (key_t key);
extern ScreenSegmentHeader *getScreenSegmentForPath (const char *path);
extern void logScreenSegment (const ScreenSegmentHeader *segment);

static inline int
haveScreenRowArray (const ScreenSegmentHeader *segment) {
  return !!segment->rowsOffset;
}

static inline unsigned int
getScreenRowWidth (const ScreenSegmentHeader *segment) {
  return segment->screenWidth * segment->characterSize;
}

static inline unsigned int
getScreenCharacterCount (const ScreenSegmentHeader *segment) {
  return segment->screenWidth * segment->screenHeight;
}

extern void *getScreenItem (ScreenSegmentHeader *segment, uint32_t offset);
extern ScreenSegmentRow *getScreenRowArray (ScreenSegmentHeader *segment);
extern ScreenSegmentCharacter *getScreenCharacterArray (ScreenSegmentHeader *segment, const ScreenSegmentCharacter **end);

extern ScreenSegmentCharacter *getScreenRow (ScreenSegmentHeader *segment, unsigned int row, const ScreenSegmentCharacter **end);
extern ScreenSegmentCharacter *getScreenCharacter (ScreenSegmentHeader *segment, unsigned int row, unsigned int column, const ScreenSegmentCharacter **end);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* BRLTTY_INCLUDED_SCR_TERMINAL */
