d7dea971de8104f9c739d19d122d0d89baded71f
[vrfileman] / src / main.cc
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <SDL2/SDL.h>
4 #include "app.h"
5
6 static void process_event(SDL_Event *ev);
7
8 static SDL_Window *win;
9 static SDL_GLContext ctx;
10 static bool redraw_pending = true;
11 static bool quit;
12
13 int main(int argc, char **argv)
14 {
15         if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
16                 fprintf(stderr, "failed to initialize SDL\n");
17                 return 1;
18         }
19
20         SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
21         SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
22         SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
23
24         int x = SDL_WINDOWPOS_UNDEFINED;
25         int y = SDL_WINDOWPOS_UNDEFINED;
26         unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
27         win_width = 1280;
28         win_height = 800;
29         if(!(win = SDL_CreateWindow("vrfileman", x, y, win_width, win_height, flags))) {
30                 fprintf(stderr, "failed to create window\n");
31                 return 1;
32         }
33
34         if(!(ctx = SDL_GL_CreateContext(win))) {
35                 fprintf(stderr, "failed to create OpenGL context\n");
36                 return 1;
37         }
38         SDL_GL_GetDrawableSize(win, &win_width, &win_height);
39         win_aspect = (float)win_width / (float)win_height;
40
41         if(!app_init(argc, argv)) {
42                 SDL_Quit();
43                 return 1;
44         }
45         app_reshape(win_width, win_height);
46
47         while(!quit) {
48                 SDL_Event ev;
49
50                 if(!redraw_pending) {
51                         if(!SDL_WaitEvent(0)) {
52                                 fprintf(stderr, "error while waiting for events\n");
53                                 break;
54                         }
55                 }
56
57                 time_msec = app_get_msec();
58                 while(SDL_PollEvent(&ev)) {
59                         process_event(&ev);
60                         if(quit) goto break_evloop;
61                 }
62
63                 if(redraw_pending) {
64                         redraw_pending = false;
65                         app_draw();
66                 }
67         }
68 break_evloop:
69
70         app_cleanup();
71         SDL_Quit();
72         return 0;
73 }
74
75 void app_resize(int x, int y)
76 {
77         SDL_SetWindowSize(win, x, y);
78 }
79
80 void app_fullscreen(int fs)
81 {
82         SDL_SetWindowFullscreen(win, fs ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
83 }
84
85 void app_quit()
86 {
87         quit = true;
88 }
89
90 void app_redraw()
91 {
92         redraw_pending = true;
93 }
94
95 void app_swap_buffers()
96 {
97         SDL_GL_SwapWindow(win);
98 }
99
100 long app_get_msec()
101 {
102         return SDL_GetTicks();
103 }
104
105 static void process_event(SDL_Event *ev)
106 {
107         switch(ev->type) {
108         case SDL_QUIT:
109                 quit = true;
110                 break;
111
112         case SDL_KEYDOWN:
113         case SDL_KEYUP:
114                 app_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED);
115                 break;
116
117         case SDL_MOUSEBUTTONDOWN:
118         case SDL_MOUSEBUTTONUP:
119                 app_mouse_button(ev->button.button - SDL_BUTTON_LEFT, ev->button.state == SDL_PRESSED,
120                                 ev->button.x, ev->button.y);
121                 break;
122
123         case SDL_MOUSEMOTION:
124                 app_mouse_motion(ev->motion.x, ev->motion.y);
125                 break;
126
127         case SDL_WINDOWEVENT:
128                 if(ev->window.event == SDL_WINDOWEVENT_RESIZED) {
129                         win_width = ev->window.data1;
130                         win_height = ev->window.data2;
131                         win_aspect = (float)win_width / (float)win_height;
132                         app_reshape(win_width, win_height);
133                 }
134                 break;
135         }
136 }