13 #define SHELL "/bin/bash"
17 #define CTRLKEY(x) ((x) - 96)
18 #define BADPOLLFLAGS (POLLHUP | POLLERR | POLLNVAL)
21 static struct term terms
[TAGS
* 2];
22 static int cterm
; /* current tag */
23 static int lterm
; /* last tag */
26 static int readchar(void)
29 if (read(STDIN_FILENO
, &b
, 1) > 0)
34 static void showterm(int n
)
36 if (cterm
% TAGS
!= n
% TAGS
)
38 term_save(&terms
[cterm
]);
40 term_load(&terms
[cterm
], TERM_REDRAW
);
43 static struct term
*mainterm(void)
50 static void exec_cmd(char *file
)
56 static void directkey(void)
59 char *tags
= "xnlhtrv-";
61 switch ((c
= readchar())) {
73 showterm(cterm
< TAGS
? cterm
+ TAGS
: cterm
- TAGS
);
82 if (strchr(tags
, c
)) {
83 showterm(strchr(tags
, c
) - tags
);
90 if (c
!= -1 && mainterm())
94 static int find_by_fd(int fd
)
97 for (i
= 0; i
< ARRAY_SIZE(terms
); i
++)
98 if (terms
[i
].fd
== fd
)
103 static int fill_ufds(struct pollfd
*ufds
)
107 ufds
[0].fd
= STDIN_FILENO
;
108 ufds
[0].events
= POLLIN
;
109 for (i
= 0; i
< ARRAY_SIZE(terms
); i
++) {
111 ufds
[n
].fd
= terms
[i
].fd
;
112 ufds
[n
].events
= POLLIN
;
119 static void temp_switch(int termid
)
121 if (termid
!= cterm
) {
122 term_save(&terms
[cterm
]);
123 term_load(&terms
[termid
], TERM_HIDDEN
);
127 static void switch_back(int termid
)
129 if (termid
!= cterm
) {
130 term_save(&terms
[termid
]);
131 term_load(&terms
[cterm
], TERM_VISIBLE
);
135 static void check_ufds(struct pollfd
*ufds
, int n
)
138 for (i
= 1; i
< n
; i
++) {
139 int idx
= find_by_fd(ufds
[i
].fd
);
140 if (ufds
[i
].revents
& BADPOLLFLAGS
) {
145 if (ufds
[i
].revents
& POLLIN
) {
153 static void mainloop(void)
155 struct pollfd ufds
[ARRAY_SIZE(terms
) + 1];
156 struct termios oldtermios
, termios
;
159 tcgetattr(STDIN_FILENO
, &termios
);
160 oldtermios
= termios
;
162 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
163 memset(ufds
, 0, sizeof(ufds
));
164 term_load(&terms
[cterm
], TERM_REDRAW
);
167 rv
= poll(ufds
, n
, 1000);
168 if (rv
== -1 && errno
!= EINTR
)
170 if (ufds
[0].revents
& BADPOLLFLAGS
)
172 if (ufds
[0].revents
& POLLIN
)
177 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);
180 static void signalreceived(int n
)
186 term_save(&terms
[cterm
]);
187 ioctl(STDIN_FILENO
, VT_RELDISP
, 1);
191 term_load(&terms
[cterm
], TERM_REDRAW
);
196 static void setupsignals(void)
199 vtm
.mode
= VT_PROCESS
;
201 vtm
.relsig
= SIGUSR1
;
202 vtm
.acqsig
= SIGUSR2
;
204 ioctl(STDIN_FILENO
, VT_SETMODE
, &vtm
);
206 signal(SIGUSR1
, signalreceived
);
207 signal(SIGUSR2
, signalreceived
);
212 char *hide
= "\x1b[?25l";
213 char *clear
= "\x1b[2J\x1b[H";
214 char *show
= "\x1b[?25h";
215 write(STDIN_FILENO
, clear
, strlen(clear
));
216 write(STDIN_FILENO
, hide
, strlen(hide
));
219 fcntl(STDIN_FILENO
, F_SETFL
,
220 fcntl(STDIN_FILENO
, F_GETFL
) | O_NONBLOCK
);
223 write(STDIN_FILENO
, show
, strlen(show
));