11 #define SHELL "/bin/bash"
20 static void execshell(void)
22 if ((pid
= forkpty(&fd
, NULL
, NULL
, NULL
)) == -1)
23 xerror("failed to create a pty");
25 setenv("TERM", "linux", 1);
26 execl(SHELL
, SHELL
, NULL
);
31 static void setsize(void)
34 size
.ws_col
= pad_cols();
35 size
.ws_row
= pad_rows();
38 ioctl(fd
, TIOCSWINSZ
, &size
);
41 static int readpty(void)
44 if (read(fd
, &b
, 1) > 0)
49 static int readchar(void)
52 if (read(STDIN_FILENO
, &b
, 1) > 0)
57 static void writechar(int c
)
59 unsigned char b
= (unsigned char) c
;
63 static void writepty(int c
)
68 static void setmode(int m
)
74 if (m
>= 30 && m
<= 37)
76 if (m
>= 40 && m
<= 47)
80 static void kill_line(void)
83 for (i
= pad_col(); i
< pad_cols(); i
++)
84 pad_put(' ', pad_row(), i
);
87 static void escape(void)
89 int args
[MAXESCARGS
] = {0};
98 for (i
= 0; i
< ARRAY_SIZE(args
) && !isalpha(c
); i
++) {
100 while (isdigit((c
= readpty())))
101 arg
= arg
* 10 + (c
- '0');
107 pad_move(args
[0], args
[1]);
114 pad_move(pad_row() - args
[0], pad_col());
117 pad_move(pad_row() + args
[0], pad_col());
120 pad_move(pad_row(), pad_col() + args
[0]);
123 pad_move(pad_row(), pad_col() - args
[0]);
129 for (i
= 0; i
< n
; i
++)
135 printf("unknown escapse <%c>\n", c
);
139 static void shcmds(void)
148 static void directkey(void)
154 static void mainloop(void)
156 struct pollfd ufds
[2];
158 struct termios oldtermios
, termios
;
159 tcgetattr(STDIN_FILENO
, &termios
);
160 oldtermios
= termios
;
162 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
163 ufds
[0].fd
= STDIN_FILENO
;
164 ufds
[0].events
= POLLIN
;
166 ufds
[1].events
= POLLIN
;
167 while ((rv
= poll(ufds
, 2, 1000)) != -1) {
168 if ((ufds
[0].revents
| ufds
[1].revents
) &
169 (POLLHUP
| POLLERR
| POLLNVAL
))
171 if (ufds
[0].revents
& POLLIN
)
173 if (ufds
[1].revents
& POLLIN
)
176 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);