static void print_event(int x, int y, caca_event_t *ev) { int character; switch(caca_get_event_type(ev)) { case CACA_EVENT_NONE: caca_printf(cv, x, y, "CACA_EVENT_NONE"); break; case CACA_EVENT_KEY_PRESS: character = caca_get_event_key_ch(ev); caca_printf(cv, x, y, "CACA_EVENT_KEY_PRESS 0x%02x (%c)", character, (character > 0x1f && character < 0x80) ? character : '?'); break; case CACA_EVENT_KEY_RELEASE: character = caca_get_event_key_ch(ev); caca_printf(cv, x, y, "CACA_EVENT_KEY_RELEASE 0x%02x (%c)", character, (character > 0x1f && character < 0x80) ? character : '?'); break; case CACA_EVENT_MOUSE_MOTION: caca_printf(cv, x, y, "CACA_EVENT_MOUSE_MOTION %u %u", caca_get_event_mouse_x(ev), caca_get_event_mouse_y(ev)); break; case CACA_EVENT_MOUSE_PRESS: caca_printf(cv, x, y, "CACA_EVENT_MOUSE_PRESS %u", caca_get_event_mouse_button(ev)); break; case CACA_EVENT_MOUSE_RELEASE: caca_printf(cv, x, y, "CACA_EVENT_MOUSE_RELEASE %u", caca_get_event_mouse_button(ev)); break; case CACA_EVENT_RESIZE: caca_printf(cv, x, y, "CACA_EVENT_RESIZE %u %u", caca_get_event_resize_width(ev), caca_get_event_resize_height(ev)); break; case CACA_EVENT_QUIT: caca_printf(cv, x, y, "CACA_EVENT_QUIT"); break; default: caca_printf(cv, x, y, "CACA_EVENT_UNKNOWN"); } }
std::list<int>* CacaWrapperGui::getEvents() const{ std::list<int>* events = new std::list<int>(); int search; int retKey; int retok = 0; caca_event_t _ev; retok = caca_get_event(_dp, CACA_EVENT_KEY_PRESS, &_ev, 0); retKey = caca_get_event_key_ch(&_ev); search = this->_eventKeyboard.find(retKey)->second; if (search != 0 && retok) events->push_back(search); return events; }
/** * Proccess pending event */ static void Manage(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; struct caca_event ev; while (caca_get_event(sys->dp, CACA_EVENT_ANY, &ev, 0) > 0) { switch (caca_get_event_type(&ev)) { case CACA_EVENT_KEY_PRESS: { const int caca = caca_get_event_key_ch(&ev); for (int i = 0; keys[i].caca != -1; i++) { if (keys[i].caca == caca) { const int vlc = keys[i].vlc; if (vlc >= 0) vout_display_SendEventKey(vd, vlc); return; } } if (caca >= 0x20 && caca <= 0x7f) { vout_display_SendEventKey(vd, caca); return; } break; } case CACA_EVENT_RESIZE: vout_display_SendEventDisplaySize(vd, caca_get_event_resize_width(&ev), caca_get_event_resize_height(&ev)); break; case CACA_EVENT_MOUSE_MOTION: { vout_display_place_t place; Place(vd, &place); const unsigned x = vd->source.i_x_offset + (int64_t)(caca_get_event_mouse_x(&ev) - place.x) * vd->source.i_visible_width / place.width; const unsigned y = vd->source.i_y_offset + (int64_t)(caca_get_event_mouse_y(&ev) - place.y) * vd->source.i_visible_height / place.height; caca_set_mouse(sys->dp, 1); vout_display_SendEventMouseMoved(vd, x, y); break; } case CACA_EVENT_MOUSE_PRESS: case CACA_EVENT_MOUSE_RELEASE: { caca_set_mouse(sys->dp, 1); const int caca = caca_get_event_mouse_button(&ev); for (int i = 0; mouses[i].caca != -1; i++) { if (mouses[i].caca == caca) { if (caca_get_event_type(&ev) == CACA_EVENT_MOUSE_PRESS) vout_display_SendEventMousePressed(vd, mouses[i].vlc); else vout_display_SendEventMouseReleased(vd, mouses[i].vlc); return; } } break; } case CACA_EVENT_QUIT: vout_display_SendEventClose(vd); break; default: break; } } }
int main(int argc, char **argv) { caca_event_t *events; int i, h, quit; cv = caca_create_canvas(80, 24); if(cv == NULL) { printf("Failed to create canvas\n"); return 1; } dp = caca_create_display(cv); if(dp == NULL) { printf("Failed to create display\n"); return 1; } h = caca_get_canvas_height(cv) - 1; caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE); caca_draw_line(cv, 0, 0, caca_get_canvas_width(cv) - 1, 0, ' '); caca_draw_line(cv, 0, h, caca_get_canvas_width(cv) - 1, h, ' '); caca_put_str(cv, 0, h, "type \"quit\" to exit"); caca_refresh_display(dp); events = malloc(h * sizeof(caca_event_t)); memset(events, 0, h * sizeof(caca_event_t)); for(quit = 0; quit < 4; ) { caca_event_t ev; static char const * quit_string[] = { "", "q", "qu", "qui", "quit" }; int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, -1); if(!ret) continue; do { /* "quit" quits */ if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) { int key = caca_get_event_key_ch(&ev); if((key == 'q' && quit == 0) || (key == 'u' && quit == 1) || (key == 'i' && quit == 2) || (key == 't' && quit == 3)) quit++; else if(key == 'q') quit = 1; else quit = 0; } memmove(events + 1, events, (h - 1) * sizeof(caca_event_t)); events[0] = ev; ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0); } while(ret); caca_set_color_ansi(cv, CACA_LIGHTGRAY, CACA_BLACK); caca_clear_canvas(cv); /* Print current event */ caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE); caca_draw_line(cv, 0, 0, caca_get_canvas_width(cv) - 1, 0, ' '); print_event(0, 0, events); caca_draw_line(cv, 0, h, caca_get_canvas_width(cv) - 1, h, ' '); caca_printf(cv, 0, h, "type \"quit\" to exit: %s", quit_string[quit]); /* Print previous events */ caca_set_color_ansi(cv, CACA_WHITE, CACA_BLACK); for(i = 1; i < h && caca_get_event_type(&events[i]); i++) print_event(0, i, events + i); caca_refresh_display(dp); } /* Clean up */ free(events); caca_free_display(dp); caca_free_canvas(cv); return 0; }
JNIEXPORT jint JNICALL Java_org_zoy_caca_Event_getEventKeyCh(JNIEnv *env, jclass cls, jlong ptr) { return caca_get_event_key_ch((caca_event_t *)ptr); }
static VALUE get_event(VALUE self, VALUE event_mask, VALUE timeout) { char utf8[8]; caca_event_t ev; VALUE e; event_mask = rb_funcall(event_mask, rb_intern("to_i"), 0); if(caca_get_event(_SELF, NUM2UINT(event_mask), &ev, NUM2INT(timeout)) == 0) { return Qnil; } switch(caca_get_event_type(&ev)) { case CACA_EVENT_KEY_PRESS: caca_get_event_key_utf8(&ev, utf8); e = rb_funcall(cEventKeyPress, rb_intern("new"), 3, UINT2NUM(caca_get_event_key_ch(&ev)), ULONG2NUM(caca_get_event_key_utf32(&ev)), rb_str_new(utf8, 8)); break; case CACA_EVENT_KEY_RELEASE: caca_get_event_key_utf8(&ev, utf8); e = rb_funcall(cEventKeyRelease, rb_intern("new"), 3, UINT2NUM(caca_get_event_key_ch(&ev)), ULONG2NUM(caca_get_event_key_utf32(&ev)), rb_str_new(utf8, 8)); break; case CACA_EVENT_MOUSE_PRESS: e = rb_funcall(cEventMousePress, rb_intern("new"), 3, UINT2NUM(caca_get_event_mouse_x(&ev)), UINT2NUM(caca_get_event_mouse_y(&ev)), UINT2NUM(caca_get_event_mouse_button(&ev))); break; case CACA_EVENT_MOUSE_RELEASE: e = rb_funcall(cEventMouseRelease, rb_intern("new"), 3, UINT2NUM(caca_get_event_mouse_x(&ev)), UINT2NUM(caca_get_event_mouse_y(&ev)), UINT2NUM(caca_get_event_mouse_button(&ev))); break; case CACA_EVENT_MOUSE_MOTION: e = rb_funcall(cEventMouseMotion, rb_intern("new"), 3, UINT2NUM(caca_get_event_mouse_x(&ev)), UINT2NUM(caca_get_event_mouse_y(&ev)), Qnil); break; case CACA_EVENT_RESIZE: e = rb_funcall(cEventResize, rb_intern("new"), 2, UINT2NUM(caca_get_event_resize_width(&ev)), UINT2NUM(caca_get_event_resize_height(&ev))); break; case CACA_EVENT_QUIT: e = rb_funcall(cEventQuit, rb_intern("new"), 0); break; default: rb_raise(rb_eRuntimeError, "Invalid event received !"); } return e; }
int main(int argc, char **argv) { int refresh = 1, file = 1; unsigned int iw = 0, ih = 0; if(argc < 2) { fprintf(stderr, "%s: missing argument (filename).\n", argv[0]); return 1; } cv = caca_create_canvas(0, 0); if(!cv) return 1; dp = caca_create_display(cv); if(!dp) return 1; for(;;) { caca_event_t ev; unsigned int w, h; int dx = 0, dy = 0; if(!image) { image = caca_create_canvas(0, 0); if(caca_import_canvas_from_file(image, argv[file], "ansi") < 0) { fprintf(stderr, "%s: invalid file `%s'.\n", argv[0], argv[1]); return 1; } ih = caca_get_canvas_height(image); iw = caca_get_canvas_width(image); x = y = 0; caca_set_display_title(dp, argv[file]); refresh = 1; } if(refresh) { refresh_screen(); refresh = 0; } while(caca_get_event(dp, CACA_EVENT_ANY, &ev, -1)) { switch(caca_get_event_type(&ev)) { case CACA_EVENT_QUIT: goto quit; case CACA_EVENT_KEY_PRESS: switch(caca_get_event_key_ch(&ev)) { case CACA_KEY_LEFT: dx -= 2; break; case CACA_KEY_RIGHT: dx += 2; break; case CACA_KEY_UP: dy--; break; case CACA_KEY_DOWN: dy++; break; case CACA_KEY_PAGEUP: dy -= 12; break; case CACA_KEY_PAGEDOWN: dy += 12; break; case CACA_KEY_ESCAPE: case 'q': goto quit; case 'n': file = file + 1 < argc ? file + 1 : 1; caca_free_canvas(image); image = NULL; goto stopevents; case 'p': file = file > 1 ? file - 1 : argc - 1; caca_free_canvas(image); image = NULL; goto stopevents; default: break; } case CACA_EVENT_RESIZE: refresh = 1; goto stopevents; default: break; } } stopevents: w = caca_get_canvas_width(cv); h = caca_get_canvas_height(cv); if(dx | dy) { refresh = 1; x += dx; y += dy; if(x < 0) x = 0; else if(x + w > iw) x = iw > w ? iw - w : 0; if(y < 0) y = 0; else if(y + h > ih) y = ih > h ? ih - h : 0; } } quit: /* Clean up */ caca_free_display(dp); caca_free_canvas(image); caca_free_canvas(cv); return 0; }
int main(int argc, char **argv) { static caca_display_t *dp; static caca_canvas_t *frontcv, *backcv, *mask; int demo, next = -1, paused = 0, next_transition = DEMO_FRAMES; unsigned int i; int tmode = caca_rand(0, TRANSITION_COUNT); /* Set up two canvases, a mask, and attach a display to the front one */ frontcv = caca_create_canvas(0, 0); backcv = caca_create_canvas(0, 0); mask = caca_create_canvas(0, 0); dp = caca_create_display(frontcv); if(!dp) return 1; caca_set_canvas_size(backcv, caca_get_canvas_width(frontcv), caca_get_canvas_height(frontcv)); caca_set_canvas_size(mask, caca_get_canvas_width(frontcv), caca_get_canvas_height(frontcv)); caca_set_display_time(dp, 20000); /* Initialise all demos' lookup tables */ for(i = 0; i < DEMOS; i++) fn[i](PREPARE, frontcv); /* Choose a demo at random */ demo = caca_rand(0, DEMOS); fn[demo](INIT, frontcv); for(;;) { /* Handle events */ caca_event_t ev; while(caca_get_event(dp, CACA_EVENT_KEY_PRESS | CACA_EVENT_QUIT, &ev, 0)) { if(caca_get_event_type(&ev) == CACA_EVENT_QUIT) goto end; switch(caca_get_event_key_ch(&ev)) { case CACA_KEY_ESCAPE: case CACA_KEY_CTRL_C: case CACA_KEY_CTRL_Z: goto end; case ' ': paused = !paused; break; case '\r': if(next == -1) next_transition = frame; break; } } /* Resize the spare canvas, just in case the main one changed */ caca_set_canvas_size(backcv, caca_get_canvas_width(frontcv), caca_get_canvas_height(frontcv)); caca_set_canvas_size(mask, caca_get_canvas_width(frontcv), caca_get_canvas_height(frontcv)); if(paused) goto _paused; /* Update demo's data */ fn[demo](UPDATE, frontcv); /* Handle transitions */ if(frame == next_transition) { next = caca_rand(0, DEMOS); if(next == demo) next = (next + 1) % DEMOS; fn[next](INIT, backcv); } else if(frame == next_transition + TRANSITION_FRAMES) { fn[demo](FREE, frontcv); demo = next; next = -1; next_transition = frame + DEMO_FRAMES; tmode = caca_rand(0, TRANSITION_COUNT); } if(next != -1) fn[next](UPDATE, backcv); frame++; _paused: /* Render main demo's canvas */ fn[demo](RENDER, frontcv); /* If a transition is on its way, render it */ if(next != -1) { fn[next](RENDER, backcv); caca_set_color_ansi(mask, CACA_LIGHTGRAY, CACA_BLACK); caca_clear_canvas(mask); caca_set_color_ansi(mask, CACA_WHITE, CACA_WHITE); transition(mask, tmode, 100 * (frame - next_transition) / TRANSITION_FRAMES); caca_blit(frontcv, 0, 0, backcv, mask); } caca_set_color_ansi(frontcv, CACA_WHITE, CACA_BLUE); if(frame < 100) caca_put_str(frontcv, caca_get_canvas_width(frontcv) - 30, caca_get_canvas_height(frontcv) - 2, " -=[ Powered by libcaca ]=- "); caca_refresh_display(dp); } end: if(next != -1) fn[next](FREE, frontcv); fn[demo](FREE, frontcv); caca_free_display(dp); caca_free_canvas(mask); caca_free_canvas(backcv); caca_free_canvas(frontcv); return 0; }
int main(int argc, char *argv[]) { textentry entries[TEXT_ENTRIES]; caca_canvas_t *cv; caca_display_t *dp; unsigned int i, e = 0, running = 1; cv = caca_create_canvas(0, 0); if(cv == NULL) { printf("Can't create canvas\n"); return -1; } dp = caca_create_display(cv); if(dp == NULL) { printf("Can't create display\n"); return -1; } caca_set_cursor(dp, 1); caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE); caca_put_str(cv, 1, 1, "Text entries - press tab to cycle"); for(i = 0; i < TEXT_ENTRIES; i++) { entries[i].buffer[0] = 0; entries[i].size = 0; entries[i].cursor = 0; entries[i].changed = 1; caca_printf(cv, 3, 3 * i + 4, "[entry %i]", i + 1); } /* Put Unicode crap in the last text entry */ entries[TEXT_ENTRIES - 1].buffer[0] = 'A'; entries[TEXT_ENTRIES - 1].buffer[1] = 'b'; entries[TEXT_ENTRIES - 1].buffer[2] = caca_utf8_to_utf32("Ç", NULL); entries[TEXT_ENTRIES - 1].buffer[3] = caca_utf8_to_utf32("đ", NULL); entries[TEXT_ENTRIES - 1].buffer[4] = caca_utf8_to_utf32("ボ", NULL); entries[TEXT_ENTRIES - 1].buffer[5] = CACA_MAGIC_FULLWIDTH; entries[TEXT_ENTRIES - 1].buffer[6] = caca_utf8_to_utf32("♥", NULL); entries[TEXT_ENTRIES - 1].size = 7; while(running) { caca_event_t ev; for(i = 0; i < TEXT_ENTRIES; i++) { unsigned int j, start, size; if(!entries[i].changed) continue; caca_set_color_ansi(cv, CACA_BLACK, CACA_LIGHTGRAY); caca_fill_box(cv, 2, 3 * i + 5, BUFFER_SIZE + 1, 1, ' '); start = 0; size = entries[i].size; for(j = 0; j < size; j++) { caca_put_char(cv, 2 + j, 3 * i + 5, entries[i].buffer[start + j]); } entries[i].changed = 0; } /* Put the cursor on the active textentry */ caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 5); caca_refresh_display(dp); if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1) == 0) continue; switch(caca_get_event_key_ch(&ev)) { case CACA_KEY_ESCAPE: running = 0; break; case CACA_KEY_TAB: case CACA_KEY_RETURN: e = (e + 1) % TEXT_ENTRIES; break; case CACA_KEY_HOME: entries[e].cursor = 0; break; case CACA_KEY_END: entries[e].cursor = entries[e].size; break; case CACA_KEY_LEFT: if(entries[e].cursor) entries[e].cursor--; break; case CACA_KEY_RIGHT: if(entries[e].cursor < entries[e].size) entries[e].cursor++; break; case CACA_KEY_DELETE: if(entries[e].cursor < entries[e].size) { memmove(entries[e].buffer + entries[e].cursor, entries[e].buffer + entries[e].cursor + 1, (entries[e].size - entries[e].cursor + 1) * 4); entries[e].size--; entries[e].changed = 1; } break; case CACA_KEY_BACKSPACE: if(entries[e].cursor) { memmove(entries[e].buffer + entries[e].cursor - 1, entries[e].buffer + entries[e].cursor, (entries[e].size - entries[e].cursor) * 4); entries[e].size--; entries[e].cursor--; entries[e].changed = 1; } break; default: if(entries[e].size < BUFFER_SIZE) { memmove(entries[e].buffer + entries[e].cursor + 1, entries[e].buffer + entries[e].cursor, (entries[e].size - entries[e].cursor) * 4); entries[e].buffer[entries[e].cursor] = caca_get_event_key_utf32(&ev); entries[e].size++; entries[e].cursor++; entries[e].changed = 1; } break; } } caca_free_display(dp); caca_free_canvas(cv); return 0; }
int main(int argc, char **argv){ SDL_AudioSpec requested, obtained; int quit = 0; int xo, yo; int i, j, k; int meter[4]; static char chars[10] = { '+', '-', '*', '#', 'X', '@', '%', '$', 'M', 'W' }; caca_display_t *dp; caca_canvas_t *cv; caca_canvas_t *pineapple; if(SDL_Init( SDL_INIT_AUDIO ) < 0){ err(1, "Couldnt initialize SDL\n"); exit(1); } cv = caca_create_canvas(80, 24); pineapple = caca_create_canvas(0, 0); if((cv == NULL) || (pineapple == NULL)){ printf("failed to create canvas\n"); return 1; } dp = caca_create_display(cv); caca_set_display_time(dp, 20000); if(dp == NULL){ printf("Failed to create display\n"); return 1; } caca_import_file(pineapple, "./pineapple", ""); atexit(SDL_Quit); requested.freq = 16000; requested.format = AUDIO_U8; requested.samples = 256; requested.callback = audiocb; requested.channels = 1; if(SDL_OpenAudio(&requested, &obtained) == -1){ err(1, "SDL_OpenAudio"); } initchip(); loadfile(argv[1]); SDL_PauseAudio(0); silence(); startplaysong(0); while(!quit) { caca_event_t ev; caca_set_color_ansi(cv, CACA_DEFAULT, CACA_DEFAULT); caca_clear_canvas(cv); xo = caca_get_canvas_width(cv); yo = caca_get_canvas_height(cv); //caca_blit(cv, 0, 0, pineapple, NULL); caca_blit(cv, 55, 0, pineapple, NULL); caca_set_color_ansi(cv, caca_rand(0, 16), caca_rand(0, 16)); caca_put_str(cv, (xo - strlen("pineapple player")) / 2, (yo / 2) - 5, "pineapple player"); caca_set_color_ansi(cv, caca_rand(0, 16), caca_rand(0, 16)); caca_printf(cv, (xo - strlen("song pos -> ")) / 2, (yo / 2) - 3, "song pos -> %x", songpos); for(i = 0; i < 4; i ++) meter[i] = (osc[i].volume*20)/255; /* note visualizer */ i = 0; for(j = 0; j < 25; j=j+6){ for(k = 0; k < 4; k++){ caca_draw_line(cv, (((xo/2)+10)-j)-k, yo, (((xo/2)+10)-j)-k, yo - meter[i], chars[caca_rand(0, 9)]); } i++; } for(i = 0; i < 4; i ++) caca_printf(cv, 0, i, "%0x", osc[i].volume); while(caca_get_event(dp, CACA_EVENT_ANY, &ev, 0)) { if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) { switch(caca_get_event_key_ch(&ev)) { case 'q': case 'Q': case CACA_KEY_ESCAPE: quit = 1; break; } } } caca_refresh_display(dp); } silence(); caca_free_display(dp); caca_free_canvas(cv); return 0; }
int main(int argc, char *argv[]) { /* libcaca/libcaca contexts */ caca_canvas_t *cv; caca_display_t *dp; caca_canvas_t *tex; /* cached canvas size */ int ww, wh, tw, th; /* logic */ int quit = 0; int update = 1; int px, py; float angle = 0; float square[6][2] = { {-SQUARE_SIZE, -SQUARE_SIZE}, {SQUARE_SIZE, -SQUARE_SIZE}, {SQUARE_SIZE, SQUARE_SIZE}, {-SQUARE_SIZE, SQUARE_SIZE}, }; float uv1[6] = { 0, 0, 1, 0, 1, 1 }; float uv2[6] = { 0, 0, 1, 1, 0, 1 }; float rotated[4][2]; int coords1[6], coords2[6]; /* Create displayed canvas */ cv = caca_create_canvas(0, 0); if (!cv) { fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]); return 1; } /* Create texture holding canvas */ tex = caca_create_canvas(16, 16); if (!tex) { fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]); return 1; } /* Open window */ dp = caca_create_display(cv); if (!dp) { fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]); return 1; } /* Set the window title */ caca_set_display_title(dp, "trifiller"); /* Frame duration */ caca_set_display_time(dp, 10000); /* Get displayed canvas size */ ww = caca_get_canvas_width(cv); wh = caca_get_canvas_height(cv); /* Texture size */ tw = caca_get_canvas_width(tex); th = caca_get_canvas_height(tex); /* Load texture if any */ if (argc == 2) { struct image *im = load_image(argv[1]); if (!im) { fprintf(stderr, "%s: unable to load image '%s'\n", argv[0], argv[1]); return 1; } caca_set_dither_algorithm(im->dither, caca_get_dither_algorithm_list(NULL)[4]); caca_dither_bitmap(tex, 0, 0, tw, th, im->dither, im->pixels); unload_image(im); } /* or generate one */ else { int i; for (i = 0; i < 16; i++) { caca_set_color_ansi(tex, (i + 1) % 0xF, i % 0xF); caca_put_str(tex, 0, i, "0123456789ABCDEF"); } } px = 0; py = 0; while (!quit) { caca_event_t ev; unsigned int const event_mask = CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE | CACA_EVENT_QUIT; int event; if (update) event = caca_get_event(dp, event_mask, &ev, 0); else event = caca_get_event(dp, event_mask, &ev, -1); while (event) { if (caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) switch (caca_get_event_key_ch(&ev)) { case 'q': case 'Q': case CACA_KEY_ESCAPE: quit = 1; break; case CACA_KEY_UP: py--; break; case CACA_KEY_DOWN: py++; break; case CACA_KEY_LEFT: px--; break; case CACA_KEY_RIGHT: px++; break; case 'a': angle += 1.0f; break; case 's': angle -= 1.0f; break; } else if (caca_get_event_type(&ev) == CACA_EVENT_RESIZE) { caca_refresh_display(dp); ww = caca_get_event_resize_width(&ev); wh = caca_get_event_resize_height(&ev); update = 1; } else if (caca_get_event_type(&ev) & CACA_EVENT_QUIT) quit = 1; event = caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0); } /* 2D Rotation around screen center */ int p; for (p = 0; p < 4; p++) { rotated[p][0] = square[p][0] * cos(angle * M_PI / 180.0f) - square[p][1] * sin(angle * M_PI / 180.0f); rotated[p][1] = square[p][0] * sin(angle * M_PI / 180.0f) + square[p][1] * cos(angle * M_PI / 180.0f); rotated[p][0] += ww / 2 + px; rotated[p][1] += wh / 2 + py; } angle += 1.0f; /* Reaarange coordinates to fit libcaca's format */ coords1[0] = rotated[0][0]; coords1[1] = rotated[0][1]; coords1[2] = rotated[1][0]; coords1[3] = rotated[1][1]; coords1[4] = rotated[2][0]; coords1[5] = rotated[2][1]; coords2[0] = rotated[0][0]; coords2[1] = rotated[0][1]; coords2[2] = rotated[2][0]; coords2[3] = rotated[2][1]; coords2[4] = rotated[3][0]; coords2[5] = rotated[3][1]; /* Display two triangles */ caca_fill_triangle_textured(cv, /* canvas */ coords1, /* triangle coordinates */ tex, /* texture canvas */ uv1); /* texture coordinates */ caca_fill_triangle_textured(cv, coords2, tex, uv2); /* Refresh display and clear for next frame */ caca_refresh_display(dp); caca_clear_canvas(cv); } caca_free_display(dp); caca_free_canvas(cv); caca_free_canvas(tex); return 0; }