fbee

annotate src/sys_sdl.c @ 0:88a2049be27b

fbee initial
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 05 Feb 2013 13:40:36 +0200
parents
children
rev   line source
nuclear@0 1 #include <SDL/SDL.h>
nuclear@0 2 #include "fbee.h"
nuclear@0 3 #include "fbeeimpl.h"
nuclear@0 4
nuclear@0 5 static int quit, dirty;
nuclear@0 6 static SDL_Surface *fbsurf;
nuclear@0 7
nuclear@0 8 int fbee_sys_init(void)
nuclear@0 9 {
nuclear@0 10 SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
nuclear@0 11 quit = 0;
nuclear@0 12 dirty = 1;
nuclear@0 13 return 0;
nuclear@0 14 }
nuclear@0 15
nuclear@0 16 int fbee_sys_set_video(int width, int height, int bpp, unsigned int flags)
nuclear@0 17 {
nuclear@0 18 unsigned int sdl_flags = SDL_HWSURFACE;
nuclear@0 19 if(!(fbsurf = SDL_SetVideoMode(width, height, bpp, sdl_flags))) {
nuclear@0 20 fprintf(stderr, "failed to set video mode\n");
nuclear@0 21 return -1;
nuclear@0 22 }
nuclear@0 23 SDL_WM_SetCaption("fbee", "fbee");
nuclear@0 24 return 0;
nuclear@0 25 }
nuclear@0 26
nuclear@0 27 int fbee_sys_get_video(int *width, int *height, int *bpp)
nuclear@0 28 {
nuclear@0 29 if(fbsurf) {
nuclear@0 30 *width = fbsurf->w;
nuclear@0 31 *height = fbsurf->h;
nuclear@0 32 *bpp = fbsurf->format->BitsPerPixel;
nuclear@0 33 return 0;
nuclear@0 34 }
nuclear@0 35 return -1;
nuclear@0 36 }
nuclear@0 37
nuclear@0 38 void fbee_sys_destroy(void)
nuclear@0 39 {
nuclear@0 40 SDL_Quit();
nuclear@0 41 }
nuclear@0 42
nuclear@0 43 int fbee_sys_process_events(void)
nuclear@0 44 {
nuclear@0 45 SDL_Event ev;
nuclear@0 46
nuclear@0 47 if(dirty) {
nuclear@0 48 struct closure *cb = fbee_get_callback(FBEE_EV_DRAW);
nuclear@0 49 if(cb) {
nuclear@0 50 cb->func(cb->cls);
nuclear@0 51 dirty = 0;
nuclear@0 52 }
nuclear@0 53 }
nuclear@0 54
nuclear@0 55 if(!fbee_get_callback(FBEE_EV_IDLE)) {
nuclear@0 56 if(SDL_WaitEvent(&ev)) {
nuclear@0 57 SDL_PushEvent(&ev);
nuclear@0 58 }
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 while(SDL_PollEvent(&ev)) {
nuclear@0 62 struct closure *cb;
nuclear@0 63
nuclear@0 64 switch(ev.type) {
nuclear@0 65 case SDL_KEYDOWN:
nuclear@0 66 case SDL_KEYUP:
nuclear@0 67 if((cb = fbee_get_callback(FBEE_EV_KEY))) {
nuclear@0 68 int pressed = ev.key.state == SDL_PRESSED ? 1 : 0;
nuclear@0 69 cb->func(ev.key.keysym.sym, pressed, cb->cls);
nuclear@0 70 }
nuclear@0 71 break;
nuclear@0 72
nuclear@0 73 case SDL_MOUSEBUTTONDOWN:
nuclear@0 74 case SDL_MOUSEBUTTONUP:
nuclear@0 75 if((cb = fbee_get_callback(FBEE_EV_BUTTON))) {
nuclear@0 76 int pressed = ev.button.state == SDL_PRESSED ? 1 : 0;
nuclear@0 77 int idx = ev.button.button - SDL_BUTTON_LEFT;
nuclear@0 78 cb->func(idx, pressed, cb->cls);
nuclear@0 79 }
nuclear@0 80 break;
nuclear@0 81
nuclear@0 82 case SDL_MOUSEMOTION:
nuclear@0 83 if((cb = fbee_get_callback(FBEE_EV_MOTION))) {
nuclear@0 84 cb->func(ev.motion.x, ev.motion.y, cb->cls);
nuclear@0 85 }
nuclear@0 86 break;
nuclear@0 87
nuclear@0 88 case SDL_QUIT:
nuclear@0 89 quit = 1;
nuclear@0 90 return 0;
nuclear@0 91
nuclear@0 92 default:
nuclear@0 93 break;
nuclear@0 94 }
nuclear@0 95 }
nuclear@0 96 return 1;
nuclear@0 97 }
nuclear@0 98
nuclear@0 99 void fbee_sys_evloop(void)
nuclear@0 100 {
nuclear@0 101 while(!quit && fbee_sys_process_events()) {
nuclear@0 102 struct closure *cb = fbee_get_callback(FBEE_EV_IDLE);
nuclear@0 103 if(cb) {
nuclear@0 104 cb->func(cb->cls);
nuclear@0 105 }
nuclear@0 106 }
nuclear@0 107 }
nuclear@0 108
nuclear@0 109 void fbee_redisplay(void)
nuclear@0 110 {
nuclear@0 111 dirty = 1;
nuclear@0 112 }
nuclear@0 113
nuclear@0 114 void *fbee_sys_framebuffer(void)
nuclear@0 115 {
nuclear@0 116 return fbsurf->pixels;
nuclear@0 117 }
nuclear@0 118
nuclear@0 119 void fbee_sys_update(void *img)
nuclear@0 120 {
nuclear@0 121 if(img && img != fbsurf->pixels) {
nuclear@0 122 if(SDL_MUSTLOCK(fbsurf)) {
nuclear@0 123 SDL_LockSurface(fbsurf);
nuclear@0 124 }
nuclear@0 125
nuclear@0 126 memcpy(fbsurf->pixels, img, fbsurf->pitch * fbsurf->h);
nuclear@0 127
nuclear@0 128 if(SDL_MUSTLOCK(fbsurf)) {
nuclear@0 129 SDL_UnlockSurface(fbsurf);
nuclear@0 130 }
nuclear@0 131 }
nuclear@0 132
nuclear@0 133 SDL_UpdateRect(fbsurf, 0, 0, 0, 0);
nuclear@0 134 }