diff --git a/emul/hw/sms/sms.c b/emul/hw/sms/sms.c index 99cb393..25c414a 100644 --- a/emul/hw/sms/sms.c +++ b/emul/hw/sms/sms.c @@ -99,6 +99,7 @@ void draw_pixels() int innerh = psize * VDP_SCREENH; int innerx = (geom->width - innerw) / 2; int innery = (geom->height - innerh) / 2; + free(geom); int drawcnt = 0; for (int i=0; iwidth - innerw) / 2; int innery = (geom->height - innerh) / 2; + free(geom); int drawcnt = 0; for (int i=0; i<96; i++) { for (int j=0; j<64; j++) { @@ -231,6 +232,15 @@ void event_loop() emul_steps(100); draw_pixels(); } + // A low tech way of checking when the window was closed. The proper way + // involving WM_DELETE is too complicated. + xcb_get_geometry_reply_t *geom; + geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); + if (geom == NULL) { + return; // window has been closed. + } else { + free(geom); + } xcb_generic_event_t *e = xcb_poll_for_event(conn); if (!e) { continue;