/** * Print the current button list at the specified `row` and `col`umn. */ size_t button_print(int row, int col) { int j; button_mouse *bttn; if (button_print_hook) { size_t res = (*button_print_hook)(row, col); if (res) { // if res != 0 return res; } } button_1d_start_x = col; button_1d_start_y = row; for (j = 0; j < button_1d_num; j++) put_fstr(col + button_1d_list[j].left, row, CLR_SLATE "%s", button_1d_list[j].label); /* print 2d buttons */ bttn = button_stack; while (bttn) { if (bttn->label && bttn->label[0]) { put_cstr(bttn->left, bttn->top, bttn->label, 0); } bttn = bttn->next; } return button_1d_length; }
/* * Pause for user response XXX XXX XXX */ void pause_line(int row) { prtf(0, row, ""); put_fstr(23, row, "[Press any key to continue]"); inkey(); prtf(0, row, ""); }
/* * Generic "get choice from menu" function */ int get_player_choice(cptr *choices, int num, int col, int wid, cptr helpfile, void (*hook) (cptr)) { int top = 0, cur = 0; /* int bot = 13; */ int i, dir; char c; char buf[80]; bool done = FALSE; int hgt; /* Autoselect if able */ if (num == 1) done = TRUE; /* Clear */ for (i = TABLE_ROW; i < Term->hgt; i++) { /* Clear */ Term_erase(col, i, Term->wid - wid); } /* Choose */ while (TRUE) { /* * Note to Melkor: What happens when the screen is resized? * There is no 'redraw' hook at this point... * (That is why the original code restricted itself to what * would fit in the smallest possible screen.) -SF- */ hgt = Term->hgt - TABLE_ROW - 1; /* Redraw the list */ for (i = 0; ((i + top < num) && (i <= hgt)); i++) { if (i + top < 26) { strnfmt(buf, 80, "%c) %s", I2A(i + top), choices[i + top]); } else { /* ToDo: Fix the ASCII dependency */ strnfmt(buf, 80, "%c) %s", 'A' + (i + top - 26), choices[i + top]); } /* Clear */ Term_erase(col, i + TABLE_ROW, wid); /* Display */ if (i == (cur - top)) { /* Highlight the current selection */ put_fstr(col, i + TABLE_ROW, CLR_L_BLUE "%s", buf); } else { put_fstr(col, i + TABLE_ROW, buf); } } if (done) return (cur); /* Display auxiliary information if any is available. */ if (hook) hook(choices[cur]); /* Move the cursor */ Term_gotoxy(col, TABLE_ROW + cur - top); c = inkey(); if (c == KTRL('X')) { quit(NULL); } if (c == ESCAPE) { /* Mega Hack - go back. */ return (INVALID_CHOICE); } if (c == '*') { /* Select at random */ cur = randint0(num); /* Move it onto the screen */ if ((cur < top) || (cur > top + hgt)) { top = cur; } /* Done */ done = TRUE; } else if (c == '?') { (void)show_file(helpfile, NULL, 0, 0); } else if (c == '=') { do_cmd_options(OPT_FLAG_BIRTH | OPT_FLAG_SERVER | OPT_FLAG_PLAYER); } else if ((c == '\n') || (c == '\r')) { /* Done */ return (cur); } else if (isdigit(c)) { /* Get a direction from the key */ dir = get_keymap_dir(c); /* Going up? */ if (dir == 8) { if (cur != 0) { /* Move selection */ cur--; } if ((top > 0) && ((cur - top) < 4)) { /* Scroll up */ top--; } } /* Going down? */ if (dir == 2) { if (cur != (num - 1)) { /* Move selection */ cur++; } if ((top + hgt < (num - 1)) && ((top + hgt - cur) < 4)) { /* Scroll down */ top++; } } } else if (isalpha(c)) { int choice; if (islower(c)) { choice = A2I(c); } else { choice = c - 'A' + 26; } /* Validate input */ if ((choice > -1) && (choice < num)) { cur = choice; /* Move it onto the screen */ if ((cur < top) || (cur > top + hgt)) { top = cur; } /* Done */ done = TRUE; } else { /* Invalid input */ bell("Illegal birth choice!"); } } } return (INVALID_CHOICE); }
/* * Get some input at the cursor location. * Assume the buffer is initialized to a default string. * Note that this string is often "empty" (see below). * The default buffer is displayed in yellow until cleared. * Pressing RETURN right away accepts the default entry. * Normal chars clear the default and append the char. * Backspace clears the default or deletes the final char. * ESCAPE clears the buffer and the window and returns FALSE. * RETURN accepts the current buffer contents and returns TRUE. * * Note that 'len' refers to the size of the buffer. The maximum length * of the input is 'len-1'. */ bool askfor_aux(char *buf, int len) { int y, x; int i = 0; int k = 0; bool done = FALSE; /* Locate the cursor */ (void)Term_locate(&x, &y); /* Paranoia -- check len */ if (len < 1) len = 1; /* Paranoia -- check column */ if ((x < 0) || (x >= 80)) x = 0; /* Restrict the length */ if (x + len > 80) len = 80 - x; /* Paranoia -- Clip the default entry */ buf[len - 1] = '\0'; /* Display the default answer */ Term_erase(x, y, len); put_fstr(x, y, CLR_YELLOW "%s", buf); /* Process input */ while (!done) { /* Get a key */ i = inkey(); /* Analyze the key */ switch (i) { case ESCAPE: k = 0; done = TRUE; break; case '\n': case '\r': k = strlen(buf); done = TRUE; break; case 0x7F: case '\010': if (k > 0) k--; break; default: if ((k < len - 1) && (isprint(i))) { buf[k++] = i; } else { bell("Illegal edit key!"); } break; } /* Terminate */ buf[k] = '\0'; /* Update the entry */ Term_erase(x, y, len); put_fstr(x, y, "%s", buf); } /* Aborted */ if (i == ESCAPE) return (FALSE); /* Success */ return (TRUE); }