mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 19:12:48 -05:00
Re-engineering of terminal emulator, phase 1.
The active terminal screen is no longer an array of `unsigned long' encoding 16-bit Unicode plus 16 attribute bits. Now it's an array of `termchar' structures, which currently have 32-bit Unicode and 32 attribute bits but which will probably expand further in future. To prevent bloat of the memory footprint, I've introduced a mostly RLE-like compression scheme for storing scrollback: each line is compressed into a compact (but hard to modify) form when it moves into the term->scrollback tree, and is temporarily decompressed when the user wants to scroll back over it. My initial tests suggest that this compression averages about 1/4 of the previous (32 bits per character cell) data size in typical output, which means this is an improvement even without counting the new ability to extend the information stored in each character cell. Another beneficial side effect is that the insane format in which Unicode was passed to front ends through do_text() has now been rendered sane. Testing is incomplete; this _may_ still have instabilities. Windows and Unix front ends both seem to work as far as I've looked, but I haven't yet looked very hard. The Mac front end I've edited (it seemed obvious how to change it) but I can't compile or test it. As an immediate functional effect, the terminal emulator now supports full 32-bit Unicode to whatever extent the host platform allows it to. For example, if you output a 4-or-more-byte UTF-8 character in Unix pterm, it will not display it properly, but it will correctly paste it back out in a UTF8_STRING selection. Windows is more restricted, sadly. [originally from svn r4609]
This commit is contained in:
77
putty.h
77
putty.h
@ -40,35 +40,35 @@ typedef struct terminal_tag Terminal;
|
||||
* ATTR_INVALID is an illegal colour combination.
|
||||
*/
|
||||
|
||||
#define TATTR_ACTCURS 0x4UL /* active cursor (block) */
|
||||
#define TATTR_PASCURS 0x2UL /* passive cursor (box) */
|
||||
#define TATTR_RIGHTCURS 0x1UL /* cursor-on-RHS */
|
||||
#define TATTR_ACTCURS 0x40000000UL /* active cursor (block) */
|
||||
#define TATTR_PASCURS 0x20000000UL /* passive cursor (box) */
|
||||
#define TATTR_RIGHTCURS 0x10000000UL /* cursor-on-RHS */
|
||||
|
||||
#define LATTR_NORM 0x00000000UL
|
||||
#define LATTR_WIDE 0x01000000UL
|
||||
#define LATTR_TOP 0x02000000UL
|
||||
#define LATTR_BOT 0x03000000UL
|
||||
#define LATTR_MODE 0x03000000UL
|
||||
#define LATTR_WRAPPED 0x10000000UL
|
||||
#define LATTR_WRAPPED2 0x20000000UL
|
||||
#define LATTR_WIDE 0x00000001UL
|
||||
#define LATTR_TOP 0x00000002UL
|
||||
#define LATTR_BOT 0x00000003UL
|
||||
#define LATTR_MODE 0x00000003UL
|
||||
#define LATTR_WRAPPED 0x00000010UL
|
||||
#define LATTR_WRAPPED2 0x00000020UL
|
||||
|
||||
#define ATTR_INVALID 0x03FF0000UL
|
||||
#define ATTR_INVALID 0x03FFU
|
||||
|
||||
/* Like Linux use the F000 page for direct to font. */
|
||||
#define ATTR_OEMCP 0x0000F000UL /* OEM Codepage DTF */
|
||||
#define ATTR_ACP 0x0000F100UL /* Ansi Codepage DTF */
|
||||
#define CSET_OEMCP 0x0000F000UL /* OEM Codepage DTF */
|
||||
#define CSET_ACP 0x0000F100UL /* Ansi Codepage DTF */
|
||||
|
||||
/* These are internal use overlapping with the UTF-16 surrogates */
|
||||
#define ATTR_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */
|
||||
#define ATTR_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */
|
||||
#define ATTR_SCOACS 0x0000DA00UL /* SCO Alternate charset */
|
||||
#define ATTR_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */
|
||||
#define CSET_MASK 0x0000FF00UL /* Character set mask; MUST be 0xFF00 */
|
||||
#define CSET_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */
|
||||
#define CSET_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */
|
||||
#define CSET_SCOACS 0x0000DA00UL /* SCO Alternate charset */
|
||||
#define CSET_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */
|
||||
#define CSET_MASK 0xFFFFFF00UL /* Character set mask */
|
||||
|
||||
#define DIRECT_CHAR(c) ((c&0xFC00)==0xD800)
|
||||
#define DIRECT_FONT(c) ((c&0xFE00)==0xF000)
|
||||
#define DIRECT_CHAR(c) ((c&0xFFFFFC00)==0xD800)
|
||||
#define DIRECT_FONT(c) ((c&0xFFFFFE00)==0xF000)
|
||||
|
||||
#define UCSERR (ATTR_LINEDRW|'a') /* UCS Format error character. */
|
||||
#define UCSERR (CSET_LINEDRW|'a') /* UCS Format error character. */
|
||||
/*
|
||||
* UCSWIDE is a special value used in the terminal data to signify
|
||||
* the character cell containing the right-hand half of a CJK wide
|
||||
@ -79,27 +79,24 @@ typedef struct terminal_tag Terminal;
|
||||
*/
|
||||
#define UCSWIDE 0xDFFF
|
||||
|
||||
#define ATTR_NARROW 0x80000000UL
|
||||
#define ATTR_WIDE 0x40000000UL
|
||||
#define ATTR_BOLD 0x04000000UL
|
||||
#define ATTR_UNDER 0x08000000UL
|
||||
#define ATTR_REVERSE 0x10000000UL
|
||||
#define ATTR_BLINK 0x20000000UL
|
||||
#define ATTR_FGMASK 0x001F0000UL
|
||||
#define ATTR_BGMASK 0x03E00000UL
|
||||
#define ATTR_COLOURS 0x03FF0000UL
|
||||
#define ATTR_FGSHIFT 16
|
||||
#define ATTR_BGSHIFT 21
|
||||
#define ATTR_NARROW 0x8000U
|
||||
#define ATTR_WIDE 0x4000U
|
||||
#define ATTR_BOLD 0x0400U
|
||||
#define ATTR_UNDER 0x0800U
|
||||
#define ATTR_REVERSE 0x1000U
|
||||
#define ATTR_BLINK 0x2000U
|
||||
#define ATTR_FGMASK 0x001FU
|
||||
#define ATTR_BGMASK 0x03E0U
|
||||
#define ATTR_COLOURS 0x03FFU
|
||||
#define ATTR_FGSHIFT 0
|
||||
#define ATTR_BGSHIFT 5
|
||||
|
||||
#define ATTR_DEFAULT 0x01280000UL /* bg 9, fg 8 */
|
||||
#define ATTR_DEFFG 0x00080000UL
|
||||
#define ATTR_DEFBG 0x01200000UL
|
||||
#define ERASE_CHAR (ATTR_DEFAULT | ATTR_ASCII | ' ')
|
||||
#define ATTR_MASK 0xFFFFFF00UL
|
||||
#define CHAR_MASK 0x000000FFUL
|
||||
#define ATTR_DEFAULT 0x0128U /* bg 9, fg 8 */
|
||||
#define ATTR_DEFFG 0x0008U
|
||||
#define ATTR_DEFBG 0x0120U
|
||||
|
||||
#define ATTR_CUR_AND (~(ATTR_BOLD|ATTR_REVERSE|ATTR_BLINK|ATTR_COLOURS))
|
||||
#define ATTR_CUR_XOR 0x016A0000UL
|
||||
#define ATTR_CUR_XOR 0x016AU
|
||||
|
||||
struct sesslist {
|
||||
int nsessions;
|
||||
@ -530,8 +527,8 @@ struct RSAKey; /* be a little careful of scope */
|
||||
* Exports from window.c.
|
||||
*/
|
||||
void request_resize(void *frontend, int, int);
|
||||
void do_text(Context, int, int, char *, int, unsigned long, int);
|
||||
void do_cursor(Context, int, int, char *, int, unsigned long, int);
|
||||
void do_text(Context, int, int, wchar_t *, int, unsigned long, int);
|
||||
void do_cursor(Context, int, int, wchar_t *, int, unsigned long, int);
|
||||
int char_width(Context ctx, int uc);
|
||||
#ifdef OPTIMISE_SCROLL
|
||||
void do_scroll(Context, int, int, int);
|
||||
|
Reference in New Issue
Block a user