further reorg of module abstraction and control interface
[dcpu16] / vm-dcpu16.c
index b8a35327b0721bc75961fa86a3746ac227b7a3e5..a6dc67dac2ca2f2212eac09ffe2836e46e913fc1 100644 (file)
@@ -564,18 +564,19 @@ COMMAND_IMPL(display) {
             return 0;
         }
 
-        lem1802_vnc_associate(hw, s->screen);
+        if (dcpu16_hw_ctl(hw, "associate_rfbScreen", s->screen, NULL)) {
+            fprintf(stderr, "failed to configure display/vnc");
+            dcpu16_hw_del(&hw);
+            return 0;
+        }
         s->attached_display = hw;
         rfbScreen_start(s->screen);
         renderer_data = s->screen;
     }
 #endif /* HAVE_LIBVNCSERVER */
 
-    if (lem1802_renderer_set(hw, renderer, renderer_data)) {
-        fprintf(stderr, "failed to set back-end renderer for display\n");
-        dcpu16_hw_del(&hw);
-        return 0;
-    }
+    dcpu16_hw_ctl(hw, "renderer", (char *)renderer, NULL);
+    dcpu16_hw_ctl(hw, "renderer_data", renderer_data, NULL);
 
     if (dcpu16_hw_attach(vm, hw)) {
         fprintf(stderr, "failed to attach new display\n");
@@ -586,6 +587,11 @@ COMMAND_IMPL(display) {
     return 0;
 }
 COMMAND_HELP(display) {
+    struct renderer_ {
+        char *name;
+        char *args;
+        int (*renderer)(void *, void *, size_t, size_t);
+    } *r;
     char *name, *args;
     void *iter;
 
@@ -596,6 +602,16 @@ 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);
@@ -624,7 +640,11 @@ COMMAND_IMPL(keyboard) {
         dcpu16_hw_del(&hw);
         return 0;
     }
-    keyboard_vnc_associate(hw, s->screen);
+    if (dcpu16_hw_ctl(hw, "associate_rfbScreen", s->screen, NULL)) {
+        fprintf(stderr, "failed to configure keyboard/vnc\n");
+        dcpu16_hw_del(&hw);
+        return 0;
+    }
     s->attached_keyboard = hw;
 
     if (dcpu16_hw_attach(vm, hw)) {