Introduction
Introduction Statistics Contact Development Disclaimer Help
Handle terminal resizes. - irc - Unnamed repository; edit this file 'descriptio…
git clone git://vernunftzentrum.de/irc.git
Log
Files
Refs
README
---
commit c5b6ac6afa188bd107bdbfb96500182447368b05
parent 646d0a762d1536fca7c19518d1e30a269b57cba5
Author: Quentin Carbonneaux <[email protected]>
Date: Sun, 11 Mar 2012 22:03:49 +0100
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.
Diffstat:
irc.c | 34 +++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)
---
diff --git 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 = 20…
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 cod…
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;
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.