Browse code

Uxnemu skips resizing window until reset vector is done.

Devine Lu Linvega authored on 25/07/2023 21:30:51
Showing 1 changed files
... ...
@@ -59,6 +59,7 @@ static Uint32 stdin_event, audio0_event, zoom = 1;
59 59
 static Uint64 exec_deadline, deadline_interval, ms_interval;
60 60
 
61 61
 char *rom_path;
62
+int window_created = 0;
62 63
 
63 64
 static Uint8
64 65
 audio_dei(int instance, Uint8 *d, Uint8 port)
... ...
@@ -168,6 +169,8 @@ set_window_size(SDL_Window *window, int w, int h)
168 169
 int
169 170
 emu_resize(int width, int height)
170 171
 {
172
+	if(!window_created)
173
+		return 0;
171 174
 	if(emu_texture != NULL)
172 175
 		SDL_DestroyTexture(emu_texture);
173 176
 	SDL_RenderSetLogicalSize(emu_renderer, width, height);
... ...
@@ -191,7 +194,7 @@ emu_redraw(void)
191 194
 }
192 195
 
193 196
 static int
194
-init(void)
197
+emu_init(void)
195 198
 {
196 199
 	SDL_AudioSpec as;
197 200
 	SDL_zero(as);
... ...
@@ -203,13 +206,7 @@ init(void)
203 206
 	as.userdata = NULL;
204 207
 	if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
205 208
 		return system_error("sdl", SDL_GetError());
206
-	emu_window = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (WIDTH)*zoom, (HEIGHT)*zoom, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
207
-	if(emu_window == NULL)
208
-		return system_error("sdl_window", SDL_GetError());
209
-	emu_renderer = SDL_CreateRenderer(emu_window, -1, 0);
210
-	if(emu_renderer == NULL)
211
-		return system_error("sdl_renderer", SDL_GetError());
212
-	SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff);
209
+
213 210
 	audio_id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0);
214 211
 	if(!audio_id)
215 212
 		system_error("sdl_audio", SDL_GetError());
... ...
@@ -229,7 +226,7 @@ init(void)
229 226
 /* Boot */
230 227
 
231 228
 static int
232
-start(Uxn *u, char *rom, int queue)
229
+emu_start(Uxn *u, char *rom, int queue)
233 230
 {
234 231
 	free(u->ram);
235 232
 	if(!uxn_boot(u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8))))
... ...
@@ -245,11 +242,12 @@ start(Uxn *u, char *rom, int queue)
245 242
 }
246 243
 
247 244
 static void
248
-set_zoom(Uint8 z)
245
+set_zoom(Uint8 z, int win)
249 246
 {
250 247
 	if(z >= 1) {
251 248
 		zoom = z;
252
-		set_window_size(emu_window, (uxn_screen.width) * zoom, (uxn_screen.height) * zoom);
249
+		if(win)
250
+			set_window_size(emu_window, (uxn_screen.width) * zoom, (uxn_screen.height) * zoom);
253 251
 	}
254 252
 }
255 253
 
... ...
@@ -288,8 +286,8 @@ static void
288 286
 emu_restart(Uxn *u)
289 287
 {
290 288
 	screen_resize(WIDTH, HEIGHT);
291
-	if(!start(u, "launcher.rom", 0))
292
-		start(u, rom_path, 0);
289
+	if(!emu_start(u, "launcher.rom", 0))
290
+		emu_start(u, rom_path, 0);
293 291
 }
294 292
 
295 293
 static Uint8
... ...
@@ -352,7 +350,7 @@ handle_events(Uxn *u)
352 350
 			emu_redraw();
353 351
 		else if(event.type == SDL_DROPFILE) {
354 352
 			screen_resize(WIDTH, HEIGHT);
355
-			start(u, event.drop.file, 0);
353
+			emu_start(u, event.drop.file, 0);
356 354
 			SDL_free(event.drop.file);
357 355
 		}
358 356
 		/* Audio */
... ...
@@ -377,7 +375,7 @@ handle_events(Uxn *u)
377 375
 			else if(get_button(&event))
378 376
 				controller_down(u, &u->dev[0x80], get_button(&event));
379 377
 			else if(event.key.keysym.sym == SDLK_F1)
380
-				set_zoom(zoom == 3 ? 1 : zoom + 1);
378
+				set_zoom(zoom == 3 ? 1 : zoom + 1, 1);
381 379
 			else if(event.key.keysym.sym == SDLK_F2)
382 380
 				system_inspect(u);
383 381
 			else if(event.key.keysym.sym == SDLK_F3)
... ...
@@ -443,7 +441,7 @@ handle_events(Uxn *u)
443 441
 }
444 442
 
445 443
 static int
446
-run(Uxn *u)
444
+emu_run(Uxn *u)
447 445
 {
448 446
 	Uint64 next_refresh = 0;
449 447
 	Uint64 now;
... ...
@@ -475,26 +473,41 @@ run(Uxn *u)
475 473
 	}
476 474
 }
477 475
 
476
+int
477
+emu_show(void)
478
+{
479
+	window_created = 1;
480
+	emu_window = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, uxn_screen.width * zoom, uxn_screen.height * zoom, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
481
+	if(emu_window == NULL)
482
+		return system_error("sdl_window", SDL_GetError());
483
+	emu_renderer = SDL_CreateRenderer(emu_window, -1, 0);
484
+	if(emu_renderer == NULL)
485
+		return system_error("sdl_renderer", SDL_GetError());
486
+	SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff);
487
+	emu_resize(uxn_screen.width, uxn_screen.height);
488
+	return 1;
489
+}
490
+
478 491
 int
479 492
 main(int argc, char **argv)
480 493
 {
481 494
 	SDL_DisplayMode DM;
482 495
 	Uxn u = {0};
483 496
 	int i = 1;
484
-	if(!init())
497
+	if(!emu_init())
485 498
 		return system_error("Init", "Failed to initialize emulator.");
486 499
 	/* default resolution */
487 500
 	screen_resize(WIDTH, HEIGHT);
488 501
 	/* default zoom */
489 502
 	if(argc > 1 && (strcmp(argv[i], "-1x") == 0 || strcmp(argv[i], "-2x") == 0 || strcmp(argv[i], "-3x") == 0))
490
-		set_zoom(argv[i++][1] - '0');
503
+		set_zoom(argv[i++][1] - '0', 0);
491 504
 	else if(SDL_GetCurrentDisplayMode(0, &DM) == 0)
492
-		set_zoom(DM.w / 1280);
505
+		set_zoom(DM.w / 1280, 0);
493 506
 	/* load rom */
494 507
 	if(i == argc)
495 508
 		return system_error("usage", "uxnemu [-2x][-3x] file.rom [args...]");
496 509
 	rom_path = argv[i++];
497
-	if(!start(&u, rom_path, argc - i))
510
+	if(!emu_start(&u, rom_path, argc - i))
498 511
 		return system_error("Start", "Failed");
499 512
 	/* read arguments */
500 513
 	for(; i < argc; i++) {
... ...
@@ -503,7 +516,8 @@ main(int argc, char **argv)
503 516
 		console_input(&u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
504 517
 	}
505 518
 	/* start rom */
506
-	run(&u);
519
+	emu_show();
520
+	emu_run(&u);
507 521
 	/* finished */
508 522
 #ifdef _WIN32
509 523
 #pragma GCC diagnostic ignored "-Wint-to-pointer-cast"