942db477141fc07d4bb152d45d8224c147d87fa6
[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, 1);
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_quit()
76 {
77         quit = true;
78 }
79
80 void app_redraw()
81 {
82         redraw_pending = true;
83 }
84
85 void app_swap_buffers()
86 {
87         SDL_GL_SwapWindow(win);
88 }
89
90 long app_get_msec()
91 {
92         return SDL_GetTicks();
93 }
94
95 static void process_event(SDL_Event *ev)
96 {
97         switch(ev->type) {
98         case SDL_QUIT:
99                 quit = true;
100                 break;
101
102         case SDL_KEYDOWN:
103         case SDL_KEYUP:
104                 app_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED);
105                 break;
106
107         case SDL_MOUSEBUTTONDOWN:
108         case SDL_MOUSEBUTTONUP:
109                 app_mouse_button(ev->button.button - SDL_BUTTON_LEFT, ev->button.state == SDL_PRESSED,
110                                 ev->button.x, ev->button.y);
111                 break;
112
113         case SDL_MOUSEMOTION:
114                 app_mouse_motion(ev->motion.x, ev->motion.y);
115                 break;
116
117         case SDL_WINDOWEVENT:
118                 if(ev->window.event == SDL_WINDOWEVENT_RESIZED) {
119                         win_width = ev->window.data1;
120                         win_height = ev->window.data2;
121                         win_aspect = (float)win_width / (float)win_height;
122                         app_reshape(win_width, win_height);
123                 }
124                 break;
125         }
126 }