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 }
|