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

📄 terminal.c

📁 在非GUI环境下
💻 C
📖 第 1 页 / 共 2 页
字号:
/* terminal.c -- controlling the terminal with termcap. *//* Copyright (C) 1996 Free Software Foundation, Inc.   This file is part of the GNU Readline Library, a library for   reading lines of text with interactive input and history editing.   The GNU Readline Library is free software; you can redistribute it   and/or modify it under the terms of the GNU General Public License   as published by the Free Software Foundation; either version 2, or   (at your option) any later version.   The GNU Readline Library is distributed in the hope that it will be   useful, but WITHOUT ANY WARRANTY; without even the implied warranty   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   The GNU General Public License is often shipped with GNU software, and   is generally kept in a file called COPYING or LICENSE.  If you do not   have a copy of the license, write to the Free Software Foundation,   59 Temple Place, Suite 330, Boston, MA 02111 USA. */#define READLINE_LIBRARY#if defined (HAVE_CONFIG_H)#  include <config.h>#endif#include <sys/types.h>#include "posixstat.h"#include <fcntl.h>#if defined (HAVE_SYS_FILE_H)#  include <sys/file.h>#endif /* HAVE_SYS_FILE_H */#if defined (HAVE_UNISTD_H)#  include <unistd.h>#endif /* HAVE_UNISTD_H */#if defined (HAVE_STDLIB_H)#  include <stdlib.h>#else#  include "ansi_stdlib.h"#endif /* HAVE_STDLIB_H */#if defined (HAVE_LOCALE_H)#  include <locale.h>#endif#include <stdio.h>/* System-specific feature definitions and include files. */#include "rldefs.h"#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)#  include <sys/ioctl.h>#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */#include "rltty.h"#include "tcap.h"/* Some standard library routines. */#include "readline.h"#include "history.h"#include "rlprivate.h"#include "rlshell.h"#include "xmalloc.h"#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)/* **************************************************************** *//*								    *//*			Terminal and Termcap			    *//*								    *//* **************************************************************** */static char *term_buffer = (char *)NULL;static char *term_string_buffer = (char *)NULL;static int tcap_initialized;#if !defined (__linux__)#  if defined (__EMX__) || defined (NEED_EXTERN_PC)extern #  endif /* __EMX__ || NEED_EXTERN_PC */char PC, *BC, *UP;#endif /* __linux__ *//* Some strings to control terminal actions.  These are output by tputs (). */char *_rl_term_clreol;char *_rl_term_clrpag;char *_rl_term_cr;char *_rl_term_backspace;char *_rl_term_goto;char *_rl_term_pc;/* Non-zero if we determine that the terminal can do character insertion. */int _rl_terminal_can_insert = 0;/* How to insert characters. */char *_rl_term_im;char *_rl_term_ei;char *_rl_term_ic;char *_rl_term_ip;char *_rl_term_IC;/* How to delete characters. */char *_rl_term_dc;char *_rl_term_DC;#if defined (HACK_TERMCAP_MOTION)char *_rl_term_forward_char;#endif  /* HACK_TERMCAP_MOTION *//* How to go up a line. */char *_rl_term_up;/* A visible bell; char if the terminal can be made to flash the screen. */static char *_rl_visible_bell;/* Non-zero means the terminal can auto-wrap lines. */int _rl_term_autowrap;/* Non-zero means that this terminal has a meta key. */static int term_has_meta;/* The sequences to write to turn on and off the meta key, if this   terminal has one. */static char *_rl_term_mm;static char *_rl_term_mo;/* The key sequences output by the arrow keys, if this terminal has any. */static char *_rl_term_ku;static char *_rl_term_kd;static char *_rl_term_kr;static char *_rl_term_kl;/* How to initialize and reset the arrow keys, if this terminal has any. */static char *_rl_term_ks;static char *_rl_term_ke;/* The key sequences sent by the Home and End keys, if any. */static char *_rl_term_kh;static char *_rl_term_kH;static char *_rl_term_at7;	/* @7 *//* Insert key */static char *_rl_term_kI;/* Cursor control */static char *_rl_term_vs;	/* very visible */static char *_rl_term_ve;	/* normal */static void bind_termcap_arrow_keys PARAMS((Keymap));/* Variables that hold the screen dimensions, used by the display code. */int _rl_screenwidth, _rl_screenheight, _rl_screenchars;/* Non-zero means the user wants to enable the keypad. */int _rl_enable_keypad;/* Non-zero means the user wants to enable a meta key. */int _rl_enable_meta = 1;#if defined (__EMX__)static void_emx_get_screensize (swp, shp)     int *swp, *shp;{  int sz[2];  _scrsize (sz);  if (swp)    *swp = sz[0];  if (shp)    *shp = sz[1];}#endif/* Get readline's idea of the screen size.  TTY is a file descriptor open   to the terminal.  If IGNORE_ENV is true, we do not pay attention to the   values of $LINES and $COLUMNS.  The tests for TERM_STRING_BUFFER being   non-null serve to check whether or not we have initialized termcap. */void_rl_get_screen_size (tty, ignore_env)     int tty, ignore_env;{  char *ss;#if defined (TIOCGWINSZ)  struct winsize window_size;#endif /* TIOCGWINSZ */#if defined (TIOCGWINSZ)  if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)    {      _rl_screenwidth = (int) window_size.ws_col;      _rl_screenheight = (int) window_size.ws_row;    }#endif /* TIOCGWINSZ */#if defined (__EMX__)  _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);#endif  /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV     is unset. */  if (_rl_screenwidth <= 0)    {      if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))	_rl_screenwidth = atoi (ss);#if !defined (__DJGPP__)      if (_rl_screenwidth <= 0 && term_string_buffer)	_rl_screenwidth = tgetnum ("co");#endif    }  /* Environment variable LINES overrides setting of "li" if IGNORE_ENV     is unset. */  if (_rl_screenheight <= 0)    {      if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))	_rl_screenheight = atoi (ss);#if !defined (__DJGPP__)      if (_rl_screenheight <= 0 && term_string_buffer)	_rl_screenheight = tgetnum ("li");#endif    }  /* If all else fails, default to 80x24 terminal. */  if (_rl_screenwidth <= 1)    _rl_screenwidth = 80;  if (_rl_screenheight <= 0)    _rl_screenheight = 24;  /* If we're being compiled as part of bash, set the environment     variables $LINES and $COLUMNS to new values.  Otherwise, just     do a pair of putenv () or setenv () calls. */  sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);  if (_rl_term_autowrap == 0)    _rl_screenwidth--;  _rl_screenchars = _rl_screenwidth * _rl_screenheight;}void_rl_set_screen_size (rows, cols)     int rows, cols;{  if (rows == 0 || cols == 0)    return;  _rl_screenheight = rows;  _rl_screenwidth = cols;  if (_rl_term_autowrap == 0)    _rl_screenwidth--;  _rl_screenchars = _rl_screenwidth * _rl_screenheight;}voidrl_set_screen_size (rows, cols)     int rows, cols;{  _rl_set_screen_size (rows, cols);}voidrl_get_screen_size (rows, cols)     int *rows, *cols;{  if (rows)    *rows = _rl_screenheight;  if (cols)    *cols = _rl_screenwidth;}     voidrl_resize_terminal (){  if (readline_echoing_p)    {      _rl_get_screen_size (fileno (rl_instream), 1);      if (CUSTOM_REDISPLAY_FUNC ())	rl_forced_update_display ();      else	_rl_redisplay_after_sigwinch ();    }}struct _tc_string {     const char *tc_var;     char **tc_value;};/* This should be kept sorted, just in case we decide to change the   search algorithm to something smarter. */static struct _tc_string tc_strings[] ={  { "@7", &_rl_term_at7 },  { "DC", &_rl_term_DC },  { "IC", &_rl_term_IC },  { "ce", &_rl_term_clreol },  { "cl", &_rl_term_clrpag },  { "cr", &_rl_term_cr },  { "dc", &_rl_term_dc },  { "ei", &_rl_term_ei },  { "ic", &_rl_term_ic },  { "im", &_rl_term_im },  { "kH", &_rl_term_kH },	/* home down ?? */  { "kI", &_rl_term_kI },	/* insert */  { "kd", &_rl_term_kd },  { "ke", &_rl_term_ke },	/* end keypad mode */  { "kh", &_rl_term_kh },	/* home */  { "kl", &_rl_term_kl },  { "kr", &_rl_term_kr },  { "ks", &_rl_term_ks },	/* start keypad mode */  { "ku", &_rl_term_ku },  { "le", &_rl_term_backspace },  { "mm", &_rl_term_mm },  { "mo", &_rl_term_mo },#if defined (HACK_TERMCAP_MOTION)  { "nd", &_rl_term_forward_char },#endif

⌨️ 快捷键说明

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