X-Git-Url: http://git.squeep.com/?p=dcpu16;a=blobdiff_plain;f=vm-dcpu16.c;fp=vm-dcpu16.c;h=86f773aac4cfa691921da0488ddddaceaa9243e9;hp=a6dc67dac2ca2f2212eac09ffe2836e46e913fc1;hb=d3c579a9b588b7f94fca88474ab2bd010f67a22f;hpb=94be117719b907e351bb2bf1096f6195daecd2aa diff --git a/vm-dcpu16.c b/vm-dcpu16.c index a6dc67d..86f773a 100644 --- a/vm-dcpu16.c +++ b/vm-dcpu16.c @@ -151,7 +151,7 @@ int file_load_(struct dcpu16 *vm, char *filename, DCPU16_WORD addr) { #ifdef HAVE_LIBVNCSERVER static struct dynamic_array rfbScreens_; -/* wups, kbdAddEvent isn't null by default, so I guess track things externally */ +/* wups, kbdAddEvent isn't null by default, so I guess track associations externally */ struct rfb_instance_ { rfbScreenInfoPtr screen; struct dcpu16_hw *attached_display; @@ -163,6 +163,10 @@ static struct rfb_instance_ *rfbScreen_next_available_display_(struct dynamic_array *rfbScreens, int argc, char *argv[]) { size_t i; struct rfb_instance_ new_instance, *s; + struct packed_args_ { + int argc; + char **argv; + } parg = { argc, argv }; fprintf(stderr, "DEBUG: rfbScreens->entries:%zu\n", rfbScreens->entries); @@ -172,7 +176,11 @@ struct rfb_instance_ *rfbScreen_next_available_display_(struct dynamic_array *rf return s; } - new_instance.screen = lem1802_rfb_new(argc, argv); + if (dcpu16_hw_module_lem1802.ctl(NULL, "new_rfbScreen", &parg, &new_instance.screen)) { + fprintf(stderr, "failed to allocate new rfbScreen"); + return NULL; + } + new_instance.attached_display = NULL; new_instance.attached_keyboard = NULL; s = dynarray_add(rfbScreens, &new_instance); @@ -184,6 +192,10 @@ static struct rfb_instance_ *rfbScreen_next_available_keyboard_(struct dynamic_array *rfbScreens, int argc, char *argv[]) { size_t i; struct rfb_instance_ new_instance, *s; + struct packed_args_ { + int argc; + char **argv; + } parg = { argc, argv }; for (i = 0; i < rfbScreens->entries; i++) { s = (struct rfb_instance_ *)DYNARRAY_ITEM(*rfbScreens, i); @@ -191,7 +203,11 @@ struct rfb_instance_ *rfbScreen_next_available_keyboard_(struct dynamic_array *r return s; } - new_instance.screen = lem1802_rfb_new(argc, argv); + if (dcpu16_hw_module_lem1802.ctl(NULL, "new_rfbScreen", &parg, &new_instance.screen)) { + fprintf(stderr, "failed to allocate new rfbScreen"); + return NULL; + } + new_instance.attached_display = NULL; new_instance.attached_keyboard = NULL; s = dynarray_add(rfbScreens, &new_instance); @@ -590,9 +606,7 @@ COMMAND_HELP(display) { struct renderer_ { char *name; char *args; - int (*renderer)(void *, void *, size_t, size_t); - } *r; - char *name, *args; + } renderer; void *iter; fprintf(f, "\tdisplay renderer [renderer data]\n"); @@ -603,19 +617,17 @@ COMMAND_HELP(display) { fprintf(f, "Supported renderers:\n"); - if (dcpu16_hw_module_lem1802.ctl(NULL, "get_renderers", NULL, &r)) { - fprintf(stderr, "error fetching list of renderers\n"); - return; - } - - while (r->name) { - fprintf(f, "name:%s args:%s\n", r->name, r->args); - } - iter = NULL; - while ( (lem1802_renderers_iter(&iter, &name, &args)) ) { - fprintf(f, "\t%s %s\n", name, args); - } + do { + if (dcpu16_hw_module_lem1802.ctl(NULL, "renderers_iter", &iter, &renderer)) { + fprintf(stderr, "error fetching next renderer\n"); + break; + } + if (iter == NULL || renderer.name == NULL) + break; + + fprintf(f, "\t%s %s\n", renderer.name, renderer.args); + } while (iter); } COMMAND_IMPL(keyboard) {