--- rxvt-unicode/src/init.C 2008/01/19 13:00:07 1.239 +++ rxvt-unicode/src/init.C 2009/04/26 01:51:20 1.257 @@ -12,7 +12,7 @@ * Copyright (c) 1997,1998 Oezguer Kesim * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications - * Copyright (c) 2003-2007 Marc Lehmann + * Copyright (c) 2003-2008 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 @@ -269,10 +269,10 @@ #ifdef OPTION_HC NULL, #endif -#ifdef KEEP_SCROLLCOLOR COLOR_SCROLLBAR, +#ifdef RXVT_SCROLLBAR COLOR_SCROLLTROUGH, -#endif /* KEEP_SCROLLCOLOR */ +#endif #if ENABLE_TRANSPARENCY NULL, #endif @@ -310,20 +310,16 @@ set_option (Opt_pastableTabs); set_option (Opt_intensityStyles); set_option (Opt_iso14755_52); + set_option (Opt_buffered); } -void -rxvt_term::init_secondary () +static void +init_secondary () { int i; - /* - * Close all unused file descriptors - * We don't want them, we don't need them. - */ if ((i = open ("/dev/null", O_RDONLY)) < 0) { - /* TODO: BOO HISS */ dup2 (STDERR_FILENO, STDIN_FILENO); } else if (i != STDIN_FILENO) @@ -333,17 +329,6 @@ } dup2 (STDERR_FILENO, STDOUT_FILENO); - -#if 0 // schmorp sayz closing filies is murder - for (i = STDERR_FILENO + 1; i < num_fds; i++) - { -#ifdef __sgi /* Alex Coventry says we need 4 & 7 too */ - if (i == 4 || i == 7) - continue; -#endif - close (i); - } -#endif } /*----------------------------------------------------------------------*/ @@ -409,17 +394,17 @@ select_visual (strtol (rs[Rs_depth], 0, 0)); #endif -#ifdef HAVE_AFTERIMAGE - set_application_name ((char*)rs[Rs_name]); - set_output_threshold (OUTPUT_LEVEL_WARNING); - asv = create_asvisual_for_id (dpy, display->screen, depth, XVisualIDFromVisual (visual), cmap, NULL); -#endif free (r_argv); for (int i = NUM_RESOURCES; i--; ) if (rs [i] == resval_undef) rs [i] = 0; +#ifdef HAVE_AFTERIMAGE + set_application_name ((char *)rs[Rs_name]); + set_output_threshold (OUTPUT_LEVEL_WARNING); +#endif + #if ENABLE_PERL if (!rs[Rs_perl_ext_1]) rs[Rs_perl_ext_1] = "default"; @@ -440,6 +425,7 @@ { if (!rs[Rs_title]) rs[Rs_title] = rxvt_basename (cmd_argv[0]); + if (!rs[Rs_iconName]) rs[Rs_iconName] = rs[Rs_title]; } @@ -447,6 +433,7 @@ { if (!rs[Rs_title]) rs[Rs_title] = rs[Rs_name]; + if (!rs[Rs_iconName]) rs[Rs_iconName] = rs[Rs_name]; } @@ -476,11 +463,6 @@ if (!saveLines) set_option (Opt_scrollBar, 0); -#ifdef PRINTPIPE - if (!rs[Rs_print_pipe]) - rs[Rs_print_pipe] = PRINTPIPE; -#endif - if (!rs[Rs_cutchars]) rs[Rs_cutchars] = CUTCHARS; @@ -502,9 +484,7 @@ # endif #endif -#ifdef HAVE_SCROLLBARS - setup_scrollbar (rs[Rs_scrollBar_align], rs[Rs_scrollstyle], rs[Rs_scrollBar_thickness]); -#endif + scrollBar.setup (this); #ifdef XTERM_REVERSE_VIDEO /* this is how xterm implements reverseVideo */ @@ -558,7 +538,7 @@ SET_R (this); set_locale (""); - set_environ (envv); // few things in X do not call setlocale :( + set_environ (envv); // a few things in X do not call setlocale :( init_vars (); @@ -570,10 +550,18 @@ keyboard->register_done (); #endif -#ifdef HAVE_SCROLLBARS + if (const char *path = rs[Rs_chdir]) + if (*path) // ignored if empty + { + if (*path != '/') + rxvt_fatal ("specified shell working directory must start with a slash, aborting.\n"); + + if (chdir (path)) + rxvt_fatal ("unable to change into specified shell working directory, aborting.\n"); + } + if (option (Opt_scrollBar)) - scrollBar.setIdle (); /* set existence for size calculations */ -#endif + scrollBar.state = STATE_IDLE; /* set existence for size calculations */ pty = ptytty::create (); @@ -581,16 +569,14 @@ init_xlocale (); - scr_reset (); // initialize screen + scr_poweron (); // initialize screen #if 0 XSynchronize (dpy, True); #endif -#ifdef HAVE_SCROLLBARS if (option (Opt_scrollBar)) - resize_scrollbar (); /* create and map scrollbar */ -#endif + scrollBar.resize (); /* create and map scrollbar */ #ifdef HAVE_BG_PIXMAP { bgPixmap.set_target (this); @@ -855,7 +841,7 @@ /*----------------------------------------------------------------------*/ void -rxvt_term::Get_Colours () +rxvt_term::get_colours () { int i; @@ -925,7 +911,7 @@ * The calculations of topShadow/bottomShadow values are adapted * from the fvwm window manager. */ -#ifdef KEEP_SCROLLCOLOR +#ifdef RXVT_SCROLLBAR if (depth <= 2) { /* Monochrome */ @@ -950,7 +936,7 @@ )) alias_color (Color_topShadow, Color_White); } -#endif /* KEEP_SCROLLCOLOR */ +#endif #ifdef OFF_FOCUS_FADING for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) @@ -1082,7 +1068,7 @@ dLocal (Display *, dpy); /* grab colors before netscape does */ - Get_Colours (); + get_colours (); if (!set_fonts ()) rxvt_fatal ("unable to load base fontset, please specify a valid one using -fn, aborting.\n"); @@ -1140,8 +1126,8 @@ old_width = szHint.width; old_height = szHint.height; - process_xterm_seq (XTerm_title, rs[Rs_title], CHAR_ST); - process_xterm_seq (XTerm_iconName, rs[Rs_iconName], CHAR_ST); + set_title (rs [Rs_title]); + set_icon_name (rs [Rs_iconName]); classHint.res_name = (char *)rs[Rs_name]; classHint.res_class = (char *)RESCLASS; @@ -1153,6 +1139,56 @@ XmbSetWMProperties (dpy, top, NULL, NULL, (char **)argv, argc, &szHint, &wmHint, &classHint); +#if ENABLE_EWMH +# ifdef HAVE_AFTERIMAGE + /* + * set up icon hint + * rs [Rs_iconfile] is path to icon, asv has been created in init_resources + */ + + if (rs [Rs_iconfile]) + { + init_asv (); + + ASImage *im = file2ASImage (rs [Rs_iconfile], 0xFFFFFFFF, SCREEN_GAMMA, 0, NULL); + if (asv && im) + { + int w = im->width; + int h = im->height; + long* buffer = (long *)malloc ((2 + w * h) * sizeof (long)); + ASImage *result = scale_asimage (asv, im, + w, h, ASA_ARGB32, + 100, ASIMAGE_QUALITY_DEFAULT); + destroy_asimage (&im); + + if (buffer && result) + { + 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]; + + destroy_asimage (&result); + XChangeProperty (dpy, top, xa[XA_NET_WM_ICON], XA_CARDINAL, 32, + PropModeReplace, (const unsigned char*) buffer, 2 + w * h); + free (buffer); + } + else + { + if (!buffer) + rxvt_warn ("Memory allocation for icon hint failed, continuing without.\n"); + + if (!result) + rxvt_warn ("Icon image transformation to ARGB failed, continuing without.\n"); + } + } + else + rxvt_warn ("Loading image icon failed, continuing without.\n"); + } +# endif +#endif #if ENABLE_FRILLS if (mwmhints.flags) @@ -1547,11 +1583,6 @@ signal (SIGTTOU, SIG_IGN); #endif /* SIGTSTP */ - // unblock signals (signals are blocked by iom.C - sigset_t ss; - sigemptyset (&ss); - sigprocmask (SIG_SETMASK, &ss, 0); - /* command interpreter path */ if (argv) {