13 #define SHELL "/bin/bash"
15 #define CTRLKEY(x) ((x) - 96)
16 #define BADPOLLFLAGS (POLLHUP | POLLERR | POLLNVAL)
19 static struct term terms
[TAGS
* 2];
20 static int cterm
; /* current tag */
21 static int lterm
; /* last tag */
24 static int readchar(void)
27 if (read(STDIN_FILENO
, &b
, 1) > 0)
32 static void showterm(int n
)
34 if (lterm
% TAGS
!= cterm
% TAGS
)
36 term_save(&terms
[cterm
]);
38 term_load(&terms
[cterm
], TERM_REDRAW
);
41 static struct term
*mainterm(void)
48 static void directkey(void)
51 static int pending
= 0;
53 char *tags
= "xnlhtrv-";
55 showterm(strchr(tags
, c
) - tags
);
60 switch ((c
= readchar())) {
67 showterm((cterm
+ TAGS
) % ARRAY_SIZE(terms
));
88 static int find_by_fd(int fd
)
91 for (i
= 0; i
< ARRAY_SIZE(terms
); i
++)
92 if (terms
[i
].fd
== fd
)
97 static int fill_ufds(struct pollfd
*ufds
)
101 ufds
[0].fd
= STDIN_FILENO
;
102 ufds
[0].events
= POLLIN
;
103 for (i
= 0; i
< ARRAY_SIZE(terms
); i
++) {
105 ufds
[n
].fd
= terms
[i
].fd
;
106 ufds
[n
].events
= POLLIN
;
113 static void temp_switch(int termid
)
115 if (termid
!= cterm
) {
116 term_save(&terms
[cterm
]);
117 term_load(&terms
[termid
], TERM_HIDDEN
);
121 static void switch_back(int termid
)
123 if (termid
!= cterm
) {
124 term_save(&terms
[termid
]);
125 term_load(&terms
[cterm
], TERM_VISIBLE
);
129 static void check_ufds(struct pollfd
*ufds
, int n
)
132 for (i
= 1; i
< n
; i
++) {
133 int idx
= find_by_fd(ufds
[i
].fd
);
134 if (ufds
[i
].revents
& BADPOLLFLAGS
) {
139 if (ufds
[i
].revents
& POLLIN
) {
147 static void mainloop(void)
149 struct pollfd ufds
[ARRAY_SIZE(terms
) + 1];
150 struct termios oldtermios
, termios
;
153 tcgetattr(STDIN_FILENO
, &termios
);
154 oldtermios
= termios
;
156 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
157 memset(ufds
, 0, sizeof(ufds
));
158 term_load(&terms
[cterm
], TERM_REDRAW
);
161 rv
= poll(ufds
, n
, 1000);
162 if (rv
== -1 && errno
!= EINTR
)
164 if (ufds
[0].revents
& BADPOLLFLAGS
)
166 if (ufds
[0].revents
& POLLIN
)
171 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);
174 static void signalreceived(int n
)
180 term_save(&terms
[cterm
]);
181 ioctl(STDIN_FILENO
, VT_RELDISP
, 1);
185 term_load(&terms
[cterm
], TERM_REDRAW
);
190 static void setupsignals(void)
193 vtm
.mode
= VT_PROCESS
;
195 vtm
.relsig
= SIGUSR1
;
196 vtm
.acqsig
= SIGUSR2
;
198 ioctl(STDIN_FILENO
, VT_SETMODE
, &vtm
);
200 signal(SIGUSR1
, signalreceived
);
201 signal(SIGUSR2
, signalreceived
);
206 char *hide
= "\x1b[?25l";
207 char *clear
= "\x1b[2J\x1b[H";
208 char *show
= "\x1b[?25h";
209 write(STDIN_FILENO
, clear
, strlen(clear
));
210 write(STDIN_FILENO
, hide
, strlen(hide
));
213 fcntl(STDIN_FILENO
, F_SETFL
,
214 fcntl(STDIN_FILENO
, F_GETFL
) | O_NONBLOCK
);
217 write(STDIN_FILENO
, show
, strlen(show
));