Commit 617152fe authored by Seblu's avatar Seblu
Browse files

utilisation de LINES et COLS pour les dimensions

Ajout d'une page pour le login/pass
Gestion du redimensionnement des fenetres
parent 250c120f
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@

# include <vector>

# define HISTORY_SIZE 256
# define HISTORY_MAX_SIZE 256

class History {
public:
@@ -23,6 +23,4 @@ private:
  size_t size_;
};

extern History H;

#endif
+89 −32
Original line number Diff line number Diff line
@@ -4,8 +4,14 @@
#include "slc.hh"
#include "screen.hh"
#include "history.hh"
#include "options.hh"

Screen::Screen() {}
Screen::Screen() {
  *cmd_buffer_ = 0;
  cmd_buf_off_ = 0;
  cmd_win_off_ = 0;
  cmd_history_off_ = 0;
}

void Screen::init() {
  // Init ncurses
@@ -16,40 +22,72 @@ void Screen::init() {

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

  // refresh parameters (needed by ncurses)
  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);
void Screen::create_windows() {
  noecho();
  clear();
  refresh();

  // set buf value
  *cmd_buffer_ = 0;
  cmd_buf_off_ = 0;
  cmd_win_off_ = 0;
  cmd_win_size_ = col - 2;
  cmd_history_off_ = 0;
  // msg window
  if (msg_)
    delwin(msg_);
  msg_ = newwin(LINES - 3, COLS, 0, 0);
  msg_draw();

  wmove(cmd_, 1, 1);
  wrefresh(cmd_);
  // cmd window
  if (cmd_)
    delwin(cmd_);
  cmd_ = newwin(3, COLS, LINES - 3, 0);
  cmd_draw();
}

  //register sigwinch
void Screen::login() {
  char *buf;
  int size;
  const char *smsg;

  clear();
  box(stdscr, 0,0);
  move(1, 1);

  // ask login
  if (O.login.empty()) {
    smsg = "Login: ";
    size = COLS - 2 - strlen(smsg);
    buf = new char[size + 1];
    echo();
    printw(smsg);
    refresh();
    getnstr(buf, size);
    buf[size] = 0;
    O.login = buf;
    delete [] buf;
    move(2,1);
  }

  // ask password
  smsg = "Password: ";
  size = COLS - 2 - strlen(smsg);
  buf = new char[size + 1];
  printw(smsg);
  noecho();
  refresh();
  getnstr(buf, size);
  buf[size] = 0;
  O.login = buf;
  delete [] buf;
}

void Screen::run() {

  //nominal screen nom
  create_windows();

  while (1) {
    int key = getch();
    switch(key) {
@@ -63,6 +101,7 @@ void Screen::run() {
      cmd_buffer_[CMD_BUFFER_SIZE - 1] = 0;
      cmd_buf_off_ = strlen(cmd_buffer_);
      cmd_win_off_ = 0;
      cmd_draw();
      break;
      // KEY DOWN
    case KEY_DOWN:
@@ -77,22 +116,27 @@ void Screen::run() {
      }
      cmd_buf_off_ = strlen(cmd_buffer_);
      cmd_win_off_ = 0;
      cmd_draw();
      break;
      // KEY LEFT
    case KEY_LEFT:
      if (cmd_buf_off_ > 0)
	--cmd_buf_off_;
      cmd_draw();
      break;
      // KEY RIGHT
    case KEY_RIGHT:
      if ((size_t) cmd_buf_off_ < strlen(cmd_buffer_))
	++cmd_buf_off_;
      cmd_draw();
      break;
    case KEY_HOME:
      cmd_buf_off_ = 0;
      cmd_draw();
      break;
    case KEY_END:
      cmd_buf_off_ = strlen(cmd_buffer_);
      cmd_draw();
      break;
    case 10:
      // save buffer in history
@@ -105,23 +149,30 @@ void Screen::run() {
      cmd_buf_off_ = 0;
      cmd_win_off_ = 0;
      cmd_history_off_ = 0;
      // print result
      cmd_draw();
      break;
    case KEY_BACKSPACE:
      if (cmd_buf_off_ == 0) break;
      if (cmd_buf_off_ != 0)
	if (del_char(cmd_buffer_, cmd_buf_off_ - 1, CMD_BUFFER_SIZE))
	  --cmd_buf_off_;
      cmd_draw();
      break;
    case KEY_DC:
      del_char(cmd_buffer_, cmd_buf_off_, CMD_BUFFER_SIZE);
      cmd_draw();
      break;
    case KEY_RESIZE:
      create_windows();
      break;
    default:
      if (!isprint(key)) break;
      if (add_char(key, cmd_buffer_, cmd_buf_off_, CMD_BUFFER_SIZE))
	++cmd_buf_off_;
    }
      cmd_draw();
    }
  }
}

void Screen::cmd_draw() {
  char print_buf[CMD_BUFFER_SIZE];
@@ -132,13 +183,13 @@ void Screen::cmd_draw() {
  wmove(cmd_, 1, 1);

  // check cur pos is in screen
  if ((ssize_t) cmd_buf_off_ > (ssize_t) cmd_win_off_ + (ssize_t) cmd_win_size_ - 1)
    cmd_win_off_ = cmd_buf_off_ - cmd_win_size_ + 1;
  if ((ssize_t) cmd_buf_off_ > (ssize_t) cmd_win_off_ + COLS - 3)
    cmd_win_off_ = cmd_buf_off_ - COLS - 1;
  else if (cmd_buf_off_ < cmd_win_off_)
    cmd_win_off_ = cmd_buf_off_;

  // copy part of buffer in print buffer
  size_t minsize = (CMD_BUFFER_SIZE < cmd_win_size_) ? CMD_BUFFER_SIZE : cmd_win_size_;
  size_t minsize = (CMD_BUFFER_SIZE < COLS - 2) ? CMD_BUFFER_SIZE : COLS - 2;
  strncpy(print_buf, cmd_buffer_ + cmd_win_off_, minsize);
  print_buf[minsize - 1] = 0;

@@ -152,6 +203,12 @@ void Screen::cmd_draw() {
  wrefresh(cmd_);
}

void Screen::msg_draw() {
  werase(msg_);
  box(msg_, 0, 0);
  wrefresh(msg_);
}

/*!
** Add a char in a buffer
**
+3 −3
Original line number Diff line number Diff line
@@ -9,13 +9,16 @@ class Screen {
public:
  Screen();
  void init();
  void login();
  void run();

friend Screen &operator<< (Screen &, const string &s);
friend Screen &operator<< (Screen &, int i);

private:
  void create_windows();
  void cmd_draw();
  void msg_draw();
  bool add_char(char c, char *string, ssize_t offset, size_t buf_len);
  bool del_char(char *string, ssize_t offset, size_t buf_len);
  void sigwinch(int);
@@ -29,10 +32,7 @@ private:
  char cmd_history_buffer_[CMD_BUFFER_SIZE];
  size_t cmd_buf_off_;
  size_t cmd_win_off_;
  size_t cmd_win_size_;
  size_t cmd_history_off_;
};

extern Screen S;

#endif
+6 −4
Original line number Diff line number Diff line
@@ -7,7 +7,8 @@
#include "history.hh"

Screen S;
History H(HISTORY_SIZE);
Options O;
History H(HISTORY_MAX_SIZE);

/*!
** Program entry point
@@ -19,14 +20,15 @@ History H(HISTORY_SIZE);
*/
int main(int argc, char *argv[])
{
  Options o;

  // get options
  o.load(argc, argv);
  O.load(argc, argv);

  // Create graphic env
  S.init();

  // Try to login
  S.login();

  // Processing
  S.run();

+10 −0
Original line number Diff line number Diff line
@@ -45,4 +45,14 @@ static const string SND_DATA = ">> ";
// Global
// -----------------------------------------------------------------------------

class History;
class Options;
class Screen;


extern History H;
extern Options O;
extern Screen S;


#endif