
// This may look like C code, but it is really -*- C++ -*-

#pragma once
#include <CursesW.h>

// Quick but effective extesion to CursesWindow, by Ping Huang (July 1991)

// Restricts you to using stdscr; could not figure out how to overload
// constructor of Extended so that it would properly call the appropriate
// CursesWindow constructor as well.

// Uses several of the routines from curses.h directly without
// going through CursesWindow class.

// Applications should check savedScreenAvailable before doing a
// restoreScreen.  However, the methods do not use it (but rather
// use savedScreenEvenExists so that the application can re-use
// the same screen again and again at will.  In a sense, if more code
// is added to support multiple saves (push and pop stack), the code
// lets you pop the last saved screen indefinite number of times.

// Added console_output because it's useful for debugging purposes

class ExtendedCursesWindow : public CursesWindow
{
 protected:
  WINDOW * savedScreen = NULL;
  int saved_y,saved_x;
  int savedScreenCount = 0;
 public:
  ExtendedCursesWindow() : CursesWindow(stdscr)
    {
      erase();
      refresh();
    };
  bool savedScreenEvenExists(void)
    {
      return (savedScreen!=NULL);
    };
  bool savedScreenAvailable(void)
    {
      return (savedScreenEvenExists() && (savedScreenCount > 0));
    };
  void saveScreen(void)
    {
      refresh();
      getyx(saved_y,saved_x);
      if (savedScreenEvenExists())
	delwin(savedScreen);
      /* special case, should result in same size as terminal */
      savedScreen = newwin(0,0,0,0);
      /* Syntax: overwrite(w1,w2) destroys w2 contents */
      ::overwrite(w,savedScreen);
      savedScreenCount++;
    };
  void restoreScreen(void)
    {
      if (savedScreenEvenExists())
	{
	  ::overwrite(savedScreen,w);
	  move(saved_y,saved_x);
	  refresh();
	  if (savedScreenCount>0)
	    savedScreenCount--;
	}
    };
  void console_output(char* str)
    {
      static FILE* console = NULL;
      if (console == NULL)
	console = fopen("/dev/ttyv0","wb");
      fputs(str,console);
      fflush(console);
    }
};
