summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Carbonneaux2012-03-11 22:03:49 +0100
committerQuentin Carbonneaux2012-03-11 22:03:49 +0100
commitc5b6ac6afa188bd107bdbfb96500182447368b05 (patch)
treef710b90ac28e0228997bcb1928e4e0cc19e206df
parent646d0a762d1536fca7c19518d1e30a269b57cba5 (diff)
Handle terminal resizes.
The KEY_RESIZE feature of ncurses is not used since it is not possible to detect if a KEY_RESIZE was queued by selecting on stdin. Hence, tinit now installs a SIGWINCH handler which will set the winchg variable to 1. I rely on the fact that select will be interrupted by the signal which pops after a terminal resize to be able to redraw the screen instantaneously. tresize does all the job of resizing the three used curses windows.
-rw-r--r--irc.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/irc.c b/irc.c
index 85d695b..a7e68f6 100644
--- a/irc.c
+++ b/irc.c
@@ -2,6 +2,7 @@
*/
#include <assert.h>
#include <limits.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
@@ -28,7 +29,7 @@ enum { ChanLen = 64, LineLen = 512, MaxChans = 16, BufSz = 2048, LogSz = 4096 };
char nick[64];
char prefix[64];
-int quit;
+int quit, winchg;
int sfd; /* Server file descriptor. */
struct {
int x;
@@ -315,9 +316,16 @@ uparse(char *m)
}
static void
+sigwinch(int sig)
+{
+ if (sig) winchg=1;
+}
+
+static void
tinit(void)
{
setlocale(LC_ALL, "");
+ signal(SIGWINCH, sigwinch);
initscr();
raw();
noecho();
@@ -337,6 +345,19 @@ tinit(void)
}
static void
+tresize(void)
+{
+ winchg=0;
+ getmaxyx(stdscr, scr.y, scr.x);
+ if (scr.y<3 || scr.x<10) panic("Screen too small.");
+ wresize(scr.mw, scr.y-2, scr.x);
+ wresize(scr.iw, 1, scr.x);
+ wresize(scr.sw, 1, scr.x);
+ mvwin(scr.iw, scr.y-1, 1);
+ tredraw();
+}
+
+static void
tredraw(void)
{
struct Chan * const c=&chl[ch];
@@ -425,11 +446,6 @@ tgetch(void)
uparse(lb);
dirty=cu=len=0;
break;
- case KEY_RESIZE:
- getmaxyx(stdscr, scr.y, scr.x);
- if (scr.y<3 || scr.x<10) panic("Screen too small.");
- tredraw();
- return;
default:
if (c>CHAR_MAX || len>=BufSz) return; /* Skip other curses codes. */
memmove(&lb[cu+1], &lb[cu], len-cu);
@@ -476,7 +492,9 @@ main(void)
while (!quit) {
fd_set rfs, wfs;
int ret;
-
+
+ if (winchg)
+ tresize();
FD_ZERO(&wfs);
FD_ZERO(&rfs);
FD_SET(0, &rfs);
@@ -494,7 +512,7 @@ main(void)
}
if (FD_ISSET(sfd, &wfs)) {
int wr;
-
+
wr=write(sfd, outb, outp-outb);
if (wr<0) {
if (errno==EINTR) continue;