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);