diff options
Diffstat (limited to 'src/xplorer.c')
-rw-r--r-- | src/xplorer.c | 139 |
1 files changed, 70 insertions, 69 deletions
diff --git a/src/xplorer.c b/src/xplorer.c index 5e69d82..4b8bcfc 100644 --- a/src/xplorer.c +++ b/src/xplorer.c | |||
@@ -1,6 +1,6 @@ | |||
1 | #include <ui.h> | 1 | #include <ui.h> |
2 | 2 | ||
3 | #include <SDL.h> | 3 | #include <SDL3/SDL.h> |
4 | #include <cstring.h> | 4 | #include <cstring.h> |
5 | #include <tinydir.h> | 5 | #include <tinydir.h> |
6 | 6 | ||
@@ -210,7 +210,7 @@ static bool Render(State* state) { | |||
210 | .pixels = window_surface->pixels, | 210 | .pixels = window_surface->pixels, |
211 | }); | 211 | }); |
212 | 212 | ||
213 | if (SDL_UpdateWindowSurface(state->window) != 0) { | 213 | if (!SDL_UpdateWindowSurface(state->window)) { |
214 | return false; | 214 | return false; |
215 | } | 215 | } |
216 | 216 | ||
@@ -244,12 +244,14 @@ bool Initialize(State* state) { | |||
244 | assert(state); | 244 | assert(state); |
245 | 245 | ||
246 | if ((state->window = SDL_CreateWindow( | 246 | if ((state->window = SDL_CreateWindow( |
247 | WindowTitle, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, | 247 | WindowTitle, DefaultWidth, DefaultHeight, SDL_WINDOW_RESIZABLE)) == |
248 | DefaultWidth, DefaultHeight, | 248 | NULL) { |
249 | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE)) == NULL) { | ||
250 | return false; | 249 | return false; |
251 | } | 250 | } |
252 | 251 | ||
252 | // SDL_SetWindowSurfaceVSync(state->window, | ||
253 | // SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE); | ||
254 | |||
253 | CreateUi(state); | 255 | CreateUi(state); |
254 | 256 | ||
255 | path home = path_new(getenv("HOME")); | 257 | path home = path_new(getenv("HOME")); |
@@ -265,7 +267,7 @@ int main( | |||
265 | 267 | ||
266 | State state = {0}; | 268 | State state = {0}; |
267 | 269 | ||
268 | if (SDL_Init(SDL_INIT_VIDEO) != 0) { | 270 | if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { |
269 | return false; | 271 | return false; |
270 | } | 272 | } |
271 | 273 | ||
@@ -305,75 +307,74 @@ int main( | |||
305 | 307 | ||
306 | // Handle events. | 308 | // Handle events. |
307 | SDL_Event event = {0}; | 309 | SDL_Event event = {0}; |
308 | if (SDL_WaitEvent(&event) == 0) { | 310 | if (!SDL_WaitEvent(&event)) { |
309 | success = false; | 311 | success = false; |
310 | break; | 312 | break; |
311 | } else if (event.type == SDL_QUIT) { | 313 | } |
314 | if ((event.type == SDL_EVENT_QUIT) || | ||
315 | (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED)) { | ||
312 | break; | 316 | break; |
313 | } else { | 317 | } |
314 | if (event.type == SDL_WINDOWEVENT) { | 318 | // When the window is maximized, an SDL_WINDOWEVENT_MOVED comes in |
315 | // When the window is maximized, an SDL_WINDOWEVENT_MOVED comes in | 319 | // before an SDL_WINDOWEVENT_SIZE_CHANGED with the window already |
316 | // before an SDL_WINDOWEVENT_SIZE_CHANGED with the window already | 320 | // resized. This is unfortunate because we cannot rely on the latter |
317 | // resized. This is unfortunate because we cannot rely on the latter | 321 | // event alone to handle resizing. |
318 | // event alone to handle resizing. | 322 | if ((event.window.type == SDL_EVENT_WINDOW_DISPLAY_CHANGED) || |
319 | if ((event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) || | 323 | (event.window.type == SDL_EVENT_WINDOW_RESIZED) || |
320 | (event.window.event == SDL_WINDOWEVENT_RESIZED) || | 324 | (event.window.type == SDL_EVENT_WINDOW_MOVED)) { |
321 | (event.window.event == SDL_WINDOWEVENT_MOVED)) { | 325 | if (!Resize(&state)) { |
322 | if (!Resize(&state)) { | 326 | success = false; |
323 | success = false; | 327 | break; |
324 | break; | 328 | } |
325 | } | 329 | redraw = true; |
326 | redraw = true; | 330 | } else if (event.type == SDL_EVENT_KEY_DOWN) { |
327 | } | 331 | if (event.key.mod & SDL_KMOD_LCTRL) { |
328 | } else if (event.type == SDL_KEYDOWN) { | 332 | switch (event.key.key) { |
329 | if (event.key.keysym.mod & KMOD_LCTRL) { | 333 | // Exit. |
330 | switch (event.key.keysym.sym) { | 334 | case SDLK_C: |
331 | // Exit. | 335 | case SDLK_D: |
332 | case SDLK_c: | 336 | running = false; |
333 | case SDLK_d: | 337 | break; |
334 | running = false; | 338 | default: |
335 | break; | 339 | break; |
336 | default: | ||
337 | break; | ||
338 | } | ||
339 | } | 340 | } |
340 | } else if (event.type == SDL_MOUSEBUTTONDOWN) { | ||
341 | const uiInputEvent ev = { | ||
342 | .type = uiEventMouseButton, | ||
343 | .mouse_button = (uiMouseButtonEvent){ | ||
344 | .button = ToUiButton(event.button.button), | ||
345 | .state = uiMouseDown, | ||
346 | .mouse_position = | ||
347 | (uiPoint){.x = event.button.x, .y = event.button.y}} | ||
348 | }; | ||
349 | redraw = uiSendEvent(state.frame, &ev); | ||
350 | } else if (event.type == SDL_MOUSEBUTTONUP) { | ||
351 | const uiInputEvent ev = { | ||
352 | .type = uiEventMouseButton, | ||
353 | .mouse_button = (uiMouseButtonEvent){ | ||
354 | .button = ToUiButton(event.button.button), | ||
355 | .state = uiMouseUp, | ||
356 | .mouse_position = | ||
357 | (uiPoint){.x = event.button.x, .y = event.button.y}} | ||
358 | }; | ||
359 | redraw = uiSendEvent(state.frame, &ev); | ||
360 | } else if (event.type == SDL_MOUSEWHEEL) { | ||
361 | const uiInputEvent ev = { | ||
362 | .type = uiEventMouseScroll, | ||
363 | .mouse_scroll = (uiMouseScrollEvent){ | ||
364 | .scroll_offset = event.wheel.y, | ||
365 | .mouse_position = (uiPoint){ | ||
366 | .x = event.wheel.mouseX, .y = event.wheel.mouseY}} | ||
367 | }; | ||
368 | redraw = uiSendEvent(state.frame, &ev); | ||
369 | } else { | ||
370 | EVENT_LOOP_PRINT("event.window.event = %d\n", event.window.event); | ||
371 | } | 341 | } |
342 | } else if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) { | ||
343 | const uiInputEvent ui_event = { | ||
344 | .type = uiEventMouseButton, | ||
345 | .mouse_button = (uiMouseButtonEvent){ | ||
346 | .button = ToUiButton(event.button.button), | ||
347 | .state = uiMouseDown, | ||
348 | .mouse_position = | ||
349 | (uiPoint){.x = event.button.x, .y = event.button.y}} | ||
350 | }; | ||
351 | redraw = uiSendEvent(state.frame, &ui_event); | ||
352 | } else if (event.type == SDL_EVENT_MOUSE_BUTTON_UP) { | ||
353 | const uiInputEvent ev = { | ||
354 | .type = uiEventMouseButton, | ||
355 | .mouse_button = (uiMouseButtonEvent){ | ||
356 | .button = ToUiButton(event.button.button), | ||
357 | .state = uiMouseUp, | ||
358 | .mouse_position = | ||
359 | (uiPoint){.x = event.button.x, .y = event.button.y}} | ||
360 | }; | ||
361 | redraw = uiSendEvent(state.frame, &ev); | ||
362 | } else if (event.type == SDL_EVENT_MOUSE_WHEEL) { | ||
363 | const uiInputEvent ev = { | ||
364 | .type = uiEventMouseScroll, | ||
365 | .mouse_scroll = (uiMouseScrollEvent){ | ||
366 | .scroll_offset = event.wheel.y, | ||
367 | .mouse_position = (uiPoint){.x = event.wheel.mouse_x, | ||
368 | .y = event.wheel.mouse_y}} | ||
369 | }; | ||
370 | redraw = uiSendEvent(state.frame, &ev); | ||
371 | } else { | ||
372 | EVENT_LOOP_PRINT("event.window.event = %d\n", event.window.event); | ||
373 | } | ||
372 | 374 | ||
373 | if (HandleWidgetEvents(&state)) { | 375 | if (HandleWidgetEvents(&state)) { |
374 | Resize(&state); // Trigger a re-layout of widgets. | 376 | Resize(&state); // Trigger a re-layout of widgets. |
375 | redraw = true; | 377 | redraw = true; |
376 | } | ||
377 | } | 378 | } |
378 | } | 379 | } |
379 | 380 | ||