+enum {
+ CSI_ICH = 0x40,
+ CSI_CUU, CSI_CUD, CSI_CUF, CSI_CUB, CSI_CNL, CSI_CPL, CSI_CHA,
+ CSI_CUP, CSI_CHT, CSI_ED , CSI_EL , CSI_IL , CSI_DL , CSI_EF , CSI_EA ,
+ CSI_DCH, CSI_SEE, CSI_CPR, CSI_SU , CSI_SD , CSI_NP , CSI_PP , CSI_CTC,
+ CSI_ECH, CSI_CVT, CSI_CBT, CSI_SRS, CSI_PTX, CSI_SDS, CSI_SIMD, CSI_5F,
+ CSI_HPA, CSI_HPR, CSI_REP, CSI_DA , CSI_VPA, CSI_VPR, CSI_HVP, CSI_TBC,
+ CSI_SM , CSI_MC , CSI_HPB, CSI_VPB, CSI_RM , CSI_SGR, CSI_DSR, CSI_DAQ,
+ CSI_70 , CSI_71 , CSI_72 , CSI_73 , CSI_74 , CSI_75 , CSI_76 , CSI_77 ,
+ CSI_78 , CSI_79 , CSI_7A , CSI_7B , CSI_7C , CSI_7D , CSI_7E , CSI_7F
+};
+
+struct madtty_t {
+ int pty;
+ pid_t childpid;
+
+ /* flags */
+ unsigned seen_input : 1;
+ unsigned insert : 1;
+ unsigned escaped : 1;
+ unsigned graphmode : 1;
+ unsigned curshid : 1;
+
+ /* geometry */
+ int rows, cols;
+ unsigned curattrs;
+
+ struct t_row_t *lines;
+ struct t_row_t *scroll_top;
+ struct t_row_t *scroll_bot;
+
+ /* cursor */
+ struct t_row_t *curs_row;
+ int curs_col, curs_srow, curs_scol;
+
+ /* buffers and parsing state */
+ mbstate_t ps;
+ char rbuf[BUFSIZ];
+ char ebuf[BUFSIZ];
+ int rlen, elen;
+};
+
+typedef struct t_row_t {
+ wchar_t *text;
+ uint16_t *attr;
+ unsigned dirty : 1;
+} t_row_t;