--- rxvt-unicode/src/init.C 2007/06/08 20:04:12 1.184 +++ rxvt-unicode/src/init.C 2007/12/14 05:25:24 1.230 @@ -7,11 +7,12 @@ * - original version * Copyright (c) 1994 Robert Nation * - extensive modifications + * Copyright (c) 1996 Chuck Blake + * Copyright (c) 1997 mj olesen + * Copyright (c) 1997,1998 Oezguer Kesim * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications - * Copyright (c) 1999 D J Hawkey Jr - * - QNX support - * Copyright (c) 2003-2006 Marc Lehmann + * Copyright (c) 2003-2007 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +41,109 @@ #include +#include + +#ifdef HAVE_XSETLOCALE +# define X_LOCALE +# include +#else +# ifdef HAVE_SETLOCALE +# include +# endif +#endif + +#ifdef HAVE_NL_LANGINFO +# include +#endif + +#ifdef DISPLAY_IS_IP +/* On Solaris link with -lsocket and -lnsl */ +#include +#include + +/* these next two are probably only on Sun (not Solaris) */ +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif +#ifdef HAVE_SYS_BYTEORDER_H +#include +#endif + +#include +#include +#include +#include + +static char * +rxvt_network_display (const char *display) +{ + char buffer[1024], *rval = NULL; + struct ifconf ifc; + struct ifreq *ifr; + int i, skfd; + + if (display[0] != ':' && strncmp (display, "unix:", 5)) + return (char *) display; /* nothing to do */ + + ifc.ifc_len = sizeof (buffer); /* Get names of all ifaces */ + ifc.ifc_buf = buffer; + + if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) + { + perror ("socket"); + return NULL; + } + + if (ioctl (skfd, SIOCGIFCONF, &ifc) < 0) + { + perror ("SIOCGIFCONF"); + close (skfd); + return NULL; + } + + for (i = 0, ifr = ifc.ifc_req; + i < (ifc.ifc_len / sizeof (struct ifreq)); + i++, ifr++) + { + struct ifreq ifr2; + + strcpy (ifr2.ifr_name, ifr->ifr_name); + + if (ioctl (skfd, SIOCGIFADDR, &ifr2) >= 0) + { + unsigned long addr; + struct sockaddr_in *p_addr; + + p_addr = (struct sockaddr_in *) &ifr2.ifr_addr; + addr = htonl ((unsigned long)p_addr->sin_addr.s_addr); + + /* + * not "0.0.0.0" or "127.0.0.1" - so format the address + */ + if (addr && addr != 0x7F000001) + { + char *colon = strchr (display, ':'); + + if (colon == NULL) + colon = ":0.0"; + + rval = rxvt_malloc (strlen (colon) + 16); + sprintf (rval, "%d.%d.%d.%d%s", + (int) ((addr >> 030) & 0xFF), + (int) ((addr >> 020) & 0xFF), + (int) ((addr >> 010) & 0xFF), + (int) (addr & 0xFF), colon); + break; + } + } + } + + close (skfd); + + return rval; +} +#endif + const char *const def_colorName[] = { COLOR_FOREGROUND, @@ -52,9 +156,9 @@ "rgb:00/00/cd", // 4: blue (Blue3) "rgb:cd/00/cd", // 5: magenta (Magenta3) "rgb:00/cd/cd", // 6: cyan (Cyan3) -# ifdef XTERM_COLORS +# ifdef XTERM_COLORS "rgb:e5/e5/e5", // 7: white (Grey90) -# else +# else "rgb:fa/eb/d7", // 7: white (AntiqueWhite) # endif /* high-intensity colors */ @@ -148,7 +252,7 @@ #ifndef NO_CURSORCOLOR COLOR_CURSOR_BACKGROUND, COLOR_CURSOR_FOREGROUND, -#endif /* ! NO_CURSORCOLOR */ +#endif /* ! NO_CURSORCOLOR */ NULL, /* Color_pointer_fg */ NULL, /* Color_pointer_bg */ NULL, /* Color_border */ @@ -157,7 +261,7 @@ NULL, /* Color_IT */ NULL, /* Color_UL */ NULL, /* Color_RV */ -#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ +#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ #if ENABLE_FRILLS NULL, // Color_underline #endif @@ -167,8 +271,8 @@ #ifdef KEEP_SCROLLCOLOR COLOR_SCROLLBAR, COLOR_SCROLLTROUGH, -#endif /* KEEP_SCROLLCOLOR */ -#if TINTING +#endif /* KEEP_SCROLLCOLOR */ +#if ENABLE_TRANSPARENCY NULL, #endif #if OFF_FOCUS_FADING @@ -176,7 +280,7 @@ #endif }; -bool +void rxvt_term::init_vars () { pix_colors = // @@ -185,10 +289,6 @@ pix_colors_unfocused = new rxvt_color [TOTAL_COLORS]; #endif -#if defined(XPM_BACKGROUND) || defined(TRANSPARENT) - pixmap = None; -#endif - MEvent.time = CurrentTime; MEvent.button = AnyButton; want_refresh = 1; @@ -201,27 +301,20 @@ saveLines = SAVELINES; numpix_colors = TOTAL_COLORS; - refresh_limit = 1; refresh_type = SLOW_REFRESH; oldcursor.row = oldcursor.col = -1; -#ifdef XPM_BACKGROUND - /* bgPixmap.w = bgPixmap.h = 0; */ - bgPixmap.x = bgPixmap.y = 0; - bgPixmap.pixmap = None; -#endif - last_bot = last_state = -1; set_option (Opt_scrollBar); set_option (Opt_scrollTtyOutput); set_option (Opt_jumpScroll); + set_option (Opt_skipScroll); set_option (Opt_secondaryScreen); set_option (Opt_secondaryScroll); set_option (Opt_pastableTabs); set_option (Opt_intensityStyles); - - return true; + set_option (Opt_iso14755_52); } void @@ -238,7 +331,7 @@ /* TODO: BOO HISS */ dup2 (STDERR_FILENO, STDIN_FILENO); } - else if (i > STDIN_FILENO) + else if (i != STDIN_FILENO) { dup2 (i, STDIN_FILENO); close (i); @@ -263,7 +356,6 @@ rxvt_term::init_resources (int argc, const char *const *argv) { int i, r_argc; - char *val; const char **cmd_argv, **r_argv; /* @@ -273,15 +365,10 @@ if (!strcmp (argv[r_argc], "-e")) break; - r_argv = (const char **)rxvt_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 if (!argv[r_argc + 1]) + rxvt_fatal ("option '-e' requires an argument, aborting.\n"); else { cmd_argv = (const char **)rxvt_malloc (sizeof (char *) * (argc - r_argc)); @@ -292,7 +379,14 @@ cmd_argv[i] = NULL; } - rs[Rs_name] = rxvt_r_basename (argv[0]); + r_argv = (const char **)rxvt_malloc (sizeof (char *) * (r_argc + 1)); + + for (i = 0; i < r_argc; i++) + r_argv[i] = (const char *)argv[i]; + + r_argv[i] = NULL; + + rs[Rs_name] = rxvt_basename (argv[0]); /* * Open display, get options/resources and create the window @@ -304,7 +398,10 @@ get_options (r_argc, r_argv); if (!(display = displays.get (rs[Rs_display_name]))) - rxvt_fatal ("can't open display %s, aborting.\n", rs[Rs_display_name]); + { + free (r_argv); + rxvt_fatal ("can't open display %s, aborting.\n", rs[Rs_display_name]); + } // using a local pointer decreases code size a lot xa = display->xa; @@ -317,6 +414,9 @@ select_visual (strtol (rs[Rs_depth], 0, 0)); #endif +#ifdef HAVE_AFTERIMAGE + asv = create_asvisual_for_id (dpy, display->screen, depth, XVisualIDFromVisual (visual), cmap, NULL); +#endif free (r_argv); for (int i = NUM_RESOURCES; i--; ) @@ -342,7 +442,7 @@ if (cmd_argv && cmd_argv[0]) { if (!rs[Rs_title]) - rs[Rs_title] = rxvt_r_basename (cmd_argv[0]); + rs[Rs_title] = rxvt_basename (cmd_argv[0]); if (!rs[Rs_iconName]) rs[Rs_iconName] = rs[Rs_title]; } @@ -390,39 +490,20 @@ #ifndef NO_BACKSPACE_KEY if (!rs[Rs_backspace_key]) # ifdef DEFAULT_BACKSPACE - key_backspace = DEFAULT_BACKSPACE; + rs[Rs_backspace_key] = DEFAULT_BACKSPACE; # else - key_backspace = "DEC"; /* can toggle between \010 or \177 */ + rs[Rs_backspace_key] = "DEC"; /* can toggle between \010 or \177 */ # endif - else - { - val = strdup (rs[Rs_backspace_key]); - rxvt_Str_trim (val); - rxvt_Str_escaped (val); - key_backspace = val; - } #endif #ifndef NO_DELETE_KEY if (!rs[Rs_delete_key]) # ifdef DEFAULT_DELETE - key_delete = DEFAULT_DELETE; + rs[Rs_delete_key] = DEFAULT_DELETE; # else - key_delete = "\033[3~"; + rs[Rs_delete_key] = "\033[3~"; # endif - else - { - val = strdup (rs[Rs_delete_key]); - rxvt_Str_trim (val); - rxvt_Str_escaped (val); - key_delete = val; - } #endif - if (rs[Rs_answerbackstring]) - { - rxvt_Str_trim ((char *)rs[Rs_answerbackstring]); - rxvt_Str_escaped ((char *)rs[Rs_answerbackstring]); - } #ifdef HAVE_SCROLLBARS setup_scrollbar (rs[Rs_scrollBar_align], rs[Rs_scrollstyle], rs[Rs_scrollBar_thickness]); @@ -456,7 +537,7 @@ #ifndef NO_CURSORCOLOR color_aliases (Color_cursor); color_aliases (Color_cursor2); -#endif /* NO_CURSORCOLOR */ +#endif /* NO_CURSORCOLOR */ color_aliases (Color_pointer_fg); color_aliases (Color_pointer_bg); color_aliases (Color_border); @@ -464,7 +545,7 @@ color_aliases (Color_BD); color_aliases (Color_UL); color_aliases (Color_RV); -#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ +#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ if (!rs[Rs_color + Color_border]) rs[Rs_color + Color_border] = rs[Rs_color + Color_bg]; @@ -477,7 +558,6 @@ rxvt_term::init_env () { int i; - unsigned int u; char *val; #ifdef DISPLAY_IS_IP @@ -495,14 +575,14 @@ rs[Rs_display_name] = (const char *)val; if (val == NULL) -#endif /* DISPLAY_IS_IP */ +#endif /* DISPLAY_IS_IP */ val = XDisplayString (dpy); if (rs[Rs_display_name] == NULL) rs[Rs_display_name] = val; /* use broken `:0' value */ i = strlen (val); - env_display = (char *)rxvt_malloc ((i + 9) * sizeof (char)); + env_display = (char *)rxvt_malloc (i + 9); sprintf (env_display, "DISPLAY=%s", val); @@ -533,7 +613,7 @@ if (rs[Rs_term_name] != NULL) { - env_term = (char *)rxvt_malloc ((strlen (rs[Rs_term_name]) + 6) * sizeof (char)); + env_term = (char *)rxvt_malloc (strlen (rs[Rs_term_name]) + 6); sprintf (env_term, "TERM=%s", rs[Rs_term_name]); putenv (env_term); } @@ -545,7 +625,7 @@ unsetenv ("LINES"); unsetenv ("COLUMNS"); unsetenv ("TERMCAP"); /* terminfo should be okay */ -#endif /* HAVE_UNSETENV */ +#endif /* HAVE_UNSETENV */ } /*----------------------------------------------------------------------*/ @@ -576,7 +656,7 @@ } - this->locale = rxvt_strdup (this->locale); + this->locale = strdup (this->locale); SET_LOCALE (this->locale); mbstate.reset (); #endif @@ -643,7 +723,7 @@ priv_modes |= PrivMode_smoothScroll; #ifndef NO_BACKSPACE_KEY - if (strcmp (key_backspace, "DEC") == 0) + if (strcmp (rs[Rs_backspace_key], "DEC") == 0) priv_modes |= PrivMode_HaveBackSpace; #endif @@ -666,7 +746,7 @@ #ifdef OFF_FOCUS_FADING pix_colors = pix_colors_focused; #endif - + for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) { const char *name = rs[Rs_color + i]; @@ -754,7 +834,7 @@ )) alias_color (Color_topShadow, Color_White); } -#endif /* KEEP_SCROLLCOLOR */ +#endif /* KEEP_SCROLLCOLOR */ #ifdef OFF_FOCUS_FADING for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) @@ -772,13 +852,10 @@ int i = atoi (rs[Rs_color + idx]); if (i >= 8 && i <= 15) - { /* bright colors */ - i -= 8; - rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i]; - return; - } - - if (i >= 0 && i <= 7) /* normal colors */ + /* bright colors */ + rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i - 8]; + else if (i >= 0 && i <= 7) + /* normal colors */ rs[Rs_color + idx] = rs[Rs_color + minCOLOR + i]; } } @@ -880,7 +957,7 @@ XClassHint classHint; XWMHints wmHint; #if ENABLE_FRILLS - MWMHints mwmhints; + MWMHints mwmhints = { }; #endif XGCValues gcvalue; XSetWindowAttributes attributes; @@ -903,18 +980,14 @@ { if (XInternAtom (dpy, "_MOTIF_WM_INFO", True) == None) { - /* print_warning("Window Manager does not support MWM hints. Bypassing window manager control for borderless window.\n");*/ + // rxvt_warn("Window Manager does not support MWM hints. Bypassing window manager control for borderless window.\n"); attributes.override_redirect = true; - mwmhints.flags = 0; } else { mwmhints.flags = MWM_HINTS_DECORATIONS; - mwmhints.decorations = 0; } } - else - mwmhints.flags = 0; #endif #if ENABLE_XEMBED @@ -1035,26 +1108,6 @@ vt_ev.start (display, vt); -#ifdef XPM_BACKGROUND - if (rs[Rs_backgroundPixmap] != NULL -#ifndef HAVE_AFTERIMAGE - && !OPTION (Opt_transparent) -#endif - ) - { - const char *p = rs[Rs_backgroundPixmap]; - - if ((p = strchr (p, ';')) != NULL) - { - p++; - scale_pixmap (p); - } - - set_bgPixmap (rs[Rs_backgroundPixmap]); - scr_touch (true); - } -#endif - /* graphics context for the vt window */ gcvalue.foreground = pix_colors[Color_fg]; gcvalue.background = pix_colors[Color_bg]; @@ -1172,7 +1225,6 @@ * Debugging */ #ifdef DEBUG_TTYMODE -#ifdef HAVE_TERMIOS_H /* c_iflag bits */ fprintf (stderr, "Input flags\n"); @@ -1245,8 +1297,7 @@ fprintf (stderr, "\n"); # undef FOO -# endif /* HAVE_TERMIOS_H */ -#endif /* DEBUG_TTYMODE */ +#endif /* DEBUG_TTYMODE */ } /*----------------------------------------------------------------------*/ @@ -1280,9 +1331,9 @@ int er; #ifndef NO_BACKSPACE_KEY - if (key_backspace[0] && !key_backspace[1]) - er = key_backspace[0]; - else if (strcmp (key_backspace, "DEC") == 0) + if (rs[Rs_backspace_key][0] && !rs[Rs_backspace_key][1]) + er = rs[Rs_backspace_key][0]; + else if (strcmp (rs[Rs_backspace_key], "DEC") == 0) er = '\177'; /* the initial state anyway */ else #endif @@ -1359,7 +1410,8 @@ char *login; if (option (Opt_console)) - { /* be virtual console, fail silently */ + { + /* be virtual console, fail silently */ #ifdef TIOCCONS unsigned int on = 1; @@ -1371,7 +1423,7 @@ if (fd >= 0) if (ioctl (fd, SRIOCSREDIR, NULL) < 0) close (fd); -#endif /* SRIOCSREDIR */ +#endif /* SRIOCSREDIR */ } /* reset signals and spin off the command interpreter */ @@ -1388,7 +1440,7 @@ signal (SIGTSTP, SIG_IGN); signal (SIGTTIN, SIG_IGN); signal (SIGTTOU, SIG_IGN); -#endif /* SIGTSTP */ +#endif /* SIGTSTP */ // unblock signals (signals are blocked by iom.C sigset_t ss; @@ -1396,7 +1448,7 @@ sigprocmask (SIG_SETMASK, &ss, 0); /* command interpreter path */ - if (argv != NULL) + if (argv) { # ifdef DEBUG_CMD int i; @@ -1415,18 +1467,18 @@ if ((shell = getenv ("SHELL")) == NULL || *shell == '\0') shell = "/bin/sh"; - argv0 = (const char *)rxvt_r_basename (shell); + argv0 = (const char *)rxvt_basename (shell); if (option (Opt_loginShell)) { - login = (char *)rxvt_malloc ((strlen (argv0) + 2) * sizeof (char)); + login = (char *)rxvt_malloc (strlen (argv0) + 2); login[0] = '-'; strcpy (&login[1], argv0); argv0 = login; } - execlp (shell, argv0, NULL); + execlp (shell, argv0, (char *)0); /* no error message: STDERR is closed! */ }