mirror of
https://git.zap.org.au/git/trader.git
synced 2025-02-02 15:08:13 -05:00
Add simple functions to manage a stack of Curses windows
This commit is contained in:
parent
2a3e18460e
commit
4f62ef1b58
177
src/intf.c
177
src/intf.c
@ -33,6 +33,35 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Module constants and type declarations *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#define OUTBUFSIZE (1024) /* Output string buffer size */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct txwin {
|
||||||
|
WINDOW *win; // Pointer to window structure
|
||||||
|
struct txwin *next; // Next window in stack
|
||||||
|
struct txwin *prev; // Previous window in stack
|
||||||
|
} txwin_t;
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Global variable definitions *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
WINDOW *curwin = NULL; // Top-most (current) window
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Module variables *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
txwin_t *topwin = NULL; // Top-most txwin structure
|
||||||
|
txwin_t *firstwin = NULL; // First (bottom-most) txwin structure
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Basic text input/output function definitions *
|
* Basic text input/output function definitions *
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
@ -56,6 +85,10 @@ void init_screen (void)
|
|||||||
MIN_COLS, MIN_LINES);
|
MIN_COLS, MIN_LINES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
curwin = stdscr;
|
||||||
|
topwin = NULL;
|
||||||
|
firstwin = NULL;
|
||||||
|
|
||||||
noecho();
|
noecho();
|
||||||
curs_set(CURS_INVISIBLE);
|
curs_set(CURS_INVISIBLE);
|
||||||
raw();
|
raw();
|
||||||
@ -95,9 +128,153 @@ void init_screen (void)
|
|||||||
|
|
||||||
void end_screen (void)
|
void end_screen (void)
|
||||||
{
|
{
|
||||||
|
delalltxwin();
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
refresh();
|
refresh();
|
||||||
endwin();
|
endwin();
|
||||||
|
|
||||||
|
curwin = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Function: newtxwin - Create a new window, inserted into window stack
|
||||||
|
Arguments: nlines - Number of lines in new window
|
||||||
|
ncols - Number of columns in new window
|
||||||
|
begin_y - Starting line number (global coordinates)
|
||||||
|
begin_x - Starting column number (global coordinates)
|
||||||
|
Returns: WINDOW * - Pointer to new window structure
|
||||||
|
|
||||||
|
This function creates a window (using the Curses newwin() function) and
|
||||||
|
places it top-most in the stack of windows managed by this module. A
|
||||||
|
pointer to the new window is returned; the global variable "curwin"
|
||||||
|
also points to this new window. Please note that wrefresh() is NOT
|
||||||
|
called on the new window.
|
||||||
|
*/
|
||||||
|
|
||||||
|
WINDOW *newtxwin (int nlines, int ncols, int begin_y, int begin_x)
|
||||||
|
{
|
||||||
|
WINDOW *win;
|
||||||
|
txwin_t *nw;
|
||||||
|
|
||||||
|
|
||||||
|
win = newwin(nlines, ncols, begin_y, begin_x);
|
||||||
|
if (win == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nw = malloc(sizeof(txwin_t));
|
||||||
|
if (nw == NULL) {
|
||||||
|
delwin(win);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
nw->win = win;
|
||||||
|
nw->next = NULL;
|
||||||
|
nw->prev = topwin;
|
||||||
|
|
||||||
|
if (topwin != NULL) {
|
||||||
|
topwin->next = nw;
|
||||||
|
}
|
||||||
|
|
||||||
|
topwin = nw;
|
||||||
|
curwin = win;
|
||||||
|
|
||||||
|
if (firstwin == NULL) {
|
||||||
|
firstwin = nw;
|
||||||
|
}
|
||||||
|
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Function: deltxwin - Delete the top-most window in window stack
|
||||||
|
Arguments: (none)
|
||||||
|
Returns: int - OK if all well, ERR if not
|
||||||
|
|
||||||
|
This function deletes the top-most window in the stack of windows
|
||||||
|
managed by this module. ERR is returned if there is no such window, or
|
||||||
|
if delwin() fails. Please note that the actual screen is NOT
|
||||||
|
refreshed: a call to txrefresh() should follow this one. This allows
|
||||||
|
multiple windows to be deleted without screen flashing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int deltxwin (void)
|
||||||
|
{
|
||||||
|
txwin_t *cur, *prev;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
|
||||||
|
if (topwin == NULL) {
|
||||||
|
return ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = topwin;
|
||||||
|
prev = topwin->prev;
|
||||||
|
topwin = prev;
|
||||||
|
|
||||||
|
if (prev != NULL) {
|
||||||
|
prev->next = NULL;
|
||||||
|
curwin = prev->win;
|
||||||
|
} else {
|
||||||
|
firstwin = NULL;
|
||||||
|
curwin = stdscr;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = delwin(cur->win);
|
||||||
|
free(cur);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Function: delalltxwin - Delete all windows in the window stack
|
||||||
|
Arguments: (none)
|
||||||
|
Returns: int - OK is always returned
|
||||||
|
|
||||||
|
This function deletes all windows in the stack of windows managed by
|
||||||
|
this module. After calling this function, the global variable "curwin"
|
||||||
|
points to "stdscr", the only window for which output is now permitted.
|
||||||
|
Please note that the screen is NOT refreshed; a call to txrefresh()
|
||||||
|
should follow this one if appropriate.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int delalltxwin (void)
|
||||||
|
{
|
||||||
|
while (topwin != NULL) {
|
||||||
|
deltxwin();
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------
|
||||||
|
Function: txrefresh - Redraw all windows in the window stack
|
||||||
|
Arguments: (none)
|
||||||
|
Returns: int - OK if all well, ERR if not
|
||||||
|
|
||||||
|
This function redraws (refreshes) all windows in the stack of windows
|
||||||
|
managed by this module. Windows are refreshed from bottom (first) to
|
||||||
|
top (last). The result of doupdate() is returned.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int txrefresh (void)
|
||||||
|
{
|
||||||
|
txwin_t *p;
|
||||||
|
|
||||||
|
touchwin(stdscr);
|
||||||
|
wnoutrefresh(stdscr);
|
||||||
|
|
||||||
|
for (p = firstwin; p != NULL; p = p->next) {
|
||||||
|
touchwin(p->win);
|
||||||
|
wnoutrefresh(p->win);
|
||||||
|
}
|
||||||
|
|
||||||
|
return doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
15
src/intf.h
15
src/intf.h
@ -54,8 +54,6 @@
|
|||||||
#define COL_OFFSET ((COLS - MIN_COLS) / 2) /* Window offsets */
|
#define COL_OFFSET ((COLS - MIN_COLS) / 2) /* Window offsets */
|
||||||
#define LINE_OFFSET (0)
|
#define LINE_OFFSET (0)
|
||||||
|
|
||||||
#define OUTBUFSIZE (1024) /* Output string buffer size */
|
|
||||||
|
|
||||||
|
|
||||||
// Colour pairs used in Star Traders
|
// Colour pairs used in Star Traders
|
||||||
enum color_pairs {
|
enum color_pairs {
|
||||||
@ -68,6 +66,13 @@ enum color_pairs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Global variable declarations *
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
extern WINDOW *curwin; // Top-most (current) window
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Basic text input/output function declarations *
|
* Basic text input/output function declarations *
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
@ -75,6 +80,12 @@ enum color_pairs {
|
|||||||
extern void init_screen (void);
|
extern void init_screen (void);
|
||||||
extern void end_screen (void);
|
extern void end_screen (void);
|
||||||
|
|
||||||
|
// Simplified panel-like window functions
|
||||||
|
extern WINDOW *newtxwin (int nlines, int ncols, int begin_y, int begin_x);
|
||||||
|
extern int deltxwin (void);
|
||||||
|
extern int delalltxwin (void);
|
||||||
|
extern int txrefresh (void);
|
||||||
|
|
||||||
extern int center (WINDOW *win, const bool clrline, const char *format, ...)
|
extern int center (WINDOW *win, const bool clrline, const char *format, ...)
|
||||||
__attribute__((format (printf, 3, 4)));
|
__attribute__((format (printf, 3, 4)));
|
||||||
|
|
||||||
|
60
src/trader.c
60
src/trader.c
@ -64,56 +64,60 @@ int main (int argc, char *argv[])
|
|||||||
// Testing...
|
// Testing...
|
||||||
init_screen();
|
init_screen();
|
||||||
|
|
||||||
printw("Program name: %s\n", program_name());
|
wprintw(curwin, "Program name: %s\n", program_name());
|
||||||
printw("Home directory: %s\n", home_directory());
|
wprintw(curwin, "Home directory: %s\n", home_directory());
|
||||||
printw("Data directory: %s\n", data_directory());
|
wprintw(curwin, "Data directory: %s\n", data_directory());
|
||||||
printw("Game filename: %s (%d)\n", game_filename(game_num), game_num);
|
wprintw(curwin, "Game filename: %s (%d)\n", game_filename(game_num), game_num);
|
||||||
|
|
||||||
printw("Cols x Lines: %d x %d\n", COLS, LINES);
|
wprintw(curwin, "Cols x Lines: %d x %d\n", COLS, LINES);
|
||||||
printw("Colours, pairs: %d, %d\n", COLORS, COLOR_PAIRS);
|
wprintw(curwin, "Colours, pairs: %d, %d\n", COLORS, COLOR_PAIRS);
|
||||||
|
|
||||||
refresh();
|
wrefresh(curwin);
|
||||||
|
|
||||||
curs_set(CURS_VERYVISIBLE);
|
curs_set(CURS_VERYVISIBLE);
|
||||||
|
|
||||||
WINDOW *w1, *w2;
|
newtxwin(WIN_LINES - 7, WIN_COLS, LINE_OFFSET + 7, COL_OFFSET + 0);
|
||||||
|
wbkgd(curwin, COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
|
box(curwin, 0, 0);
|
||||||
|
wrefresh(curwin);
|
||||||
|
|
||||||
w1 = newwin(WIN_LINES - 7, WIN_COLS, LINE_OFFSET + 7, COL_OFFSET + 0);
|
newtxwin(WIN_LINES - 9, WIN_COLS - 8, LINE_OFFSET + 8, COL_OFFSET + 4);
|
||||||
wbkgd(w1, COLOR_PAIR(WHITE_ON_BLUE));
|
wbkgd(curwin, COLOR_PAIR(WHITE_ON_BLUE));
|
||||||
box(w1, 0, 0);
|
|
||||||
wrefresh(w1);
|
|
||||||
|
|
||||||
w2 = newwin(WIN_LINES - 9, WIN_COLS - 8, LINE_OFFSET + 8, COL_OFFSET + 4);
|
wattrset(curwin, has_colors() ? COLOR_PAIR(WHITE_ON_RED) | A_BOLD : A_REVERSE | A_BOLD);
|
||||||
wbkgd(w2, COLOR_PAIR(WHITE_ON_BLUE));
|
center(curwin, true, "Type some keys (^C to exit):");
|
||||||
|
wattrset(curwin, A_NORMAL);
|
||||||
|
|
||||||
wattrset(w2, has_colors() ? COLOR_PAIR(WHITE_ON_RED) | A_BOLD : A_REVERSE | A_BOLD);
|
wrefresh(curwin);
|
||||||
center(w2, true, "Type some keys (^C to exit):");
|
|
||||||
wattrset(w2, A_NORMAL);
|
|
||||||
|
|
||||||
wrefresh(w2);
|
scrollok(curwin, true);
|
||||||
|
keypad(curwin, true);
|
||||||
scrollok(w2, true);
|
meta(curwin, true);
|
||||||
keypad(w2, true);
|
wtimeout(curwin, -1);
|
||||||
meta(w2, true);
|
|
||||||
wtimeout(w2, -1);
|
|
||||||
|
|
||||||
int c = 0;
|
int c = 0;
|
||||||
while ((c = wgetch(w2)) != 3) {
|
while ((c = wgetch(curwin)) != 3) {
|
||||||
if ((c >= 0) && (c < 32)) {
|
if ((c >= 0) && (c < 32)) {
|
||||||
wprintw(w2, "0%03o ^%c ", c, c + '@');
|
wprintw(curwin, "0%03o ^%c ", c, c + '@');
|
||||||
} else if ((c >= 32) && (c < 127)) {
|
} else if ((c >= 32) && (c < 127)) {
|
||||||
wprintw(w2, "0%03o %c ", c, c);
|
wprintw(curwin, "0%03o %c ", c, c);
|
||||||
} else {
|
} else {
|
||||||
wprintw(w2, "0%05o ", c);
|
wprintw(curwin, "0%05o ", c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c == 0x1C) {
|
if (c == 0x1C) {
|
||||||
err_exit("You pressed ^%c!", c + '@');
|
err_exit("You pressed ^%c!", c + '@');
|
||||||
}
|
}
|
||||||
|
|
||||||
wrefresh(w2);
|
wrefresh(curwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deltxwin();
|
||||||
|
txrefresh();
|
||||||
|
|
||||||
|
mvwprintw(curwin, 1, 2, "All OK: ");
|
||||||
|
wgetch(curwin);
|
||||||
|
|
||||||
end_screen();
|
end_screen();
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user