Delay window generation to after eval

This commit is contained in:
neauoire 2023-08-16 13:01:50 -07:00
parent 1cc1bbc594
commit 6ebc44baeb
1 changed files with 25 additions and 25 deletions

View File

@ -86,12 +86,7 @@ emu_resize(int width, int height)
static int static int
emu_start(Uxn *u, char *rom) emu_start(Uxn *u, char *rom)
{ {
if(!system_load(u, rom))
return 0;
if(!uxn_screen.width || !uxn_screen.height)
screen_resize(WIDTH, HEIGHT);
if(!uxn_eval(u, PAGE_PROGRAM))
return system_error("boot", "Failed to start rom.");
return 1; return 1;
} }
@ -182,8 +177,15 @@ emu_event(Uxn *u)
} }
static int static int
display_start(char *title) emu_run(Uxn *u, char *rom)
{ {
int i = 1, n;
char expirations[8];
char coninp[CONINBUFSIZE];
struct pollfd fds[3];
static const struct itimerspec screen_tspec = {{0, 16666666}, {0, 16666666}};
/* display */
Atom wmDelete; Atom wmDelete;
display = XOpenDisplay(NULL); display = XOpenDisplay(NULL);
visual = DefaultVisual(display, 0); visual = DefaultVisual(display, 0);
@ -193,21 +195,10 @@ display_start(char *title)
XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask); XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask);
wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", True); wmDelete = XInternAtom(display, "WM_DELETE_WINDOW", True);
XSetWMProtocols(display, window, &wmDelete, 1); XSetWMProtocols(display, window, &wmDelete, 1);
XStoreName(display, window, title); XStoreName(display, window, rom);
XMapWindow(display, window); XMapWindow(display, window);
ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width * SCALE, uxn_screen.height * SCALE, 32, 0); ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width * SCALE, uxn_screen.height * SCALE, 32, 0);
hide_cursor(); hide_cursor();
return 1;
}
static int
emu_run(Uxn *u, char *rom)
{
int i = 1, n;
char expirations[8];
char coninp[CONINBUFSIZE];
struct pollfd fds[3];
static const struct itimerspec screen_tspec = {{0, 16666666}, {0, 16666666}};
/* timer */ /* timer */
fds[0].fd = XConnectionNumber(display); fds[0].fd = XConnectionNumber(display);
@ -242,6 +233,13 @@ emu_run(Uxn *u, char *rom)
return 1; return 1;
} }
static int
emu_end(Uxn *u)
{
XDestroyImage(ximage);
return u->dev[0x0f] & 0x7f;
}
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@ -266,10 +264,13 @@ main(int argc, char **argv)
if(!uxn_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)))) if(!uxn_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8))))
return system_error("boot", "Failed"); return system_error("boot", "Failed");
/* start sequence */ /* start sequence */
if(!emu_start(&u, rom_path)) screen_resize(WIDTH, HEIGHT);
return system_error("start", rom_path);
if(!display_start(rom_path)) if(!system_load(&u, rom_path))
return system_error("display", "Failed"); return 0;
if(!uxn_eval(&u, PAGE_PROGRAM))
return system_error("boot", "Failed to start rom.");
/* console vector */ /* console vector */
for(i = 2; i < argc; i++) { for(i = 2; i < argc; i++) {
char *p = argv[i]; char *p = argv[i];
@ -277,6 +278,5 @@ main(int argc, char **argv)
console_input(&u, '\n', i == argc ? CONSOLE_END : CONSOLE_EOA); console_input(&u, '\n', i == argc ? CONSOLE_END : CONSOLE_EOA);
} }
emu_run(&u, rom_path); emu_run(&u, rom_path);
XDestroyImage(ximage); return emu_end(&u);
return 0;
} }