def(bool, OnKeyPress, RdString ch) { if (ch.buf[0] == CTRLKEY('c')) { String_Print($("Shutting down...\n")); this->interrupt = true; return true; } else if (ch.buf[0] == CTRLKEY('q')) { String_Print($("You pressed CTRL-Q!\n")); return true; } return false; }
static void directkey(void) { char *shell[32] = SHELL; char *mail[32] = MAIL; char *editor[32] = EDITOR; int c = readchar(); if (PASS && locked) { if (c == '\r') { pass[passlen] = '\0'; if (!strcmp(PASS, pass)) locked = 0; passlen = 0; return; } if (isprint(c) && passlen + 1 < sizeof(pass)) pass[passlen++] = c; return; } if (c == ESC) { switch ((c = readchar())) { case 'c': execterm(shell); return; case 'm': execterm(mail); return; case 'e': execterm(editor); return; case 'j': case 'k': showterm(altterm(cterm())); return; case 'o': showtag(ltag); return; case 'p': listtags(); return; case '\t': if (nextterm() != cterm()) showterm(nextterm()); return; case CTRLKEY('q'): exitit = 1; return; case 's': term_screenshot(); return; case 'y': term_redraw(1); return; case CTRLKEY('l'): locked = 1; passlen = 0; return; case CTRLKEY('o'): taglock = 1 - taglock; return; case ',': term_scrl(pad_rows() / 2); return; case '.': term_scrl(-pad_rows() / 2); return; default: if (strchr(tags, c)) { showtag(strchr(tags, c) - tags); return; } if (mainterm()) term_send(ESC); } } if (c != -1 && mainterm()) term_send(c); }
static void mainloop(void) { int step = srows / PAGESTEPS; int hstep = scols / PAGESTEPS; int c; term_setup(); signal(SIGCONT, sigcont); loadpage(num); srow = prow; scol = -scols / 2; draw(); while ((c = readkey()) != -1) { if (c == 'q') break; if (c == 'e' && reload()) break; switch (c) { /* commands that do not require redrawing */ case 'o': numdiff = num - getcount(num); break; case 'Z': zoom_def = getcount(zoom); break; case 'i': printinfo(); break; case 27: count = 0; break; case 'm': setmark(readkey()); break; case 'd': sleep(getcount(1)); break; default: if (isdigit(c)) count = count * 10 + c - '0'; } switch (c) { /* commands that require redrawing */ case CTRLKEY('f'): case 'J': if (!loadpage(num + getcount(1))) srow = prow; break; case CTRLKEY('b'): case 'K': if (!loadpage(num - getcount(1))) srow = prow; break; case 'G': setmark('\''); if (!loadpage(getcount(doc_pages(doc) - numdiff) + numdiff)) srow = prow; break; case 'O': numdiff = num - getcount(num); setmark('\''); if (!loadpage(num + numdiff)) srow = prow; break; case 'z': zoom_page(getcount(zoom_def)); break; case 'w': zoom_page(pcols ? zoom * scols / pcols : zoom); break; case 'W': if (lmargin() < rmargin()) zoom_page(zoom * (scols - hstep) / (rmargin() - lmargin())); break; case 'f': zoom_page(prows ? zoom * srows / prows : zoom); break; case 'r': rotate = getcount(0); if (!loadpage(num)) srow = prow; break; case '`': case '\'': jmpmark(readkey(), c == '`'); break; case 'j': srow += step * getcount(1); break; case 'k': srow -= step * getcount(1); break; case 'l': scol += hstep * getcount(1); break; case 'h': scol -= hstep * getcount(1); break; case 'H': srow = prow; break; case 'L': srow = prow + prows - srows; break; case 'M': srow = prow + prows / 2 - srows / 2; break; case 'C': scol = -scols / 2; break; case ' ': case CTRLKEY('d'): srow += srows * getcount(1) - step; break; case 127: case CTRLKEY('u'): srow -= srows * getcount(1) - step; break; case '[': scol = pcol; break; case ']': scol = pcol + pcols - scols; break; case '{': scol = pcol + lmargin() - hstep / 2; break; case '}': scol = pcol + rmargin() + hstep / 2 - scols; break; case CTRLKEY('l'): break; case 'I': invert = !invert; loadpage(num); break; default: /* no need to redraw */ continue; } srow = MAX(prow - srows + MARGIN, MIN(prow + prows - MARGIN, srow)); scol = MAX(pcol - scols + MARGIN, MIN(pcol + pcols - MARGIN, scol)); draw(); } term_cleanup(); }