Heavy surgery on tgetch. - irc - Unnamed repository; edit this file 'descriptio… | |
git clone git://vernunftzentrum.de/irc.git | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 43b2c32a6d4ddbb64edbd7428a7d0a425cab6e96 | |
parent 110c0a8075a87cf1991233c158ad51fe69e48e2a | |
Author: Quentin Carbonneaux <[email protected]> | |
Date: Mon, 12 Mar 2012 09:40:37 +0100 | |
Heavy surgery on tgetch. | |
The code layout used in the main switch was unified. The printer was re | |
written from scratch to handle long input lines. The code is supposed to | |
resist to terminal resizes (with some slight refresh problems). | |
Diffstat: | |
irc.c | 62 +++++++++++++++++++++---------- | |
1 file changed, 42 insertions(+), 20 deletions(-) | |
--- | |
diff --git a/irc.c b/irc.c | |
@@ -410,14 +410,20 @@ static void | |
tgetch(void) | |
{ | |
static char l[BufSz]; | |
- static size_t cu=0, len=0; | |
+ static size_t shft, cu, len; | |
size_t dirty=len+1, i; | |
int c; | |
c=wgetch(scr.iw); | |
switch (c) { | |
- case 0xe: ch=(ch+1)%nch; tredraw(); return; | |
- case 0x10: ch=(ch+nch-1)%nch; tredraw(); return; | |
+ case CTRL('n'): //0xe: | |
+ ch=(ch+1)%nch; | |
+ tredraw(); | |
+ return; | |
+ case CTRL('p'): //0x10: | |
+ ch=(ch+nch-1)%nch; | |
+ tredraw(); | |
+ return; | |
case KEY_PPAGE: | |
chl[ch].n+=SCROLL; | |
tredraw(); | |
@@ -427,14 +433,24 @@ tgetch(void) | |
if (chl[ch].n<0) chl[ch].n=0; | |
tredraw(); | |
return; | |
- case 0x1: cu=0; break; | |
- case 0x5: cu=len; break; | |
- case 0x2: | |
- case KEY_LEFT: if (cu) cu--; break; | |
- case 0x6: | |
- case KEY_RIGHT: if (cu<len) cu++; break; | |
- case 0xb: dirty=len=cu; break; | |
- case 0x15: | |
+ case CTRL('a'): //0x1: | |
+ cu=0; | |
+ break; | |
+ case CTRL('e'): //0x5: | |
+ cu=len; | |
+ break; | |
+ case CTRL('b'): //0x2: | |
+ case KEY_LEFT: | |
+ if (cu) cu--; | |
+ break; | |
+ case CTRL('f'): //0x6: | |
+ case KEY_RIGHT: | |
+ if (cu<len) cu++; | |
+ break; | |
+ case CTRL('k'): //0xb: | |
+ dirty=len=cu; | |
+ break; | |
+ case CTRL('u'): //0x15: | |
if (cu==0) return; | |
len-=cu; | |
memmove(l, &l[cu], len); | |
@@ -459,14 +475,21 @@ tgetch(void) | |
l[cu++]=c; | |
break; | |
} | |
- /* TODO, add a cleverer printer to deal with long lines. */ | |
- if (dirty<=len) { | |
- wmove(scr.iw, 0, strlen(nick)+2+dirty); | |
- wclrtoeol(scr.iw); | |
- for (i=dirty; i<len; i++) | |
- waddch(scr.iw, l[i]); | |
- } | |
- wmove(scr.iw, 0, strlen(nick)+2+cu); | |
+ while (cu<shft) | |
+ dirty=0, shft -= shft>=scr.x/2 ? scr.x/2 : shft; | |
+ while (cu>=scr.x+shft) | |
+ dirty=0, shft += scr.x/2; | |
+ if (dirty<=shft) | |
+ i=shft; | |
+ else if (dirty>scr.x+shft || dirty>len) | |
+ goto mvcur; | |
+ else | |
+ i=dirty; | |
+ wmove(scr.iw, 0, i-shft); | |
+ wclrtoeol(scr.iw); | |
+ for (; i-shft<scr.x && i<len; i++) | |
+ waddch(scr.iw, l[i]); | |
+mvcur: wmove(scr.iw, 0, cu-shft); | |
} | |
static void | |
@@ -489,7 +512,6 @@ main(void) | |
waddstr(scr.sw, "Welcome in irc."); | |
wrefresh(scr.sw); | |
strcpy(nick, "_mpu"); | |
- waddstr(scr.iw, "_mpu< "); | |
sfd = dial("chat.freenode.org", 6667); | |
sndf("NICK %s", nick); | |
sndf("USER brebi 8 * :%s", user); |