static SDL_Window *win;
static SDL_GLContext ctx;
static bool redraw_pending = true;
+static bool fullscreen, mouse_grabbed;
static bool quit;
+static int scale_factor = 1;
+
static SDL_Window *create_window(int width, int height)
{
SDL_Window *win;
if(!(win = create_window(def_opt.width, def_opt.height))) {
// try again without the SRGB capability
SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 0);
- if(!(win = create_window(win_width, win_height))) {
+ if(!(win = create_window(def_opt.width, def_opt.height))) {
fprintf(stderr, "failed to create window\n");
return 1;
}
void app_fullscreen(bool fs)
{
SDL_SetWindowFullscreen(win, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
+ fullscreen = fs;
+}
+
+void app_toggle_fullscreen()
+{
+ app_fullscreen(!fullscreen);
+}
+
+bool app_is_fullscreen()
+{
+ return fullscreen;
+}
+
+void app_grab_mouse(bool grab)
+{
+ /*SDL_SetWindowGrab(win, grab ? SDL_TRUE : SDL_FALSE);
+ SDL_ShowCursor(grab ? 1 : 0);
+ */
+ SDL_SetRelativeMouseMode(grab ? SDL_TRUE : SDL_FALSE);
+ mouse_grabbed = grab;
+}
+
+void app_toggle_grab_mouse()
+{
+ app_grab_mouse(!mouse_grabbed);
+}
+
+bool app_is_mouse_grabbed()
+{
+ return mouse_grabbed;
}
void app_quit()
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
app_mouse_button(ev->button.button - SDL_BUTTON_LEFT, ev->button.state == SDL_PRESSED,
- ev->button.x, ev->button.y);
+ ev->button.x * scale_factor, ev->button.y * scale_factor);
break;
case SDL_MOUSEMOTION:
- app_mouse_motion(ev->motion.x, ev->motion.y);
+ if(mouse_grabbed) {
+ app_mouse_delta(ev->motion.xrel, ev->motion.yrel);
+ } else {
+ app_mouse_motion(ev->motion.x * scale_factor, ev->motion.y * scale_factor);
+ }
break;
case SDL_WINDOWEVENT:
if(ev->window.event == SDL_WINDOWEVENT_RESIZED) {
- win_width = ev->window.data1;
- win_height = ev->window.data2;
+ SDL_GL_GetDrawableSize(win, &win_width, &win_height);
win_aspect = (float)win_width / (float)win_height;
+ scale_factor = win_width / ev->window.data1;
app_reshape(win_width, win_height);
}
break;