delete trash in cmdwin when wheel rolls

This commit is contained in:
Edward Emelianov 2023-10-04 17:16:27 +03:00
parent 08e99e0063
commit 934cbc04fd
4 changed files with 84 additions and 27 deletions

View File

@ -12,7 +12,7 @@ message("VER: ${VERSION}")
# default flags # default flags
set(CMAKE_C_FLAGS_RELEASE "") set(CMAKE_C_FLAGS_RELEASE "")
set(CMAKE_C_FLAGS_DEBUG "") set(CMAKE_C_FLAGS_DEBUG "")
set(CMAKE_C_FLAGS "-O3 -std=gnu99") set(CMAKE_C_FLAGS "-O3 -std=gnu99 -D_XOPEN_SOURCE=12345 -D_DEFAULT_SOURCE")
set(CMAKE_COLOR_MAKEFILE ON) set(CMAKE_COLOR_MAKEFILE ON)

View File

@ -36,6 +36,7 @@ glob_pars const Gdefault = {
.speed = 9600, .speed = 9600,
.eol = "n", .eol = "n",
.tmoutms = 100, .tmoutms = 100,
.port = "8N1"
}; };
/* /*

View File

@ -35,6 +35,13 @@
#include "ttysocket.h" #include "ttysocket.h"
#include "ncurses_and_readline.h" #include "ncurses_and_readline.h"
enum { // using colors
BKG_NO = 1,
NORMAL_NO = 2,
MARKED_NO = 3
};
#define COLOR(x) COLOR_PAIR(x ## _NO)
// Keeps track of the terminal mode so we can reset the terminal if needed on errors // Keeps track of the terminal mode so we can reset the terminal if needed on errors
static bool visual_mode = false; static bool visual_mode = false;
// insert commands when true; roll upper screen when false // insert commands when true; roll upper screen when false
@ -90,27 +97,26 @@ static void forward_to_readline(char c){
static void msg_win_redisplay(bool for_resize){ static void msg_win_redisplay(bool for_resize){
werase(msg_win); werase(msg_win);
Line *l = firstline; Line *l = firstline;
static char *buf = NULL;
int nlines = 0; // total amount of lines @ output int nlines = 0; // total amount of lines @ output
for(; l && (nlines < LINES - 2); l = l->next){ for(; l && (nlines < LINES - 2); l = l->next){
size_t contlen = strlen(l->contents) + 128;
char *buf = malloc(contlen);
// don't add trailing '\n' (or last line will be empty with cursor)
contlen = snprintf(buf, contlen, "%s", l->contents);
int nlnext = (contlen - 1) / COLS + 1;
wmove(msg_win, nlines, 0); wmove(msg_win, nlines, 0);
if(nlines + nlnext < LINES-2){ // can put out the full line size_t contlen = strlen(l->contents) + 128;
waddstr(msg_win, buf); buf = realloc(buf, contlen);
//wprintw(msg_win, "%d (%d): %s -> %d", l->Nline, firstline->Nline, l->contents, nlnext); int sz = strlen(l->contents);
nlines += nlnext; char *ptr = l->contents;
}else{ // put only first part for(int i = 0; i < sz; ++i, ++ptr){
int rest = LINES-2 - nlines; char c = *ptr;
waddnstr(msg_win, buf, rest *COLS); if(c <'a' || c > 'z'){
free(buf); wattron(msg_win, COLOR(MARKED));
break; waddch(msg_win, c);
wattroff(msg_win, COLOR(MARKED));
}else{
waddch(msg_win, c);
}
} }
free(buf); ++nlines;
} }
curs_set(0);
if(for_resize) wnoutrefresh(msg_win); if(for_resize) wnoutrefresh(msg_win);
else wrefresh(msg_win); else wrefresh(msg_win);
} }
@ -127,9 +133,11 @@ static void cmd_win_redisplay(bool for_resize){
snprintf(abuf, 4096, "> %s", rl_line_buffer); snprintf(abuf, 4096, "> %s", rl_line_buffer);
waddstr(cmd_win, abuf+x); waddstr(cmd_win, abuf+x);
wmove(cmd_win, 0, cursor_col); wmove(cmd_win, 0, cursor_col);
curs_set(2);
if(for_resize) wnoutrefresh(cmd_win); if(for_resize) wnoutrefresh(cmd_win);
else wrefresh(cmd_win); else wrefresh(cmd_win);
keypad(cmd_win, TRUE);
if(insert_mode) curs_set(2);
else curs_set(0);
} }
static void readline_redisplay(){ static void readline_redisplay(){
@ -229,7 +237,7 @@ void init_ncurses(){
noecho(); noecho();
nonl(); nonl();
intrflush(NULL, FALSE); intrflush(NULL, FALSE);
keypad(cmd_win, 0); keypad(cmd_win, TRUE);
curs_set(2); curs_set(2);
if(LINES > 2){ if(LINES > 2){
msg_win = newwin(LINES - 2, COLS, 0, 0); msg_win = newwin(LINES - 2, COLS, 0, 0);
@ -244,8 +252,10 @@ void init_ncurses(){
if(!msg_win || !sep_win || !cmd_win) if(!msg_win || !sep_win || !cmd_win)
fail_exit("Failed to allocate windows"); fail_exit("Failed to allocate windows");
if(has_colors()){ if(has_colors()){
init_pair(1, COLOR_WHITE, COLOR_BLUE); init_pair(BKG_NO, COLOR_WHITE, COLOR_BLUE);
wbkgd(sep_win, COLOR_PAIR(1)); init_pair(NORMAL_NO, COLOR_WHITE, COLOR_BLACK);
init_pair(MARKED_NO, COLOR_CYAN, COLOR_BLACK);
wbkgd(sep_win, COLOR(BKG));
}else{ }else{
wbkgd(sep_win, A_STANDOUT); wbkgd(sep_win, A_STANDOUT);
} }
@ -294,6 +304,8 @@ static void rolldown(){
if(firstline && firstline->prev){ if(firstline && firstline->prev){
firstline = firstline->prev; firstline = firstline->prev;
msg_win_redisplay(false); msg_win_redisplay(false);
show_mode(false);
doupdate();
} }
} }
@ -301,6 +313,8 @@ static void rollup(){
if(firstline && firstline->next){ if(firstline && firstline->next){
firstline = firstline->next; firstline = firstline->next;
msg_win_redisplay(false); msg_win_redisplay(false);
show_mode(false);
doupdate();
} }
} }
@ -316,7 +330,8 @@ void *cmdline(void* arg){
do{ do{
int c = wgetch(cmd_win); int c = wgetch(cmd_win);
bool processed = true; bool processed = true;
switch(c){ //DBG("wgetch got %d", c);
switch(c){ // common keys for both modes
case KEY_MOUSE: case KEY_MOUSE:
if(getmouse(&event) == OK){ if(getmouse(&event) == OK){
if(event.bstate & (BUTTON4_PRESSED)) rolldown(); // wheel up if(event.bstate & (BUTTON4_PRESSED)) rolldown(); // wheel up
@ -324,11 +339,8 @@ void *cmdline(void* arg){
} }
break; break;
case '\t': // tab switch between scroll and edit mode case '\t': // tab switch between scroll and edit mode
keypad(cmd_win, insert_mode); // enable/disable reaction @ special characters
insert_mode = !insert_mode; insert_mode = !insert_mode;
show_mode(false); show_mode(false);
if(insert_mode) curs_set(2);
else curs_set(0);
break; break;
case KEY_RESIZE: case KEY_RESIZE:
resize(); resize();
@ -338,7 +350,51 @@ void *cmdline(void* arg){
} }
if(processed) continue; if(processed) continue;
if(insert_mode){ if(insert_mode){
forward_to_readline(c); DBG("forward_to_readline(%d)", c);
char *ptr = NULL;
switch(c){ // check special keys
case KEY_UP:
ptr = "A";
break;
case KEY_DOWN:
ptr = "B";
break;
case KEY_RIGHT:
ptr = "C";
break;
case KEY_LEFT:
ptr = "D";
break;
case KEY_BACKSPACE:
ptr = "H";
break;
case KEY_IC:
DBG("key insert");
ptr = "2~";
break;
case KEY_DC:
ptr = "3~";
break;
case KEY_HOME:
ptr = "H";
break;
case KEY_PPAGE:
ptr = "5~";
break;
case KEY_NPAGE:
ptr = "6~";
break;
case KEY_END:
ptr = "F";
break;
default:
forward_to_readline(c);
}
if(ptr){ // arrows and so on: 27, 91, code
forward_to_readline(27);
forward_to_readline(91);
while(*ptr) forward_to_readline(*ptr++);
}
}else{ }else{
switch(c){ switch(c){
case KEY_UP: // roll down for one item case KEY_UP: // roll down for one item

View File

@ -69,7 +69,7 @@ static int waittoread(int fd){
break; break;
}while(1); }while(1);
if(FD_ISSET(fd, &fds)){ if(FD_ISSET(fd, &fds)){
DBG("FD_ISSET"); //DBG("FD_ISSET");
return 1; return 1;
} }
return 0; return 0;