Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
You are viewing proxied material from vernunftzentrum.de. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.