📄 rxvtlib_main.c
字号:
if (init && o->rs[Rs_boldFont] != NULL) boldFont = XLoadQueryFont (o->Xdisplay, o->rs[Rs_boldFont]);#endif#ifdef MULTICHAR_SET if (o->TermWin.mfont) { XFreeFont (o->Xdisplay, o->TermWin.mfont); o->TermWin.mfont = 0; }/* load font or substitute */ xfont = XLoadQueryFont (o->Xdisplay, o->rs[Rs_mfont + idx]); if (!xfont) { print_error (msg, o->rs[Rs_mfont + idx]);#ifdef ZHCN o->rs[Rs_mfont + idx] = "-*-16-*-gb2312*-*";#else o->rs[Rs_mfont + idx] = "k14";#endif xfont = XLoadQueryFont (o->Xdisplay, o->rs[Rs_mfont + idx]); if (!xfont) { print_error (msg, o->rs[Rs_mfont + idx]); goto Abort; } } o->TermWin.mfont = xfont;#endif /* MULTICHAR_SET *//* alter existing GC */ if (!init) { XSetFont (o->Xdisplay, o->TermWin.gc, o->TermWin.font->fid); rxvtlib_menubar_expose (o); }/* set the sizes */ { int fh, fw = 0; fw = rxvt_get_fontwidest(o, o->TermWin.font); fh = o->TermWin.font->ascent + o->TermWin.font->descent; if (fw == o->TermWin.font->min_bounds.width) o->TermWin.fprop = 0; /* Mono-spaced (fixed width) font */ else o->TermWin.fprop = 1; /* Proportional font */ recheckfonts = !(fw == o->TermWin.fwidth && fh == o->TermWin.fheight); o->TermWin.fwidth = fw; o->TermWin.fheight = fh; }/* check that size of boldFont is okay */#ifndef NO_BOLDFONT if (recheckfonts) { o->TermWin.boldFont = NULL; if (boldFont != NULL) { int fh, fw; fw = rxvt_get_fontwidest(o, boldFont); fh = boldFont->ascent + boldFont->descent; if (fw <= o->TermWin.fwidth && fh <= o->TermWin.fheight) o->TermWin.boldFont = boldFont; o->TermWin.bprop = !(fw == o->TermWin.fwidth /* && fh == TermWin.fheight */ ); } }#endif /* NO_BOLDFONT */#ifdef MULTICHAR_SET if (recheckfonts) /* TODO: XXX: This could be much better? */ if (o->TermWin.mfont != NULL) { int fh, fw; fw = get_fontwidest(o->TermWin.mfont); fh = o->TermWin.mfont->ascent + o->TermWin.mfont->descent; if (fw <= o->TermWin.fwidth && fh <= o->TermWin.fheight) /* WHAT TO DO!! */ ; o->TermWin.mprop = !(fw == o->TermWin.fwidth /* && fh == TermWin.fheight */ ); }#endif rxvtlib_set_colorfgbg (o); o->TermWin.width = o->TermWin.ncol * o->TermWin.fwidth; o->TermWin.height = o->TermWin.nrow * o->TermWin.fheight; if (!init) { rxvtlib_resize_all_windows (o); rxvtlib_scr_touch (o); } return; Abort: print_error ("aborting"); /* fatal problem */ o->killed = EXIT_FAILURE | DO_EXIT; /* NOTREACHED */}int rxvt_get_fontwidest (rxvtlib *o, XFontStruct * f){ int i, cw, fw = 0; if (f->min_bounds.width == f->max_bounds.width) return f->min_bounds.width; if (f->per_char == NULL) return 0; for (i = f->max_char_or_byte2 - f->min_char_or_byte2; --i >= 0;) { cw = f->per_char[i].width; MAX_IT (fw, cw); } return fw;}/* ------------------------------------------------------------------------- *//* INTPROTO */void rxvtlib_init_vars (rxvtlib *o){ o->Options = Opt_scrollBar | Opt_scrollTtyOutput; o->sb_shadow = 0; o->TermWin.ncol = 80; o->TermWin.nrow = 24; o->TermWin.mapped = 0; o->want_refresh = 1; o->scrollBar.win = 0;#if (MENUBAR_MAX) o->menuBar.win = 0;#endif#if defined (HOTKEY_CTRL) || defined (HOTKEY_META)/* recognized when combined with HOTKEY */ o->ks_bigfont = XK_greater; o->ks_smallfont = XK_less;#endif#ifndef NO_BRIGHTCOLOR o->colorfgbg = DEFAULT_RSTYLE;#endif#ifndef NO_NEW_SELECTION o->selection_style = NEW_SELECT;#else o->selection_style = OLD_SELECT;#endif}extern Display *CDisplay;/* ------------------------------------------------------------------------- *//* INTPROTO */const char **rxvtlib_init_resources (rxvtlib *o, int argc, const char *const *argv){ int i, r_argc; char *val; const char *tmp; const char **cmd_argv, **r_argv;/* * Look for -exec option. Find => split and make cmd_argv[] of command args */ for (r_argc = 0; r_argc < argc; r_argc++) if (!strcmp (argv[r_argc], "-e") || !strcmp (argv[r_argc], "-exec")) break; r_argv = (const char **)MALLOC (sizeof (char *) * (r_argc + 1)); for (i = 0; i < r_argc; i++) r_argv[i] = (const char *)argv[i]; r_argv[i] = NULL; if (r_argc == argc) cmd_argv = NULL; else { cmd_argv = (const char **)MALLOC (sizeof (char *) * (argc - r_argc)); for (i = 0; i < argc - r_argc - 1; i++) cmd_argv[i] = (const char *)argv[i + r_argc + 1]; cmd_argv[i] = NULL; }/* clear all resources */ for (i = 0; i < TOTAL_RS; i++) o->rs[i] = NULL; o->rs[Rs_name] = my_basename (argv[0]); if (cmd_argv != NULL && cmd_argv[0] != NULL) o->rs[Rs_iconName] = o->rs[Rs_title] = my_basename (cmd_argv[0]);/* * Open display, get options/resources and create the window */ if ((o->rs[Rs_display_name] = getenv ("DISPLAY")) == NULL) o->rs[Rs_display_name] = ":0";#ifdef LOCAL_X_IS_UNIX if (strncmp (o->rs[Rs_display_name], ":0", 2) == 0) o->rs[Rs_display_name] = "unix:0";#endif rxvtlib_get_options (o, r_argc, r_argv); if (o->killed) return 0; FREE (r_argv);#ifdef STANDALONE if ((o->Xdisplay = XOpenDisplay (o->rs[Rs_display_name])) == NULL) { print_error ("can't open display %s", o->rs[Rs_display_name]); o->killed = EXIT_FAILURE | DO_EXIT; return 0; }#else o->Xdisplay = CDisplay; /* FIXME: not generic */#endif#ifdef INEXPENSIVE_LOCAL_X_CALLS /* it's hard to determine further if we're on a local display or not */ o->display_is_local = o->rs[Rs_display_name][0] == ':' ? 1 : 0;#endif rxvtlib_extract_resources (o, o->Xdisplay, o->rs[Rs_name]);#if ! defined(XTERM_SCROLLBAR) && ! defined(NEXT_SCROLLBAR) if (!(o->Options & Opt_scrollBar_floating)) o->sb_shadow = SHADOW;#endif/* * set any defaults not already set */ if (!o->rs[Rs_title]) o->rs[Rs_title] = o->rs[Rs_name]; if (!o->rs[Rs_iconName]) o->rs[Rs_iconName] = o->rs[Rs_title]; if (!o->rs[Rs_saveLines] || (o->TermWin.saveLines = atoi (o->rs[Rs_saveLines])) < 0) o->TermWin.saveLines = SAVELINES;/* no point having a scrollbar without having any scrollback! */ if (!o->TermWin.saveLines) o->Options &= ~Opt_scrollBar;#ifdef PRINTPIPE if (!o->rs[Rs_print_pipe]) o->rs[Rs_print_pipe] = PRINTPIPE;#endif if (!o->rs[Rs_cutchars]) o->rs[Rs_cutchars] = CUTCHARS;#ifndef NO_BACKSPACE_KEY if (!o->rs[Rs_backspace_key])# ifdef DEFAULT_BACKSPACE o->key_backspace = DEFAULT_BACKSPACE;# else o->key_backspace = "DEC"; /* can toggle between \033 or \177 */# endif else { val = (char *) strdup (o->rs[Rs_backspace_key]); (void)Str_escaped (val); o->key_backspace = val; }#endif#ifndef NO_DELETE_KEY if (!o->rs[Rs_delete_key])# ifdef DEFAULT_DELETE o->key_delete = DEFAULT_DELETE;# else o->key_delete = "\033[3~";# endif else { val = (char *) strdup (o->rs[Rs_delete_key]); (void)Str_escaped (val); o->key_delete = val; }#endif if (o->rs[Rs_selectstyle]) { if (strncasecmp (o->rs[Rs_selectstyle], "oldword", 7) == 0) o->selection_style = OLD_WORD_SELECT;#ifndef NO_OLD_SELECTION else if (strncasecmp (o->rs[Rs_selectstyle], "old", 3) == 0) o->selection_style = OLD_SELECT;#endif }#ifndef NO_BOLDFONT if (o->rs[Rs_font] == NULL && o->rs[Rs_boldFont] != NULL) { o->rs[Rs_font] = o->rs[Rs_boldFont]; o->rs[Rs_boldFont] = NULL; }#endif for (i = 0; i < NFONTS; i++) { if (!o->rs[Rs_font + i]) o->rs[Rs_font + i] = o->def_fontName[i];#ifdef MULTICHAR_SET if (!o->rs[Rs_mfont + i]) o->rs[Rs_mfont + i] = o->def_mfontName[i];#endif } o->TermWin.fontset = NULL;#ifdef XTERM_REVERSE_VIDEO/* this is how xterm implements reverseVideo */ if (o->Options & Opt_reverseVideo) { if (!o->rs[Rs_color + Color_fg]) o->rs[Rs_color + Color_fg] = o->def_colorName[Color_bg]; if (!o->rs[Rs_color + Color_bg]) o->rs[Rs_color + Color_bg] = o->def_colorName[Color_fg]; }#endif for (i = 0; i < NRS_COLORS; i++) if (!o->rs[Rs_color + i]) o->rs[Rs_color + i] = o->def_colorName[i];#ifndef XTERM_REVERSE_VIDEO/* this is how we implement reverseVideo */ if (o->Options & Opt_reverseVideo) SWAP_IT (o->rs[Rs_color + Color_fg], o->rs[Rs_color + Color_bg], tmp);#endif/* convenient aliases for setting fg/bg to colors */ rxvtlib_color_aliases (o, Color_fg); rxvtlib_color_aliases (o, Color_bg);#ifndef NO_CURSORCOLOR rxvtlib_color_aliases (o, Color_cursor); rxvtlib_color_aliases (o, Color_cursor2);#endif /* NO_CURSORCOLOR */ rxvtlib_color_aliases (o, Color_pointer); rxvtlib_color_aliases (o, Color_border);#ifndef NO_BOLDUNDERLINE rxvtlib_color_aliases (o, Color_BD); rxvtlib_color_aliases (o, Color_UL);#endif /* NO_BOLDUNDERLINE */ return cmd_argv;}/* ------------------------------------------------------------------------- *//* INTPROTO */void rxvtlib_init_env (rxvtlib *o){ char *val;/* these don't need to be static but do so to placate some mem checkers */ static char env_display[100], env_windowid[40], env_term[40];#ifdef DISPLAY_IS_IP/* Fixup display_name for export over pty to any interested terminal * clients via "ESC[7n" (e.g. shells). Note we use the pure IP number * (for the first non-loopback interface) that we get from * network_display(). This is more "name-resolution-portable", if you * will, and probably allows for faster x-client startup if your name * server is beyond a slow link or overloaded at client startup. Of * course that only helps the shell's child processes, not us. * * Giving out the display_name also affords a potential security hole */ o->rs[Rs_display_name] = (const char *)val = network_display (o->rs[Rs_display_name]); if (val == NULL)#endif /* DISPLAY_IS_IP */ val = XDisplayString (o->Xdisplay); if (o->rs[Rs_display_name] == NULL) o->rs[Rs_display_name] = val; /* use broken `:0' value */ sprintf (env_display, "DISPLAY=%.90s", val); sprintf (env_windowid, "WINDOWID=%u", (unsigned int)o->TermWin.parent[0]);/* add entries to the environment: * @ DISPLAY: in case we started with -display * @ WINDOWID: X window id number of the window * @ COLORTERM: terminal sub-name and also indicates its color * @ TERM: terminal name * @ TERMINFO: path to terminfo directory */ putenv (env_display); putenv (env_windowid);#ifdef RXVT_TERMINFO putenv ("TERMINFO=" RXVT_TERMINFO);#endif if (o->Xdepth <= 2) putenv ("COLORTERM=" COLORTERMENV "-mono"); else putenv ("COLORTERM=" COLORTERMENVFULL); if (o->rs[Rs_term_name] != NULL) { sprintf (env_term, "TERM=%.40s", o->rs[Rs_term_name]); putenv (env_term); } else { putenv ("TERM=" TERMENV); }}/* ------------------------------------------------------------------------- *//* main() *//* INTPROTO */int rxvtlib_main (rxvtlib * o, int argc, const char *const *argv, int do_sleep){ const char **cmd_argv;/* * Save and then give up any super-user privileges * If we need privileges in any area then we must specifically request it. * We should only need to be root in these cases: * 1. write utmp entries on some systems * 2. chown tty on some systems */ privileges (SAVE); privileges (IGNORE); rxvtlib_init_vars (o); cmd_argv = rxvtlib_init_resources (o, argc, (const char *const *) argv); if (o->killed) return EXIT_FAILURE;#if (MENUBAR_MAX) rxvtlib_menubar_read (o, o->rs[Rs_menu]);#endif rxvtlib_scrollbar_mapping (o, o->Options & Opt_scrollBar); rxvtlib_Create_Windows (o, argc, (const char *const *) argv); if (o->killed) return EXIT_FAILURE; rxvtlib_init_xlocale (o); rxvtlib_scr_reset (o); /* initialize screen */ rxvtlib_Gr_reset (o); /* reset graphics */#ifdef STANDALONE#ifdef DEBUG_X XSynchronize (o->Xdisplay, True); XSetErrorHandler ((XErrorHandler) abort);#else XSetErrorHandler ((XErrorHandler) xerror_handler);#endif#endif if (scrollbar_visible ()) XMapWindow (o->Xdisplay, o->scrollBar.win);#if (MENUBAR_MAX) if (menubar_visible ()) XMapWindow (o->Xdisplay, o->menuBar.win);#endif#ifdef TRANSPARENT if (o->Options & Opt_transparent) { XSetWindowBackgroundPixmap (o->Xdisplay, o->TermWin.parent[0], ParentRelative); XSetWindowBackgroundPixmap (o->Xdisplay, o->TermWin.vt, ParentRelative); XSelectInput (o->Xdisplay, Xroot, PropertyChangeMask); }#endif XMapWindow (o->Xdisplay, o->TermWin.vt); XMapWindow (o->Xdisplay, o->TermWin.parent[0]); rxvtlib_init_env (o); rxvtlib_init_command (o, cmd_argv, do_sleep); if (o->killed) return EXIT_FAILURE;#ifdef STANDALONE rxvtlib_main_loop (o); /* main processing loop */#endif if (cmd_argv) free (cmd_argv); return EXIT_SUCCESS;}/*----------------------- end-of-file (C source) -----------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -