fbdev backend works
[retrobench] / src / fbdev / fbevents.c
1 #include <stdio.h>
2 #include <assert.h>
3 #include <unistd.h>
4 #include <fcntl.h>
5 #include <termios.h>
6 #include "fbevents.h"
7
8 static struct termios orig_state;
9 static int term_fd = -1;        /* tty file descriptor */
10
11 static void (*keyb_func)(int, int, void*);
12 static void *keyb_cls;
13 static void (*mbutton_func)(int, int, int, int, void*);
14 static void *mbutton_cls;
15 static void (*mmotion_func)(int, int, void*);
16 static void *mmotion_cls;
17
18
19 int fbev_init(void)
20 {
21         struct termios tstate;
22
23         if((term_fd = open("/dev/tty", O_RDWR)) == -1) {
24                 perror("failed to open tty");
25                 return -1;
26         }
27         fcntl(term_fd, F_SETFL, fcntl(term_fd, F_GETFL) | O_NONBLOCK);
28
29         if(tcgetattr(term_fd, &tstate) == -1) {
30                 perror("failed to retrieve tty attribs");
31                 close(term_fd);
32                 return -1;
33         }
34         orig_state = tstate;
35
36         cfmakeraw(&tstate);
37         /* keep output flags as they where, since we'll be drawing directly to fbdev */
38         tstate.c_oflag = orig_state.c_oflag;
39         if(tcsetattr(term_fd, TCSANOW, &tstate) == -1) {
40                 perror("failed put terminal into raw mode");
41                 close(term_fd);
42                 return -1;
43         }
44         return 0;
45 }
46
47 void fbev_shutdown(void)
48 {
49         if(term_fd >= 0) {
50                 tcsetattr(term_fd, TCSANOW, &orig_state);
51                 close(term_fd);
52                 term_fd = -1;
53         }
54 }
55
56 void fbev_update(void)
57 {
58         char buf[64];
59         int i, sz;
60         assert(term_fd >= 0);
61
62         while((sz = read(term_fd, buf, 64)) > 0) {
63                 if(keyb_func) {
64                         for(i=0; i<sz; i++) {
65                                 keyb_func(buf[i], 1, keyb_cls);
66                         }
67                 }
68         }
69 }
70
71 void fbev_keyboard(void (*func)(int, int, void*), void *cls)
72 {
73         keyb_func = func;
74         keyb_cls = cls;
75 }
76
77 void fbev_mbutton(void (*func)(int, int, int, int, void*), void *cls)
78 {
79         mbutton_func = func;
80         mbutton_cls = cls;
81 }
82
83 void fbev_mmotion(void (*func)(int, int, void*), void *cls)
84 {
85         mmotion_func = func;
86         mmotion_cls = cls;
87 }