/* * Process any signals we have received. * A received signal cause a bit to be set in "sigs". */ void psignals(void) { int tsignals; if ((tsignals = sigs) == 0) return; sigs = 0; if (tsignals & S_STOP) { /* * Clean up the terminal. */ lsignal(SIGTTOU, SIG_IGN); clear_bot(); deinit(); flush(0); raw_mode(0); lsignal(SIGTTOU, SIG_DFL); lsignal(SIGTSTP, SIG_DFL); kill(getpid(), SIGTSTP); /* * ... Bye bye. ... * Hopefully we'll be back later and resume here... * Reset the terminal and arrange to repaint the * screen when we get back to the main command loop. */ lsignal(SIGTSTP, stop); raw_mode(1); init(); screen_trashed = 1; tsignals |= S_WINCH; } if (tsignals & S_WINCH) { int old_width, old_height; /* * Re-execute scrsize() to read the new window size. */ old_width = sc_width; old_height = sc_height; get_term(); if (sc_width != old_width || sc_height != old_height) { wscroll = (sc_height + 1) / 2; calc_jump_sline(); calc_shift_count(); screen_trashed = 1; } } if (tsignals & S_INTERRUPT) { ring_bell(); if (quit_on_intr) quit(QUIT_INTERRUPT); } }
/* * Handlers for -j option. */ void opt_j(int type, char *s) { PARG parg; char buf[16]; int len; int err; switch (type) { case INIT: case TOGGLE: if (*s == '.') { s++; jump_sline_fraction = getfraction(&s, "j", &err); if (err) error("Invalid line fraction", NULL_PARG); else calc_jump_sline(); } else { int sline = getnum(&s, "j", &err); if (err) { error("Invalid line number", NULL_PARG); } else { jump_sline = sline; jump_sline_fraction = -1; } } break; case QUERY: if (jump_sline_fraction < 0) { parg.p_int = jump_sline; error("Position target at screen line %d", &parg); } else { (void) snprintf(buf, sizeof (buf), ".%06d", jump_sline_fraction); len = strlen(buf); while (len > 2 && buf[len-1] == '0') len--; buf[len] = '\0'; parg.p_string = buf; error("Position target at screen position %s", &parg); } break; } }