📄 lib_setup.c
字号:
* real terminfo database and use that. */ status = _nc_read_termcap_entry(tn, tp);#endif /* PURE_TERMINFO */ }#else status = _nc_read_termcap_entry(tn, tp);#endif /* * If we have an entry, force all of the cancelled strings to null * pointers so we don't have to test them in the rest of the library. * (The terminfo compiler bypasses this logic, since it must know if * a string is cancelled, for merging entries). */ if (status == 1) { unsigned n; for_each_boolean(n, tp) { if (!VALID_BOOLEAN(tp->Booleans[n])) tp->Booleans[n] = FALSE; } for_each_string(n, tp) { if (tp->Strings[n] == CANCELLED_STRING) tp->Strings[n] = ABSENT_STRING; } } return (status);}#endif/*** do_prototype()**** Take the real command character out of the CC environment variable** and substitute it in for the prototype given in 'command_character'.***/static voiddo_prototype(void){ int i; char CC; char proto; char *tmp; tmp = getenv("CC"); CC = *tmp; proto = *command_character; for_each_string(i, &(cur_term->type)) { for (tmp = cur_term->type.Strings[i]; *tmp; tmp++) { if (*tmp == proto) *tmp = CC; } }}/* * Find the locale which is in effect. */NCURSES_EXPORT(char *)_nc_get_locale(void){ char *env;#if HAVE_LOCALE_H /* * This is preferable to using getenv() since it ensures that we are using * the locale which was actually initialized by the application. */ env = setlocale(LC_CTYPE, 0);#else if (((env = getenv("LC_ALL")) != 0 && *env != '\0') || ((env = getenv("LC_CTYPE")) != 0 && *env != '\0') || ((env = getenv("LANG")) != 0 && *env != '\0')) { ; }#endif T(("_nc_get_locale %s", _nc_visbuf(env))); return env;}/* * Check if we are running in a UTF-8 locale. */NCURSES_EXPORT(int)_nc_unicode_locale(void){ int result = 0;#if HAVE_LANGINFO_CODESET char *env = nl_langinfo(CODESET); result = !strcmp(env, "UTF-8"); T(("_nc_unicode_locale(%s) ->%d", env, result));#else char *env = _nc_get_locale(); if (env != 0) { if (strstr(env, ".UTF-8") != 0) { result = 1; T(("_nc_unicode_locale(%s) ->%d", env, result)); } }#endif return result;}#define CONTROL_N(s) ((s) != 0 && strstr(s, "\016") != 0)#define CONTROL_O(s) ((s) != 0 && strstr(s, "\017") != 0)/* * Check for known broken cases where a UTF-8 locale breaks the alternate * character set. */NCURSES_EXPORT(int)_nc_locale_breaks_acs(void){ char *env; if ((env = getenv("NCURSES_NO_UTF8_ACS")) != 0) { return atoi(env); } else if ((env = getenv("TERM")) != 0) { if (strstr(env, "linux")) return 1; /* always broken */ if (strstr(env, "screen") != 0 && ((env = getenv("TERMCAP")) != 0 && strstr(env, "screen") != 0) && strstr(env, "hhII00") != 0) { if (CONTROL_N(enter_alt_charset_mode) || CONTROL_O(enter_alt_charset_mode) || CONTROL_N(set_attributes) || CONTROL_O(set_attributes)) return 1; } } return 0;}/* * This entrypoint is called from tgetent() to allow special a case of reusing * the same TERMINAL data (see comment). */NCURSES_EXPORT(int)_nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse){ int status; START_TRACE(); T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret)); if (tname == 0) { tname = getenv("TERM"); if (tname == 0 || *tname == '\0') { ret_error0(-1, "TERM environment variable not set.\n"); } } if (strlen(tname) > MAX_NAME_SIZE) { ret_error(-1, "TERM environment must be <= %d characters.\n", MAX_NAME_SIZE); } T(("your terminal name is %s", tname)); /* * Allow output redirection. This is what SVr3 does. If stdout is * directed to a file, screen updates go to standard error. */ if (Filedes == STDOUT_FILENO && !isatty(Filedes)) Filedes = STDERR_FILENO; /* * Check if we have already initialized to use this terminal. If so, we * do not need to re-read the terminfo entry, or obtain TTY settings. * * This is an improvement on SVr4 curses. If an application mixes curses * and termcap calls, it may call both initscr and tgetent. This is not * really a good thing to do, but can happen if someone tries using ncurses * with the readline library. The problem we are fixing is that when * tgetent calls setupterm, the resulting Ottyb struct in cur_term is * zeroed. A subsequent call to endwin uses the zeroed terminal settings * rather than the ones saved in initscr. So we check if cur_term appears * to contain terminal settings for the same output file as our current * call - and copy those terminal settings. (SVr4 curses does not do this, * however applications that are working around the problem will still work * properly with this feature). */ if (reuse && cur_term != 0 && cur_term->Filedes == Filedes && cur_term->_termname != 0 && !strcmp(cur_term->_termname, tname) && _nc_name_match(cur_term->type.term_names, tname, "|")) { T(("reusing existing terminal information and mode-settings")); } else { TERMINAL *term_ptr; term_ptr = typeCalloc(TERMINAL, 1); if (term_ptr == 0) { ret_error0(-1, "Not enough memory to create terminal structure.\n"); }#if USE_DATABASE || USE_TERMCAP status = grab_entry(tname, &term_ptr->type);#else status = 0;#endif /* try fallback list if entry on disk */ if (status != 1) { const TERMTYPE *fallback = _nc_fallback(tname); if (fallback) { term_ptr->type = *fallback; status = 1; } } if (status <= 0) { del_curterm(term_ptr); if (status == -1) { ret_error0(-1, "terminals database is inaccessible\n"); } else if (status == 0) { ret_error(0, "'%s': unknown terminal type.\n", tname); } } set_curterm(term_ptr); if (command_character && getenv("CC")) do_prototype(); strncpy(ttytype, cur_term->type.term_names, NAMESIZE - 1); ttytype[NAMESIZE - 1] = '\0'; cur_term->Filedes = Filedes; cur_term->_termname = strdup(tname); /* * If an application calls setupterm() rather than initscr() or * newterm(), we will not have the def_prog_mode() call in * _nc_setupscreen(). Do it now anyway, so we can initialize the * baudrate. */ if (isatty(Filedes)) { def_prog_mode(); baudrate(); } } /* * We should always check the screensize, just in case. */ _nc_get_screensize(&LINES, &COLS); if (errret) *errret = 1; T((T_CREATE("screen %s %dx%d"), tname, LINES, COLS)); if (generic_type) { ret_error(0, "'%s': I need something more specific.\n", tname); } if (hard_copy) { ret_error(1, "'%s': I can't handle hardcopy terminals.\n", tname); } returnCode(OK);}/* * setupterm(termname, Filedes, errret) * * Find and read the appropriate object file for the terminal * Make cur_term point to the structure. * */NCURSES_EXPORT(int)setupterm(NCURSES_CONST char *tname, int Filedes, int *errret){ return _nc_setupterm(tname, Filedes, errret, FALSE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -