📄 lyoptions.c
字号:
#include "HTUtils.h"#include "tcp.h"#include "HTFTP.h"#include "HTML.h"#include "LYCurses.h"#include "LYUtils.h"#include "LYStrings.h"#include "LYGlobalDefs.h"#include "LYOptions.h"#include "LYSignal.h"#include "LYClean.h"#include "LYCharSets.h"#include "LYCharUtils.h"#include "UCMap.h"#include "UCAux.h"#include "LYKeymap.h"#include "LYrcFile.h"#include "HTAlert.h"#include "LYBookmark.h"#include "GridText.h"#include "LYLeaks.h"#define FREE(x) if (x) {free(x); x = NULL;}#ifdef VMS#define DISPLAY "DECW$DISPLAY"#else#define DISPLAY "DISPLAY"#endif /* VMS */#define COL_OPTION_VALUES 36 /* display column where option values start */BOOLEAN term_options;PRIVATE void terminate_options PARAMS((int sig));PRIVATE int boolean_choice PARAMS(( int status, int line, int column, char ** choices));PRIVATE int popup_choice PARAMS(( int cur_choice, int line, int column, char ** choices, int i_length, int disabled));#define MAXCHOICES 10#define L_Bool_A (use_assume_charset ? L_BOOL_A + 1 : L_BOOL_A)#define L_Bool_B (use_assume_charset ? L_BOOL_B + 1 : L_BOOL_B)#define L_Exec (use_assume_charset ? L_EXEC + 1 : L_EXEC)#define L_Rawmode (use_assume_charset ? L_RAWMODE + 1 : L_RAWMODE)#define L_Charset (use_assume_charset ? L_CHARSET + 1 : L_CHARSET)#define L_Color (use_assume_charset ? L_COLOR + 1 : L_COLOR)#define L_Keypad (use_assume_charset ? L_KEYPAD + 1 : L_KEYPAD)#define L_Lineed (use_assume_charset ? L_LINEED + 1 : L_LINEED)#define L_Dired (use_assume_charset ? L_DIRED + 1 : L_DIRED)#define L_User_Mode (use_assume_charset ? L_USER_MODE + 1 : L_USER_MODE)#define L_User_Agent (use_assume_charset ? L_USER_AGENT + 1 : L_USER_AGENT)PRIVATE void option_statusline ARGS1( CONST char *, text){ /* * Make sure we have a pointer to a string. */ if (text == NULL) return; /* * Don't print statusline messages if dumping to stdout. */ if (dump_output_immediately) return; /* * Use _statusline() set to output on the bottom line. - FM */ LYStatusLine = (LYlines - 1); _statusline(text); LYStatusLine = -1;}PRIVATE void option_user_message ARGS2( CONST char *, message, char *, argument){ /* * Make sure we have a pointer to a string. */ if (message == NULL || argument == NULL) return; /* * Don't print statusline messages if dumping to stdout. */ if (dump_output_immediately) return; /* * Use _user_message() set to output on the bottom line. */ LYStatusLine = (LYlines - 1); _user_message(message, argument); LYStatusLine = -1;}PUBLIC void options NOARGS{#ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS int itmp;#endif /* ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS */ int response, ch; /* * If the user changes the display we need memory to put it in. */ char display_option[256];#ifndef VMS static char putenv_command[142];#endif /* !VMS */ char *choices[MAXCHOICES]; int CurrentCharSet = current_char_set; int CurrentShowColor = LYShowColor; int CurrentAssumeCharSet = UCLYhndl_for_unspec; BOOLEAN CurrentRawMode = LYRawMode; BOOLEAN AddValueAccepted = FALSE; char *cp = NULL; BOOL use_assume_charset, old_use_assume_charset;#ifdef DIRED_SUPPORT#ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS if (LYlines < 24) { HTAlert(OPTION_SCREEN_NEEDS_24); return; }#else if (LYlines < 23) { HTAlert(OPTION_SCREEN_NEEDS_23); return; }#endif /* ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS */#else#ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS if (LYlines < 23) { HTAlert( "Screen height must be at least 23 lines for the Options menu!"); return; }#else if (LYlines < 22) { HTAlert(OPTION_SCREEN_NEEDS_22); return; }#endif /* ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS */#endif /* DIRED_SUPPORT */ term_options = FALSE; signal(SIGINT, terminate_options); if (no_option_save) { if (LYShowColor == SHOW_COLOR_NEVER) { LYShowColor = SHOW_COLOR_OFF; } else if (LYShowColor == SHOW_COLOR_ALWAYS) { LYShowColor = SHOW_COLOR_ON; }#if defined(USE_SLANG) || defined(COLOR_CURSES) } else { if (LYChosenShowColor == SHOW_COLOR_UNKNOWN) { switch (LYrcShowColor) { case SHOW_COLOR_NEVER: LYChosenShowColor = (LYShowColor >= SHOW_COLOR_ON) ? SHOW_COLOR_ON : SHOW_COLOR_NEVER; break; case SHOW_COLOR_ALWAYS:#if defined(COLOR_CURSES) if (!has_colors()) LYChosenShowColor = SHOW_COLOR_ALWAYS; else#endif LYChosenShowColor = (LYShowColor >= SHOW_COLOR_ON) ? SHOW_COLOR_ALWAYS : SHOW_COLOR_OFF; break; default: LYChosenShowColor = (LYShowColor >= SHOW_COLOR_ON) ? SHOW_COLOR_ON : SHOW_COLOR_OFF; } }#endif /* USE_SLANG || COLOR_CURSES */ } old_use_assume_charset = use_assume_charset = (user_mode == ADVANCED_MODE);draw_options: old_use_assume_charset = use_assume_charset; /* * NOTE that printw() should be avoided for strings that * might have non-ASCII or multibyte/CJK characters. - FM */ response = 0;#if defined(FANCY_CURSES) || defined (USE_SLANG) if (enable_scrollback) { clear(); } else { erase(); }#else clear();#endif /* FANCY_CURSES || USE_SLANG */ move(0, 5); lynx_start_h1_color (); addstr(" Options Menu ("); addstr(LYNX_NAME); addstr(" Version "); addstr(LYNX_VERSION); addch(')'); lynx_stop_h1_color (); move(L_EDITOR, 5); addstr("E)ditor : "); addstr((editor && *editor) ? editor : "NONE"); move(L_DISPLAY, 5); addstr("D)ISPLAY variable : "); addstr((display && *display) ? display : "NONE"); move(L_HOME, 5); addstr("mu(L)ti-bookmarks: "); addstr((LYMultiBookmarks ? (LYMBMAdvanced ? "ADVANCED" : "STANDARD") : "OFF ")); move(L_HOME, B_BOOK); if (LYMultiBookmarks) { addstr("review/edit B)ookmarks files"); } else { addstr("B)ookmark file: "); addstr((bookmark_page && *bookmark_page) ? bookmark_page : "NONE"); } move(L_FTPSTYPE, 5); addstr("F)TP sort criteria : "); addstr((HTfileSortMethod == FILE_BY_NAME ? "By Filename" : (HTfileSortMethod == FILE_BY_SIZE ? "By Size " : (HTfileSortMethod == FILE_BY_TYPE ? "By Type " : "By Date ")))); move(L_MAIL_ADDRESS, 5); addstr("P)ersonal mail address : "); addstr((personal_mail_address && *personal_mail_address) ? personal_mail_address : "NONE"); move(L_SSEARCH, 5); addstr("S)earching type : "); addstr(case_sensitive ? "CASE SENSITIVE " : "CASE INSENSITIVE"); move(L_Charset, 5); addstr("display (C)haracter set : "); addstr((char *)LYchar_set_names[current_char_set]); move(L_LANGUAGE, 5); addstr("preferred document lan(G)uage: "); addstr((language && *language) ? language : "NONE"); move(L_PREF_CHARSET, 5); addstr("preferred document c(H)arset : "); addstr((pref_charset && *pref_charset) ? pref_charset : "NONE"); if (use_assume_charset) { move(L_ASSUME_CHARSET, 5); addstr("^A)ssume charset if unknown : "); if (UCAssume_MIMEcharset) addstr(UCAssume_MIMEcharset); else addstr((UCLYhndl_for_unspec >= 0) ? (char *)LYCharSet_UC[UCLYhndl_for_unspec].MIMEname : "NONE"); } move(L_Rawmode, 5); addstr("Raw 8-bit or CJK m(O)de : "); addstr(LYRawMode ? "ON " : "OFF");#if defined(USE_SLANG) || defined(COLOR_CURSES) move(L_Color, B_COLOR); addstr("show color (&) : "); if (no_option_save) { addstr((LYShowColor == SHOW_COLOR_OFF ? "OFF" : "ON ")); } else { switch (LYChosenShowColor) { case SHOW_COLOR_NEVER: addstr("NEVER "); break; case SHOW_COLOR_OFF: addstr("OFF"); break; case SHOW_COLOR_ON: addstr("ON "); break; case SHOW_COLOR_ALWAYS:#if defined(COLOR_CURSES) if (!has_colors()) addstr("Always try"); else#endif addstr("ALWAYS "); } }#endif /* USE_SLANG || COLOR_CURSES */ move(L_Bool_A, B_VIKEYS); addstr("V)I keys: "); addstr(vi_keys ? "ON " : "OFF"); move(L_Bool_A, B_EMACSKEYS); addstr("e(M)acs keys: "); addstr(emacs_keys ? "ON " : "OFF"); move(L_Bool_A, B_SHOW_DOTFILES); addstr("sho(W) dot files: "); addstr((!no_dotfiles && show_dotfiles) ? "ON " : "OFF"); move(L_Bool_B, B_SELECT_POPUPS); addstr("popups for selec(T) fields : "); addstr(LYSelectPopups ? "ON " : "OFF"); move(L_Bool_B, B_SHOW_CURSOR); addstr("show cursor (@) : "); addstr(LYShowCursor ? "ON " : "OFF"); move(L_Keypad, 5); addstr("K)eypad mode : "); addstr((keypad_mode == NUMBERS_AS_ARROWS) ? "Numbers act as arrows " : ((keypad_mode == LINKS_ARE_NUMBERED) ? "Links are numbered " : "Links and form fields are numbered")); move(L_Lineed, 5); addstr("li(N)e edit style : "); addstr(LYLineeditNames[current_lineedit]);#ifdef DIRED_SUPPORT move(L_Dired, 5); addstr("l(I)st directory style : "); addstr((dir_list_style == FILES_FIRST) ? "Files first " : ((dir_list_style == MIXED_STYLE) ? "Mixed style " : "Directories first"));#endif /* DIRED_SUPPORT */ move(L_User_Mode, 5); addstr("U)ser mode : "); addstr( (user_mode == NOVICE_MODE) ? "Novice " : ((user_mode == INTERMEDIATE_MODE) ? "Intermediate" : "Advanced ")); move(L_User_Agent, 5); addstr("user (A)gent : "); addstr((LYUserAgent && *LYUserAgent) ? LYUserAgent : "NONE");#ifdef ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS move(L_Exec, 5); addstr("local e(X)ecution links : ");#ifndef NEVER_ALLOW_REMOTE_EXEC addstr( local_exec ? "ALWAYS ON " : (local_exec_on_local_files ? "FOR LOCAL FILES ONLY" : "ALWAYS OFF "));#else addstr(local_exec_on_local_files ? "FOR LOCAL FILES ONLY" : "ALWAYS OFF ");#endif /* !NEVER_ALLOW_REMOTE_EXEC */#endif /* ALLOW_USERS_TO_CHANGE_EXEC_WITHIN_OPTIONS */ move(LYlines-3, 2); addstr(SELECT_SEGMENT); start_bold(); addstr(CAP_LETT_SEGMENT); stop_bold(); addstr(OF_OPT_LINE_SEGMENT); if (!no_option_save) { addstr(" '"); start_bold(); addstr(">"); stop_bold(); addstr("'"); addstr(TO_SAVE_SEGMENT); } addstr(OR_SEGMENT); addstr("'"); start_bold(); addstr("r"); stop_bold(); addstr("'"); addstr(TO_RETURN_SEGMENT); while (TOUPPER(response) != 'R' && !LYisNonAlnumKeyname(response, LYK_PREV_DOC) && response != '>' && !term_options && response != 7 && response != 3) { if (AddValueAccepted == TRUE) { option_statusline(VALUE_ACCEPTED); AddValueAccepted = FALSE; } move((LYlines - 2), 0); lynx_start_prompt_color (); addstr(COMMAND_PROMPT); lynx_stop_prompt_color (); refresh(); response = LYgetch(); if (term_options || response == 7 || response == 3) response = 'R'; if (LYisNonAlnumKeyname(response, LYK_REFRESH)) { lynx_force_repaint(); goto draw_options; } switch (response) { case 'e': /* Change the editor. */ case 'E': if (no_editor) { option_statusline(EDIT_DISABLED); } else if (system_editor ) { option_statusline(EDITOR_LOCKED); } else { if (editor && *editor) strcpy(display_option, editor); else { /* clear the NONE */ move(L_EDITOR, COL_OPTION_VALUES); addstr(" "); *display_option = '\0'; } option_statusline(ACCEPT_DATA); move(L_EDITOR, COL_OPTION_VALUES); start_bold(); ch = LYgetstr(display_option, VISIBLE, sizeof(display_option), NORECALL); stop_bold(); move(L_EDITOR, COL_OPTION_VALUES); if (term_options || ch == -1) { addstr((editor && *editor) ? editor : "NONE"); } else if (*display_option == '\0') { FREE(editor); addstr("NONE"); } else { StrAllocCopy(editor, display_option); addstr(display_option); } clrtoeol(); if (ch == -1) { option_statusline(CANCELLED); sleep(InfoSecs); option_statusline(""); } else { option_statusline(VALUE_ACCEPTED); } } response = ' '; break; case 'd': /* Change the display. */ case 'D': if (display && *display) { strcpy(display_option, display); } else { /* clear the NONE */ move(L_DISPLAY, COL_OPTION_VALUES); addstr(" "); *display_option = '\0'; } option_statusline(ACCEPT_DATA); move(L_DISPLAY, COL_OPTION_VALUES); start_bold(); ch = LYgetstr(display_option, VISIBLE, sizeof(display_option), NORECALL); stop_bold(); move(L_DISPLAY, COL_OPTION_VALUES); if ((term_options || ch == -1) || (display != NULL &&#ifdef VMS !strcasecomp(display, display_option)))#else !strcmp(display, display_option)))#endif /* VMS */ { /* * Cancelled, or a non-NULL display string * wasn't changed. - FM */ addstr((display && *display) ? display : "NONE"); clrtoeol(); if (ch == -1) { option_statusline(CANCELLED); sleep(InfoSecs); option_statusline(""); } else { option_statusline(VALUE_ACCEPTED); } response = ' '; break; } else if (*display_option == '\0') { if ((display == NULL) || (display != NULL && *display == '\0')) { /* * NULL or zero-length display string * wasn't changed. - FM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -