Skip to content
screen.cc 1.24 KiB
Newer Older
Seblu's avatar
Seblu committed
#include "slc.hh"
#include "screen.hh"

Screen::Screen() {
  msg_ = 0;
  cmd_ = 0;
}

void Screen::init() {
  // Init ncurses
  initscr();

  // register end stop ncurses before exit
  atexit((void (*)(void)) endwin);

  // Set good parameters
  cbreak();
  noecho();
  keypad(stdscr, TRUE);

  refresh();

  //wrefresh(stdscr);
  // Get term dimension
  int row, col;
  getmaxyx(stdscr, row, col);

  // Create msg window
  msg_ = newwin(row - 3, col, 0, 0);
  box(msg_, 0, 0);

  wrefresh(msg_);

  // Create cmd window
  cmd_ = newwin(3, col, row - 3, 0);
  box(cmd_, 0 , 0);

  wmove(cmd_, 1, 1);
  wrefresh(cmd_);

}

void Screen::run() {
  int key;
  int x,y;
  while (1) {
    key = getch();
    getyx(cmd_, y,x);
    switch(key) {
    case KEY_LEFT:
      wmove(cmd_, y, --x);
      break;
    case KEY_RIGHT:
      wmove(cmd_, y, ++x);
      break;
    case 10:
      werase(cmd_);
      box(cmd_, 0, 0);
      wmove(cmd_, 1, 1);
      // exec command
      break;
    case KEY_BACKSPACE:
      if (x <= 1) break;
      wmove(cmd_, y, --x);
      waddch(cmd_, ' ');
      wmove(cmd_, y, x);
      break;
    case KEY_RESIZE:
      wrefresh(cmd_);
      wrefresh(msg_);
      break;
    default:
      waddch(cmd_, key | A_BOLD);
    }
    wrefresh(cmd_);
  }
}