8 static bool init(int argc, char **argv);
9 static void process_event(SDL_Event *ev);
10 static void proc_modkeys();
12 static SDL_Window *win;
13 static SDL_GLContext ctx;
14 static bool fullscreen, mouse_grabbed;
17 static unsigned int start_time;
18 static unsigned int modkeys;
20 static int scale_factor = 1;
22 int main(int argc, char **argv)
24 if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
25 fprintf(stderr, "failed to initialize SDL\n");
29 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
30 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8);
31 SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
33 int defpos = SDL_WINDOWPOS_UNDEFINED;
34 unsigned int sdlflags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
36 if(!(win = SDL_CreateWindow("demo", defpos, defpos, 1024, 768, sdlflags))) {
37 // try again without sRGB capability
38 SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 0);
39 if(!(win = SDL_CreateWindow("demo", defpos, defpos, 1024, 768, sdlflags))) {
40 fprintf(stderr, "failed to create window\n");
44 fprintf(stderr, "failed to get an sRGB framebuffer.\n");
47 SDL_GL_GetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, &val);
48 printf("SDL says we %s an sRGB framebuffer\n", val ? "got" : "didn't get");
50 if(!(ctx = SDL_GL_CreateContext(win))) {
51 fprintf(stderr, "failed to create OpenGL context\n");
55 SDL_GL_GetDrawableSize(win, &win_width, &win_height);
56 win_aspect = (float)win_width / (float)win_height;
58 if(!init(argc, argv)) {
62 app_reshape(win_width, win_height);
67 time_msec = SDL_GetTicks() - start_time;
68 while(SDL_PollEvent(&ev)) {
70 if(quit) goto break_evloop;
82 void app_swap_buffers()
84 SDL_GL_SwapWindow(win);
92 unsigned int app_get_modifiers()
97 void app_resize(int x, int y)
99 SDL_SetWindowSize(win, x, y);
102 void app_fullscreen(bool fs)
104 SDL_SetWindowFullscreen(win, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
108 void app_toggle_fullscreen()
110 app_fullscreen(!fullscreen);
113 bool app_is_fullscreen()
118 void app_grab_mouse(bool grab)
121 SDL_WarpMouseInWindow(win, win_width / 2, win_height / 2);
123 //SDL_SetWindowGrab(win, grab ? SDL_TRUE : SDL_FALSE);
124 //SDL_ShowCursor(grab ? 1 : 0);
125 SDL_SetRelativeMouseMode(grab ? SDL_TRUE : SDL_FALSE);
126 mouse_grabbed = grab;
129 void app_toggle_grab_mouse()
131 app_grab_mouse(!mouse_grabbed);
134 bool app_is_mouse_grabbed()
136 return mouse_grabbed;
140 static bool init(int argc, char **argv)
144 if(!app_init(argc, argv)) {
148 start_time = SDL_GetTicks();
152 static void process_event(SDL_Event *ev)
162 app_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED);
165 case SDL_MOUSEBUTTONDOWN:
166 case SDL_MOUSEBUTTONUP:
168 app_mouse_button(ev->button.button - SDL_BUTTON_LEFT, ev->button.state == SDL_PRESSED,
169 ev->button.x * scale_factor, ev->button.y * scale_factor);
172 case SDL_MOUSEMOTION:
174 // XXX xrel/yrel seems faster by default
175 app_mouse_delta(ev->motion.xrel * 0.75, ev->motion.yrel * 0.75);
177 app_mouse_motion(ev->motion.x * scale_factor, ev->motion.y * scale_factor);
181 case SDL_WINDOWEVENT:
182 if(ev->window.event == SDL_WINDOWEVENT_RESIZED) {
183 SDL_GL_GetDrawableSize(win, &win_width, &win_height);
184 win_aspect = (float)win_width / (float)win_height;
185 scale_factor = win_width / ev->window.data1;
186 app_reshape(win_width, win_height);
192 static void proc_modkeys()
195 SDL_Keymod sdlmod = SDL_GetModState();
196 if(sdlmod & KMOD_SHIFT) {
197 modkeys |= MOD_SHIFT;
199 if(sdlmod & KMOD_ALT) {
202 if(sdlmod & KMOD_CTRL) {