font: don't segfault if font is wider than specified
[fbpad.git] / fbpad.c
blob8efba0ca2376d8f6bfd6d214397167342b8d4968
1 #include <poll.h>
2 #include <pty.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include "pad.h"
6 #include "term.h"
7 #include "util.h"
9 #define SHELL "/bin/bash"
10 #define TAGS 8
11 #define CTRLKEY(x) ((x) - 96)
13 static struct term_state terms[TAGS * 2];
14 static int cterm; /* current tag */
15 static int lterm; /* last tag */
16 static int exitit;
18 static int readchar(void)
20 char b;
21 if (read(STDIN_FILENO, &b, 1) > 0)
22 return (int) b;
23 return -1;
26 static void showterm(int n)
28 if (lterm % TAGS != cterm % TAGS)
29 lterm = cterm;
30 term_save(&terms[cterm]);
31 cterm = n;
32 term_load(&terms[cterm]);
35 static void directkey(void)
37 int c = readchar();
38 if (c == ESC) {
39 switch ((c = readchar())) {
40 case 'c':
41 if (!term_fd())
42 term_exec(SHELL);
43 return;
44 case 'j':
45 case 'k':
46 showterm((cterm + TAGS) % ARRAY_SIZE(terms));
47 return;
48 case 'o':
49 showterm(lterm);
50 return;
51 case CTRLKEY('q'):
52 exitit = 1;
53 return;
54 default:
55 term_send(ESC);
58 term_send(c);
61 static void mainloop(void)
63 struct pollfd ufds[2];
64 int rv;
65 struct termios oldtermios, termios;
66 tcgetattr(STDIN_FILENO, &termios);
67 oldtermios = termios;
68 cfmakeraw(&termios);
69 tcsetattr(STDIN_FILENO, TCSAFLUSH, &termios);
70 memset(ufds, 0, sizeof(ufds));
71 ufds[0].fd = STDIN_FILENO;
72 ufds[0].events = POLLIN;
73 ufds[1].fd = term_fd();
74 ufds[1].events = POLLIN;
75 while (!exitit && (rv = poll(ufds, term_fd() ? 2 : 1, 1000)) != -1) {
76 if (ufds[0].revents & (POLLHUP | POLLERR | POLLNVAL))
77 break;
78 if (term_fd() && ufds[1].revents & (POLLHUP | POLLERR | POLLNVAL))
79 term_end();
80 if (term_fd() && ufds[1].revents & POLLIN)
81 term_read();
82 if (ufds[0].revents & POLLIN)
83 directkey();
84 ufds[1].fd = term_fd();
86 tcsetattr(STDIN_FILENO, 0, &oldtermios);
89 int main(void)
91 char *hide = "\x1b[?25l";
92 char *clear = "\x1b[2J\x1b[H";
93 char *show = "\x1b[?25h";
94 write(STDOUT_FILENO, hide, strlen(hide));
95 write(STDOUT_FILENO, clear, strlen(clear));
96 pad_init();
97 pad_blank();
98 mainloop();
99 pad_free();
100 write(STDOUT_FILENO, clear, strlen(clear));
101 write(STDOUT_FILENO, show, strlen(show));
102 return 0;