--- rxvt-unicode/src/init.C 2005/11/30 21:05:39 1.121 +++ rxvt-unicode/src/init.C 2006/01/06 02:11:15 1.132 @@ -36,6 +36,8 @@ #include "rxvtutil.h" #include "init.h" +#include + #include const char *const def_colorName[] = @@ -44,7 +46,6 @@ COLOR_BACKGROUND, /* low-intensity colors */ "Black", /* 0: black (#000000) */ -#ifndef NO_BRIGHTCOLOR "Red3", /* 1: red (#CD0000) */ "Green3", /* 2: green (#00CD00) */ "Yellow3", /* 3: yellow (#CDCD00) */ @@ -62,7 +63,6 @@ # else "Grey25", /* 8: bright black (#404040) */ # endif -#endif /* NO_BRIGHTCOLOR */ "Red", /* 1/9: bright red (#FF0000) */ "Green", /* 2/10: bright green (#00FF00) */ "Yellow", /* 3/11: bright yellow (#FFFF00) */ @@ -228,7 +228,7 @@ return false; #if defined(XPM_BACKGROUND) || defined(TRANSPARENT) - TermWin.pixmap = None; + pixmap = None; #endif MEvent.time = CurrentTime; @@ -236,13 +236,13 @@ options = DEFAULT_OPTIONS; want_refresh = 1; priv_modes = SavedModes = PrivMode_Default; - TermWin.focus = 0; - TermWin.ncol = 80; - TermWin.nrow = 24; - TermWin.int_bwidth = INTERNALBORDERWIDTH; - TermWin.ext_bwidth = EXTERNALBORDERWIDTH; - TermWin.lineSpace = LINESPACE; - TermWin.saveLines = SAVELINES; + focus = 0; + ncol = 80; + nrow = 24; + int_bwidth = INTERNALBORDERWIDTH; + ext_bwidth = EXTERNALBORDERWIDTH; + lineSpace = LINESPACE; + saveLines = SAVELINES; numpix_colors = TOTAL_COLORS; refresh_limit = 1; @@ -371,15 +371,17 @@ } if (rs[Rs_saveLines] && (i = atoi (rs[Rs_saveLines])) >= 0) - TermWin.saveLines = BOUND_POSITIVE_INT16 (i); + saveLines = min (i, MAX_SAVELINES); #if ENABLE_FRILLS if (rs[Rs_int_bwidth] && (i = atoi (rs[Rs_int_bwidth])) >= 0) - TermWin.int_bwidth = min (i, 100); /* arbitrary limit */ + int_bwidth = min (i, std::numeric_limits::max ()); + if (rs[Rs_ext_bwidth] && (i = atoi (rs[Rs_ext_bwidth])) >= 0) - TermWin.ext_bwidth = min (i, 100); /* arbitrary limit */ + ext_bwidth = min (i, std::numeric_limits::max ()); + if (rs[Rs_lineSpace] && (i = atoi (rs[Rs_lineSpace])) >= 0) - TermWin.lineSpace = min (i, 100); /* arbitrary limit */ + lineSpace = min (i, std::numeric_limits::max ()); #endif #ifdef POINTER_BLANK @@ -390,8 +392,8 @@ #endif /* no point having a scrollbar without having any scrollback! */ - if (!TermWin.saveLines) - options &= ~Opt_scrollBar; + if (!saveLines) + CLR_OPTION (Opt_scrollBar); #ifdef PRINTPIPE if (!rs[Rs_print_pipe]) @@ -444,7 +446,7 @@ #ifdef XTERM_REVERSE_VIDEO /* this is how xterm implements reverseVideo */ - if (options & Opt_reverseVideo) + if (OPTION (Opt_reverseVideo)) { if (!rs[Rs_color + Color_fg]) rs[Rs_color + Color_fg] = def_colorName[Color_bg]; @@ -459,8 +461,8 @@ #ifndef XTERM_REVERSE_VIDEO /* this is how we implement reverseVideo */ - if (options & Opt_reverseVideo) - SWAP_IT (rs[Rs_color + Color_fg], rs[Rs_color + Color_bg], const char *); + if (OPTION (Opt_reverseVideo)) + ::swap (rs[Rs_color + Color_fg], rs[Rs_color + Color_bg]); #endif /* convenient aliases for setting fg/bg to colors */ @@ -520,14 +522,14 @@ sprintf (env_display, "DISPLAY=%s", val); /* avoiding the math library: - * i = (int) (ceil (log10 ((unsigned int)TermWin.parent[0]))) */ - for (i = 0, u = (unsigned int)TermWin.parent[0]; u; u /= 10, i++) + * i = (int) (ceil (log10 ((unsigned int)parent[0]))) */ + for (i = 0, u = (unsigned int)parent[0]; u; u /= 10, i++) ; - MAX_IT (i, 1); + max_it (i, 1); env_windowid = (char *)rxvt_malloc ((i + 10) * sizeof (char)); sprintf (env_windowid, "WINDOWID=%u", - (unsigned int)TermWin.parent[0]); + (unsigned int)parent[0]); /* add entries to the environment: * @ DISPLAY: in case we started with -display @@ -646,16 +648,16 @@ */ #ifdef META8_OPTION - meta_char = (options & Opt_meta8 ? 0x80 : C0_ESC); + meta_char = OPTION (Opt_meta8) ? 0x80 : C0_ESC; #endif get_ourmods (); - if (!(options & Opt_scrollTtyOutput)) + if (!OPTION (Opt_scrollTtyOutput)) priv_modes |= PrivMode_TtyOutputInh; - if (options & Opt_scrollTtyKeypress) + if (OPTION (Opt_scrollTtyKeypress)) priv_modes |= PrivMode_Keypress; - if (!(options & Opt_jumpScroll)) + if (!OPTION (Opt_jumpScroll)) priv_modes |= PrivMode_smoothScroll; #ifndef NO_BACKSPACE_KEY @@ -676,11 +678,6 @@ SavedModes |= PrivMode_menuBar; } -#ifdef CURSOR_BLINK - if (options & Opt_cursorBlink) - (void)gettimeofday (&lastcursorchange, NULL); -#endif - run_command (argv); } @@ -704,7 +701,7 @@ if (!rXParseAllocColor (&xcol, rs[Rs_color + i])) { #ifndef XTERM_REVERSE_VIDEO - if (i < 2 && (options & Opt_reverseVideo)) + if (i < 2 && OPTION (Opt_reverseVideo)) rs[Rs_color + i] = def_colorName[!i]; else #endif @@ -811,10 +808,8 @@ if (i >= 8 && i <= 15) { /* bright colors */ i -= 8; -#ifndef NO_BRIGHTCOLOR rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i]; return; -#endif } if (i >= 0 && i <= 7) /* normal colors */ @@ -937,14 +932,14 @@ assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); XInternAtoms (disp, (char **)xa_names, NUM_XA, False, xa); - if (options & Opt_transparent) + if (OPTION (Opt_transparent)) { XGetWindowAttributes (disp, RootWindow (disp, display->screen), &gattr); display->depth = gattr.depth; // doh //TODO, per-term not per-display? } #if ENABLE_FRILLS - if (options & Opt_borderLess) + if (OPTION (Opt_borderLess)) { prop = XInternAtom(disp, "_MOTIF_WM_INFO", True); @@ -986,8 +981,8 @@ window_calc (wattr.width, wattr.height); } - #endif + window_calc (0, 0); /* sub-window placement & size in rxvt_resize_subwindows () */ @@ -998,7 +993,7 @@ top = XCreateWindow (disp, parent, szHint.x, szHint.y, szHint.width, szHint.height, - TermWin.ext_bwidth, + ext_bwidth, display->depth, InputOutput, display->visual, CWColormap | CWBackPixel | CWBorderPixel, &attributes); @@ -1006,12 +1001,12 @@ top = XCreateSimpleWindow (disp, parent, szHint.x, szHint.y, szHint.width, szHint.height, - TermWin.ext_bwidth, + ext_bwidth, pix_colors_focused[Color_border], pix_colors_focused[Color_border]); #endif - TermWin.parent[0] = top; + this->parent[0] = top; old_width = szHint.width; old_height = szHint.height; @@ -1024,7 +1019,7 @@ wmHint.flags = InputHint | StateHint | WindowGroupHint; wmHint.input = True; - wmHint.initial_state = options & Opt_iconic ? IconicState : NormalState; + wmHint.initial_state = OPTION (Opt_iconic) ? IconicState : NormalState; wmHint.window_group = top; XmbSetWMProperties (disp, top, NULL, NULL, (char **)argv, argc, @@ -1074,39 +1069,39 @@ #endif /* the vt window */ - TermWin.vt = XCreateSimpleWindow (disp, top, + vt = XCreateSimpleWindow (disp, top, window_vt_x, window_vt_y, - TermWin_TotalWidth (), - TermWin_TotalHeight (), + width, + height, 0, pix_colors_focused[Color_fg], pix_colors_focused[Color_bg]); #ifdef DEBUG_X - XStoreName (disp, TermWin.vt, "vt window"); + XStoreName (disp, vt, "vt window"); #endif attributes.bit_gravity = NorthWestGravity; - XChangeWindowAttributes (disp, TermWin.vt, CWBitGravity, &attributes); + XChangeWindowAttributes (disp, vt, CWBitGravity, &attributes); vt_emask = ExposureMask | ButtonPressMask | ButtonReleaseMask | PropertyChangeMask; #ifdef POINTER_BLANK - if (options & Opt_pointerBlank) + if (OPTION (Opt_pointerBlank)) vt_emask |= PointerMotionMask; else #endif vt_emask |= Button1MotionMask | Button3MotionMask; - XSelectInput (disp, TermWin.vt, vt_emask); - vt_ev.start (display, TermWin.vt); + XSelectInput (disp, vt, vt_emask); + vt_ev.start (display, vt); #if defined(MENUBAR) && (MENUBAR_MAX > 1) if (menuBar_height ()) { menuBar.win = XCreateSimpleWindow (disp, top, window_vt_x, 0, - TermWin_TotalWidth (), + width, menuBar_TotalHeight (), 0, pix_colors_focused[Color_fg], @@ -1129,7 +1124,7 @@ #ifdef XPM_BACKGROUND if (rs[Rs_backgroundPixmap] != NULL - && ! (options & Opt_transparent)) + && ! OPTION (Opt_transparent)) { const char *p = rs[Rs_backgroundPixmap]; @@ -1148,19 +1143,19 @@ gcvalue.foreground = pix_colors[Color_fg]; gcvalue.background = pix_colors[Color_bg]; gcvalue.graphics_exposures = 1; - TermWin.gc = XCreateGC (disp, TermWin.vt, + gc = XCreateGC (disp, vt, GCForeground | GCBackground | GCGraphicsExposures, &gcvalue); - TermWin.drawable = new rxvt_drawable (display, TermWin.vt); + drawable = new rxvt_drawable (display, vt); #if defined(MENUBAR) || defined(RXVT_SCROLLBAR) gcvalue.foreground = pix_colors[Color_topShadow]; - topShadowGC = XCreateGC (disp, TermWin.vt, GCForeground, &gcvalue); + topShadowGC = XCreateGC (disp, vt, GCForeground, &gcvalue); gcvalue.foreground = pix_colors[Color_bottomShadow]; - botShadowGC = XCreateGC (disp, TermWin.vt, GCForeground, &gcvalue); + botShadowGC = XCreateGC (disp, vt, GCForeground, &gcvalue); gcvalue.foreground = pix_colors[ (display->depth <= 2 ? Color_fg : Color_scroll)]; - scrollbarGC = XCreateGC (disp, TermWin.vt, GCForeground, &gcvalue); + scrollbarGC = XCreateGC (disp, vt, GCForeground, &gcvalue); #endif #ifdef OFF_FOCUS_FADING @@ -1195,10 +1190,16 @@ */ if (GET_TERMIOS (STDIN_FILENO, tio) < 0) { - /* return error - use system defaults */ + // return error - use system defaults, + // where possible, and zero elsewhere + memset (tio, 0, sizeof (ttymode_t)); + tio->c_cc[VINTR] = CINTR; tio->c_cc[VQUIT] = CQUIT; tio->c_cc[VERASE] = CERASE; +#ifdef VERASE2 + tio->c_cc[VERASE2] = CERASE2; +#endif tio->c_cc[VKILL] = CKILL; tio->c_cc[VSTART] = CSTART; tio->c_cc[VSTOP] = CSTOP; @@ -1402,7 +1403,15 @@ if (rs[Rs_pty_fd]) { pty.pty = atoi (rs[Rs_pty_fd]); - fcntl (pty.pty, F_SETFL, O_NONBLOCK); + + if (pty.pty >= 0) + { + if (getfd_hook) + pty.pty = (*getfd_hook) (pty.pty); + + if (pty.pty < 0 || fcntl (pty.pty, F_SETFL, O_NONBLOCK)) + rxvt_fatal ("unusable pty-fd filehandle, aborting.\n"); + } } else #endif @@ -1513,7 +1522,7 @@ SET_TTYMODE (STDIN_FILENO, &tio); /* init terminal attributes */ - if (options & Opt_console) + if (OPTION (Opt_console)) { /* be virtual console, fail silently */ #ifdef TIOCCONS unsigned int on = 1; @@ -1573,7 +1582,7 @@ argv0 = (const char *)rxvt_r_basename (shell); - if (options & Opt_loginShell) + if (OPTION (Opt_loginShell)) { login = (char *)rxvt_malloc ((strlen (argv0) + 2) * sizeof (char)); @@ -1618,7 +1627,7 @@ arg_a[0] = my_basename (command); - if (options & Opt_loginShell) + if (OPTION (Opt_loginShell)) { login = rxvt_malloc ((strlen (arg_a[0]) + 2) * sizeof (char));