Merge display functions

This commit is contained in:
Devine Lu Linvega 2024-01-15 10:17:37 -08:00
parent 83762ded9c
commit f4e3dc9973
2 changed files with 39 additions and 33 deletions

View File

@ -35,7 +35,7 @@ system_load(Uxn *u, char *filename)
{ {
FILE *f = fopen(filename, "rb"); FILE *f = fopen(filename, "rb");
if(f) { if(f) {
int i, l = fread(&u->ram[PAGE_PROGRAM], 0x10000 - PAGE_PROGRAM, 1, f); int i = 0, l = fread(&u->ram[PAGE_PROGRAM], 0x10000 - PAGE_PROGRAM, 1, f);
while(l && ++i < RAM_PAGES) while(l && ++i < RAM_PAGES)
l = fread(u->ram + 0x10000 * i, 0x10000, 1, f); l = fread(u->ram + 0x10000 * i, 0x10000, 1, f);
fclose(f); fclose(f);

View File

@ -43,18 +43,6 @@ clamp(int val, int min, int max)
return (val >= min) ? (val <= max) ? val : max : min; return (val >= min) ? (val <= max) ? val : max : min;
} }
static void
hide_cursor(void)
{
XColor black = {0};
static char empty[] = {0};
Pixmap bitmap = XCreateBitmapFromData(display, window, empty, 1, 1);
Cursor blank = XCreatePixmapCursor(display, bitmap, bitmap, &black, &black, 0, 0);
XDefineCursor(display, window, blank);
XFreeCursor(display, blank);
XFreePixmap(display, bitmap);
}
Uint8 Uint8
emu_dei(Uxn *u, Uint8 addr) emu_dei(Uxn *u, Uint8 addr)
{ {
@ -86,9 +74,9 @@ emu_deo(Uxn *u, Uint8 addr, Uint8 value)
} }
int int
emu_resize(int width, int height) emu_resize(int w, int h)
{ {
int w = uxn_screen.width, h = uxn_screen.height, s = uxn_screen.scale; int s = uxn_screen.scale;
static Visual *visual; static Visual *visual;
if(window) { if(window) {
visual = DefaultVisual(display, 0); visual = DefaultVisual(display, 0);
@ -137,7 +125,7 @@ get_button(KeySym sym)
} }
static void static void
toggle_scale(Uxn *u) toggle_scale(void)
{ {
int s = uxn_screen.scale + 1; int s = uxn_screen.scale + 1;
if(s > 3) s = 1; if(s > 3) s = 1;
@ -162,7 +150,7 @@ emu_event(Uxn *u)
char buf[7]; char buf[7];
XLookupString((XKeyPressedEvent *)&ev, buf, 7, &sym, 0); XLookupString((XKeyPressedEvent *)&ev, buf, 7, &sym, 0);
if(sym == XK_F1) if(sym == XK_F1)
toggle_scale(u); toggle_scale();
else if(sym == XK_F2) else if(sym == XK_F2)
u->dev[0x0e] = !u->dev[0x0e]; u->dev[0x0e] = !u->dev[0x0e];
else if(sym == XK_F4) else if(sym == XK_F4)
@ -203,18 +191,19 @@ emu_event(Uxn *u)
} }
static int static int
emu_run(Uxn *u, char *rom) display_init(void)
{ {
int i = 1, n, s = uxn_screen.scale; int s = uxn_screen.scale;
char expirations[8];
char coninp[CONINBUFSIZE];
struct pollfd fds[3];
static const struct itimerspec screen_tspec = {{0, 16666666}, {0, 16666666}};
loaded_rom = rom;
/* display */
Atom wmDelete; Atom wmDelete;
static Visual *visual; static Visual *visual;
XColor black = {0};
static char empty[] = {0};
Pixmap bitmap;
Cursor blank;
display = XOpenDisplay(NULL);
if(!display)
return system_error("init", "Display failed");
/* display */
visual = DefaultVisual(display, 0); visual = DefaultVisual(display, 0);
window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, uxn_screen.width * s + PAD * 2, uxn_screen.height * s + PAD * 2, 1, 0, 0); window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, uxn_screen.width * s + PAD * 2, uxn_screen.height * s + PAD * 2, 1, 0, 0);
if(visual->class != TrueColor) if(visual->class != TrueColor)
@ -222,10 +211,27 @@ emu_run(Uxn *u, char *rom)
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, rom); XStoreName(display, window, boot_rom);
XMapWindow(display, window); XMapWindow(display, window);
ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width * s, uxn_screen.height * s, 32, 0); ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width * s, uxn_screen.height * s, 32, 0);
hide_cursor(); /* hide cursor */
bitmap = XCreateBitmapFromData(display, window, empty, 1, 1);
blank = XCreatePixmapCursor(display, bitmap, bitmap, &black, &black, 0, 0);
XDefineCursor(display, window, blank);
XFreeCursor(display, blank);
XFreePixmap(display, bitmap);
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}};
loaded_rom = rom;
/* timer */ /* timer */
fds[0].fd = XConnectionNumber(display); fds[0].fd = XConnectionNumber(display);
@ -243,7 +249,7 @@ emu_run(Uxn *u, char *rom)
read(fds[1].fd, expirations, 8); /* Indicate we handled the timer */ read(fds[1].fd, expirations, 8); /* Indicate we handled the timer */
uxn_eval(u, PEEK2(u->dev + 0x20)); /* Call the vector once, even if the timer fired multiple times */ uxn_eval(u, PEEK2(u->dev + 0x20)); /* Call the vector once, even if the timer fired multiple times */
if(uxn_screen.x2) { if(uxn_screen.x2) {
s = uxn_screen.scale; int s = uxn_screen.scale;
int x1 = uxn_screen.x1 * s, y1 = uxn_screen.y1 * s, x2 = uxn_screen.x2 * s, y2 = uxn_screen.y2 * s; int x1 = uxn_screen.x1 * s, y1 = uxn_screen.y1 * s, x2 = uxn_screen.x2 * s, y2 = uxn_screen.y2 * s;
screen_redraw(u); screen_redraw(u);
XPutImage(display, window, DefaultGC(display, 0), ximage, x1, y1, x1 + PAD, y1 + PAD, x2 - x1, y2 - y1); XPutImage(display, window, DefaultGC(display, 0), ximage, x1, y1, x1 + PAD, y1 + PAD, x2 - x1, y2 - y1);
@ -272,14 +278,14 @@ main(int argc, char **argv)
fprintf(stdout, "Uxn11 - Varvara Emulator, 15 Jan 2023.\n"); fprintf(stdout, "Uxn11 - Varvara Emulator, 15 Jan 2023.\n");
i++; i++;
} }
if(!(display = XOpenDisplay(NULL))) {
fprintf(stdout, "Could not open display.\n");
return 0;
}
if(!system_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) { if(!system_boot(&u, (Uint8 *)calloc(0x10000 * RAM_PAGES, sizeof(Uint8)), argv[i++])) {
fprintf(stdout, "Could not boot.\n"); fprintf(stdout, "Could not boot.\n");
return 0; return 0;
} }
if(!display_init()) {
fprintf(stdout, "Could not open display.\n");
return 0;
}
/* Game Loop */ /* Game Loop */
screen_resize(WIDTH, HEIGHT, 1); screen_resize(WIDTH, HEIGHT, 1);
u.dev[0x17] = argc - i; u.dev[0x17] = argc - i;