#Endif; ! V5 #Ifnot; ! TARGET_GLULX [ DoMenu menu_choices EntryR ChoiceR winwid winhgt lines main_title main_wid cl i oldcl pkey; if (pretty_flag == 0 || gg_statuswin == 0) return LowKey_Menu(menu_choices, EntryR, ChoiceR); menu_nesting++; menu_item = 0; lines = indirect(EntryR); main_title = item_name; main_wid = item_width; cl = 0; ! If we printed "hit arrow keys" here, it would be appropriate to ! check for the availability of Glk input keys. But we actually ! print "hit N/P/Q". So it's reasonable to silently accept Glk ! arrow key codes as secondary options. .ReDisplay; glk($002A, gg_statuswin); ! window_clear glk($002A, gg_mainwin); ! window_clear glk($002F, gg_statuswin); ! set_window StatusLineHeight(lines+7); glk($0025, gg_statuswin, gg_arguments, gg_arguments+4); ! window_get_size winwid = gg_arguments-->0; winhgt = gg_arguments-->1; glk($0086, 4); ! set subheader style glk($002B, gg_statuswin, winwid/2-main_wid, 0); ! window_move_cursor print (string) main_title; glk($002B, gg_statuswin, 1, 1); ! window_move_cursor print (string) NKEY__TX; glk($002B, gg_statuswin, winwid-13, 1); ! window_move_cursor print (string) PKEY__TX; glk($002B, gg_statuswin, 1, 2); ! window_move_cursor print (string) RKEY__TX; glk($002B, gg_statuswin, winwid-18, 2); ! window_move_cursor if (menu_nesting == 1) print (string) QKEY1__TX; else print (string) QKEY2__TX; glk($0086, 0); ! set normal style glk($002B, gg_statuswin, 1, 4); ! window_move_cursor if (menu_choices ofclass String) print (string) menu_choices; else menu_choices.call(); oldcl = -1; for (::) { if (cl ~= oldcl) { if (cl < 0 || cl >= lines) cl = 0; if (oldcl >= 0) { glk($002B, gg_statuswin, 3, oldcl+6); print (char) ' '; } oldcl = cl; glk($002B, gg_statuswin, 3, oldcl+6); print (char) '>'; } pkey = KeyCharPrimitive(gg_statuswin, true); if (pkey == $80000000) jump ReDisplay; if (pkey == NKEY1__KY or NKEY2__KY or $fffffffb) { cl++; if (cl >= lines) cl = 0; continue; } if (pkey == PKEY1__KY or PKEY2__KY or $fffffffc) { cl--; if (cl < 0) cl = lines-1; continue; } if (pkey == QKEY1__KY or QKEY2__KY or $fffffff8 or $fffffffe) break; if (pkey == $fffffffa or $fffffffd) { glk($002F, gg_mainwin); ! set_window new_line; new_line; new_line; menu_item = cl+1; EntryR.call(); glk($002A, gg_statuswin); ! window_clear glk($002A, gg_mainwin); ! window_clear glk($002F, gg_statuswin); ! set_window StatusLineHeight(1); glk($0025, gg_statuswin, gg_arguments, gg_arguments+4); ! window_get_size winwid = gg_arguments-->0; winhgt = gg_arguments-->1; glk($0086, 4); ! set subheader style glk($002B, gg_statuswin, winwid/2-item_width, 0); ! window_move_cursor print (string) item_name; glk($0086, 0); ! set normal style glk($002F, gg_mainwin); ! set_window new_line; i = ChoiceR.call(); if (i == 2) jump ReDisplay; if (i == 3) break; L__M(##Miscellany, 53); pkey = KeyCharPrimitive(gg_mainwin, 1); jump ReDisplay; } } ! done with this menu... menu_nesting--; if (menu_nesting > 0) rfalse; glk($002F, gg_mainwin); ! set_window glk($002A, gg_mainwin); ! window_clear new_line; new_line; new_line; if (deadflag == 0) <>; ];