12 #define SHELL "/bin/bash"
14 #define CTRLKEY(x) ((x) - 96)
16 static struct term_state terms
[TAGS
* 2];
17 static int cterm
; /* current tag */
18 static int lterm
; /* last tag */
21 static int readchar(void)
24 if (read(STDIN_FILENO
, &b
, 1) > 0)
29 static void showterm(int n
)
31 if (lterm
% TAGS
!= cterm
% TAGS
)
33 term_save(&terms
[cterm
]);
35 term_load(&terms
[cterm
]);
38 static void directkey(void)
42 switch ((c
= readchar())) {
49 showterm((cterm
+ TAGS
) % ARRAY_SIZE(terms
));
64 static void mainloop(void)
66 struct pollfd ufds
[2];
68 struct termios oldtermios
, termios
;
69 tcgetattr(STDIN_FILENO
, &termios
);
72 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &termios
);
73 memset(ufds
, 0, sizeof(ufds
));
74 ufds
[0].fd
= STDIN_FILENO
;
75 ufds
[0].events
= POLLIN
;
76 ufds
[1].fd
= term_fd();
77 ufds
[1].events
= POLLIN
;
79 rv
= poll(ufds
, term_fd() ? 2 : 1, 1000);
80 if (rv
== -1 && errno
!= EINTR
)
82 if (ufds
[0].revents
& (POLLHUP
| POLLERR
| POLLNVAL
))
84 if (term_fd() && ufds
[1].revents
& (POLLHUP
| POLLERR
| POLLNVAL
))
86 if (term_fd() && ufds
[1].revents
& POLLIN
)
88 if (ufds
[0].revents
& POLLIN
)
90 ufds
[1].fd
= term_fd();
92 tcsetattr(STDIN_FILENO
, 0, &oldtermios
);
95 static void signalreceived(int n
)
101 term_save(&terms
[cterm
]);
102 ioctl(STDIN_FILENO
, VT_RELDISP
, 1);
106 term_load(&terms
[cterm
]);
111 static void setupsignals(void)
114 vtm
.mode
= VT_PROCESS
;
116 vtm
.relsig
= SIGUSR1
;
117 vtm
.acqsig
= SIGUSR2
;
119 ioctl(STDIN_FILENO
, VT_SETMODE
, &vtm
);
121 signal(SIGUSR1
, signalreceived
);
122 signal(SIGUSR2
, signalreceived
);
127 char *hide
= "\x1b[?25l";
128 char *clear
= "\x1b[2J\x1b[H";
129 char *show
= "\x1b[?25h";
130 write(STDOUT_FILENO
, hide
, strlen(hide
));
131 write(STDOUT_FILENO
, clear
, strlen(clear
));
137 write(STDOUT_FILENO
, hide
, strlen(hide
));
138 write(STDOUT_FILENO
, show
, strlen(show
));