oops, that commit wasn't so clean
[hrr.git] / main.c
blob14198bdcbb28208fa18a7e4da7f7862b658ae3ee
1 /*
2 -----BEGIN PGP SIGNED MESSAGE-----
3 Hash: SHA1
5 m m mm mmm .----------. .---------------------. mmm mm m m
6 8 8 88 888 | .--------` | .------------------` 888 88 8 8
7 8 8 88 888 | ```````|`V```````| |``||``|`````| 888 88 8 8
8 8 8 88 888 `------ | | [] | |``````|| | [] | 888 88 8 8
9 8 8 88 888 |`````` | | | ````|```` | | 888 88 8 8
10 ` ` `` ``` ``````````````> |````````````| |`` ``` `` ` `
11 ==============` `---`
12 L A B O R A T O R I E S
14 This file is part of Hacker Radio Rec.
16 Hacker Radio Rec is free software: you can redistribute it and/or
17 modify it under the terms of the GNU General Public License as
18 published by the Free Software Foundation, either version 3 of
19 the License or (at your option) any later version.
21 Hacker Radio Rec is distributed in the hope that it will be
22 useful, but WITHOUT ANY WARRANTY; without even the implied
23 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
24 See the GNU General Public License for more details.
26 Copyright (C) 2009, Thea DeSilva
27 You can find a copy of GNU General Public License in COPYING
29 #include "includes.h"
30 #include "pictures.h"
32 struct menu_entry_t menu_wave_text[] = {
33 {"copy", CALL_BUTTON, MENU_WAVE_COPY, menu_bottom},
34 {"cut", CALL_BUTTON, MENU_WAVE_CUT, menu_bottom},
35 {"paste", CALL_BUTTON, MENU_WAVE_PASTE, menu_bottom},
36 {"zoom to",CALL_BUTTON, MENU_WAVE_ZOOMTO, menu_bottom},
37 {"clear", CALL_BUTTON, MENU_WAVE_CLEAR, menu_bottom},
38 {"delete", CALL_BUTTON, MENU_WAVE_DELETE, menu_bottom},
39 {NULL, NULL, NULL, NULL}
42 const color_t menu_color = { 0xaf, 0xaf, 0x54 };
44 struct menu_entry_t menu_button_text[] = {
45 {"load", CALL_BUTTON, MENU_LOAD, menu_bottom},
46 {"save", CALL_BUTTON, MENU_SAVE, menu_bottom},
47 {"clear selection", CALL_BUTTON, MENU_CLEAR, menu_bottom},
48 {"clear track", CALL_BUTTON, MENU_CLEAR_TRACK, menu_bottom},
49 {NULL, NULL, NULL, NULL}
52 struct select_file_t *cue_file;
54 stk_t stk[STACK_SIZE];
55 Sint32 stk_pointer = 0;
57 char tmp_path[MAX_CHARS] = { 0 };
59 group_t *main_grp, *sub_grp, *splash_grp, *time_bar_grp, *menu_grp, *menu_wave_grp;
61 struct object_t *vert, *time_bar, *main_obj;
63 struct object_t *start_obj, *stop_obj, *pause_obj, *play_obj, *end_obj, *rec_obj;
64 struct object_t *progress_bar, *message_bar, *memory_bar;
66 /* clear_dir {{{ */
68 Sint32 clear_dir_depth;
70 Sint32 clear_dir(char *path) {
71 struct stat sb, qsb;
72 Sint32 nbytes;
73 char buf2[MAX_CHARS];
74 long base;
75 struct dirent *dp;
76 unsigned char *buf, *ebuf, *cp;
77 int fp;
78 if((fp =open(path, O_RDONLY,0)) == -1)
79 return;
80 fstat(fp, &sb);
81 buf = (unsigned char *)malloc(sb.st_size);
83 clear_dir_depth++;
84 while((nbytes= getdirentries(fp,buf,sb.st_size,&base)) > 0 ){
85 ebuf = buf+nbytes;
86 cp = buf;
87 while(cp<ebuf) {
88 dp = (struct dirent *)cp;
89 if(dp->d_fileno!=0) {
90 if(dp->d_type == DT_REG) {
91 snprintf(buf2, MAX_CHARS, "%s/%s", path, dp->d_name);
92 if(unlink(buf2)<0) return 0;
94 if(dp->d_type == DT_DIR &&
95 strcmp(".", dp->d_name)!=0 &&
96 strcmp("..",dp->d_name)!=0) {
97 snprintf(buf2,MAX_CHARS-1,"%s/%s", path,dp->d_name);
98 if(clear_dir(buf2)==0) return 0;
101 cp+=dp->d_reclen;
104 free(buf);
105 close(fp);
106 rmdir(path);
107 putchar('.');
108 fflush(stdout);
109 clear_dir_depth--;
110 if(clear_dir_depth == 0)
111 putchar('\n');
112 return 1;
114 /* }}} */
115 /* setup_windows {{{ */
116 void setup_windows(Sint32 w, Sint32 h) {
117 obj_param_t tmp_parm;
118 struct object_t *tmp_obj;
120 main_grp = new_group(0,0, gui_screen->w, gui_screen->h, 0,0);
122 // PARM(0,0, w, h, &globl_fg, &globl_bg, 0, proc_back);
124 tmp_parm.x = 0; tmp_parm.y = 0;
125 tmp_parm.w = w; tmp_parm.h = h;
126 tmp_parm.fg = &globl_fg;
127 tmp_parm.bg = &globl_bg;
128 tmp_parm.flags = 0;
129 tmp_parm.proc = proc_back;
131 new_obj(main_grp, &tmp_parm);
133 if(config_file.do_splash==1) {
134 tmp_parm.proc = proc_start_splash;
135 new_obj(main_grp, &tmp_parm);
139 PARM( VX(311)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg, LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|CALL_BUTTON, proc_icon_button);
140 tmp_parm.dp1 = (void *)move_xpm;
141 tmp_parm.d1 = FALSE;
142 tmp_parm.d2 = 1;
143 tmp_parm.callback = bottom;
144 tmp_parm.user_flags = CMD_MOVE;
145 new_obj(main_grp, &tmp_parm);
148 PARM( VX(311), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
149 new_obj(main_grp, &tmp_parm);
151 PARM( VX(275)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg, LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|CALL_BUTTON, proc_icon_button);
152 tmp_parm.dp1 = (void *)envelope_xpm;
153 tmp_parm.d2 = 1;
154 tmp_parm.d1 = FALSE;
155 tmp_parm.callback = bottom;
156 tmp_parm.user_flags = CMD_ENVELOPE;
157 new_obj(main_grp, &tmp_parm);
160 PARM( VX(275), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
161 new_obj(main_grp, &tmp_parm);
163 PARM( VX(237)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg, LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|CALL_BUTTON, proc_icon_button);
164 tmp_parm.dp1 = (void *)select_xpm;
165 tmp_parm.d2 = 1;
166 tmp_parm.d1 = TRUE;
167 tmp_parm.callback = bottom;
168 tmp_parm.user_flags = CMD_SELECT;
169 new_obj(main_grp, &tmp_parm);
170 current_tool = TOOL_SELECT;
171 PARM( VX(237), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
172 new_obj(main_grp, &tmp_parm);
177 PARM( VX(94), VY(8), VX(85), VY(22), &globl_fg, &globl_bg, DROP_SHADOW|SHOW_FOCUS|CALL_BUTTON, proc_button_box);
178 tmp_parm.dp1 = (void *)"menu";
179 tmp_parm.user_flags = CMD_MENU;
180 tmp_parm.callback = bottom;
181 tmp_obj = new_obj(main_grp, &tmp_parm);
183 PARM( VX(6), VY(8), VX(85), VY(22), &globl_fg, &globl_bg, DROP_SHADOW|SHOW_FOCUS|CALL_BUTTON, proc_button_box);
184 tmp_parm.dp1 = (void *)"live";
185 tmp_parm.callback = bottom;
186 tmp_parm.user_flags = CMD_LIVE;
187 new_obj(main_grp, &tmp_parm);
189 PARM( VX(707), VY(8), VX(85), VY(22), &globl_fg, &globl_bg, DROP_SHADOW|SHOW_FOCUS|CALL_BUTTON, proc_button_box);
190 tmp_parm.dp1 = (void *)"quit";
191 tmp_parm.callback = nah_really;
192 new_obj(main_grp, &tmp_parm);
194 PARM( VX(619), VY(8), VX(85), VY(22), &globl_fg, &globl_bg, DROP_SHADOW|SHOW_FOCUS|CALL_BUTTON, proc_button_box);
195 tmp_parm.dp1 = (void *)"manual";
196 tmp_parm.callback = bottom;
197 tmp_parm.user_flags = CMD_MANUAL;
198 new_obj(main_grp, &tmp_parm);
202 PARM( VX(575)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
203 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
204 tmp_parm.dp1 = (void *)end_xpm;
205 tmp_parm.d2 = 2;
206 tmp_parm.d1 = FALSE;
207 tmp_parm.user_flags = CMD_END;
208 tmp_parm.callback = bottom;
209 end_obj = new_obj(main_grp, &tmp_parm);
210 PARM( VX(575), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
211 new_obj(main_grp, &tmp_parm);
213 PARM( VX(539)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
214 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
215 tmp_parm.dp1 = (void *)rec_xpm;
216 tmp_parm.d2 = 2;
217 tmp_parm.d1 = FALSE;
218 tmp_parm.user_flags = CMD_REC;
219 tmp_parm.callback = bottom;
220 rec_obj = new_obj(main_grp, &tmp_parm);
221 PARM( VX(539), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
222 new_obj(main_grp, &tmp_parm);
224 PARM( VX(503)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
225 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
226 tmp_parm.dp1 = (void *)play_xpm;
227 tmp_parm.d2 = 2;
228 tmp_parm.d1 = FALSE;
229 tmp_parm.user_flags = CMD_PLAY;
230 tmp_parm.callback = bottom;
232 play_obj = new_obj(main_grp, &tmp_parm);
233 PARM( VX(503), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
234 new_obj(main_grp, &tmp_parm);
236 PARM( VX(467)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
237 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
238 tmp_parm.dp1 = (void *)pause_xpm;
239 tmp_parm.d2 = 2;
240 tmp_parm.d1 = FALSE;
241 tmp_parm.user_flags = CMD_PAUSE;
242 tmp_parm.callback = bottom;
243 pause_obj = new_obj(main_grp, &tmp_parm);
244 PARM( VX(467), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
245 new_obj(main_grp, &tmp_parm);
247 PARM( VX(431)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
248 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
249 tmp_parm.dp1 = (void *)stop_xpm;
250 tmp_parm.d2 = 2;
251 tmp_parm.d1 = FALSE;
252 tmp_parm.user_flags = CMD_STOP;
253 tmp_parm.callback = bottom;
254 stop_obj = new_obj(main_grp, &tmp_parm);
255 PARM( VX(431), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
256 new_obj(main_grp, &tmp_parm);
258 PARM( VX(395)+1, VY(8)+1, 22, 20, &globl_fg, &globl_bg,
259 LOAD_XPM_FROM_ARRAY|SHOW_FOCUS|SINGLE_RADIO|CALL_BUTTON, proc_icon_button);
260 tmp_parm.dp1 = (void *)start_xpm;
261 tmp_parm.d2 = 2;
262 tmp_parm.d1 = FALSE;
263 tmp_parm.user_flags = CMD_START;
264 tmp_parm.callback = bottom;
265 start_obj = new_obj(main_grp, &tmp_parm);
266 PARM( VX(395), VY(8), 24, 22, &globl_fg, &globl_bg, DROP_SHADOW, proc_shadow_box);
267 new_obj(main_grp, &tmp_parm);
269 PARM( VX(778), VY(41), VX(11), VY(554)-35, &globl_fg, &globl_bg, SHOW_FOCUS|CALL_BUTTON, proc_scroll_bar);
270 tmp_parm.d1 = 0;
271 tmp_parm.d2 = 0xff;
272 tmp_parm.user_flags = CMD_VSCROLL;
273 tmp_parm.callback = bottom;
274 vert = new_obj(main_grp, &tmp_parm);
277 PARM( VX(10), VY(41), VX(765), VY(554)-34, &globl_fg, &globl_bg, 0, proc_box);
278 new_obj(main_grp, &tmp_parm);
280 PARM( VX(10)+1, VY(41)+1, VX(765)-1, VY(554)-35, &globl_fg, &globl_bg, 0, proc_main);
281 main_obj = new_obj(main_grp, &tmp_parm);
283 PARM(VX(10)+1,VY(554)+11, 127, 22, &globl_fg, &globl_bg, 0, proc_progress_bar);
284 tmp_parm.dp1 = progress_bar_xpm;
285 tmp_parm.dp2 = progress_bar2_xpm;
286 progress_bar = new_obj(main_grp, &tmp_parm);
288 PARM( VX(10), VY(554)+10, 128, 23, &globl_fg, &globl_bg, 0, proc_box);
289 new_obj(main_grp, &tmp_parm);
291 PARM( VX(10)+131, VY(554)+11, VX(786)-141-50, 22, &globl_bg, &globl_fg, 0, proc_message_bar);
292 message_bar = new_obj(main_grp, &tmp_parm);
295 PARM(message_bar->param.x+message_bar->param.w,
296 message_bar->param.y, 50, 22, &globl_fg, &globl_bg, 0,
297 proc_memory_bar);
298 memory_bar = new_obj(main_grp, &tmp_parm);
302 PARM( VX(10)+130, VY(554)+10, VX(786)-140, 23, &globl_fg, &globl_bg, 0, proc_box);
303 new_obj(main_grp, &tmp_parm);
306 PARM( VX(6), VY(37), VX(786), VY(554), &globl_fg, &globl_bg, 0, proc_shadow_box);
307 new_obj(main_grp, &tmp_parm);
311 menu_grp =
312 new_menu(tmp_obj->param.x+2, tmp_obj->param.y+2, menu_button_text, &globl_fg, &globl_bg);
314 menu_wave_grp =
315 new_menu(tmp_obj->param.x+2, tmp_obj->param.y+2, menu_wave_text, &globl_fg, &menu_color);
319 cue_file = setup_overlay_window(400, 300, LOAD, "pants", cue_file_bot);
322 /* }}} */
323 /* setup_main_obj {{{ */
324 Sint32 setup_main_obj(void) {
325 obj_param_t tmp_parm;
326 Sint32 y;
327 sub_grp = new_group(0,0, main_obj->param.w, main_obj->param.h,0,0);
328 intern_update= norm_update;
330 for(y=0;y<TRACKS;y++) {
331 PARM( 6, 62 +(TRACK_SIZE * y) , 0, 8, &globl_fg, &globl_bg, SHOW_FOCUS | SINGLE_RADIO, proc_radio_button);
332 tmp_parm.d1 = FALSE;
333 tmp_parm.d2 = 3;
334 tmp_parm.dp1 = (void *)"auto";
335 new_obj(sub_grp, &tmp_parm);
337 PARM( 6, 75 +(TRACK_SIZE *y), 0, 8, &globl_fg, &globl_bg, SHOW_FOCUS | SINGLE_RADIO, proc_radio_button);
338 tmp_parm.d1 = FALSE;
339 tmp_parm.d2 = 3;
340 tmp_parm.dp1 = (void *)"mute";
341 new_obj(sub_grp, &tmp_parm);
343 PARM( 15, 90 +(TRACK_SIZE *y), 0, 0, &globl_fg, &globl_bg,
344 SHOW_FOCUS | SINGLE_RADIO |LOAD_XPM_FROM_ARRAY|CALL_BUTTON|FADE, proc_icon_button);
345 tmp_parm.d1 = FALSE;
346 tmp_parm.d2 = y;
347 tmp_parm.dp1 = (void *)cue_xpm;
348 tmp_parm.dp2 = (void *)cue_inactive_xpm;
349 tmp_parm.callback = bottom;
350 tmp_parm.user_flags = CMD_CUE;
351 tracks[y].cue = new_obj(sub_grp, &tmp_parm);
354 PARM( 11, 8 +TRACK_SIZE * y, 0,0, &globl_fg, &globl_bg, ((y&1)==0 ? BLUE : 0), proc_knob);
355 tmp_parm.d1 = 0x80;
356 tmp_parm.d2 = 0x100;
357 new_obj(sub_grp, &tmp_parm);
359 PARM( 4, 2 + (TRACK_SIZE * y), 56, 110, &globl_fg, &globl_bg, 0, proc_shadow_box);
360 new_obj(sub_grp, &tmp_parm);
362 PARM( 66, 3 + (TRACK_SIZE * y), main_obj->param.w - 71, 169, &globl_fg, &globl_bg, 0, proc_wave);
363 tmp_parm.d2 = y;
364 tracks[y].wave = new_obj(sub_grp, &tmp_parm);
365 tracks[y].dirty = 1;
366 tracks[y].empty = 0;
368 PARM( 65, 2 + (TRACK_SIZE * y), main_obj->param.w - 70, 170, &globl_fg, &globl_bg, 0, proc_shadow_box);
369 new_obj(sub_grp, &tmp_parm);
373 tracks[0].empty = 0;
375 left = IMG_ReadXPMFromArray(move_left_xpm);
376 right= IMG_ReadXPMFromArray(move_right_xpm);
378 printf("0x%x\n", left);
380 /*}}}*/
381 /* setup_splash {{{ */
382 void setup_splash(void) {
383 obj_param_t tmp_parm;
384 #define SPLASH_WIDTH 585
385 #define SPLASH_HEIGHT 400
386 splash_grp = new_group( (gui_screen->w/2) - (SPLASH_WIDTH/2),
387 (gui_screen->h/2) - (SPLASH_HEIGHT/2),
388 SPLASH_WIDTH+2, SPLASH_HEIGHT+2, 0,0);
389 simple_window(splash_grp, SPLASH_WIDTH, SPLASH_HEIGHT);
390 PARM(3,15,0,0,&globl_fg, &globl_bg, LOAD_XPM_FROM_ARRAY, proc_bitmap);
391 tmp_parm.dp1 = (void *)splash_xpm;
392 new_obj(splash_grp, &tmp_parm);
393 PARM(3,15,580,382,&globl_fg, &globl_bg, 0, proc_end_splash);
394 new_obj(splash_grp, &tmp_parm);
396 #undef SPLASH_WIDTH
397 #undef SPLASH_HEIGHT
399 /* }}} */
400 /* setup_time_bar {{{ */
401 void setup_time_bar(void) {
402 obj_param_t tmp_parm;
403 time_bar_bmp = SDL_CreateRGBSurface(SDL_SWSURFACE, VX(766)-112, 30, 24,
404 gui_screen->format->Rmask, gui_screen->format->Gmask,
405 gui_screen->format->Bmask, gui_screen->format->Amask);
406 if(time_bar_bmp <= 0) {
407 printf("bunko\n");
408 exit(-1);
410 time_bar_grp = new_group(0,0, time_bar_bmp->w, time_bar_bmp->h, 0, 0);
412 PARM( 0, 0, time_bar_bmp->w, time_bar_bmp->h, &globl_bg, &globl_fg, SHOW_FOCUS|CALL_BUTTON, proc_time_bar);
413 time_bar = new_obj(time_bar_grp, &tmp_parm);
415 broadcast_group(time_bar_grp, MSG_START,0);
417 /* }}} */
419 void terminate(int sigraised, siginfo_t *info, void *a) {
420 if(tmp_path[0] != 0) {
421 printf("\nclearing %s", tmp_path); fflush(stdout);
422 clear_dir_depth = 0;
423 if(clear_dir(tmp_path)==0)
424 printf("Yeah can't do that, you do it\n");
426 exit(-1);
429 SDL_Surface *ctx_old_gc, *time_bar_bmp;
430 group_t *ctx_old;
431 void *ctx_updater;
433 Sint32 main(void) {
434 struct sigaction action;
435 pthread_mutexattr_t attr;
436 char buf[MAX_CHARS];
438 sigemptyset(&action.sa_mask);
439 action.sa_flags = 0;
440 action.sa_handler = terminate;
441 sigaction(SIGTERM, &action, NULL);
442 sigaction(SIGINT, &action, NULL);
443 sigaction(SIGQUIT, &action, NULL);
447 globl_flags = 0;
448 globl_fg.r =
449 globl_fg.g =
450 globl_fg.b = 0;
451 globl_bg.r=
452 globl_bg.g = 194;
453 globl_bg.b = 184;
454 globl_move_color.r = 90;
455 globl_move_color.g = 32;
456 globl_move_color.b = 24;
457 globl_wait_tick = 1;
459 set_defaults();
460 snprintf(buf, MAX_CHARS, "%s/.hrr/hrr.conf", getenv("HOME"));
461 if(load_config(buf) == 0)
462 load_config("/etc/hrr.conf");
464 zoom = 1.0f/config_file.start_scale;
466 init_gui(config_file.screen_w, config_file.screen_h,config_file.fullscreen*FULLSCREEN);
467 SDL_WM_SetCaption("HRR!!", "HRR!!");
468 SDL_WM_SetIcon(IMG_ReadXPMFromArray(icon_xpm), NULL);
470 printf("0x%x\n", gui_screen);
472 setup_windows(config_file.screen_w, config_file.screen_h);
473 setup_main_obj();
474 if(config_file.do_splash==1)
475 setup_splash();
476 setup_time_bar();
478 snprintf(tmp_path, MAX_CHARS, "/tmp/hrr_%d", getpid());
479 clear_dir(tmp_path);
480 if(mkdir(tmp_path, 0644)<0) {
481 perror(tmp_path);
482 exit(-1);
486 // HOST_BLOCK;
488 pthread_mutexattr_init(&attr);
489 if(pthread_mutex_init(&mtx, &attr)<0) {
490 perror("mutex");
491 exit(-1);
494 init_not(HOST, host_msg_recv);
496 new_thread(loader);
497 // coder_thread = new_thread(coder_main);
498 // player_thread = new_thread(player_main);
502 // if(wocka==1)
503 // new_thread(wocka_wocka);
505 cursor.track = 1;
506 cursor.pos = 60.0f;
508 // new_thread(update_memory_bar);
509 group_loop(main_grp);
510 terminate(SIGTERM, NULL, NULL);
513 void loader(void) {
514 while(main_grp->go==0) SDL_Delay(40);
515 printf("we are a go\n");
516 coder_thread = new_thread(coder_main);
517 player_thread = new_thread(player_main);
518 if(wocka==1)
519 new_thread(wocka_wocka);
520 new_thread(update_memory_bar);
521 return;
524 void update_memory_bar(void) {
525 for(;;) {
526 send_host(NOT_MEMORY_BAR, NULL, 0, STORE);
527 SDL_Delay(2000);
532 Thank you for your attention
533 -----BEGIN PGP SIGNATURE-----
534 Version: GnuPG v1.4.9 (OpenBSD)
536 iEYEARECAAYFAkrsgw4ACgkQMNO4A6bnBrNW2wCgi3Rb9WdU6Y+9Rma4SYALren6
537 L5oAmQH9AF69CyM+S6q5qu1a+z2pkb0A
538 =MC0u
539 -----END PGP SIGNATURE-----