5af3c86339d88aa3140d4f316d3ae1894e757f74
[o2demo] / src / demo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include <GL/gl.h>
6 #include <GL/glu.h>
7 #include "demo.h"
8 #include "screen.h"
9 #include "cfgopt.h"
10
11 static int console_active;
12
13 int demo_init(int argc, char **argv)
14 {
15         struct screen *scr;
16         char *env;
17
18         if(load_config("demo.cfg") == -1) {
19                 return -1;
20         }
21         if((env = getenv("START_SCR"))) {
22                 opt.start_scr = env;
23         }
24         if(parse_args(argc, argv) == -1) {
25                 return -1;
26         }
27
28         glEnable(GL_DEPTH_TEST);
29         glEnable(GL_CULL_FACE);
30
31         if(scr_init() == -1) {
32                 return -1;
33         }
34         if(opt.start_scr) {
35                 scr = scr_lookup(opt.start_scr);
36         } else {
37                 scr = scr_screen(0);
38         }
39
40         if(!scr || scr_change(scr, 4000) == -1) {
41                 fprintf(stderr, "screen %s not found\n", opt.start_scr ? opt.start_scr : "0");
42                 return -1;
43         }
44
45         return 0;
46 }
47
48 void demo_cleanup(void)
49 {
50         scr_shutdown();
51 }
52
53 void demo_draw(void)
54 {
55         scr_update();
56         scr_draw();
57 }
58
59 void demo_reshape(int x, int y)
60 {
61         glViewport(0, 0, x, y);
62
63         glMatrixMode(GL_PROJECTION);
64         glLoadIdentity();
65         gluPerspective(50.0, win_aspect, 0.5, 500.0);
66 }
67
68 static void change_screen(int idx)
69 {
70         printf("change screen %d\n", idx);
71         scr_change(scr_screen(idx), 4000);
72 }
73
74 #define CBUF_SIZE       64
75 #define CBUF_MASK       (CBUF_SIZE - 1)
76 void demo_keyboard(int key, int pressed)
77 {
78         static char cbuf[CBUF_SIZE];
79         static int rd, wr;
80         char inp[CBUF_SIZE + 1], *dptr;
81         int i, nscr;
82
83         if(pressed) {
84                 switch(key) {
85                 case 27:
86                         demo_quit();
87                         break;
88
89                 case '`':
90                         console_active = !console_active;
91                         if(console_active) {
92                                 printf("> ");
93                                 fflush(stdout);
94                         } else {
95                                 putchar('\n');
96                         }
97                         return;
98
99                 case '\b':
100                         if(console_active) {
101                                 if(wr != rd) {
102                                         printf("\b \b");
103                                         fflush(stdout);
104                                         wr = (wr + CBUF_SIZE - 1) & CBUF_MASK;
105                                 }
106                                 return;
107                         }
108                         break;
109
110                 case '\n':
111                 case '\r':
112                         if(console_active) {
113                                 dptr = inp;
114                                 while(rd != wr) {
115                                         *dptr++ = cbuf[rd];
116                                         rd = (rd + 1) & CBUF_MASK;
117                                 }
118                                 *dptr = 0;
119                                 if(inp[0]) {
120                                         printf("\ntrying to match: %s\n", inp);
121                                         nscr = scr_num_screens();
122                                         for(i=0; i<nscr; i++) {
123                                                 if(strstr(scr_screen(i)->name, inp)) {
124                                                         change_screen(i);
125                                                         break;
126                                                 }
127                                         }
128                                 }
129                                 console_active = 0;
130                                 return;
131                         }
132                         break;
133
134                 default:
135                         if(key >= '1' && key <= '9' && key <= '1' + scr_num_screens()) {
136                                 change_screen(key - '1');
137                         } else if(key == '0' && scr_num_screens() >= 10) {
138                                 change_screen(9);
139                         }
140
141                         if(console_active) {
142                                 if(key < 256 && isprint(key)) {
143                                         putchar(key);
144                                         fflush(stdout);
145
146                                         cbuf[wr] = key;
147                                         wr = (wr + 1) & CBUF_MASK;
148                                         if(wr == rd) { /* overflow */
149                                                 rd = (rd + 1) & CBUF_MASK;
150                                         }
151                                 }
152                                 return;
153                         }
154                         break;
155                 }
156
157                 scr_keypress(key);
158         }
159 }
160
161 void demo_mbutton(int bn, int pressed, int x, int y)
162 {
163 }
164
165 void demo_mmotion(int x, int y)
166 {
167 }