static gboolean do_redraw(gpointer unused) { terminfo_cont(current_term); irssi_redraw(); return 1; }
static int term_setup(TERM_REC *term) { GString *str; #ifdef HAVE_TERMINFO int err; #endif char *term_env; term_env = getenv("TERM"); if (term_env == NULL) { fprintf(term->out, "TERM environment not set\n"); return 0; } #ifdef HAVE_TERMINFO if (setupterm(term_env, 1, &err) != 0) { fprintf(term->out, "setupterm() failed for TERM=%s: %d\n", term_env, err); return 0; } #else if (tgetent(term->buffer1, term_env) < 1) { fprintf(term->out, "Termcap not found for TERM=%s\n", term_env); return -1; } #endif term_fill_capabilities(term); /* Cursor movement */ if (term->TI_cup) term->move = _move_cup; else if (term->TI_hpa && term->TI_vpa) term->move = _move_pa; else { fprintf(term->out, "Terminal doesn't support cursor movement\n"); return 0; } term->move_relative = _move_relative; term->set_cursor_visible = term->TI_civis && term->TI_cnorm ? _set_cursor_visible : _ignore_parm; /* Scrolling */ if ((term->TI_csr || term->TI_wind) && term->TI_rin && term->TI_indn) term->scroll = _scroll_region; else if (term->TI_il && term->TI_dl) term->scroll = _scroll_line; else if ((term->TI_csr || term->TI_wind) && term->TI_ri && term->TI_ind) term->scroll = _scroll_region_1; else if (term->scroll == NULL && (term->TI_il1 && term->TI_dl1)) term->scroll = _scroll_line_1; else if (term->scroll == NULL) { fprintf(term->out, "Terminal doesn't support scrolling\n"); return 0; } /* Clearing screen */ if (term->TI_clear) term->clear = _clear_screen; else if (term->TI_ed) term->clear = _clear_eos; else if (term->TI_dl) term->clear = _clear_del; else if (term->TI_dl1) term->clear = _clear_del_1; else { /* we could do this by line inserts as well, but don't bother - if some terminal has insert line it most probably has delete line as well, if not a regular clear screen */ fprintf(term->out, "Terminal doesn't support clearing screen\n"); return 0; } /* Clearing to end of line */ if (term->TI_el) term->clrtoeol = _clrtoeol; else { fprintf(term->out, "Terminal doesn't support clearing to end of line\n"); return 0; } /* Repeating character */ if (term->TI_rep) term->repeat = _repeat; else term->repeat = _repeat_manual; /* Bold, underline, standout */ term->set_bold = term->TI_bold ? _set_bold : _ignore; term->set_uline = term->TI_smul && term->TI_rmul ? _set_uline : _ignore_parm; term->set_standout = term->TI_smso && term->TI_rmso ? _set_standout : _ignore_parm; /* Create a string to set all attributes off */ str = g_string_new(NULL); if (term->TI_sgr0) g_string_append(str, term->TI_sgr0); if (term->TI_rmul && (term->TI_sgr0 == NULL || strcmp(term->TI_rmul, term->TI_sgr0) != 0)) g_string_append(str, term->TI_rmul); if (term->TI_rmso && (term->TI_sgr0 == NULL || strcmp(term->TI_rmso, term->TI_sgr0) != 0)) g_string_append(str, term->TI_rmso); term->TI_normal = str->str; g_string_free(str, FALSE); term->set_normal = _set_normal; term->beep = term->TI_bel ? _beep : _ignore; terminfo_setup_colors(term, FALSE); terminfo_cont(term); return 1; }
/* SIGCONT handler */ static void sig_cont(int p) { redraw_needed = TRUE; terminfo_cont(current_term); }