static void reset(void) { decset(tracking_x10, FALSE); decset(tracking_mouse, FALSE); decset(tracking_hilite, FALSE); decset(tracking_cell_motion, FALSE); decset(tracking_all_motion, FALSE); fflush(stdout); }
/* Reset all of the keyboard modes. */ static void reset(void) { g_print(MODE_NORMAL_KEYPAD); decset(MODE_APPLICATION_CURSOR_KEYS, FALSE); decset(MODE_SUN_FUNCTION_KEYS, FALSE); decset(MODE_HP_FUNCTION_KEYS, FALSE); decset(MODE_XTERM_FUNCTION_KEYS, FALSE); decset(MODE_VT220_FUNCTION_KEYS, FALSE); reset_scrolling_region(); restore_cursor(); }
static void reset(void) { reset_mouse_tracking_mode(); decset(tracking_focus, FALSE); fflush(stdout); }
static void clear(void) { fprintf(stdout, "%s", _VTE_CAP_ESC "7" _VTE_CAP_CSI "8;1H" _VTE_CAP_CSI "1J" _VTE_CAP_CSI "2K" _VTE_CAP_CSI "1;1H"); reset(); switch (tracking_mode) { case tracking_x10: fprintf(stdout, "X10 tracking enabled.\r\n"); decset(tracking_x10, TRUE); break; case tracking_mouse: fprintf(stdout, "Mouse tracking enabled.\r\n"); decset(tracking_mouse, TRUE); break; case tracking_hilite: fprintf(stdout, "Hilite tracking enabled.\r\n"); decset(tracking_hilite, TRUE); break; case tracking_cell_motion: fprintf(stdout, "Cell motion tracking enabled.\r\n"); decset(tracking_cell_motion, TRUE); break; case tracking_all_motion: fprintf(stdout, "All motion tracking enabled.\r\n"); decset(tracking_all_motion, TRUE); break; default: fprintf(stdout, "Tracking disabled.\r\n"); break; } fprintf(stdout, "A - X10.\r\n"); fprintf(stdout, "B - Mouse tracking.\r\n"); fprintf(stdout, "C - Hilite tracking [FIXME: NOT IMPLEMENTED].\r\n"); fprintf(stdout, "D - Cell motion tracking.\r\n"); fprintf(stdout, "E - All motion tracking.\r\n"); fprintf(stdout, "%s", _VTE_CAP_ESC "8"); fflush(stdout); }
static void clear(void) { fprintf(stdout, "%s", _VTE_CAP_ESC "7" _VTE_CAP_CSI "11;1H" _VTE_CAP_CSI "1J" _VTE_CAP_CSI "2K" _VTE_CAP_CSI "1;1H"); reset_mouse_tracking_mode(); switch (tracking_mode) { case tracking_x10: fprintf(stdout, "X10 tracking enabled.\r\n"); decset(tracking_x10, TRUE); break; case tracking_mouse: fprintf(stdout, "Mouse tracking enabled.\r\n"); decset(tracking_mouse, TRUE); break; case tracking_hilite: fprintf(stdout, "Hilite tracking enabled.\r\n"); decset(tracking_hilite, TRUE); break; case tracking_cell_motion: fprintf(stdout, "Cell motion tracking enabled.\r\n"); decset(tracking_cell_motion, TRUE); break; case tracking_all_motion: fprintf(stdout, "All motion tracking enabled.\r\n"); decset(tracking_all_motion, TRUE); break; case tracking_xterm_ext: fprintf(stdout, "Xterm 1006 mouse tracking extension enabled.\r\n"); decset(tracking_xterm_ext, TRUE); break; case tracking_urxvt: fprintf(stdout, "rxvt-unicode 1015 mouse tracking extension enabled.\r\n"); decset(tracking_urxvt, TRUE); break; default: fprintf(stdout, "Tracking disabled.\r\n"); break; } fprintf(stdout, "Tracking focus %s.\r\n", tracking_focus_mode ? "enabled":"disabled"); fprintf(stdout, "A - X10.\r\n"); fprintf(stdout, "B - Mouse tracking.\r\n"); fprintf(stdout, "C - Hilite tracking [FIXME: NOT IMPLEMENTED].\r\n"); fprintf(stdout, "D - Cell motion tracking.\r\n"); fprintf(stdout, "E - All motion tracking.\r\n"); fprintf(stdout, "F - Xterm 1006 extension.\r\n"); fprintf(stdout, "G - rxvt-unicode extension.\r\n"); fprintf(stdout, "I - Focus tracking.\r\n"); fprintf(stdout, "Q - Quit.\r\n"); fprintf(stdout, "%s", _VTE_CAP_ESC "8"); fflush(stdout); }
static void reset_mouse_tracking_mode(void) { decset(tracking_x10, FALSE); decset(tracking_mouse, FALSE); decset(tracking_hilite, FALSE); decset(tracking_cell_motion, FALSE); decset(tracking_all_motion, FALSE); decset(tracking_xterm_ext, FALSE); decset(tracking_urxvt, FALSE); fflush(stdout); }
static gboolean parse(void) { GByteArray *bytes; guchar buffer[64]; gsize i, length; gboolean ret = FALSE; bytes = g_byte_array_new(); if ((length = read(STDIN_FILENO, buffer, sizeof(buffer))) > 0) { g_byte_array_append(bytes, buffer, length); } i = 0; while (i < bytes->len) { switch (bytes->data[i]) { case 'A': case 'a': tracking_mode = (tracking_mode == tracking_x10) ? 0 : tracking_x10; i++; break; case 'B': case 'b': tracking_mode = (tracking_mode == tracking_mouse) ? 0 : tracking_mouse; i++; break; case 'C': case 'c': tracking_mode = (tracking_mode == tracking_hilite) ? 0 : tracking_hilite; i++; break; case 'D': case 'd': tracking_mode = (tracking_mode == tracking_cell_motion) ? 0 : tracking_cell_motion; i++; break; case 'E': case 'e': tracking_mode = (tracking_mode == tracking_all_motion) ? 0 : tracking_all_motion; i++; break; case 'F': case 'f': tracking_mode = (tracking_mode == tracking_xterm_ext) ? 0 : tracking_xterm_ext; i++; break; case 'G': case 'g': tracking_mode = (tracking_mode == tracking_urxvt) ? 0 : tracking_urxvt; i++; break; case 'I': case 'i': tracking_focus_mode = !tracking_focus_mode; decset(tracking_focus, tracking_focus_mode); i++; break; case 'Q': case 'q': ret = TRUE; i++; break; case '\033': { gsize consumed = parse_esc(&bytes->data[i], bytes->len - i); if (consumed > 0) { i += consumed; break; } /* else fall-trough */ } default: i += print_data(&bytes->data[i], bytes->len - i); fprintf(stdout, "\r\n"); break; } } fflush(stdout); g_byte_array_free(bytes, TRUE); return ret; }
int main(int argc, char **argv) { char c; guint i; struct termios tcattr; GByteArray *bytes; gboolean done = FALSE, saved = FALSE; struct timeval tv; fd_set readset; /* Start up: save the cursor location and put the terminal in * raw mode. */ bytes = g_byte_array_new(); save_cursor(); if (tcgetattr(STDIN_FILENO, &tcattr) != 0) { perror("tcgetattr"); return 1; } original = tcattr; signal(SIGINT, sigint_handler); /* Here we approximate what cfmakeraw() would do, for the benefit * of systems which don't actually provide the function. */ tcattr.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tcattr.c_oflag &= ~(OPOST); tcattr.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); tcattr.c_cflag &= ~(CSIZE | PARENB); tcattr.c_cflag |= CS8; #ifdef HAVE_CFMAKERAW cfmakeraw(&tcattr); #endif if (tcsetattr(STDIN_FILENO, TCSANOW, &tcattr) != 0) { perror("tcsetattr"); return 1; } /* Switch to the alternate screen, clear it, and reset the keyboard. */ decset(MODE_ALTERNATE_SCREEN, TRUE); clear(); reset(); /* Main processing loop. */ while (!done) { print_help(); set_scrolling_region(); if (saved) { restore_cursor(); } /* Read a single byte. */ if (read(STDIN_FILENO, &c, 1) != 1) { done = TRUE; } switch (c) { case 'A': case 'a': keypad_mode = 1 - keypad_mode; if (keypad_mode == normal) { g_print(MODE_NORMAL_KEYPAD); } else { g_print(MODE_APPLICATION_KEYPAD); } break; case 'B': case 'b': cursor_mode = 1 - cursor_mode; decset(MODE_APPLICATION_CURSOR_KEYS, cursor_mode == application); break; case 'C': case 'c': sun_fkeys = !sun_fkeys; decset(MODE_SUN_FUNCTION_KEYS, sun_fkeys); break; case 'D': case 'd': hp_fkeys = !hp_fkeys; decset(MODE_HP_FUNCTION_KEYS, hp_fkeys); break; case 'E': case 'e': xterm_fkeys = !xterm_fkeys; decset(MODE_XTERM_FUNCTION_KEYS, xterm_fkeys); break; case 'F': case 'f': vt220_fkeys = !vt220_fkeys; decset(MODE_VT220_FUNCTION_KEYS, vt220_fkeys); break; case 'R': case 'r': keypad_mode = cursor_mode = normal; sun_fkeys = hp_fkeys = xterm_fkeys = vt220_fkeys = FALSE; reset(); break; case 'Q': case 'q': done = TRUE; break; case 0x0c: /* ^L */ clear(); if (saved) { restore_cursor(); saved = FALSE; } break; default: /* We get here if it's not one of the keys we care * about, so it might be a sequence. */ if (saved) { restore_cursor(); } g_byte_array_append(bytes, &c, 1); /* Wait for up to just under 1/50 second. */ tv.tv_sec = 0; tv.tv_usec = 1000000 / 50; FD_ZERO(&readset); FD_SET(STDIN_FILENO, &readset); while (select(STDIN_FILENO + 1, &readset, NULL, NULL, &tv) == 1) { if (read(STDIN_FILENO, &c, 1) == 1) { g_byte_array_append(bytes, &c, 1); } else { break; } tv.tv_sec = 0; tv.tv_usec = 1000000 / 50; FD_ZERO(&readset); FD_SET(STDIN_FILENO, &readset); } /* Clear this line, and print the sequence. */ g_print(ESC "[K"); for (i = 0; i < bytes->len; i++) { if (bytes->data[i] == 27) { g_print("<ESC> "); } else if ((((guint8)bytes->data[i]) < 32) || (((guint8)bytes->data[i]) > 126)) { g_print("<0x%02x> ", bytes->data[i]); } else { g_print("`%c' ", bytes->data[i]); } } g_print("\r\n"); g_byte_array_set_size(bytes, 0); save_cursor(); saved = TRUE; break; } reset_scrolling_region(); } decset(MODE_ALTERNATE_SCREEN, FALSE); if (tcsetattr(STDIN_FILENO, TCSANOW, &original) != 0) { perror("tcsetattr"); return 1; } g_byte_array_free(bytes, TRUE); reset(); return 0; }