13 #define SHELL "/bin/bash"
15 #define CTRLKEY(x) ((x) - 96)
17 static struct term_state 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 void directkey(void)
43 switch ((c
= readchar())) {
50 showterm((cterm
+ TAGS
) % ARRAY_SIZE(terms
));
66 static void mainloop(void)
68 struct pollfd ufds
[2];
70 struct termios oldtermios
, termios
;
71 tcgetattr(STDIN_FILENO
, &termios
);
74 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
75 memset(ufds
, 0, sizeof(ufds
));
76 ufds
[0].fd
= STDIN_FILENO
;
77 ufds
[0].events
= POLLIN
;
78 ufds
[1].fd
= term_fd();
79 ufds
[1].events
= POLLIN
;
81 rv
= poll(ufds
, term_fd() ? 2 : 1, 1000);
82 if (rv
== -1 && errno
!= EINTR
)
84 if (ufds
[0].revents
& (POLLHUP
| POLLERR
| POLLNVAL
))
86 if (term_fd() && ufds
[1].revents
& (POLLHUP
| POLLERR
| POLLNVAL
))
88 if (term_fd() && ufds
[1].revents
& POLLIN
)
90 if (ufds
[0].revents
& POLLIN
)
92 ufds
[1].fd
= term_fd();
94 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);
97 static void signalreceived(int n
)
103 term_save(&terms
[cterm
]);
104 ioctl(STDIN_FILENO
, VT_RELDISP
, 1);
108 term_load(&terms
[cterm
]);
113 static void setupsignals(void)
116 vtm
.mode
= VT_PROCESS
;
118 vtm
.relsig
= SIGUSR1
;
119 vtm
.acqsig
= SIGUSR2
;
121 ioctl(STDIN_FILENO
, VT_SETMODE
, &vtm
);
123 signal(SIGUSR1
, signalreceived
);
124 signal(SIGUSR2
, signalreceived
);
129 char *hide
= "\x1b[?25l";
130 char *clear
= "\x1b[2J\x1b[H";
131 char *show
= "\x1b[?25h";
132 write(STDOUT_FILENO
, hide
, strlen(hide
));
133 write(STDOUT_FILENO
, clear
, strlen(clear
));
137 fcntl(STDIN_FILENO
, F_SETFL
,
138 fcntl(STDIN_FILENO
, F_GETFL
) | O_NONBLOCK
);
141 write(STDOUT_FILENO
, hide
, strlen(hide
));
142 write(STDOUT_FILENO
, show
, strlen(show
));