From 0af3b9cc0453d13fa109ec1394945c1d7a6a1acb Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Jan 2006 18:36:35 +0000 Subject: [PATCH] *** empty log message *** --- Changes | 6 ++++ src/command.C | 32 ++++++++++---------- src/init.C | 36 ++++++++++++----------- src/main.C | 27 +++++------------ src/rxvt.h | 9 ++---- src/rxvttoolkit.C | 75 ++++++++++++++++++++++------------------------- src/rxvttoolkit.h | 20 ++++++------- 7 files changed, 94 insertions(+), 111 deletions(-) diff --git a/Changes b/Changes index 9374b932..984d9174 100644 --- a/Changes +++ b/Changes @@ -16,6 +16,12 @@ THINK: struct passwd *userinfo; /* defined in pwd.h + if ((userinfo = getpwuid(g TODO: xim "how to" faq entry TODO: reorganize faq +TODO: support +xxx option syntax (e.g. -tint red +tint) +TODO: scrollstyle -next, raised/sunken, maybe extra pixels(?) w. halfshadow + + - changed interpretation of [alpha] colour prefix. + - further round trip eliminations in the !XFT case by remembering + the colour components. 7.5 Tue Jan 31 15:15:43 CET 2006 - further improvements to the careful mode detection, and font width diff --git a/src/command.C b/src/command.C index 51226831..3a6068f3 100644 --- a/src/command.C +++ b/src/command.C @@ -2542,7 +2542,7 @@ rxvt_term::check_our_parents () { int shade = rs[Rs_shade] ? atoi (rs[Rs_shade]) : 100; - rxvt_rgba c; + rgba c; pix_colors_focused [Color_tint].get (this, c); ShadeXImage (this, image, shade, c.r, c.g, c.b); @@ -2576,8 +2576,7 @@ rxvt_term::check_our_parents () for (i = 1; i < (int) (sizeof (parent) / sizeof (Window)); i++) { oldp = parent[i]; - XQueryTree (xdisp, parent[i - 1], &root, - &parent[i], &list, &n); + XQueryTree (xdisp, parent[i - 1], &root, &parent[i], &list, &n); XFree (list); if (parent[i] == display->root) @@ -2595,19 +2594,18 @@ rxvt_term::check_our_parents () n = 0; if (pchanged) - { - for (; n < (unsigned int)i; n++) - { - XGetWindowAttributes (xdisp, parent[n], &wattr); - if (wattr.depth != rootdepth || wattr.c_class == InputOnly) - { - n = (int) (sizeof (parent) / sizeof (Window)) + 1; - break; - } - } - } + for (; n < (unsigned int)i; n++) + { + XGetWindowAttributes (xdisp, parent[n], &wattr); + + if (wattr.depth != rootdepth || wattr.c_class == InputOnly) + { + n = (int) (sizeof (parent) / sizeof (Window)) + 1; + break; + } + } - if (n > (int) (sizeof (parent) / sizeof (parent[0]))) + if (n > (sizeof (parent) / sizeof (parent[0]))) { XSetWindowBackground (xdisp, parent[0], pix_colors_focused[Color_border]); XSetWindowBackground (xdisp, vt, pix_colors_focused[Color_bg]); @@ -3723,11 +3721,11 @@ rxvt_term::process_color_seq (int report, int color, const char *str, char resp) { if (str[0] == '?' && !str[1]) { - rxvt_rgba c; + rgba c; pix_colors_focused[color].get (this, c); #if XFT - if (c.a != rxvt_rgba::MAX_CC) + if (c.a != rgba::MAX_CC) tt_printf ("\033]%d;rgba:%04x/%04x/%04x/%04x%c", report, c.a, c.r, c.g, c.b, resp); else #endif diff --git a/src/init.C b/src/init.C index 2bec95fd..c299ba47 100644 --- a/src/init.C +++ b/src/init.C @@ -657,56 +657,58 @@ rxvt_term::Get_Colours () for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) { - rxvt_color xcol; + const char *name = rs[Rs_color + i]; - if (!rs[Rs_color + i]) + if (!name) continue; - if (!set_color (xcol, rs[Rs_color + i])) + rxvt_color xcol; + + if (!set_color (xcol, name)) { #ifndef XTERM_REVERSE_VIDEO if (i < 2 && OPTION (Opt_reverseVideo)) - rs[Rs_color + i] = def_colorName[!i]; + name = def_colorName [1 - i]; else #endif - rs[Rs_color + i] = def_colorName[i]; + name = def_colorName [i]; - if (!rs[Rs_color + i]) + if (!name) continue; - if (!set_color (xcol, rs[Rs_color + i])) + if (!set_color (xcol, name)) { switch (i) { case Color_fg: case Color_bg: - /* fatal: need bg/fg color */ rxvt_warn ("unable to get foreground/background colour, continuing.\n"); + name = ""; break; #ifndef NO_CURSORCOLOR case Color_cursor2: - xcol = pix_colors[Color_fg]; - break; -#endif /* ! NO_CURSORCOLOR */ +#endif case Color_pointer_fg: + name = rs[Rs_color + Color_fg]; xcol = pix_colors[Color_fg]; break; default: - xcol = pix_colors[Color_bg]; /* None */ + name = rs[Rs_color + Color_bg]; + xcol = pix_colors[Color_bg]; break; } } } pix_colors[i] = xcol; - SET_PIXCOLOR (i); + rs[Rs_color + i] = name; } #ifdef OFF_FOCUS_FADING if (rs[Rs_fade]) for (i = 0; i < (depth <= 2 ? 2 : NRS_COLORS); i++) { - rxvt_rgba c; + rgba c; pix_colors[Color_fade].get (this, c); pix_colors_focused[i].fade (this, atoi (rs[Rs_fade]), pix_colors_unfocused[i],c); } @@ -742,9 +744,9 @@ rxvt_term::Get_Colours () * xcol[2] == bot shadow */ xcol[1] = pix_colors[Color_scroll]; - xcol[0].set (this, rxvt_rgba (rxvt_rgba::MAX_CC, rxvt_rgba::MAX_CC, rxvt_rgba::MAX_CC)); + xcol[0].set (this, rgba (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC)); - rxvt_rgba c0, c1; + rgba c0, c1; xcol[0].get (this, c0); xcol[1].get (this, c1); @@ -753,7 +755,7 @@ rxvt_term::Get_Colours () /* topShadowColor */ if (!xcol[1].set (this, - rxvt_rgba ( + rgba ( min (c0.r, max (c1.r / 5, c1.r) * 7 / 5), min (c0.g, max (c1.g / 5, c1.g) * 7 / 5), min (c0.b, max (c1.b / 5, c1.b) * 7 / 5), diff --git a/src/main.C b/src/main.C index b1968056..4a374ed0 100644 --- a/src/main.C +++ b/src/main.C @@ -889,10 +889,14 @@ rxvt_term::set_window_color (int idx, const char *color) { rxvt_color xcol; int i; - + if (color == NULL || *color == '\0') return; + color = strdup (color); + allocated.push_back ((void *)color); + rs[Rs_color + idx] = color; + /* handle color aliases */ if (isdigit (*color)) { @@ -902,41 +906,24 @@ rxvt_term::set_window_color (int idx, const char *color) { /* bright colors */ i -= 8; pix_colors_focused[idx] = pix_colors_focused[minBrightCOLOR + i]; - SET_PIXCOLOR (idx); goto done; } if (i >= 0 && i <= 7) { /* normal colors */ pix_colors_focused[idx] = pix_colors_focused[minCOLOR + i]; - SET_PIXCOLOR (idx); goto done; } } - if (!set_color (xcol, color)) - return; - - /* XStoreColor (xdisp, display->cmap, XColor*); */ + set_color (xcol, color); /* * FIXME: should free colors here, but no idea how to do it so instead, * so just keep gobbling up the colormap */ -# if 0 - for (i = Color_Black; i <= Color_White; i++) - if (pix_colors[idx] == pix_colors[i]) - break; - if (i > Color_White) - { - /* fprintf (stderr, "XFreeColors: pix_colors [%d] = %lu\n", idx, pix_colors [idx]); */ - XFreeColors (xdisp, display->cmap, (pix_colors + idx), 1, - DisplayPlanes (xdisp, display->screen)); - } -# endif pix_colors_focused[idx] = xcol; - SET_PIXCOLOR (idx); /* XSetWindowAttributes attr; */ /* Cursor cursor; */ @@ -945,7 +932,7 @@ done: #if OFF_FOCUS_FADING if (rs[Rs_fade]) { - rxvt_rgba c; + rgba c; pix_colors [Color_fade].get (this, c); pix_colors_focused [idx].fade (this, atoi (rs[Rs_fade]), pix_colors_unfocused [idx], c); } diff --git a/src/rxvt.h b/src/rxvt.h index c2281719..11ee312a 100644 --- a/src/rxvt.h +++ b/src/rxvt.h @@ -590,9 +590,6 @@ enum colour_list { #define Color_Bits 7 // 0 .. maxTermCOLOR -#define NPIXCLR_SETS ((TOTAL_COLORS + 31) / 32) -#define NPIXCLR_BITS 32 - /* * Resource list */ @@ -733,8 +730,8 @@ enum { #define RS_SAME(a,b) (!(((a) ^ (b)) & ~RS_Careful)) -#define SET_PIXCOLOR(x) (pixcolor_set[(x) / NPIXCLR_BITS] |= (1 << ((x) % NPIXCLR_BITS))) -#define ISSET_PIXCOLOR(x) (pixcolor_set[(x) / NPIXCLR_BITS] & (1 << ((x) % NPIXCLR_BITS))) +#define PIXCOLOR_NAME(idx) rs[Rs_color + (idx)] +#define ISSET_PIXCOLOR(idx) (!!rs[Rs_color + (idx)]) #if ENABLE_STYLES # define FONTSET(style) fontset[GET_STYLE (style)] @@ -946,8 +943,6 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen { prev_nrow; /* screen: previous number of rows */ /* ---------- */ rend_t rstyle; -/* ---------- */ - uint32_t pixcolor_set[NPIXCLR_SETS]; /* ---------- */ #ifdef SELECTION_SCROLLING int scroll_selection_lines; diff --git a/src/rxvttoolkit.C b/src/rxvttoolkit.C index 755e8bb2..16c7ab56 100644 --- a/src/rxvttoolkit.C +++ b/src/rxvttoolkit.C @@ -562,7 +562,7 @@ refcache displays; ///////////////////////////////////////////////////////////////////////////// bool -rxvt_color::alloc (rxvt_screen *screen, const rxvt_rgba &color) +rxvt_color::alloc (rxvt_screen *screen, const rgba &color) { #if XFT XRenderPictFormat *format; @@ -579,10 +579,10 @@ rxvt_color::alloc (rxvt_screen *screen, const rxvt_rgba &color) c.color.blue = color.b; c.color.alpha = color.a; - c.pixel = ((color.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red ) - | ((color.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) - | ((color.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) - | ((color.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha); + c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red ) + | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green) + | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue ) + | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha); return true; } @@ -600,32 +600,30 @@ rxvt_color::alloc (rxvt_screen *screen, const rxvt_rgba &color) #else if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) { - p = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) - / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ) - | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) - / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask) - | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) - / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ); + c.red = color.g; + c.green = color.g; + c.blue = color.g; + c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) + / rgba::MAX_CC) << ctz (screen->visual->red_mask ) + | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) + / rgba::MAX_CC) << ctz (screen->visual->green_mask) + | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) + / rgba::MAX_CC) << ctz (screen->visual->blue_mask ); return true; } else { - XColor xc; + c.red = color.r; + c.green = color.g; + c.blue = color.b; - xc.red = color.r; - xc.green = color.g; - xc.blue = color.b; - - if (XAllocColor (screen->xdisp, screen->cmap, &xc)) - { - p = xc.pixel; - return true; - } + if (XAllocColor (screen->xdisp, screen->cmap, &c)) + return true; else - p = (color.r + color.g + color.b) > 128*3 - ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) - : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); + c.pixel = (color.r + color.g + color.b) > 128*3 + ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) + : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); } #endif @@ -635,19 +633,19 @@ rxvt_color::alloc (rxvt_screen *screen, const rxvt_rgba &color) bool rxvt_color::set (rxvt_screen *screen, const char *name) { - rxvt_rgba c; + rgba c; char eos; int skip; if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip)) { printf ("X %d\n", c.a); - c.a = lerp (0, rxvt_rgba::MAX_CC, c.a); + c.a = lerp (0, rgba::MAX_CC, c.a); name += skip; printf ("y %04x\n", c.a); } else - c.a = rxvt_rgba::MAX_CC; + c.a = rgba::MAX_CC; // parse the non-standard rgba format if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &c.r, &c.g, &c.b, &c.a, &eos)) @@ -674,7 +672,7 @@ rxvt_color::set (rxvt_screen *screen, const char *name) } bool -rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) +rxvt_color::set (rxvt_screen *screen, const rgba &color) { bool got = alloc (screen, color); @@ -690,6 +688,8 @@ rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) for (int i = 0; i < cmap_size; i++) colors [i].pixel = i; + // many kilobytes transfer per colour, but pseudocolor isn't worth + // many extra optimisations. XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); int diff = 0x7fffffffUL; @@ -711,7 +711,7 @@ rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n", // color.r, color.g, color.b, best->red, best->green, best->blue, diff); - got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue)); + got = alloc (screen, rgba (best->red, best->green, best->blue)); delete colors; } @@ -721,7 +721,7 @@ rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) } void -rxvt_color::get (rxvt_screen *screen, rxvt_rgba &color) +rxvt_color::get (rxvt_screen *screen, rgba &color) { #if XFT color.r = c.color.red; @@ -729,15 +729,10 @@ rxvt_color::get (rxvt_screen *screen, rxvt_rgba &color) color.b = c.color.blue; color.a = c.color.alpha; #else - XColor c; - - c.pixel = p; - XQueryColor (screen->xdisp, screen->cmap, &c); - color.r = c.red; color.g = c.green; color.b = c.blue; - color.a = rxvt_rgba::MAX_CC; + color.a = rgba::MAX_CC; #endif } @@ -747,19 +742,19 @@ rxvt_color::free (rxvt_screen *screen) #if XFT XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); #else - XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); + XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes); #endif } void -rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rxvt_rgba &to) +rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to) { - rxvt_rgba c; + rgba c; get (screen, c); result.set ( screen, - rxvt_rgba ( + rgba ( lerp (c.r, to.r, percent), lerp (c.g, to.g, percent), lerp (c.b, to.b, percent), diff --git a/src/rxvttoolkit.h b/src/rxvttoolkit.h index 6932b6ff..f358dcae 100644 --- a/src/rxvttoolkit.h +++ b/src/rxvttoolkit.h @@ -224,15 +224,15 @@ extern refcache displays; typedef unsigned long Pixel; -struct rxvt_rgba { +struct rgba { unsigned short r, g, b, a; enum { MIN_CC = 0x0000, MAX_CC = 0xffff }; - rxvt_rgba () + rgba () { } - rxvt_rgba (unsigned short r, unsigned short g, unsigned short b, unsigned short a = MAX_CC) + rgba (unsigned short r, unsigned short g, unsigned short b, unsigned short a = MAX_CC) : r(r), g(g), b(b), a(a) { } }; @@ -240,24 +240,24 @@ struct rxvt_rgba { struct rxvt_color { #if XFT XftColor c; - operator Pixel () const { return c.pixel; } #else - Pixel p; - operator Pixel () const { return p; } + XColor c; #endif + operator Pixel () const { return c.pixel; } + bool operator == (const rxvt_color &b) const { return Pixel (*this) == Pixel (b); } bool operator != (const rxvt_color &b) const { return Pixel (*this) != Pixel (b); } - bool alloc (rxvt_screen *screen, const rxvt_rgba &color); + bool alloc (rxvt_screen *screen, const rgba &color); void free (rxvt_screen *screen); - void get (rxvt_screen *screen, rxvt_rgba &color); + void get (rxvt_screen *screen, rgba &color); bool set (rxvt_screen *screen, const char *name); - bool set (rxvt_screen *screen, const rxvt_rgba &color); + bool set (rxvt_screen *screen, const rgba &color); - void fade (rxvt_screen *screen, int percent, rxvt_color &result, const rxvt_rgba &to = rxvt_rgba (0, 0, 0)); + void fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to = rgba (0, 0, 0)); }; #endif -- 2.34.1