This is tui.c in view mode; [Download] [Up]
/* * tui.c - A (very) simple text-based user interface. * * Written by * Ettore Perazzoli (ettore@comm2000.it) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #include "vice.h" #include <sys/farptr.h> #include <go32.h> #include <strings.h> #include <stdio.h> #include <ctype.h> #include <conio.h> #include <pc.h> #include <keys.h> #include <stdarg.h> #include <allegro.h> #include "tui.h" #include "utils.h" /* ------------------------------------------------------------------------- */ static int _tui_input_string(int x, int y, char *buf, int max_length, int displayed_length, int foreground_color, int background_color) { int cursor_pos = 0; int scroll_offset = 0; int string_length = strlen(buf); int need_redisplay = 1; tui_set_attr(foreground_color, background_color, 0); _setcursortype(_SOLIDCURSOR); while (1) { int key; if (need_redisplay) { tui_display(x, y, displayed_length, "%s", buf + scroll_offset); need_redisplay = 0; } tui_gotoxy(x + cursor_pos - scroll_offset, y); key = getkey(); switch (key) { case K_Left: if (cursor_pos > 0) { cursor_pos--; if (cursor_pos < scroll_offset) { scroll_offset = cursor_pos; need_redisplay = 1; } } break; case K_Right: if (cursor_pos < string_length) { cursor_pos++; if (cursor_pos >= (scroll_offset + displayed_length)) { scroll_offset = cursor_pos - displayed_length + 1; need_redisplay = 1; } } break; case K_Home: cursor_pos = 0; scroll_offset = 0; need_redisplay = 1; break; case K_End: cursor_pos = string_length; scroll_offset = cursor_pos - displayed_length + 1; if (scroll_offset < 0) scroll_offset = 0; need_redisplay = 1; break; case K_BackSpace: if (cursor_pos > 0 && cursor_pos <= string_length) { memmove(buf + cursor_pos - 1, buf + cursor_pos, string_length - cursor_pos + 1); string_length--; cursor_pos--; if (cursor_pos < scroll_offset) scroll_offset = cursor_pos; need_redisplay = 1; } break; case K_Delete: if (cursor_pos < string_length) { memmove(buf + cursor_pos, buf + cursor_pos + 1, string_length - cursor_pos); string_length--; need_redisplay = 1; } break; case K_Return: _setcursortype(_NOCURSOR); return 0; case K_Escape: _setcursortype(_NOCURSOR); return -1; default: if (key <= 0xff && isprint((char) key) && string_length < max_length) { memmove(buf + cursor_pos + 1, buf + cursor_pos, string_length - cursor_pos + 1); buf[cursor_pos] = (char) key; cursor_pos++; string_length++; if (cursor_pos - scroll_offset >= displayed_length) scroll_offset = cursor_pos - displayed_length + 1; need_redisplay = 1; } break; } } } int tui_input_string(const char *title, const char *prompt, char *buf, int buflen) { int field_width, x, y, width, height, retval; tui_area_t backing_store = NULL; if (buflen + 1 < tui_num_cols() - 12) field_width = buflen + 1; else field_width = tui_num_cols() - 12; width = field_width + 4; height = 4; x = CENTER_X(width); y = CENTER_Y(height); tui_display_window(x, y, width, height, REQUESTER_BORDER, REQUESTER_BACK, title, &backing_store); tui_set_attr(REQUESTER_FORE, REQUESTER_BACK, 0); tui_display(x + 2, y + 1, field_width, prompt); retval = _tui_input_string(x + 2, y + 2, buf, buflen, field_width, FIELD_FORE, FIELD_BACK); tui_area_put(backing_store, x, y); tui_area_free(backing_store); return retval; } /* ------------------------------------------------------------------------- */ void tui_error(const char *format,...) { int x, y, width, height; char str[1024]; int str_length; va_list ap; tui_area_t backing_store = NULL; va_start(ap, format); vsprintf(str, format, ap); str_length = strlen(str); if (str_length > tui_num_cols() - 10) { str_length = tui_num_cols() - 10; str[str_length] = 0; } x = CENTER_X(str_length + 6); y = CENTER_Y(5); width = str_length + 6; height = 5; tui_display_window(x, y, width, height, ERROR_BORDER, ERROR_BACK, "Error!", &backing_store); tui_set_attr(ERROR_FORE, ERROR_BACK, 0); tui_display(CENTER_X(str_length), y + 2, 0, str); getkey(); tui_area_put(backing_store, x, y); tui_area_free(backing_store); } void tui_message(const char *format,...) { int x, y, width, height; char str[1024]; int str_length; va_list ap; tui_area_t backing_store = NULL; va_start(ap, format); vsprintf(str, format, ap); str_length = strlen(str); if (str_length > tui_num_cols() - 10) { str_length = tui_num_cols() - 10; str[str_length] = 0; } x = CENTER_X(str_length + 6); y = CENTER_Y(5); width = str_length + 6; height = 5; tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, NULL, &backing_store); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); tui_display(CENTER_X(str_length), y + 2, 0, str); getkey(); tui_area_put(backing_store, x, y); tui_area_free(backing_store); } int tui_ask_confirmation(const char *format, ...) { int x, y, width, height; char str[1024]; int str_length; va_list ap; tui_area_t backing_store = NULL; int c; va_start(ap, format); vsprintf(str, format, ap); str_length = strlen(str); if (str_length > tui_num_cols() - 10) { str_length = tui_num_cols() - 10; str[str_length] = 0; } x = CENTER_X(str_length + 6); y = CENTER_Y(5); width = str_length + 6; height = 5; tui_display_window(x, y, width, height, MESSAGE_BORDER, MESSAGE_BACK, NULL, &backing_store); tui_set_attr(MESSAGE_FORE, MESSAGE_BACK, 0); tui_display(CENTER_X(str_length), y + 2, 0, str); do { c = getkey(); } while (toupper(c) != 'Y' && toupper(c) != 'N'); tui_area_put(backing_store, x, y); tui_area_free(backing_store); return toupper(c) == 'Y'; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.