iHandle terminal resizes. - irc - Unnamed repository; edit this file 'description' to name the repository. Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/irc.git URL:git://vernunftzentrum.de/irc.git vernunftzentrum.de 70 1Log /ckeen/repos/irc/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/irc/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/irc/refs.gph vernunftzentrum.de 70 1README /ckeen/repos/irc/file/README.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit c5b6ac6afa188bd107bdbfb96500182447368b05 /ckeen/repos/irc/commit/c5b6ac6afa188bd107bdbfb96500182447368b05.gph vernunftzentrum.de 70 1parent 646d0a762d1536fca7c19518d1e30a269b57cba5 /ckeen/repos/irc/commit/646d0a762d1536fca7c19518d1e30a269b57cba5.gph vernunftzentrum.de 70 hAuthor: Quentin Carbonneaux URL:mailto:qcarbonneaux@gmail.com vernunftzentrum.de 70 iDate: Sun, 11 Mar 2012 22:03:49 +0100 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iHandle terminal resizes. Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iThe KEY_RESIZE feature of ncurses is not used since it is not possible Err vernunftzentrum.de 70 ito detect if a KEY_RESIZE was queued by selecting on stdin. Hence, tinit Err vernunftzentrum.de 70 inow installs a SIGWINCH handler which will set the winchg variable to 1. Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iI rely on the fact that select will be interrupted by the signal which Err vernunftzentrum.de 70 ipops after a terminal resize to be able to redraw the screen Err vernunftzentrum.de 70 iinstantaneously. Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 itresize does all the job of resizing the three used curses windows. Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i irc.c | 34 +++++++++++++++++++++++-------- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i1 file changed, 26 insertions(+), 8 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/irc.c b/irc.c /ckeen/repos/irc/file/irc.c.gph vernunftzentrum.de 70 i@@ -2,6 +2,7 @@ Err vernunftzentrum.de 70 i */ Err vernunftzentrum.de 70 i #include Err vernunftzentrum.de 70 i #include Err vernunftzentrum.de 70 i+#include Err vernunftzentrum.de 70 i #include Err vernunftzentrum.de 70 i #include Err vernunftzentrum.de 70 i #include Err vernunftzentrum.de 70 i@@ -28,7 +29,7 @@ enum { ChanLen = 64, LineLen = 512, MaxChans = 16, BufSz = 2048, LogSz = 4096 }; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i char nick[64]; Err vernunftzentrum.de 70 i char prefix[64]; Err vernunftzentrum.de 70 i-int quit; Err vernunftzentrum.de 70 i+int quit, winchg; Err vernunftzentrum.de 70 i int sfd; /* Server file descriptor. */ Err vernunftzentrum.de 70 i struct { Err vernunftzentrum.de 70 i int x; Err vernunftzentrum.de 70 i@@ -315,9 +316,16 @@ uparse(char *m) Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i static void Err vernunftzentrum.de 70 i+sigwinch(int sig) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ if (sig) winchg=1; Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i tinit(void) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i setlocale(LC_ALL, ""); Err vernunftzentrum.de 70 i+ signal(SIGWINCH, sigwinch); Err vernunftzentrum.de 70 i initscr(); Err vernunftzentrum.de 70 i raw(); Err vernunftzentrum.de 70 i noecho(); Err vernunftzentrum.de 70 i@@ -337,6 +345,19 @@ tinit(void) Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i static void Err vernunftzentrum.de 70 i+tresize(void) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ winchg=0; Err vernunftzentrum.de 70 i+ getmaxyx(stdscr, scr.y, scr.x); Err vernunftzentrum.de 70 i+ if (scr.y<3 || scr.x<10) panic("Screen too small."); Err vernunftzentrum.de 70 i+ wresize(scr.mw, scr.y-2, scr.x); Err vernunftzentrum.de 70 i+ wresize(scr.iw, 1, scr.x); Err vernunftzentrum.de 70 i+ wresize(scr.sw, 1, scr.x); Err vernunftzentrum.de 70 i+ mvwin(scr.iw, scr.y-1, 1); Err vernunftzentrum.de 70 i+ tredraw(); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+static void Err vernunftzentrum.de 70 i tredraw(void) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i struct Chan * const c=&chl[ch]; Err vernunftzentrum.de 70 i@@ -425,11 +446,6 @@ tgetch(void) Err vernunftzentrum.de 70 i uparse(lb); Err vernunftzentrum.de 70 i dirty=cu=len=0; Err vernunftzentrum.de 70 i break; Err vernunftzentrum.de 70 i- case KEY_RESIZE: Err vernunftzentrum.de 70 i- getmaxyx(stdscr, scr.y, scr.x); Err vernunftzentrum.de 70 i- if (scr.y<3 || scr.x<10) panic("Screen too small."); Err vernunftzentrum.de 70 i- tredraw(); Err vernunftzentrum.de 70 i- return; Err vernunftzentrum.de 70 i default: Err vernunftzentrum.de 70 i if (c>CHAR_MAX || len>=BufSz) return; /* Skip other curses codes. */ Err vernunftzentrum.de 70 i memmove(&lb[cu+1], &lb[cu], len-cu); Err vernunftzentrum.de 70 i@@ -476,7 +492,9 @@ main(void) Err vernunftzentrum.de 70 i while (!quit) { Err vernunftzentrum.de 70 i fd_set rfs, wfs; Err vernunftzentrum.de 70 i int ret; Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ if (winchg) Err vernunftzentrum.de 70 i+ tresize(); Err vernunftzentrum.de 70 i FD_ZERO(&wfs); Err vernunftzentrum.de 70 i FD_ZERO(&rfs); Err vernunftzentrum.de 70 i FD_SET(0, &rfs); Err vernunftzentrum.de 70 i@@ -494,7 +512,7 @@ main(void) Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i if (FD_ISSET(sfd, &wfs)) { Err vernunftzentrum.de 70 i int wr; Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i wr=write(sfd, outb, outp-outb); Err vernunftzentrum.de 70 i if (wr<0) { Err vernunftzentrum.de 70 i if (errno==EINTR) continue; Err vernunftzentrum.de 70 .