Commit 250c120f authored by Seblu's avatar Seblu
Browse files

L'history ne prend plus les lignes vides

La partie cmd de l'affichage est terminee
parent ded7a585
Loading
Loading
Loading
Loading

slc/trunk/TODO

0 → 100644
+3 −0
Original line number Diff line number Diff line
Gestion du redimensionnements
Gestion de plus de touche
sauvegarde de l'history dans un fichier
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ History::~History() {
}

void History::add(const string &line) {
  if (line.empty())
    return;
  if (table_.size() + 1 > size_)
    table_.erase(table_.begin());
  table_.push_back(line);
+46 −22
Original line number Diff line number Diff line
@@ -38,8 +38,8 @@ void Screen::init() {
  // set buf value
  *cmd_buffer_ = 0;
  cmd_buf_off_ = 0;
  cmd_buf_win_off_ = 0;
  cmd_buf_win_size_ = col - 1;
  cmd_win_off_ = 0;
  cmd_win_size_ = col - 2;
  cmd_history_off_ = 0;

  wmove(cmd_, 1, 1);
@@ -62,6 +62,7 @@ void Screen::run() {
      strncpy(cmd_buffer_, H.get(cmd_history_off_++).c_str(), CMD_BUFFER_SIZE);
      cmd_buffer_[CMD_BUFFER_SIZE - 1] = 0;
      cmd_buf_off_ = strlen(cmd_buffer_);
      cmd_win_off_ = 0;
      break;
      // KEY DOWN
    case KEY_DOWN:
@@ -75,6 +76,7 @@ void Screen::run() {
	cmd_buffer_[CMD_BUFFER_SIZE - 1] = 0;
      }
      cmd_buf_off_ = strlen(cmd_buffer_);
      cmd_win_off_ = 0;
      break;
      // KEY LEFT
    case KEY_LEFT:
@@ -86,6 +88,12 @@ void Screen::run() {
      if ((size_t) cmd_buf_off_ < strlen(cmd_buffer_))
	++cmd_buf_off_;
      break;
    case KEY_HOME:
      cmd_buf_off_ = 0;
      break;
    case KEY_END:
      cmd_buf_off_ = strlen(cmd_buffer_);
      break;
    case 10:
      // save buffer in history
      H.add(cmd_buffer_);
@@ -95,23 +103,27 @@ void Screen::run() {
      // purge buffer
      *cmd_buffer_ = 0;
      cmd_buf_off_ = 0;
      cmd_buf_win_off_ = 0;
      cmd_win_off_ = 0;
      cmd_history_off_ = 0;
      break;
    case KEY_BACKSPACE:
      if (cmd_buf_off_ == 0) break;
      del_char(cmd_buffer_, --cmd_buf_off_, CMD_BUFFER_SIZE);
      if (del_char(cmd_buffer_, cmd_buf_off_ - 1, CMD_BUFFER_SIZE))
	--cmd_buf_off_;
      break;
    case KEY_DC:
      del_char(cmd_buffer_, cmd_buf_off_, CMD_BUFFER_SIZE);
      break;
    default:
      if (!isprint(key)) break;
      if (cmd_buf_off_ >= CMD_BUFFER_SIZE - 1) break;
      add_char(key, cmd_buffer_, cmd_buf_off_++, CMD_BUFFER_SIZE);
      if (add_char(key, cmd_buffer_, cmd_buf_off_, CMD_BUFFER_SIZE))
	++cmd_buf_off_;
    }
    draw_cmd();
    cmd_draw();
  }
}

void Screen::draw_cmd() {
void Screen::cmd_draw() {
  char print_buf[CMD_BUFFER_SIZE];

  // clean and redraw the cmd box
@@ -119,13 +131,16 @@ void Screen::draw_cmd() {
  box(cmd_, 0, 0);
  wmove(cmd_, 1, 1);

  // compute offset
  if ((ssize_t) cmd_buf_off_ - cmd_buf_win_off_ > cmd_buf_win_size_)
    ++cmd_buf_win_off_;
  // 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;
  else if (cmd_buf_off_ < cmd_win_off_)
    cmd_win_off_ = cmd_buf_off_;

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

  // print print buffer
  wattron(cmd_, A_BOLD);
@@ -133,43 +148,52 @@ void Screen::draw_cmd() {
  wattroff(cmd_, A_BOLD);

  // move cursor to right pos
  wmove(cmd_, 1, 1 + cmd_buf_off_);
  wmove(cmd_, 1, 1 + cmd_buf_off_ - cmd_win_off_);
  wrefresh(cmd_);
}

void Screen::add_char(char c, char *string, ssize_t offset, size_t buf_len) {
/*!
** Add a char in a buffer
**
** @param c char to add
** @param offset where add in the buffer
*/
bool Screen::add_char(char c, char *string, ssize_t offset, size_t buf_len) {
  assert(string);
  size_t len = strlen(string);

  // check if add one char is possible
  if (len + 1 >= buf_len - 1)
    return;
  // check if add one char is in range
  if (len + 1 > buf_len - 1)
    return false;

  // check if offset is good
  if (offset >= (ssize_t) buf_len - 1 || offset < 0)
    return;
    return false;

  // move one char every char
  for (ssize_t i = len; i >= offset; --i)
    string[i + 1] = string[i];
  string[offset] = c;
  return true;
}

void Screen::del_char(char *string, ssize_t offset, size_t buf_len) {
bool Screen::del_char(char *string, ssize_t offset, size_t buf_len) {
  assert(string);
  size_t len = strlen(string);

  // check if del one char is possible
  if (len == 0)
    return;
    return false;

  // check if offset is good
  if (offset >= (ssize_t) buf_len - 1 || offset < 0)
    return;
    return false;

  // move one char every char
  for (; string[offset] != 0; ++offset)
    string[offset] = string[offset + 1];

  return true;
}

void sigwinch(int) {
+6 −6
Original line number Diff line number Diff line
@@ -15,9 +15,9 @@ friend Screen &operator<< (Screen &, const string &s);
friend Screen &operator<< (Screen &, int i);

private:
  void draw_cmd();
  void add_char(char c, char *string, ssize_t offset, size_t len);
  void del_char(char *string, ssize_t offset, size_t len);
  void cmd_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);

private:
@@ -27,9 +27,9 @@ private:
  WINDOW *cmd_;
  char cmd_buffer_[CMD_BUFFER_SIZE];
  char cmd_history_buffer_[CMD_BUFFER_SIZE];
  ssize_t cmd_buf_off_;
  ssize_t cmd_buf_win_off_;
  size_t cmd_buf_win_size_;
  size_t cmd_buf_off_;
  size_t cmd_win_off_;
  size_t cmd_win_size_;
  size_t cmd_history_off_;
};