//
/* * Example ATM simulation - file window.cc * * This file implements a window class on top of the curses package to provide * a simple, portable way of representing the ATM on text-based terminals, * as declared in window.h * * Copyright (c) 1996, 1997 - Russell C. Bjork * */ #include#include "sysdep.h" #include "window.h" // Curses requires us to call initscr() once. We handle this by keeping a // count of windows we have created - initalized to zero and incremented for // each window, and calling initscr() for the first one only. We also use // this opportunity to do other setup things. static int windowCount = 0; Window::Window(int lines, int cols, int begin_y, int begin_x) { if (windowCount ++ == 0) { initscr(); printf(GRAPHICS_INIT); } _Cwindow = newwin(lines, cols, begin_y, begin_x); scrollok(_Cwindow, 1); } // Curses also wants us to call endwin once upon termination. We handle // this by decrementing the windowCount in the destructor, calling it just // the windowCount becomes 0 Window::~Window() { if (-- windowCount == 0) endwin(); } Window & Window::operator << (char c) { waddch(_Cwindow, c); return * this; } Window & Window::operator << (const char * str) { #ifdef VMS waddstr(_Cwindow, (char *) str); // VMS header should declare parameter // as const char *, but doesn't #else waddstr(_Cwindow, str); #endif return * this; } void Window::putCursor(int y, int x) { wmove(_Cwindow, y, x); } Window & Window::operator >> (char & c) { wrefresh(_Cwindow); c = wgetch(_Cwindow); return * this; } Window & Window::operator >> (char * str) { wrefresh(_Cwindow); wgetstr(_Cwindow, str); return * this; } char Window::inkey(char * allowable) { noecho(); crmode(); nonl(); char c; do { c = wgetch(_Cwindow); if (allowable == NULL || strchr(allowable, c) != NULL) break; (* this) << bell; } while (1); nl(); nocrmode(); echo(); return c; } Window & clearW(Window & window) { wclear(window.Cwindow()); wmove(window.Cwindow(), 0, 0); return window; } Window & refreshW(Window & window) { wrefresh(window.Cwindow()); return window; } Window & bell(Window & window) { printf(BELL); fflush(stdout); return window; } BoxedWindow::BoxedWindow(char * legend, int lines, int cols, int begin_y, int begin_x) : Window(lines - 2, cols - 2, begin_y + 1, begin_x + 1) { // Draw the fancy box. printf(GRAPHICS_ON); wmove(stdscr, begin_y, begin_x); waddstr(stdscr, UL_CORNER); int col; for (col = begin_x + 1; col < begin_x + cols - 1; col ++) if (col - begin_x <= strlen(legend)) waddch(stdscr, legend[col - begin_x - 1]); else waddstr(stdscr, TOP_BOTTOM); waddstr(stdscr, UR_CORNER); int line; for (line = begin_y + 1; line < begin_y + lines - 1; line ++) { wmove(stdscr, line, begin_x); waddstr(stdscr, SIDE_LINE); wmove(stdscr, line, begin_x + cols - 1); waddstr(stdscr, SIDE_LINE); } wmove(stdscr, begin_y + lines - 1, begin_x); waddstr(stdscr, LL_CORNER); for (col = begin_x + 1; col < begin_x + cols - 1; col ++) waddstr(stdscr, TOP_BOTTOM); waddstr(stdscr, LR_CORNER); wrefresh(stdscr); printf(GRAPHICS_OFF); } //