⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 terminal.c

📁 gcc-2.95.3 Linux下最常用的C编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
      /* If we are scrolling down, delete AMOUNT lines at END.  Then insert         AMOUNT lines at START. */      if (amount > 0)        {          terminal_delete_lines (end, amount);          terminal_insert_lines (start, amount);        }      /* If we are scrolling up, delete AMOUNT lines before START.  This         actually does the upwards scroll.  Then, insert AMOUNT lines         after the already scrolled region (i.e., END - AMOUNT). */      if (amount < 0)        {          int abs_amount = -amount;          terminal_delete_lines (start - abs_amount, abs_amount);          terminal_insert_lines (end - abs_amount, abs_amount);        }    }}/* Re-initialize the terminal considering that the TERM/TERMCAP variable   has changed. */voidterminal_new_terminal (terminal_name)     char *terminal_name;{  if (terminal_new_terminal_hook)    (*terminal_new_terminal_hook) (terminal_name);  else    {      terminal_initialize_terminal (terminal_name);    }}/* Set the global variables SCREENWIDTH and SCREENHEIGHT. */voidterminal_get_screen_size (){  if (terminal_get_screen_size_hook)    (*terminal_get_screen_size_hook) ();  else    {      screenwidth = screenheight = 0;#if defined (TIOCGWINSZ)      {        struct winsize window_size;        if (ioctl (fileno (stdout), TIOCGWINSZ, &window_size) == 0)          {            screenwidth = (int) window_size.ws_col;            screenheight = (int) window_size.ws_row;          }      }#endif                          /* TIOCGWINSZ */      /* Environment variable COLUMNS overrides setting of "co". */      if (screenwidth <= 0)        {          char *sw = getenv ("COLUMNS");          if (sw)            screenwidth = atoi (sw);          if (screenwidth <= 0)            screenwidth = tgetnum ("co");        }      /* Environment variable LINES overrides setting of "li". */      if (screenheight <= 0)        {          char *sh = getenv ("LINES");          if (sh)            screenheight = atoi (sh);          if (screenheight <= 0)            screenheight = tgetnum ("li");        }      /* If all else fails, default to 80x24 terminal. */      if (screenwidth <= 0)        screenwidth = 80;      if (screenheight <= 0)        screenheight = 24;    }}/* Initialize the terminal which is known as TERMINAL_NAME.  If this   terminal doesn't have cursor addressability, `terminal_is_dumb_p'   becomes nonzero.  The variables SCREENHEIGHT and SCREENWIDTH are set   to the dimensions that this terminal actually has.  The variable   TERMINAL_HAS_META_P becomes nonzero if this terminal supports a Meta   key.  Finally, the terminal screen is cleared. */voidterminal_initialize_terminal (terminal_name)     char *terminal_name;{  char *term, *buffer;  terminal_is_dumb_p = 0;  if (terminal_initialize_terminal_hook)    {      (*terminal_initialize_terminal_hook) (terminal_name);      return;    }  term = terminal_name ? terminal_name : getenv ("TERM");  if (!term_string_buffer)    term_string_buffer = (char *)xmalloc (2048);  if (!term_buffer)    term_buffer = (char *)xmalloc (2048);  buffer = term_string_buffer;  term_clrpag = term_cr = term_clreol = (char *)NULL;  if (!term)    term = "dumb";  if (tgetent (term_buffer, term) <= 0)    {      terminal_is_dumb_p = 1;      screenwidth = 80;      screenheight = 24;      term_cr = "\r";      term_up = term_dn = audible_bell = visible_bell = (char *)NULL;      term_ku = term_kd = term_kl = term_kr = (char *)NULL;      term_kP = term_kN = (char *)NULL;      return;    }  BC = tgetstr ("pc", &buffer);  PC = BC ? *BC : 0;#if defined (TIOCGETP)  {    struct sgttyb sg;    if (ioctl (fileno (stdout), TIOCGETP, &sg) != -1)      ospeed = sg.sg_ospeed;    else      ospeed = B9600;  }#else  ospeed = B9600;#endif                          /* !TIOCGETP */  term_cr = tgetstr ("cr", &buffer);  term_clreol = tgetstr ("ce", &buffer);  term_clrpag = tgetstr ("cl", &buffer);  term_goto = tgetstr ("cm", &buffer);  /* Find out about this terminals scrolling capability. */  term_AL = tgetstr ("AL", &buffer);  term_DL = tgetstr ("DL", &buffer);  term_al = tgetstr ("al", &buffer);  term_dl = tgetstr ("dl", &buffer);  terminal_can_scroll = ((term_AL || term_al) && (term_DL || term_dl));  term_invbeg = tgetstr ("mr", &buffer);  if (term_invbeg)    term_invend = tgetstr ("me", &buffer);  else    term_invend = (char *)NULL;  if (!term_cr)    term_cr =  "\r";  terminal_get_screen_size ();  term_up = tgetstr ("up", &buffer);  term_dn = tgetstr ("dn", &buffer);  visible_bell = tgetstr ("vb", &buffer);  terminal_has_visible_bell_p = (visible_bell != (char *)NULL);  audible_bell = tgetstr ("bl", &buffer);  if (!audible_bell)    audible_bell = "\007";  term_begin_use = tgetstr ("ti", &buffer);  term_end_use = tgetstr ("te", &buffer);  term_keypad_on = tgetstr ("ks", &buffer);  term_keypad_off = tgetstr ("ke", &buffer);  /* Check to see if this terminal has a meta key. */  terminal_has_meta_p = (tgetflag ("km") || tgetflag ("MT"));  if (terminal_has_meta_p)    {      term_mm = tgetstr ("mm", &buffer);      term_mo = tgetstr ("mo", &buffer);    }  else    {      term_mm = (char *)NULL;      term_mo = (char *)NULL;    }  /* Attempt to find the arrow keys.  */  term_ku = tgetstr ("ku", &buffer);  term_kd = tgetstr ("kd", &buffer);  term_kr = tgetstr ("kr", &buffer);  term_kl = tgetstr ("kl", &buffer);  term_kP = tgetstr ("kP", &buffer);  term_kN = tgetstr ("kN", &buffer);  /* If this terminal is not cursor addressable, then it is really dumb. */  if (!term_goto)    terminal_is_dumb_p = 1;}/* **************************************************************** *//*                                                                  *//*               How to Read Characters From the Terminal           *//*                                                                  *//* **************************************************************** */#if defined (TIOCGETC)/* A buffer containing the terminal interrupt characters upon entry   to Info. */struct tchars original_tchars;#endif#if defined (TIOCGLTC)/* A buffer containing the local terminal mode characters upon entry   to Info. */struct ltchars original_ltchars;#endif#if defined (HAVE_TERMIOS_H)struct termios original_termios, ttybuff;#else#  if defined (HAVE_TERMIO_H)/* A buffer containing the terminal mode flags upon entry to info. */struct termio original_termio, ttybuff;#  else /* !HAVE_TERMIO_H *//* Buffers containing the terminal mode flags upon entry to info. */int original_tty_flags = 0;int original_lmode;struct sgttyb ttybuff;#  endif /* !HAVE_TERMIO_H */#endif /* !HAVE_TERMIOS_H *//* Prepare to start using the terminal to read characters singly. */voidterminal_prep_terminal (){  int tty;  if (terminal_prep_terminal_hook)    {      (*terminal_prep_terminal_hook) ();      return;    }  terminal_begin_using_terminal ();  tty = fileno (stdin);#if defined (HAVE_TERMIOS_H)  tcgetattr (tty, &original_termios);  tcgetattr (tty, &ttybuff);#else#  if defined (HAVE_TERMIO_H)  ioctl (tty, TCGETA, &original_termio);  ioctl (tty, TCGETA, &ttybuff);#  endif#endif#if defined (HAVE_TERMIOS_H) || defined (HAVE_TERMIO_H)  ttybuff.c_iflag &= (~ISTRIP & ~INLCR & ~IGNCR & ~ICRNL & ~IXON);/* These output flags are not part of POSIX, so only use them if they   are defined.  */#ifdef ONLCR  ttybuff.c_oflag &= ~ONLCR ;#endif#ifdef OCRNL  ttybuff.c_oflag &= ~OCRNL;#endif  ttybuff.c_lflag &= (~ICANON & ~ECHO);  ttybuff.c_cc[VMIN] = 1;  ttybuff.c_cc[VTIME] = 0;  if (ttybuff.c_cc[VINTR] == '\177')    ttybuff.c_cc[VINTR] = -1;  if (ttybuff.c_cc[VQUIT] == '\177')    ttybuff.c_cc[VQUIT] = -1;#ifdef VLNEXT  if (ttybuff.c_cc[VLNEXT] == '\026')    ttybuff.c_cc[VLNEXT] = -1;#endif /* VLNEXT */#endif /* TERMIOS or TERMIO */#if defined (HAVE_TERMIOS_H)  tcsetattr (tty, TCSANOW, &ttybuff);#else#  if defined (HAVE_TERMIO_H)  ioctl (tty, TCSETA, &ttybuff);#  endif#endif#if !defined (HAVE_TERMIOS_H) && !defined (HAVE_TERMIO_H)  ioctl (tty, TIOCGETP, &ttybuff);  if (!original_tty_flags)    original_tty_flags = ttybuff.sg_flags;  /* Make this terminal pass 8 bits around while we are using it. */#  if defined (PASS8)  ttybuff.sg_flags |= PASS8;#  endif /* PASS8 */#  if defined (TIOCLGET) && defined (LPASS8)  {    int flags;    ioctl (tty, TIOCLGET, &flags);    original_lmode = flags;    flags |= LPASS8;    ioctl (tty, TIOCLSET, &flags);  }#  endif /* TIOCLGET && LPASS8 */#  if defined (TIOCGETC)  {    struct tchars temp;    ioctl (tty, TIOCGETC, &original_tchars);    temp = original_tchars;    /* C-s and C-q. */    temp.t_startc = temp.t_stopc = -1;    /* Often set to C-d. */    temp.t_eofc = -1;    /* If the a quit or interrupt character conflicts with one of our       commands, then make it go away. */    if (temp.t_intrc == '\177')      temp.t_intrc = -1;    if (temp.t_quitc == '\177')      temp.t_quitc = -1;    ioctl (tty, TIOCSETC, &temp);  }#  endif /* TIOCGETC */#  if defined (TIOCGLTC)  {    struct ltchars temp;    ioctl (tty, TIOCGLTC, &original_ltchars);    temp = original_ltchars;    /* Make the interrupt keys go away.  Just enough to make people happy. */    temp.t_lnextc = -1;         /* C-v. */    temp.t_dsuspc = -1;         /* C-y. */    temp.t_flushc = -1;         /* C-o. */    ioctl (tty, TIOCSLTC, &temp);  }#  endif /* TIOCGLTC */  ttybuff.sg_flags &= ~ECHO;  ttybuff.sg_flags |= CBREAK;  ioctl (tty, TIOCSETN, &ttybuff);#endif /* !HAVE_TERMIOS_H && !HAVE_TERMIO_H */}/* Restore the tty settings back to what they were before we started using   this terminal. */voidterminal_unprep_terminal (){  int tty;  if (terminal_unprep_terminal_hook)    {      (*terminal_unprep_terminal_hook) ();      return;    }  tty = fileno (stdin);#if defined (HAVE_TERMIOS_H)  tcsetattr (tty, TCSANOW, &original_termios);#else#  if defined (HAVE_TERMIO_H)  ioctl (tty, TCSETA, &original_termio);#  else /* !HAVE_TERMIO_H */  ioctl (tty, TIOCGETP, &ttybuff);  ttybuff.sg_flags = original_tty_flags;  ioctl (tty, TIOCSETN, &ttybuff);#  if defined (TIOCGETC)  ioctl (tty, TIOCSETC, &original_tchars);#  endif /* TIOCGETC */#  if defined (TIOCGLTC)  ioctl (tty, TIOCSLTC, &original_ltchars);#  endif /* TIOCGLTC */#  if defined (TIOCLGET) && defined (LPASS8)  ioctl (tty, TIOCLSET, &original_lmode);#  endif /* TIOCLGET && LPASS8 */#  endif /* !HAVE_TERMIO_H */#endif /* !HAVE_TERMIOS_H */  terminal_end_using_terminal ();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -