X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=nestedvm.c;h=f7a2ae8ec58217e50c4769489936697e7bb4683d;hb=db313b3948d27244dd7c34c2609c66d6204d8931;hp=757b65fd8a726a3e1c5d64e73c11b07fab9136ea;hpb=0c88256a22bc27737ff0a50ab5a42425534dba3b;p=sgt-puzzles.git diff --git a/nestedvm.c b/nestedvm.c index 757b65f..f7a2ae8 100644 --- a/nestedvm.c +++ b/nestedvm.c @@ -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); } @@ -167,6 +168,16 @@ void nestedvm_end_draw(void *handle) _call_java(4,2,0,0); } +char *nestedvm_text_fallback(void *handle, const char *const *strings, + int nstrings) +{ + /* + * We assume Java can cope with any UTF-8 likely to be emitted + * by a puzzle. + */ + return dupstr(strings[0]); +} + const struct drawing_api nestedvm_drawing = { nestedvm_draw_text, nestedvm_draw_rect, @@ -184,7 +195,8 @@ const struct drawing_api nestedvm_drawing = { nestedvm_blitter_save, nestedvm_blitter_load, NULL, NULL, NULL, NULL, NULL, NULL, /* {begin,end}_{doc,page,puzzle} */ - NULL, /* line_width */ + NULL, NULL, /* line_width, line_dotted */ + nestedvm_text_fallback, }; int jcallback_key_event(int x, int y, int keyval) @@ -207,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; } @@ -291,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, 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, key)) + 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; } @@ -368,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; @@ -380,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, ¶ms); - _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);