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 slc/trunk/src/history.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading slc/trunk/src/screen.cc +46 −22 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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: Loading @@ -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: Loading @@ -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_); Loading @@ -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 Loading @@ -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); Loading @@ -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) { Loading slc/trunk/src/screen.hh +6 −6 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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_; }; 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
slc/trunk/src/history.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
slc/trunk/src/screen.cc +46 −22 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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: Loading @@ -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: Loading @@ -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_); Loading @@ -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 Loading @@ -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); Loading @@ -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) { Loading
slc/trunk/src/screen.hh +6 −6 Original line number Diff line number Diff line Loading @@ -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: Loading @@ -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_; }; Loading