--- rxvt-unicode/src/init.C 2012/05/25 08:27:47 1.323 +++ rxvt-unicode/src/init.C 2016/07/14 05:33:26 1.348 @@ -13,10 +13,11 @@ * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications * Copyright (c) 2003-2008 Marc Lehmann + * Copyright (c) 2015 Emanuele Giaquinta * * 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 - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -44,6 +45,10 @@ #include +#ifdef HAVE_XMU +# include +#endif + #ifdef HAVE_XSETLOCALE # define X_LOCALE # include @@ -78,7 +83,7 @@ #include #include -static char * +static char * ecb_cold rxvt_network_display (const char *display) { char buffer[1024], *rval = NULL; @@ -148,6 +153,31 @@ } #endif +#define NULL_5 \ + NULL, \ + NULL, \ + NULL, \ + NULL, \ + NULL, + +#define NULL_10 \ + NULL_5 \ + NULL_5 + +#define NULL_40 \ + NULL_10 \ + NULL_10 \ + NULL_10 \ + NULL_10 + +#define NULL_50 \ + NULL_40 \ + NULL_10 + +#define NULL_100 \ + NULL_50 \ + NULL_50 + static const char *const def_colorName[] = { COLOR_FOREGROUND, @@ -253,6 +283,12 @@ "rgb:b9/b9/b9", "rgb:d0/d0/d0", "rgb:e7/e7/e7", + NULL_100 + NULL_40 + NULL, + NULL, + NULL, + NULL, #else // 256 xterm colours "rgb:00/00/00", @@ -495,6 +531,10 @@ "rgb:da/da/da", "rgb:e4/e4/e4", "rgb:ee/ee/ee", + NULL_100 + NULL_100 + NULL_40 + NULL_5 #endif #ifndef NO_CURSORCOLOR @@ -521,9 +561,6 @@ #ifdef RXVT_SCROLLBAR COLOR_SCROLLTROUGH, #endif -#if ENABLE_TRANSPARENCY - NULL, -#endif #if OFF_FOCUS_FADING "rgb:00/00/00", #endif @@ -563,6 +600,14 @@ set_option (Opt_buffered); } +#if ENABLE_PERL +static void +rxvt_perl_parse_resource (rxvt_term *term, const char *k, const char *v) +{ + rxvt_perl.parse_resource (term, k, false, false, 0, v); +} +#endif + /*----------------------------------------------------------------------*/ const char ** rxvt_term::init_resources (int argc, const char *const *argv) @@ -590,9 +635,11 @@ set (display); extract_resources (); -#if XFT - if (rs[Rs_depth]) - select_visual (strtol (rs[Rs_depth], 0, 0)); +#if ENABLE_FRILLS + if (rs[Rs_visual]) + select_visual (strtol (rs[Rs_visual], 0, 0)); + else if (rs[Rs_depth]) + select_depth (strtol (rs[Rs_depth], 0, 0)); #endif for (int i = NUM_RESOURCES; i--; ) @@ -608,6 +655,7 @@ || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) { rxvt_perl.init (this); + enumerate_resources (rxvt_perl_parse_resource); HOOK_INVOKE ((this, HOOK_INIT, DT_END)); } #endif @@ -660,6 +708,13 @@ pointerBlankDelay = 2; #endif + if (rs[Rs_multiClickTime] && (i = atoi (rs[Rs_multiClickTime])) >= 0) + multiClickTime = i; + else + multiClickTime = 500; + + cursor_type = option (Opt_cursorUnderline) ? 1 : 0; + /* no point having a scrollbar without having any scrollback! */ if (!saveLines) set_option (Opt_scrollBar, 0); @@ -741,6 +796,10 @@ this->argv = argv; this->envv = envv; + env = new char *[this->envv->size ()]; + for (int i = 0; i < this->envv->size (); i++) + env[i] = this->envv->at (i); + init2 (argv->size () - 1, argv->begin ()); } @@ -768,7 +827,7 @@ { SET_R (this); set_locale (""); - set_environ (envv); // a few things in X do not call setlocale :( + set_environ (env); // a few things in X do not call setlocale :( init_vars (); @@ -793,11 +852,6 @@ pty = ptytty::create (); - // must be called before create_windows, because the latter may call set_icon -#ifdef HAVE_PIXBUF - g_type_init (); -#endif - create_windows (argc, argv); init_xlocale (); @@ -810,31 +864,6 @@ if (option (Opt_scrollBar)) scrollBar.resize (); /* create and map scrollbar */ -#ifdef HAVE_BG_PIXMAP - { - bg_init (); - -#ifdef ENABLE_TRANSPARENCY - if (option (Opt_transparent)) - { - bg_set_transparent (); - - if (rs [Rs_blurradius]) - bg_set_blur (rs [Rs_blurradius]); - - if (ISSET_PIXCOLOR (Color_tint)) - bg_set_tint (pix_colors_focused [Color_tint]); - - if (rs [Rs_shade]) - bg_set_shade (rs [Rs_shade]); - - bg_set_root_pixmap (); - XSelectInput (dpy, display->root, PropertyChangeMask); - rootwin_ev.start (display, display->root); - } -#endif - } -#endif #if ENABLE_PERL rootwin_ev.start (display, display->root); @@ -971,7 +1000,7 @@ void rxvt_term::set_locale (const char *locale) { - set_environ (envv); + set_environ (env); free (this->locale); this->locale = setlocale (LC_CTYPE, locale); @@ -1009,9 +1038,9 @@ void rxvt_term::init_xlocale () { - set_environ (envv); + set_environ (env); -#ifdef USE_XIM +#if USE_XIM if (!locale) rxvt_warn ("setting locale failed, continuing without locale support.\n"); else @@ -1071,7 +1100,7 @@ /*----------------------------------------------------------------------*/ void -rxvt_term::get_colours () +rxvt_term::get_colors () { int i; @@ -1079,61 +1108,9 @@ pix_colors = pix_colors_focused; #endif - for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) - { - const char *name = rs[Rs_color + i]; - - if (!name) - continue; - - rxvt_color xcol; - - if (!set_color (xcol, name)) - { -#ifndef XTERM_REVERSE_VIDEO - if (i < 2 && option (Opt_reverseVideo)) - name = def_colorName [1 - i]; - else -#endif - name = def_colorName [i]; - - if (!name) - continue; - - if (!set_color (xcol, name)) - { - switch (i) - { - case Color_fg: - case Color_bg: - rxvt_warn ("unable to get foreground/background colour, continuing.\n"); - name = ""; - break; -#ifndef NO_CURSORCOLOR - case Color_cursor2: -#endif - case Color_pointer_fg: - name = rs[Rs_color + Color_fg]; - xcol.set (this, name); - break; - default: - name = rs[Rs_color + Color_bg]; - xcol.set (this, name); - break; - } - } - } - - pix_colors[i] = xcol; - rs[Rs_color + i] = name; - } - - if (depth <= 2) - { - if (!rs[Rs_color + Color_pointer_fg]) alias_color (Color_pointer_fg, Color_fg); - if (!rs[Rs_color + Color_pointer_bg]) alias_color (Color_pointer_bg, Color_bg); - if (!rs[Rs_color + Color_border] ) alias_color (Color_border, Color_fg); - } + for (i = 0; i < NRS_COLORS; i++) + if (const char *name = rs[Rs_color + i]) + set_color (pix_colors [i], name); /* * get scrollBar shadow colors @@ -1142,35 +1119,25 @@ * from the fvwm window manager. */ #ifdef RXVT_SCROLLBAR - if (depth <= 2) - { - /* Monochrome */ - alias_color (Color_scroll, Color_fg); - alias_color (Color_topShadow, Color_bg); - alias_color (Color_bottomShadow, Color_bg); - } - else - { - pix_colors [Color_scroll].fade (this, 50, pix_colors [Color_bottomShadow]); + pix_colors [Color_scroll].fade (this, 50, pix_colors [Color_bottomShadow]); - rgba cscroll; - pix_colors [Color_scroll].get (cscroll); + rgba cscroll; + pix_colors [Color_scroll].get (cscroll); - /* topShadowColor */ - if (!pix_colors[Color_topShadow].set (this, - rgba ( - min ((int)rgba::MAX_CC, max (cscroll.r / 5, cscroll.r) * 7 / 5), - min ((int)rgba::MAX_CC, max (cscroll.g / 5, cscroll.g) * 7 / 5), - min ((int)rgba::MAX_CC, max (cscroll.b / 5, cscroll.b) * 7 / 5), - cscroll.a) - )) - alias_color (Color_topShadow, Color_White); - } + /* topShadowColor */ + if (!pix_colors[Color_topShadow].set (this, + rgba ( + min ((int)rgba::MAX_CC, max (cscroll.r / 5, cscroll.r) * 7 / 5), + min ((int)rgba::MAX_CC, max (cscroll.g / 5, cscroll.g) * 7 / 5), + min ((int)rgba::MAX_CC, max (cscroll.b / 5, cscroll.b) * 7 / 5), + cscroll.a) + )) + alias_color (Color_topShadow, Color_White); #endif #ifdef OFF_FOCUS_FADING - for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) - update_fade_color (i); + for (i = 0; i < NRS_COLORS; i++) + update_fade_color (i, true); #endif } @@ -1229,7 +1196,7 @@ if (kc[k] == 0) break; - switch (XKeycodeToKeysym (dpy, kc[k], 0)) + switch (rxvt_XKeycodeToKeysym (dpy, kc[k], 0)) { case XK_Num_Lock: ModNumLockMask = modmasks[i - 1]; @@ -1284,7 +1251,7 @@ void rxvt_term::set_icon (const char *file) { -#ifdef HAVE_PIXBUF +#if HAVE_PIXBUF && ENABLE_EWMH GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (file, NULL); if (!pixbuf) { @@ -1359,7 +1326,7 @@ dLocal (Display *, dpy); /* grab colors before netscape does */ - get_colours (); + get_colors (); if (!set_fonts ()) rxvt_fatal ("unable to load base fontset, please specify a valid one using -fn, aborting.\n"); @@ -1422,7 +1389,9 @@ wmHint.flags = InputHint | StateHint | WindowGroupHint; wmHint.input = True; - wmHint.initial_state = option (Opt_iconic) ? IconicState : NormalState; + wmHint.initial_state = option (Opt_iconic) ? IconicState + : option (Opt_dockapp) ? WithdrawnState + : NormalState; wmHint.window_group = top; XmbSetWMProperties (dpy, top, NULL, NULL, (char **)argv, argc, @@ -1434,9 +1403,7 @@ */ if (rs [Rs_iconfile]) - { - set_icon (rs [Rs_iconfile]); - } + set_icon (rs [Rs_iconfile]); #endif #if ENABLE_FRILLS @@ -1480,7 +1447,18 @@ termwin_ev.start (display, top); /* vt cursor: Black-on-White is standard, but this is more popular */ - TermWin_cursor = XCreateFontCursor (dpy, XC_xterm); + unsigned int shape = XC_xterm; + +#ifdef HAVE_XMU + if (rs[Rs_pointerShape]) + { + int stmp = XmuCursorNameToIndex (rs[Rs_pointerShape]); + if (stmp >= 0) + shape = stmp; + } +#endif + + TermWin_cursor = XCreateFontCursor (dpy, shape); /* the vt window */ vt = XCreateSimpleWindow (dpy, top, @@ -1522,7 +1500,7 @@ #endif pointer_unblank (); - scr_recolour (); + scr_recolor (); } /*----------------------------------------------------------------------*/