14 #define SQRADDR(r, c) (&screen[(r) * pad_cols() + (c)])
20 static struct square screen
[MAXCHARS
];
22 static int nocursor
, nowrap
;
23 static int saved_row
, saved_col
, saved_fg
, saved_bg
;
25 static void setsize(void)
28 size
.ws_col
= pad_cols();
29 size
.ws_row
= pad_rows();
32 ioctl(fd
, TIOCSWINSZ
, &size
);
35 static int readpty(void)
38 if (read(fd
, &b
, 1) > 0)
43 static void term_show(int r
, int c
, int cursor
)
45 struct square
*sqr
= SQRADDR(r
, c
);
46 int fgcolor
= sqr
->c
? sqr
->fg
: fg
;
47 int bgcolor
= sqr
->c
? sqr
->bg
: bg
;
48 if (cursor
&& !nocursor
) {
53 pad_put(sqr
->c
, r
, c
, fgcolor
, bgcolor
);
56 void term_put(int ch
, int r
, int c
)
58 struct square
*sqr
= SQRADDR(r
, c
);
65 static void empty_rows(int sr
, int er
)
67 memset(SQRADDR(sr
, 0), 0, (er
- sr
) * sizeof(screen
[0]) * pad_cols());
70 static void blank_rows(int sr
, int er
)
74 for (i
= sr
* pad_cols(); i
< er
* pad_cols(); i
++)
75 term_show(i
/ pad_cols(), i
% pad_cols(), 0);
76 term_show(row
, col
, 1);
79 static void scroll_screen(int sr
, int nr
, int n
)
81 term_show(row
, col
, 0);
82 memmove(SQRADDR(sr
+ n
, 0), SQRADDR(sr
, 0),
83 nr
* pad_cols() * sizeof(screen
[0]));
85 empty_rows(sr
, sr
+ n
);
87 empty_rows(sr
+ nr
+ n
, sr
+ nr
);
88 pad_scroll(sr
, nr
, n
, bg
);
89 term_show(row
, col
, 1);
92 static void insert_lines(int n
)
94 int sr
= MAX(top
, row
);
95 int nr
= bot
- row
- n
;
97 scroll_screen(sr
, nr
, n
);
100 static void delete_lines(int n
)
102 int r
= MAX(top
, row
);
104 int nr
= bot
- r
- n
;
106 scroll_screen(sr
, nr
, -n
);
109 static void move_cursor(int r
, int c
)
111 term_show(row
, col
, 0);
112 if (c
>= pad_cols()) {
122 int nr
= (bot
- top
) + n
;
123 scroll_screen(-n
, nr
, n
);
126 row
= MAX(0, MIN(r
, pad_rows() - 1));
127 col
= MAX(0, MIN(c
, pad_cols() - 1));
128 term_show(row
, col
, 1);
131 static void advance(int dr
, int dc
)
135 move_cursor(MAX(0, r
), MAX(0, c
));
138 void term_send(int c
)
140 unsigned char b
= (unsigned char) c
;
145 void term_sendstr(char *s
)
148 write(fd
, s
, strlen(s
));
151 static void setmode(int m
)
164 if (m
>= 30 && m
<= 37)
166 if (m
>= 40 && m
<= 47)
170 static void kill_chars(int sc
, int ec
)
173 memset(SQRADDR(row
, sc
), 0, (ec
- sc
) * sizeof(screen
[0]));
174 for (i
= sc
; i
< ec
; i
++)
175 term_show(row
, i
, 0);
176 move_cursor(row
, col
);
179 static void move_chars(int sc
, int nc
, int n
)
182 term_show(row
, col
, 0);
183 memmove(SQRADDR(row
, sc
+ n
), SQRADDR(row
, sc
),
184 nc
* sizeof(screen
[0]));
186 memset(SQRADDR(row
, sc
), 0, n
* sizeof(screen
[0]));
188 memset(SQRADDR(row
, pad_rows() + n
), 0, -n
* sizeof(screen
[0]));
189 for (i
= MIN(sc
, sc
+ n
); i
< pad_cols(); i
++)
190 term_show(row
, i
, 0);
191 term_show(row
, col
, 1);
194 static void delete_chars(int n
)
196 move_chars(col
+ n
, pad_cols(), -n
);
199 static void insert_chars(int n
)
201 int nc
= pad_cols() - col
- n
;
202 move_chars(col
, nc
, n
);
205 void term_blank(void)
208 memset(screen
, 0, sizeof(screen
));
211 static void ctlseq(void);
217 void term_exec(char *cmd
)
219 if ((pid
= forkpty(&fd
, NULL
, NULL
, NULL
)) == -1)
220 xerror("failed to create a pty");
222 setenv("TERM", "linux", 1);
223 execl(cmd
, cmd
, NULL
);
231 void term_save(struct term_state
*state
)
239 memcpy(state
->screen
, screen
,
240 pad_rows() * pad_cols() * sizeof(screen
[0]));
243 void term_load(struct term_state
*state
)
252 memcpy(screen
, state
->screen
,
253 pad_rows() * pad_cols() * sizeof(screen
[0]));
254 for (i
= 0; i
< pad_rows() * pad_cols(); i
++)
255 term_show(i
/ pad_cols(), i
% pad_cols(), 0);
256 term_show(row
, col
, 1);