summaryrefslogtreecommitdiff
path: root/src/xplorer.c
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-08-30 16:53:58 -0700
committer3gg <3gg@shellblade.net>2025-08-30 16:53:58 -0700
commit6aaedb813fa11ba0679c3051bc2eb28646b9506c (patch)
tree34acbfc9840e02cb4753e6306ea7ce978bf8b58e /src/xplorer.c
parent8f228ade99dd3d4c8da9b78ade1815c9adf85c8f (diff)
Update to SDL3
Diffstat (limited to 'src/xplorer.c')
-rw-r--r--src/xplorer.c139
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