mirror of
https://github.com/eddyem/eddys_snippets.git
synced 2025-12-06 10:45:12 +03:00
111 lines
2.6 KiB
C
111 lines
2.6 KiB
C
#include <ncurses.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#define MAXLEN 127
|
|
|
|
typedef struct Line {
|
|
char *contents;
|
|
struct Line *prev, *next;
|
|
} Line;
|
|
|
|
char inputstr[MAXLEN+1] = {0};
|
|
int currinp = 0;
|
|
|
|
Line *head = NULL, *curr = NULL, *firstline = NULL;
|
|
|
|
int refreshmain = 1, refreshstr = 1;
|
|
|
|
int nr_lines;
|
|
int curr_line;
|
|
WINDOW *mainwin, *onestring;
|
|
|
|
int term_rows, term_cols;
|
|
|
|
void draw(Line *l);
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
Line *lp;
|
|
// printf("\033c"); - cls
|
|
initscr();
|
|
noecho();
|
|
getmaxyx(stdscr, term_rows, term_cols);
|
|
term_rows -= 2;
|
|
mainwin = newwin(term_rows, term_cols, 0, 0);
|
|
onestring = newwin(1, term_cols, term_rows+1, 0);
|
|
keypad(onestring, TRUE); // for KEY_UP, KEY_DOWN
|
|
|
|
curr_line = 0;
|
|
|
|
draw(curr);
|
|
|
|
int ch;
|
|
while ((ch = wgetch(onestring)) != EOF)
|
|
{
|
|
if (ch == KEY_UP && firstline->prev != NULL)
|
|
{
|
|
curr_line--;
|
|
firstline = firstline->prev;
|
|
refreshmain = 1;
|
|
}
|
|
else if (ch == KEY_DOWN && firstline->next != NULL && curr_line + term_rows < nr_lines)
|
|
{
|
|
curr_line++;
|
|
firstline = firstline->next;
|
|
refreshmain = 1;
|
|
}
|
|
else if(ch == 10 && currinp){
|
|
lp = malloc(sizeof(Line));
|
|
lp->contents = strdup(inputstr);
|
|
lp->prev = curr;
|
|
lp->next = NULL;
|
|
if(!curr || !head){
|
|
head = curr = firstline = lp;
|
|
}else
|
|
curr->next = lp;
|
|
curr = lp;
|
|
++nr_lines;
|
|
while(nr_lines - curr_line > term_rows){
|
|
curr_line++;
|
|
firstline = firstline->next;
|
|
}
|
|
currinp = 0;
|
|
inputstr[0] = 0;
|
|
refreshstr = 1;
|
|
refreshmain = 1;
|
|
}else if(ch >= ' ' && ch < 256 && ch != 127){
|
|
if(currinp > MAXLEN){
|
|
wclear(onestring);
|
|
waddstr(onestring, "Limit reached!");
|
|
wrefresh(onestring);
|
|
}else{
|
|
inputstr[currinp++] = ch;
|
|
inputstr[currinp] = 0;
|
|
}
|
|
refreshstr = 1;
|
|
}
|
|
draw(firstline);
|
|
}
|
|
|
|
endwin();
|
|
return 0;
|
|
}
|
|
|
|
void draw(Line *l){
|
|
if(refreshmain){
|
|
refreshmain = 0;
|
|
wclear(mainwin);
|
|
for(int i = 0; i < term_rows && l != NULL; i++, l = l->next)
|
|
wprintw(mainwin, "%s\n", l->contents);
|
|
wrefresh(mainwin);
|
|
}
|
|
if(refreshstr){
|
|
refreshstr = 0;
|
|
wclear(onestring);
|
|
wprintw(onestring, " > %s", inputstr);
|
|
wrefresh(onestring);
|
|
}
|
|
}
|