commit 5e9022b

Devine Lu Linvega  ·  2025-06-24 22:46:42 +0000 UTC
parent f5f92de
Wait after reset vector to spawn window
1 files changed,  +14, -15
+14, -15
  1@@ -407,7 +407,7 @@ console_input(int c, unsigned int type)
  2 #define MAR2(x) (x + 0x10)
  3 
  4 typedef struct UxnScreen {
  5-	int width, height, zoom, x1, y1, x2, y2;
  6+	int width, height, zoom, resized, x1, y1, x2, y2;
  7 	unsigned int palette[16], *pixels;
  8 	Uint8 *fg, *bg;
  9 } UxnScreen;
 10@@ -471,9 +471,8 @@ screen_apply(int width, int height)
 11 	uxn_screen.bg = realloc(uxn_screen.bg, length), uxn_screen.fg = realloc(uxn_screen.fg, length);
 12 	memset(uxn_screen.bg, 0, length);
 13 	memset(uxn_screen.fg, 0, length);
 14-	uxn_screen.width = width, uxn_screen.height = height;
 15+	uxn_screen.width = width, uxn_screen.height = height, uxn_screen.resized = 1;
 16 	screen_change(0, 0, width, height);
 17-	emu_resize();
 18 }
 19 
 20 static void
 21@@ -909,8 +908,6 @@ static unsigned int rL1, rL2;
 22 
 23 #define CONINBUFSIZE 256
 24 
 25-int screen_width, screen_height;
 26-
 27 Uint8
 28 emu_dei(const Uint8 port)
 29 {
 30@@ -978,8 +975,8 @@ emu_deo(const Uint8 port, const Uint8 value)
 31 	case 0x1f: console_start_fork(); return;
 32 	/* Screen */
 33 	case 0x21: screen_vector = PEEK2(&dev[0x20]); return;
 34-	case 0x23: screen_apply(PEEK2(&dev[0x22]), uxn_screen.height); return;
 35-	case 0x25: screen_apply(uxn_screen.width, PEEK2(&dev[0x24])); return;
 36+	case 0x23: screen_apply(PEEK2(&dev[0x22]), uxn_screen.height), emu_resize(); return;
 37+	case 0x25: screen_apply(uxn_screen.width, PEEK2(&dev[0x24])), emu_resize(); return;
 38 	case 0x26: rMX = dev[0x26] & 0x1, rMY = dev[0x26] & 0x2, rMA = dev[0x26] & 0x4, rML = dev[0x26] >> 4, rDX = rMX << 3, rDY = rMY << 2; return;
 39 	case 0x28:
 40 	case 0x29: rX = (dev[0x28] << 8) | dev[0x29], rX = twos(rX); return;
 41@@ -1042,7 +1039,8 @@ static void
 42 emu_restart(unsigned int soft)
 43 {
 44 	console_close();
 45-	screen_apply(WIDTH, HEIGHT);
 46+	screen_apply(WIDTH, HEIGHT), emu_resize();
 47+	;
 48 	system_reboot(soft);
 49 	uxn_eval(0x100);
 50 }
 51@@ -1153,7 +1151,7 @@ display_init(void)
 52 	Screen *screen;
 53 	Visual *visual;
 54 	XClassHint class = {"uxn11", "Uxn"};
 55-	int anchor_x, anchor_y;
 56+	int screen_width, screen_height;
 57 	/* start display */
 58 	display = XOpenDisplay(NULL);
 59 	if(!display)
 60@@ -1165,15 +1163,13 @@ display_init(void)
 61 	/* center */
 62 	screen = ScreenOfDisplay(display, 0);
 63 	screen_width = screen->width, screen_height = screen->height;
 64-	window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, WIDTH, HEIGHT, 1, 0, 0);
 65+	window = XCreateSimpleWindow(display, RootWindow(display, 0), screen_width / 2 - uxn_screen.width / 2, screen_height / 2 - uxn_screen.height / 2, WIDTH, HEIGHT, 1, 0, 0);
 66 	display_hidecursor();
 67 	display_floating(display, window);
 68 	XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask | LeaveWindowMask);
 69 	XStoreName(display, window, "uxn11");
 70 	XSetClassHint(display, window, &class);
 71 	XMapWindow(display, window);
 72-	uxn_screen.zoom = 1;
 73-	screen_apply(WIDTH, HEIGHT);
 74 	return 1;
 75 }
 76 
 77@@ -1200,6 +1196,8 @@ emu_run(void)
 78 			read(fds[1].fd, expirations, 8);
 79 			if(screen_vector)
 80 				uxn_eval(screen_vector);
 81+			if(uxn_screen.resized)
 82+				emu_resize(), uxn_screen.resized = 0;
 83 			if(uxn_screen.x2 && uxn_screen.y2 && screen_changed())
 84 				emu_repaint();
 85 		}
 86@@ -1224,10 +1222,10 @@ main(int argc, char **argv)
 87 		return !fprintf(stdout, "Uxn11 - Varvara Emulator, 24 Jun 2025.\n");
 88 	else if(argc == 1)
 89 		return !fprintf(stdout, "usage: %s [-v] file.rom [args..]\n", argv[0]);
 90-	else if(!display_init())
 91-		return !fprintf(stdout, "Could not open display.\n");
 92 	else if(!system_boot(argv[i++], argc > 2))
 93 		return !fprintf(stdout, "Could not load %s.\n", argv[i - 1]);
 94+	uxn_screen.zoom = 1;
 95+	screen_apply(WIDTH, HEIGHT);
 96 	if(uxn_eval(0x100) && console_vector) {
 97 		for(; i < argc; i++) {
 98 			char *p = argv[i];
 99@@ -1236,7 +1234,8 @@ main(int argc, char **argv)
100 			console_input('\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
101 		}
102 	}
103-	XMoveWindow(display, window, screen_width / 2 - uxn_screen.width / 2, screen_height / 2 - uxn_screen.height / 2);
104+	if(!display_init())
105+		return !fprintf(stdout, "Could not open display.\n");
106 	emu_run();
107 	console_close();
108 	XDestroyImage(ximage), XDestroyWindow(display, window), XCloseDisplay(display);