/* * Display a list of commands. */ static bool cmd_menu(command_list *list, void *selection_p) { menu_type menu; menu_iter commands_menu = { NULL, NULL, cmd_sub_entry, NULL, NULL }; region area = { 23, 4, 37, 13 }; ui_event evt; struct cmd_info **selection = selection_p; /* Set up the menu */ menu_init(&menu, MN_SKIN_SCROLL, &commands_menu); menu_setpriv(&menu, list->len, list->list); menu_layout(&menu, &area); /* Set up the screen */ screen_save(); window_make(21, 3, 62, 17); /* Select an entry */ evt = menu_select(&menu, 0, TRUE); /* Load de screen */ screen_load(); if (evt.type == EVT_SELECT) *selection = &list->list[menu.cursor]; return FALSE; }
/* ** create fft and filter windows. */ static int _command(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj* const *objv) { // check for usage if (argc != 3) return fw_error_obj(interp, Tcl_ObjPrintf("usage: %s type size", Tcl_GetString(objv[0]))); char *type_name = Tcl_GetString(objv[1]); int itype = -1; for (int i = 0; window_names[i] != NULL; i += 1) if (strcmp(window_names[i], type_name) == 0) { itype = i; break; } if (itype < 0) { Tcl_AppendResult(interp, "unknown window type, should be one of ", NULL); for (int i = 0; window_names[i] != NULL; i += 1) { if (i > 0) { Tcl_AppendResult(interp, ", ", NULL); if (window_names[i+1] == NULL) Tcl_AppendResult(interp, "or ", NULL); } Tcl_AppendResult(interp, window_names[i], NULL); } return TCL_ERROR; } int size; if (Tcl_GetIntFromObj(interp, objv[2], &size) != TCL_OK) return TCL_ERROR; Tcl_Obj *result = Tcl_NewObj(); float *window = (float *)Tcl_SetByteArrayLength(result, size*sizeof(float)); window_make(itype, size, window); Tcl_SetObjResult(interp, result); return TCL_OK; }
void menu_refresh(menu_type *menu, bool reset_screen) { int oid = menu->cursor; rect_region *loc = &menu->active; if (reset_screen) { screen_load(); screen_save(); } if (menu->filter_list && menu->cursor >= 0) oid = menu->filter_list[oid]; if (menu->flags & MN_BORDER) { window_make(menu->boundary.col, menu->boundary.row, menu->boundary.col + menu->boundary.width, menu->boundary.row + menu->boundary.page_rows); } if (menu->title) { if (menu->flags & MN_BORDER) { put_cstr(menu->boundary.col+2, menu->boundary.row+2, menu->title, loc->width); } else { put_cstr(menu->boundary.col, menu->boundary.row, menu->title, loc->width); } } if (menu->header) put_cstr(loc->col, loc->row - 1, menu->header, loc->width); if (menu->prompt) { if (menu->flags & MN_BORDER) { put_cstr(menu->boundary.col+2, loc->row + loc->page_rows, menu->prompt, loc->width); } else { put_cstr(menu->boundary.col, loc->row + loc->page_rows, menu->prompt, loc->width); } } if (menu->browse_hook && oid >= 0) menu->browse_hook(oid, menu->menu_data, loc); menu->skin->display_list(menu, menu->cursor, &menu->top, loc); }
/** * Handle keypresses. */ static bool quality_action(struct menu *m, const ui_event *event, int oid) { struct menu menu; menu_iter menu_f = { NULL, NULL, quality_subdisplay, NULL, NULL }; region area = { 37, 2, 29, IGNORE_MAX }; ui_event evt; int count; /* Display at the right point */ area.row += oid; /* Save */ screen_save(); /* Work out how many options we have */ count = IGNORE_MAX; if ((oid == ITYPE_RING) || (oid == ITYPE_AMULET)) count = area.page_rows = IGNORE_BAD + 1; /* Run menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu_setpriv(&menu, count, quality_values); /* Stop menus from going off the bottom of the screen */ if (area.row + menu.count > Term->hgt - 1) area.row += Term->hgt - 1 - area.row - menu.count; menu_layout(&menu, &area); window_make(area.col - 2, area.row - 1, area.col + area.width + 2, area.row + area.page_rows); evt = menu_select(&menu, 0, true); /* Set the new value appropriately */ if (evt.type == EVT_SELECT) ignore_level[oid] = menu.cursor; /* Load and finish */ screen_load(); return true; }
/* * Handle keypresses. */ static bool quality_action(menu_type *m, const ui_event_data *event, int oid) { menu_type menu; menu_iter menu_f = { NULL, NULL, quality_subdisplay, NULL }; region area = { 24, 5, 29, SQUELCH_MAX }; ui_event_data evt; int cursor; /* Display at the right point */ area.row += oid; cursor = squelch_level[oid]; /* Save */ screen_save(); /* Work out how many options we have */ int count = SQUELCH_MAX; if ((oid == TYPE_RING) || (oid == TYPE_AMULET)) count = area.page_rows = SQUELCH_BAD + 1; /* Run menu */ menu_init(&menu, MN_SKIN_SCROLL, &menu_f); menu_setpriv(&menu, count, quality_values); /* Stop menus from going off the bottom of the screen */ if (area.row + menu.count > Term->hgt - 1) area.row += Term->hgt - 1 - area.row - menu.count; menu_layout(&menu, &area); window_make(area.col - 2, area.row - 1, area.col + area.width + 2, area.row + area.page_rows); evt = menu_select(&menu, 0); /* Set the new value appropriately */ if (evt.type == EVT_SELECT) squelch_level[oid] = menu.cursor; /* Load and finish */ screen_load(); return TRUE; }
/* * Display a list of command types, allowing the user to select one. */ static struct cmd_info *textui_action_menu_choose(void) { region area = { 21, 5, 37, 6 }; struct cmd_info *chosen_command = NULL; if (!command_menu) command_menu = menu_new(MN_SKIN_SCROLL, &command_menu_iter); menu_setpriv(command_menu, N_ELEMENTS(cmds_all) - 1, &chosen_command); menu_layout(command_menu, &area); /* Set up the screen */ screen_save(); window_make(19, 4, 58, 11); menu_select(command_menu, 0, TRUE); screen_load(); return chosen_command; }
/** * Display a "small-scale" map of the dungeon in the active Term. * * Note that this function must "disable" the special lighting effects so * that the "priority" function will work. * * Note the use of a specialized "priority" function to allow this function * to work with any graphic attr/char mappings, and the attempts to optimize * this function where possible. * * If "cy" and "cx" are not NULL, then returns the screen location at which * the player was displayed, so the cursor can be moved to that location, * and restricts the horizontal map size to SCREEN_WID. Otherwise, nothing * is returned (obviously), and no restrictions are enforced. */ void display_map(int *cy, int *cx) { int map_hgt, map_wid; int row, col; int x, y; struct grid_data g; int a, ta; wchar_t c, tc; byte tp; struct monster_race *race = &r_info[0]; /* Priority array */ byte **mp = mem_zalloc(cave->height * sizeof(byte*)); for (y = 0; y < cave->height; y++) mp[y] = mem_zalloc(cave->width * sizeof(byte)); /* Desired map height */ map_hgt = Term->hgt - 2; map_wid = Term->wid - 2; /* Prevent accidents */ if (map_hgt > cave->height) map_hgt = cave->height; if (map_wid > cave->width) map_wid = cave->width; /* Prevent accidents */ if ((map_wid < 1) || (map_hgt < 1)) { for (y = 0; y < cave->height; y++) mem_free(mp[y]); mem_free(mp); return; } /* Nothing here */ a = COLOUR_WHITE; c = L' '; ta = COLOUR_WHITE; tc = L' '; /* Draw a box around the edge of the term */ window_make(0, 0, map_wid + 1, map_hgt + 1); /* Analyze the actual map */ for (y = 0; y < cave->height; y++) for (x = 0; x < cave->width; x++) { row = (y * map_hgt / cave->height); col = (x * map_wid / cave->width); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the attr/char at that map location */ map_info(loc(x, y), &g); grid_data_as_text(&g, &a, &c, &ta, &tc); /* Get the priority of that attr/char */ tp = f_info[g.f_idx].priority; /* Stuff on top of terrain gets higher priority */ if ((a != ta) || (c != tc)) tp = 20; /* Save "best" */ if (mp[row][col] < tp) { /* Hack - make every grid on the map lit */ g.lighting = LIGHTING_LIT; grid_data_as_text(&g, &a, &c, &ta, &tc); Term_queue_char(Term, col + 1, row + 1, a, c, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_queue_char(Term, col + 1, row + 1, 255, -1, 0, 0); /* Save priority */ mp[row][col] = tp; } } /*** Display the player ***/ /* Player location */ row = (player->grid.y * map_hgt / cave->height); col = (player->grid.x * map_wid / cave->width); if (tile_width > 1) col = col - (col % tile_width); if (tile_height > 1) row = row - (row % tile_height); /* Get the "player" tile */ ta = monster_x_attr[race->ridx]; tc = monster_x_char[race->ridx]; /* Draw the player */ Term_putch(col + 1, row + 1, ta, tc); if ((tile_width > 1) || (tile_height > 1)) Term_big_putch(col + 1, row + 1, ta, tc); /* Return player location */ if (cy != NULL) (*cy) = row + 1; if (cx != NULL) (*cx) = col + 1; for (y = 0; y < cave->height; y++) mem_free(mp[y]); mem_free(mp); }