repo: rxvt-unicode-sixel action: commit revision: path_from: revision_from: 8c4059c0cf0cbd25601426b377f51aead0ce8f75: path_to: revision_to:
commit 8c4059c0cf0cbd25601426b377f51aead0ce8f75 Author: Marc LehmannDate: Tue Jan 31 18:36:35 2006 +0000 *** empty log message *** diff --git a/Changes b/Changes
--- 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
--- 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
--- 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
--- 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
--- 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
--- a/src/rxvttoolkit.C +++ b/src/rxvttoolkit.C @@ -562,7 +562,7 @@ refcachedisplays; ///////////////////////////////////////////////////////////////////////////// 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
--- a/src/rxvttoolkit.h +++ b/src/rxvttoolkit.h @@ -224,15 +224,15 @@ extern refcachedisplays; 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
-----END OF PAGE-----