/* * Device independent tty interface for JOE * Copyright * (C) 1992 Joseph H. Allen * * This file is part of JOE (Joe's Own Editor) */ struct hentry { ptrdiff_t next; ptrdiff_t loc; }; /* Each terminal has one of these: terminal capability database */ #ifdef __MSDOS__ struct scrn { ptrdiff_t li; /* Height of screen */ ptrdiff_t co; /* Width of screen */ short *scrn; /* Buffer */ int scroll; int insdel; int *updtab; /* Lines which need to be updated */ HIGHLIGHT_STATE *syntax; int *compose; ptrdiff_t *sary; }; #else #define COMPOSE 4 /* Maximum number of characters per cell (one start plus some number of combining) */ /* If there are more than (COMPOSE - 1) combining characters, JOE will emit them, but during a line update * it keeps re-emitting them even if not necessary (because the screen buffer doesn't have enough * to record them all, so it doesn't know if the cell is already correct during an update). */ struct scrn { CAP *cap; /* Termcap/Terminfo data */ ptrdiff_t li; /* Screen height */ ptrdiff_t co; /* Screen width */ const char *ti; /* Initialization string */ const char *cl; /* Home and clear screen... really an init. string */ const char *cd; /* Clear to end of screen */ const char *te; /* Restoration string */ const char *brp; /* Bracketed paste mode */ const char *bre; /* Stop bracketed paste */ int haz; /* Terminal can't print ~s */ int os; /* Terminal overstrikes */ int eo; /* Can use blank to erase even if os */ int ul; /* _ overstrikes */ int am; /* Terminal has autowrap, but not magicwrap */ int xn; /* Terminal has magicwrap */ const char *so; /* Enter standout (inverse) mode */ const char *se; /* Exit standout mode */ const char *us; /* Enter underline mode */ const char *ue; /* Exit underline mode */ const char *uc; /* Single time underline character */ int ms; /* Ok to move when in standout/underline mode */ const char *mb; /* Enter blinking mode */ const char *md; /* Enter bold mode */ const char *mh; /* Enter dim mode */ const char *mr; /* Enter inverse mode */ const char *stricken; /* Enter strikeout mode */ const char *dunderline; /* Enter double-underline mode */ const char *me; /* Exit above modes */ const char *ZH; /* Enter italic mode */ const char *ZR; /* Exit italic mode */ const char *Sb; /* Set background color */ const char *Sf; /* Set foreground color */ int Co; /* No. of colors */ int Tc; /* Truecolor (non-standard, tmux-supported) */ int ut; /* Screen erases with background color */ int da, db; /* Extra lines exist above, below */ const char *al, *dl, *AL, *DL; /* Insert/delete lines */ const char *cs; /* Set scrolling region */ int rr; /* Set for scrolling region relative addressing */ const char *sf, *SF, *sr, *SR; /* Scroll */ const char *dm, *dc, *DC, *ed; /* Delete characters */ const char *im, *ic, *IC, *ip, *ei; /* Insert characters */ int mi; /* Set if ok to move while in insert mode */ const char *bs; /* Move cursor left 1 */ ptrdiff_t cbs; const char *lf; /* Move cursor down 1 */ ptrdiff_t clf; const char *up; /* Move cursor up 1 */ ptrdiff_t cup; const char *nd; /* Move cursor right 1 */ const char *ta; /* Move cursor to next tab stop */ ptrdiff_t cta; const char *bt; /* Move cursor to previous tab stop */ ptrdiff_t cbt; ptrdiff_t tw; /* Tab width */ const char *ho; /* Home cursor to upper left */ ptrdiff_t cho; const char *ll; /* Home cursor to lower left */ ptrdiff_t cll; const char *cr; /* Move cursor to left edge */ ptrdiff_t ccr; const char *RI; /* Move cursor right n */ ptrdiff_t cRI; const char *LE; /* Move cursor left n */ ptrdiff_t cLE; const char *UP; /* Move cursor up n */ ptrdiff_t cUP; const char *DO; /* Move cursor down n */ ptrdiff_t cDO; const char *ch; /* Set cursor column */ ptrdiff_t cch; const char *cv; /* Set cursor row */ ptrdiff_t ccv; const char *cV; /* Goto beginning of specified line */ ptrdiff_t ccV; const char *cm; /* Set cursor row and column */ ptrdiff_t ccm; const char *ce; /* Clear to end of line */ ptrdiff_t cce; int assume_256; /* Assume terminal has 256 color mode, but use regular mode for standard colors just in case */ int truecolor; /* Terminal supports true color */ int *palette; /* Truecolor RGB palette */ /* Basic abilities */ int scroll; /* Set to use scrolling */ int insdel; /* Set to use insert/delete within line */ /* Current state of terminal */ int (*scrn)[COMPOSE]; /* Characters on screen */ int *attr; /* Attributes on screen */ ptrdiff_t x, y; /* Current cursor position (-1 for unknown) */ ptrdiff_t top, bot; /* Current scrolling region */ int attrib; /* Current character attributes */ int ins; /* Set if we're in insert mode */ int *updtab; /* Dirty lines table */ int avattr; /* Bits set for available attributes */ ptrdiff_t *sary; /* Scroll buffer array */ int *compose; /* Line compose buffer */ ptrdiff_t *ofst; /* stuff for magic */ struct hentry *htab; struct hentry *ary; }; #endif extern int skiptop; /* SCRN *nopen(void); * * Open the screen (sets TTY mode so that screen may be used immediately after * the 'nopen'). */ SCRN *nopen(CAP *cap); /* int nresize(SCRN *t,int w,int h); * * Change size of screen. For example, call this when you find out that * the Xterm changed size. */ int nresize(SCRN *t, ptrdiff_t w, ptrdiff_t h); /* void nredraw(SCRN *t); * * Invalidate all state variables for the terminal. This way, everything gets * redrawn. */ void nredraw(SCRN *t); void npartial(SCRN *t); void nescape(SCRN *t); void nreturn(SCRN *t); /* void nclose(SCRN *t); * * Close the screen and restore TTY to initial state. * * if 'flg' is set, tclose doesn't mess with the signals. */ void nclose(SCRN *t); /* int cpos(SCRN *t,int x,int y); * * Set cursor position */ int cpos(register SCRN *t, register ptrdiff_t x, register ptrdiff_t y); /* int attr(SCRN *t,int a); * * Set attributes */ int set_attr(SCRN *t, int c); /* Encode character as utf8 */ void utf8_putc(int c); /* void outatr(SCRN *t,int *scrn,int *attr,int x,int y,int c,int a); * * Output a character at the given screen coordinate. The cursor position * after this function is executed is indeterminate. */ /* Character attribute bits */ #ifdef __MSDOS__ #define INVERSE 1 #define UNDERLINE 2 #define BOLD 4 #define BLINK 8 #define DIM 16 #define ITALIC 32 extern unsigned atab[]; #define outatr(t,scrn,attr,x,y,c,a) do { \ (t); \ (x); \ (y); \ *(scrn) = ((unsigned)(c) | atab[a]); \ } while(0) #else #define CONTEXT_COMMENT 1 #define CONTEXT_STRING 2 #define CONTEXT_MASK (CONTEXT_COMMENT+CONTEXT_STRING) #define DOUBLE_UNDERLINE 8 #define CROSSED_OUT 16 #define ITALIC 32 #define INVERSE 64 #define UNDERLINE 128 #define BOLD 256 #define BLINK 512 #define DIM 1024 #define AT_MASK (INVERSE+UNDERLINE+BOLD+BLINK+DIM+ITALIC+DOUBLE_UNDERLINE+CROSSED_OUT) #define BG_SHIFT 11 #define BG_VALUE (255<