X-Git-Url: https://git.cworth.org/git?p=ttt;a=blobdiff_plain;f=src%2Fttt-curses-client.c;fp=src%2Fttt-curses-client.c;h=c8e42c58edee3525c6caaa5499c26ffd8fef7a58;hp=25d724acf428a8680b9ad0af55629474ced6a076;hb=a8a4225c58beea7f86159d91a464ffeef4e3d481;hpb=a1278a3d9d13f82d37bf35d08f749fc78b35fc8b diff --git a/src/ttt-curses-client.c b/src/ttt-curses-client.c index 25d724a..c8e42c5 100644 --- a/src/ttt-curses-client.c +++ b/src/ttt-curses-client.c @@ -104,8 +104,41 @@ void wprint (WINDOW *window, } } +void inpprint (WINDOW *window,char *string,int pos,int curx); + +void inpprint (WINDOW *window,char *string,int pos,int curx) +{ + int mx,my; + char tbuf[1024]; + getmaxyx(window,my,mx); + if ( curx > 0 ) { + strncpy(tbuf,&string[curx], mx-1); + tbuf[mx-1]='\0'; + wmove(window,0,0); + wprint(window,tbuf); + wclrtoeol(window); + wmove(window,0,pos - curx); + + } + else + { + strcpy(tbuf,string); + if (strlen(string) > mx-1) tbuf[mx-1]='\0'; + wmove(window,0,0); + wprint(window,tbuf); + wclrtoeol(window); + wmove(window,0,pos); + } + + +} + + + + FILE *sockin, *sockout; + int main (int argc, char **argv) { @@ -119,17 +152,21 @@ main (int argc, char **argv) char *command_string; int _socket; char buffer[BUFSIZ]; + char tlin[1024]; char inplin[1024]; ttt_status_t status; + int curpos = 0; + int curx = 0; + int mx, my; static WINDOW *mainwnd; static WINDOW *dispwin; - static WINDOW *statwin; static WINDOW *inpwin; + static WINDOW *statwin; FILE *conf_file; mainwnd = initscr(); - int dlines = LINES - 2, cols = COLS; + int dlines = LINES, cols = COLS; (void) nonl (); (void) nl (); @@ -138,12 +175,13 @@ main (int argc, char **argv) nodelay (mainwnd, TRUE); curs_set (0); refresh (); - dispwin = newwin (dlines - 5, cols - 2, 0, 0); - statwin = newwin (4, cols - 2, dlines -3, 0); - inpwin = newwin (2, cols - 2, dlines, 0); + dispwin = newwin (dlines - 6, cols , 0, 0); + statwin = newwin (4, cols , dlines -4, 0); + inpwin = newwin (1, cols , dlines -1, 0); keypad (mainwnd, TRUE); // enable keyboard mapping keypad (inpwin, TRUE); // enable keyboard mapping nodelay (inpwin, TRUE); + getmaxyx(inpwin,my,mx); wrefresh (mainwnd); wrefresh (dispwin); wrefresh (statwin); @@ -172,8 +210,6 @@ main (int argc, char **argv) init_pair (COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); init_pair (COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); } - //wbkgd (dispwin, COLOR_PAIR (COLOR_WHITE)); - //wbkgd (inpwin, COLOR_PAIR (COLOR_CYAN)); wrefresh (dispwin); wrefresh (inpwin); @@ -188,8 +224,8 @@ main (int argc, char **argv) system (command_string); } if ((conf_file = fopen(conffile,"w")) != NULL) { - fprintf(conf_file,"username=%s",username); - fclose(conf_file); + fprintf(conf_file,"username=%s",username); + fclose(conf_file); } } if ((conf_file = fopen(conffile,"r")) != NULL) { @@ -202,7 +238,7 @@ main (int argc, char **argv) xasprintf (&port, "%s",&buffer[5]); } } - fclose(conf_file); + fclose(conf_file); } status=ttt_socket_create_client (host, port, &_socket); if (status) { @@ -220,7 +256,7 @@ main (int argc, char **argv) if (fgets(buffer,BUFSIZ,sockin)) { if ((strncmp(buffer,"NOTICE MESSAGE ",15) == 0) && (strlen(buffer) > 15)) { - wprint (dispwin, buffer); + wprint (dispwin, buffer); } else { if (strncmp(buffer,"MESSAGE",7) != 0) wprint (statwin, buffer); @@ -238,32 +274,94 @@ main (int argc, char **argv) c = wgetch (inpwin); if ((c != ERR) && (strlen(inplin)< 1000)) { switch ((int) c) { - case 13: - break; - case 10: - break; - case 8: - inplin[strlen(inplin)-1]='\0'; - wmove (inpwin,0,strlen(inplin)); - wclrtoeol( inpwin); + case 13: // CARRIAGE RETURN + break; + case 10: // LINE FEED + break; + case 262: // HOME key + curpos = 0; + curx = 0; + inpprint(inpwin,inplin,curpos,curx); + wrefresh (inpwin); + break; + case 360: // END key + curpos = strlen(inplin); + if (strlen(inplin) > mx -1) { + curx = strlen(inplin) - mx +1; + } + else + { + curx = 0; + } + inpprint(inpwin,inplin,curpos,curx); + wrefresh (inpwin); + break; + case 330: // DELETE key + if (strlen(inplin) > 0) { + if (curpos == strlen(inplin)) { + inplin[strlen(inplin)-1]='\0'; + curpos--; + } + else + { + strncpy(&inplin[curpos],&inplin[curpos+1],strlen(inplin)-curpos+1); + } + + + inpprint(inpwin,inplin,curpos,curx); wrefresh (inpwin); - break; - case 127: - inplin[strlen(inplin)-1]='\0'; - wmove (inpwin,0,strlen(inplin)); - wclrtoeol (inpwin); + } + break; + case 263: // } + case 8: // > Various BACKSPACE codes + case 127: // } + if (curpos > 0) { + if (curpos == strlen(inplin)) { + inplin[strlen(inplin)-1]='\0'; + } + else + { + strncpy(&inplin[curpos-1],&inplin[curpos],strlen(inplin)-curpos); + inplin[strlen(inplin)-1]='\0'; + } + if (curpos > 0) curpos--; + if (curx > 0) curx--; + inpprint(inpwin,inplin,curpos,curx); wrefresh (inpwin); - break; - case 263: - inplin[strlen(inplin)-1]='\0'; - wmove (inpwin,0,strlen(inplin)); - wclrtoeol (inpwin); + } + break; + case 260: // LEFT ARROW + if (curpos > 0) { + curpos--; + if (curx > curpos) curx = curpos; + inpprint(inpwin,inplin,curpos,curx); wrefresh (inpwin); - break; - default: - sprintf (inplin,"%s%c",inplin,(int) c); - waddch (inpwin, c); + } + break; + case 261: // RIGHT ARROW + if (curpos < strlen(inplin)) { + curpos++; + if (curpos - curx > mx-1) curx++; + inpprint(inpwin,inplin,curpos,curx); wrefresh (inpwin); + } + break; + default: // ALL OTHER KEYS + if (curpos == strlen(inplin)) { + sprintf (inplin,"%s%c",inplin,(int) c); + } + else + { + + strncpy(tlin,&inplin[curpos],strlen(inplin)-curpos); + tlin[strlen(inplin)-curpos]='\0'; + strcpy(&inplin[curpos+1],tlin); + inplin[curpos] = (int) c; + } + curpos++; + if (curpos - curx > mx-1) curx++; + inpprint(inpwin,inplin,curpos,curx); + wrefresh (inpwin); } } @@ -281,6 +379,8 @@ main (int argc, char **argv) } if (((int) c == 13) || ((int) c == 10)) { curs_set (0); + curpos = 0; + curx = 0; if (inplin[0] == '/') { fprintf(sockout,"%s\r\n",&inplin[1]); }