Loading slc/trunk/src/history.hh +1 −3 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ # include <vector> # define HISTORY_SIZE 256 # define HISTORY_MAX_SIZE 256 class History { public: Loading @@ -23,6 +23,4 @@ private: size_t size_; }; extern History H; #endif slc/trunk/src/screen.cc +89 −32 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) { Loading @@ -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: Loading @@ -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 Loading @@ -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]; Loading @@ -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; Loading @@ -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 ** Loading slc/trunk/src/screen.hh +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 slc/trunk/src/slc.cc +6 −4 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ #include "history.hh" Screen S; History H(HISTORY_SIZE); Options O; History H(HISTORY_MAX_SIZE); /*! ** Program entry point Loading @@ -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(); Loading slc/trunk/src/slc.hh +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
slc/trunk/src/history.hh +1 −3 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ # include <vector> # define HISTORY_SIZE 256 # define HISTORY_MAX_SIZE 256 class History { public: Loading @@ -23,6 +23,4 @@ private: size_t size_; }; extern History H; #endif
slc/trunk/src/screen.cc +89 −32 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) { Loading @@ -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: Loading @@ -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 Loading @@ -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]; Loading @@ -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; Loading @@ -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 ** Loading
slc/trunk/src/screen.hh +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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
slc/trunk/src/slc.cc +6 −4 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ #include "history.hh" Screen S; History H(HISTORY_SIZE); Options O; History H(HISTORY_MAX_SIZE); /*! ** Program entry point Loading @@ -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(); Loading
slc/trunk/src/slc.hh +10 −0 Original line number Diff line number Diff line Loading @@ -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