vt102: move vt102 related stuff from term.c
[fbpad.git] / fbpad.c
blob93a5006e5009a52071081e9b066d33d283a004d2
1 #include <errno.h>
2 #include <poll.h>
3 #include <pty.h>
4 #include <signal.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <linux/vt.h>
8 #include "pad.h"
9 #include "term.h"
10 #include "util.h"
12 #define SHELL "/bin/bash"
13 #define TAGS 8
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 */
19 static int exitit;
21 static int readchar(void)
23 char b;
24 if (read(STDIN_FILENO, &b, 1) > 0)
25 return (int) b;
26 return -1;
29 static void showterm(int n)
31 if (lterm % TAGS != cterm % TAGS)
32 lterm = cterm;
33 term_save(&terms[cterm]);
34 cterm = n;
35 term_load(&terms[cterm]);
38 static void directkey(void)
40 int c = readchar();
41 if (c == ESC) {
42 switch ((c = readchar())) {
43 case 'c':
44 if (!term_fd())
45 term_exec(SHELL);
46 return;
47 case 'j':
48 case 'k':
49 showterm((cterm + TAGS) % ARRAY_SIZE(terms));
50 return;
51 case 'o':
52 showterm(lterm);
53 return;
54 case CTRLKEY('q'):
55 exitit = 1;
56 return;
57 default:
58 term_send(ESC);
61 term_send(c);
64 static void mainloop(void)
66 struct pollfd ufds[2];
67 int rv;
68 struct termios oldtermios, termios;
69 tcgetattr(STDIN_FILENO, &termios);
70 oldtermios = termios;
71 cfmakeraw(&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;
78 while (!exitit) {
79 rv = poll(ufds, term_fd() ? 2 : 1, 1000);
80 if (rv == -1 && errno != EINTR)
81 break;
82 if (ufds[0].revents & (POLLHUP | POLLERR | POLLNVAL))
83 break;
84 if (term_fd() && ufds[1].revents & (POLLHUP | POLLERR | POLLNVAL))
85 term_end();
86 if (term_fd() && ufds[1].revents & POLLIN)
87 term_read();
88 if (ufds[0].revents & POLLIN)
89 directkey();
90 ufds[1].fd = term_fd();
92 tcsetattr(STDIN_FILENO, 0, &oldtermios);
95 static void signalreceived(int n)
97 if (exitit)
98 return;
99 switch (n) {
100 case SIGUSR1:
101 term_save(&terms[cterm]);
102 ioctl(STDIN_FILENO, VT_RELDISP, 1);
103 break;
104 case SIGUSR2:
105 pad_shown();
106 term_load(&terms[cterm]);
107 break;
111 static void setupsignals(void)
113 struct vt_mode vtm;
114 vtm.mode = VT_PROCESS;
115 vtm.waitv = 0;
116 vtm.relsig = SIGUSR1;
117 vtm.acqsig = SIGUSR2;
118 vtm.frsig = 0;
119 ioctl(STDIN_FILENO, VT_SETMODE, &vtm);
121 signal(SIGUSR1, signalreceived);
122 signal(SIGUSR2, signalreceived);
125 int main(void)
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));
132 term_init();
133 term_blank();
134 setupsignals();
135 mainloop();
136 term_free();
137 write(STDOUT_FILENO, hide, strlen(hide));
138 write(STDOUT_FILENO, show, strlen(show));
139 return 0;