chiark / gitweb /
Forbid undo of new-game if it would change the params.
[sgt-puzzles.git] / nestedvm.c
index 9381b6c9fe6792d173fcd2c720567b419d311421..f7a2ae8ec58217e50c4769489936697e7bb4683d 100644 (file)
@@ -35,7 +35,7 @@ struct frontend {
     struct timeval last_time;
     config_item *cfg;
     int cfg_which, cfgret;
-    int ox, oy;
+    int ox, oy, w, h;
 };
 
 static frontend *_fe;
@@ -61,6 +61,7 @@ void nestedvm_status_bar(void *handle, char *text)
 void nestedvm_start_draw(void *handle)
 {
     frontend *fe = (frontend *)handle;
+    _call_java(5, 0, fe->w, fe->h);
     _call_java(4, 1, fe->ox, fe->oy);
 }
 
@@ -218,6 +219,8 @@ int jcallback_resize(int width, int height)
     midend_size(fe->me, &x, &y, TRUE);
     fe->ox = (width - x) / 2;
     fe->oy = (height - y) / 2;
+    fe->w = x;
+    fe->h = y;
     midend_force_redraw(fe->me);
     return 0;
 }
@@ -302,10 +305,34 @@ static int get_config(frontend *fe, int which)
     return fe->cfgret;
 }
 
-int jcallback_menu_key_event(int key)
+int jcallback_newgame_event(void)
 {
     frontend *fe = (frontend *)_fe;
-    if (!midend_process_key(fe->me, 0, 0, key))
+    if (!midend_process_key(fe->me, 0, 0, UI_NEWGAME))
+       return 42;
+    return 0;
+}
+
+int jcallback_undo_event(void)
+{
+    frontend *fe = (frontend *)_fe;
+    if (!midend_process_key(fe->me, 0, 0, UI_UNDO))
+       return 42;
+    return 0;
+}
+
+int jcallback_redo_event(void)
+{
+    frontend *fe = (frontend *)_fe;
+    if (!midend_process_key(fe->me, 0, 0, UI_REDO))
+       return 42;
+    return 0;
+}
+
+int jcallback_quit_event(void)
+{
+    frontend *fe = (frontend *)_fe;
+    if (!midend_process_key(fe->me, 0, 0, UI_QUIT))
        return 42;
     return 0;
 }
@@ -379,6 +406,23 @@ int jcallback_about_event()
     return 0;
 }
 
+void preset_menu_populate(struct preset_menu *menu, int menuid)
+{
+    int i;
+
+    for (i = 0; i < menu->n_entries; i++) {
+        struct preset_menu_entry *entry = &menu->entries[i];
+        if (entry->params) {
+            _call_java(5, (int)entry->params, 0, 0);
+            _call_java(1, (int)entry->title, menuid, entry->id);
+        } else {
+            _call_java(5, 0, 0, 0);
+            _call_java(1, (int)entry->title, menuid, entry->id);
+            preset_menu_populate(entry->submenu, entry->id);
+        }
+    }
+}
+
 int main(int argc, char **argv)
 {
     int i, n;
@@ -391,14 +435,12 @@ int main(int argc, char **argv)
        midend_game_id(_fe->me, argv[1]);   /* ignore failure */
     midend_new_game(_fe->me);
 
-    if ((n = midend_num_presets(_fe->me)) > 0) {
-        int i;
-        for (i = 0; i < n; i++) {
-            char *name;
-            game_params *params;
-            midend_fetch_preset(_fe->me, i, &name, &params);
-           _call_java(1, (int)name, (int)params, 0);
-        }
+    {
+        struct preset_menu *menu;
+        int nids, topmenu;
+        menu = midend_get_presets(_fe->me, &nids);
+        topmenu = _call_java(1, 0, nids, 0);
+        preset_menu_populate(menu, topmenu);
     }
 
     colours = midend_colours(_fe->me, &n);