X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=terminal.h;h=924c8204e340df2e4d0852508733fb8db0d20ee6;hb=fc9dd5cbaaa5466d09a2a53c33c175280069db59;hp=d4eef398679859de5ae00ae6b4da3d06b80f1f57;hpb=709a94e5f27004e3933b022e1f01b96ddf854265;p=PuTTY.git diff --git a/terminal.h b/terminal.h index d4eef398..924c8204 100644 --- a/terminal.h +++ b/terminal.h @@ -33,14 +33,40 @@ typedef struct termchar termchar; typedef struct termline termline; struct termchar { + /* + * Any code in terminal.c which definitely needs to be changed + * when extra fields are added here is labelled with a comment + * saying FULL-TERMCHAR. + */ unsigned long chr; unsigned long attr; + + /* + * The cc_next field is used to link multiple termchars + * together into a list, so as to fit more than one character + * into a character cell (Unicode combining characters). + * + * cc_next is a relative offset into the current array of + * termchars. I.e. to advance to the next character in a list, + * one does `tc += tc->next'. + * + * Zero means end of list. + */ + int cc_next; }; struct termline { unsigned short lattr; - int cols; + int cols; /* number of real columns on the line */ + int size; /* number of allocated termchars + * (cc-lists may make this > cols) */ int temporary; /* TRUE if decompressed from scrollback */ + int cc_free; /* offset to first cc in free list */ + struct termchar *chars; +}; + +struct bidi_cache_entry { + int width; struct termchar *chars; }; @@ -55,8 +81,6 @@ struct terminal_tag { int tempsblines; /* number of lines in temporary scrollback */ - termchar *cpos; /* cursor position (convenience) */ - termline **disptext; /* buffer of text on real screen */ int dispcursx, dispcursy; /* location of cursor on real screen */ int curstype; /* type of cursor on real screen */ @@ -70,9 +94,6 @@ struct terminal_tag { #define TTYPE termchar #define TSIZE (sizeof(TTYPE)) -#define fix_cpos do { \ - term->cpos = lineptr(term->curs.y)->chars + term->curs.x; \ -} while(0) #ifdef OPTIMISE_SCROLL struct scrollregion *scrollhead, *scrolltail; @@ -96,7 +117,7 @@ struct terminal_tag { int cursor_on; /* cursor enabled flag */ int reset_132; /* Flag ESC c resets to 80 cols */ int use_bce; /* Use Background coloured erase */ - int blinker; /* When blinking is the cursor on ? */ + int cblinker; /* When blinking is the cursor on ? */ int tblinker; /* When the blinking text is on */ int blink_is_real; /* Actually blink blinking text */ int term_echoing; /* Does terminal want local echo? */ @@ -115,15 +136,12 @@ struct terminal_tag { int rows, cols, savelines; int has_focus; int in_vbell; - unsigned long vbell_startpoint; + long vbell_end; int app_cursor_keys, app_keypad_keys, vt52_mode; int repeat_off, cr_lf_return; int seen_disp_event; int big_cursor; - long last_blink; /* used for real blinking control */ - long last_tblink; - int xterm_mouse; /* send mouse messages to app */ int mouse_is_down; /* used while tracking mouse buttons */ @@ -224,12 +242,27 @@ struct terminal_tag { */ int in_term_out; + /* + * We schedule a window update shortly after receiving terminal + * data. This tracks whether one is currently pending. + */ + int window_update_pending; + long next_update; + + /* + * Track pending blinks and tblinks. + */ + int tblink_pending, cblink_pending; + long next_tblink, next_cblink; + /* * These are buffers used by the bidi and Arabic shaping code. */ termchar *ltemp; + int ltemp_size; bidi_char *wcFrom, *wcTo; - termchar **pre_bidi_cache, **post_bidi_cache; + int wcFromTo_size; + struct bidi_cache_entry *pre_bidi_cache, *post_bidi_cache; int bidi_cache_size; };