--- rxvt-unicode/src/init.C 2011/11/13 16:03:31 1.301 +++ rxvt-unicode/src/init.C 2012/05/31 05:53:46 1.325 @@ -40,7 +40,7 @@ #include -#include +#include #include @@ -48,9 +48,7 @@ # define X_LOCALE # include #else -# ifdef HAVE_SETLOCALE -# include -# endif +# include #endif #ifdef HAVE_NL_LANGINFO @@ -80,7 +78,7 @@ #include #include -static char * +static char * ecb_cold rxvt_network_display (const char *display) { char buffer[1024], *rval = NULL; @@ -569,36 +567,8 @@ const char ** rxvt_term::init_resources (int argc, const char *const *argv) { - int i, r_argc; - const char **cmd_argv, **r_argv; - - /* - * Look for -e 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")) - break; - - 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)); - - for (i = 0; i < argc - r_argc - 1; i++) - cmd_argv[i] = (const char *)argv[i + r_argc + 1]; - - cmd_argv[i] = NULL; - } - - 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; + int i; + const char **cmd_argv; rs[Rs_name] = rxvt_basename (argv[0]); @@ -609,13 +579,10 @@ if ((rs[Rs_display_name] = getenv ("DISPLAY")) == NULL) rs[Rs_display_name] = ":0"; - get_options (r_argc, r_argv); + cmd_argv = get_options (argc, argv); if (!(display = displays.get (rs[Rs_display_name]))) - { - free (r_argv); - rxvt_fatal ("can't open display %s, aborting.\n", rs[Rs_display_name]); - } + 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; @@ -628,8 +595,6 @@ select_visual (strtol (rs[Rs_depth], 0, 0)); #endif - free (r_argv); - for (int i = NUM_RESOURCES; i--; ) if (rs [i] == resval_undef) rs [i] = 0; @@ -647,6 +612,10 @@ } #endif + // must be called after initialising the perl interpreter as it + // may invoke the `on_register_command' hook + extract_keysym_resources (); + /* * set any defaults not already set */ @@ -764,10 +733,39 @@ /*----------------------------------------------------------------------*/ void -rxvt_term::init (int argc, const char *const *argv, stringvec *envv) +rxvt_term::init (stringvec *argv, stringvec *envv) { + argv->push_back (0); + envv->push_back (0); + + this->argv = argv; this->envv = envv; + init2 (argv->size () - 1, argv->begin ()); +} + +void +rxvt_term::init (int argc, const char *const *argv, const char *const *envv) +{ +#if ENABLE_PERL + // perl might want to access the stringvecs later, so we need to copy them + stringvec *args = new stringvec; + for (int i = 0; i < argc; i++) + args->push_back (strdup (argv [i])); + + stringvec *envs = new stringvec; + for (const char *const *var = envv; *var; var++) + envs->push_back (strdup (*var)); + + init (args, envs); +#else + init2 (argc, argv); +#endif +} + +void +rxvt_term::init2 (int argc, const char *const *argv) +{ SET_R (this); set_locale (""); set_environ (envv); // a few things in X do not call setlocale :( @@ -795,11 +793,6 @@ pty = ptytty::create (); -#ifdef HAVE_AFTERIMAGE - set_application_name ((char *)rs[Rs_name]); - set_output_threshold (OUTPUT_LEVEL_WARNING); -#endif - // must be called before create_windows, because the latter may call set_icon #ifdef HAVE_PIXBUF g_type_init (); @@ -827,28 +820,19 @@ bg_set_transparent (); if (rs [Rs_blurradius]) - bg_set_blur (rs [Rs_blurradius]); + root_effects.set_blur (rs [Rs_blurradius]); if (ISSET_PIXCOLOR (Color_tint)) - bg_set_tint (pix_colors_focused [Color_tint]); + root_effects.set_tint (pix_colors_focused [Color_tint]); if (rs [Rs_shade]) - bg_set_shade (rs [Rs_shade]); + root_effects.set_shade (rs [Rs_shade]); bg_set_root_pixmap (); XSelectInput (dpy, display->root, PropertyChangeMask); rootwin_ev.start (display, display->root); } #endif - -#ifdef BG_IMAGE_FROM_FILE - if (rs[Rs_backgroundPixmap]) - { - if (bg_set_file (rs[Rs_backgroundPixmap])) - if (!bg_window_position_sensitive ()) - update_background (); - } -#endif } #endif @@ -856,12 +840,10 @@ rootwin_ev.start (display, display->root); #endif - set_colorfgbg (); + init_done = 1; init_command (cmd_argv); - free (cmd_argv); - if (pty->pty >= 0) pty_ev.start (pty->pty, ev::READ); @@ -912,6 +894,10 @@ rxvt_term::init_env () { char *val; + char *env_display; + char *env_windowid; + char *env_colorfgbg; + char *env_term; #ifdef DISPLAY_IS_IP /* Fixup display_name for export over pty to any interested terminal @@ -938,6 +924,7 @@ sprintf (env_display, "DISPLAY=%s", val); + env_windowid = (char *)rxvt_malloc (21); sprintf (env_windowid, "WINDOWID=%lu", (unsigned long)parent); /* add entries to the environment: @@ -951,8 +938,8 @@ putenv (env_display); putenv (env_windowid); - if (env_colorfgbg) - putenv (env_colorfgbg); + env_colorfgbg = get_colorfgbg (); + putenv (env_colorfgbg); #ifdef RXVT_TERMINFO putenv ("TERMINFO=" RXVT_TERMINFO); @@ -981,16 +968,11 @@ } /*----------------------------------------------------------------------*/ -/* - * This is more or less stolen straight from XFree86 xterm. - * This should support all European type languages. - */ void rxvt_term::set_locale (const char *locale) { set_environ (envv); -#if HAVE_XSETLOCALE || HAVE_SETLOCALE free (this->locale); this->locale = setlocale (LC_CTYPE, locale); @@ -1011,16 +993,14 @@ this->locale = strdup (this->locale); SET_LOCALE (this->locale); mbstate.reset (); -#endif #if HAVE_NL_LANGINFO - char *codeset = strdup (nl_langinfo (CODESET)); + char *codeset = nl_langinfo (CODESET); // /^UTF.?8/i enc_utf8 = (codeset[0] == 'U' || codeset[0] == 'u') && (codeset[1] == 'T' || codeset[1] == 't') && (codeset[2] == 'F' || codeset[2] == 'f') && (codeset[3] == '8' || codeset[4] == '8'); - free (codeset); #else enc_utf8 = 0; #endif @@ -1033,14 +1013,14 @@ #ifdef USE_XIM if (!locale) - rxvt_warn ("setting locale failed, working without locale support.\n"); + rxvt_warn ("setting locale failed, continuing without locale support.\n"); else { set_string_property (xa[XA_WM_LOCALE_NAME], locale); if (!XSupportsLocale ()) { - rxvt_warn ("the locale is not supported by Xlib, working without locale support.\n"); + rxvt_warn ("the locale is not supported by Xlib, continuing without locale support.\n"); return; } @@ -1199,7 +1179,7 @@ void rxvt_term::color_aliases (int idx) { - if (rs[Rs_color + idx] && isdigit (* (rs[Rs_color + idx]))) + if (rs[Rs_color + idx] && isdigit (*rs[Rs_color + idx])) { int i = atoi (rs[Rs_color + idx]); @@ -1304,57 +1284,6 @@ void rxvt_term::set_icon (const char *file) { -#ifdef HAVE_AFTERIMAGE - init_asv (); - - ASImage *im = file2ASImage (file, 0xFFFFFFFF, SCREEN_GAMMA, 0, NULL); - if (!im) - { - rxvt_warn ("Loading image icon failed, continuing without.\n"); - return; - } - - unsigned int w = im->width; - unsigned int h = im->height; - - if (!IN_RANGE_INC (w, 1, 16383) || !IN_RANGE_INC (h, 1, 16383)) - { - rxvt_warn ("Icon image too big, continuing without.\n"); - destroy_asimage (&im); - return; - } - - ASImage *result = scale_asimage (asv, im, - w, h, ASA_ARGB32, - 100, ASIMAGE_QUALITY_DEFAULT); - destroy_asimage (&im); - - if (!result) - { - rxvt_warn ("Icon image transformation to ARGB failed, continuing without.\n"); - return; - } - - long *buffer = (long *)malloc ((2 + w * h) * sizeof (long)); - if (buffer) - { - ARGB32 *asbuf = result->alt.argb32; - buffer [0] = w; - buffer [1] = h; - - for (unsigned int i = 0; i < w * h; ++i) - buffer [i + 2] = asbuf [i]; - - XChangeProperty (dpy, parent, xa[XA_NET_WM_ICON], XA_CARDINAL, 32, - PropModeReplace, (const unsigned char *) buffer, 2 + w * h); - free (buffer); - } - else - rxvt_warn ("Memory allocation for icon hint failed, continuing without.\n"); - - destroy_asimage (&result); -#endif - #ifdef HAVE_PIXBUF GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (file, NULL); if (!pixbuf) @@ -1485,9 +1414,6 @@ this->parent = top; - old_width = szHint.width; - old_height = szHint.height; - set_title (rs [Rs_title]); set_icon_name (rs [Rs_iconName]); @@ -1559,7 +1485,7 @@ /* the vt window */ vt = XCreateSimpleWindow (dpy, top, window_vt_x, window_vt_y, - width, height, + vt_width, vt_height, 0, pix_colors_focused[Color_fg], pix_colors_focused[Color_bg]); @@ -1618,7 +1544,7 @@ if (getfd_hook) pty->pty = (*getfd_hook) (pty->pty); - if (pty->pty < 0 || fcntl (pty->pty, F_SETFL, O_NONBLOCK)) + if (pty->pty < 0) rxvt_fatal ("unusable pty-fd filehandle, aborting.\n"); } } @@ -1627,6 +1553,8 @@ if (!pty->get ()) rxvt_fatal ("can't initialize pseudo-tty, aborting.\n"); + fcntl (pty->pty, F_SETFL, O_NONBLOCK); + struct termios tio = def_tio; #ifndef NO_BACKSPACE_KEY @@ -1685,7 +1613,14 @@ default: if (!option (Opt_utmpInhibit)) - pty->login (cmd_pid, option (Opt_loginShell), rs[Rs_display_name]); + { +#ifdef LOG_ONLY_ON_LOGIN + bool login_shell = option (Opt_loginShell); +#else + bool login_shell = true; +#endif + pty->login (cmd_pid, login_shell, rs[Rs_display_name]); + } pty->close_tty (); @@ -1720,8 +1655,10 @@ fd = open (CONSOLE, O_WRONLY, 0); if (fd >= 0) - if (ioctl (fd, SRIOCSREDIR, NULL) < 0) + { + ioctl (fd, SRIOCSREDIR, STDIN_FILENO); close (fd); + } #endif /* SRIOCSREDIR */ }