fixed hidpi on mac
[vrfileman] / src / main.cc
index ae84abd..82454fd 100644 (file)
@@ -10,6 +10,20 @@ static SDL_GLContext ctx;
 static bool redraw_pending = true;
 static bool quit;
 
+static int scale_factor = 1;
+
+static SDL_Window *create_window(int width, int height)
+{
+       SDL_Window *win;
+       int x = SDL_WINDOWPOS_UNDEFINED;
+       int y = SDL_WINDOWPOS_UNDEFINED;
+       unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
+       if(!(win = SDL_CreateWindow("vrfileman", x, y, width, height, flags))) {
+               return 0;
+       }
+       return win;
+}
+
 int main(int argc, char **argv)
 {
        if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
@@ -18,17 +32,18 @@ int main(int argc, char **argv)
        }
 
        SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
-       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
+       SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8);
        SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
 
-       int x = SDL_WINDOWPOS_UNDEFINED;
-       int y = SDL_WINDOWPOS_UNDEFINED;
-       unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
-       win_width = 1280;
-       win_height = 800;
-       if(!(win = SDL_CreateWindow("vrfileman", x, y, win_width, win_height, flags))) {
-               fprintf(stderr, "failed to create window\n");
-               return 1;
+       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(def_opt.width, def_opt.height))) {
+                       fprintf(stderr, "failed to create window\n");
+                       return 1;
+               }
+               fprintf(stderr, "failed to create sRGB-capable window, defaulting to non-linear color space\n");
+               def_opt.srgb = false;
        }
 
        if(!(ctx = SDL_GL_CreateContext(win))) {
@@ -78,7 +93,7 @@ void app_resize(int x, int y)
        SDL_SetWindowSize(win, x, y);
 }
 
-void app_fullscreen(int fs)
+void app_fullscreen(bool fs)
 {
        SDL_SetWindowFullscreen(win, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
 }
@@ -118,18 +133,18 @@ static void process_event(SDL_Event *ev)
        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);
+               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;