13 #define SHELL "/bin/bash"
15 #define CTRLKEY(x) ((x) - 96)
17 static struct term terms
[TAGS
* 2];
18 static int cterm
; /* current tag */
19 static int lterm
; /* last tag */
22 static int readchar(void)
25 if (read(STDIN_FILENO
, &b
, 1) > 0)
30 static void showterm(int n
)
32 if (lterm
% TAGS
!= cterm
% TAGS
)
34 term_save(&terms
[cterm
]);
36 term_load(&terms
[cterm
]);
39 static struct term
*mainterm(void)
46 static void directkey(void)
49 static int pending
= 0;
51 char *tags
= "xnlhtrv-";
53 showterm(strchr(tags
, c
) - tags
);
58 switch ((c
= readchar())) {
65 showterm((cterm
+ TAGS
) % ARRAY_SIZE(terms
));
86 static void mainloop(void)
88 struct pollfd ufds
[2];
90 struct termios oldtermios
, termios
;
91 long badflags
= POLLHUP
| POLLERR
| POLLNVAL
;
92 tcgetattr(STDIN_FILENO
, &termios
);
95 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
96 memset(ufds
, 0, sizeof(ufds
));
97 term_load(&terms
[cterm
]);
98 ufds
[0].fd
= STDIN_FILENO
;
99 ufds
[0].events
= POLLIN
;
100 ufds
[1].fd
= terms
[cterm
].fd
;
101 ufds
[1].events
= POLLIN
;
103 rv
= poll(ufds
, mainterm() ? 2 : 1, 1000);
104 if (rv
== -1 && errno
!= EINTR
)
106 if (ufds
[0].revents
& badflags
)
108 if (mainterm() && ufds
[1].revents
& badflags
)
110 if (mainterm() && ufds
[1].revents
& POLLIN
)
112 if (ufds
[0].revents
& POLLIN
)
114 ufds
[1].fd
= terms
[cterm
].fd
;
116 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);
119 static void signalreceived(int n
)
125 term_save(&terms
[cterm
]);
126 ioctl(STDIN_FILENO
, VT_RELDISP
, 1);
130 term_load(&terms
[cterm
]);
135 static void setupsignals(void)
138 vtm
.mode
= VT_PROCESS
;
140 vtm
.relsig
= SIGUSR1
;
141 vtm
.acqsig
= SIGUSR2
;
143 ioctl(STDIN_FILENO
, VT_SETMODE
, &vtm
);
145 signal(SIGUSR1
, signalreceived
);
146 signal(SIGUSR2
, signalreceived
);
151 char *hide
= "\x1b[?25l";
152 char *clear
= "\x1b[2J\x1b[H";
153 char *show
= "\x1b[?25h";
154 write(STDIN_FILENO
, clear
, strlen(clear
));
155 write(STDIN_FILENO
, hide
, strlen(hide
));
159 fcntl(STDIN_FILENO
, F_SETFL
,
160 fcntl(STDIN_FILENO
, F_GETFL
) | O_NONBLOCK
);
163 write(STDIN_FILENO
, show
, strlen(show
));