summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authormrdotx2021-05-16 20:52:25 +0200
committermrdotx2021-05-16 20:52:25 +0200
commita14718eaceb662057aa3d636b2406e392a1e7074 (patch)
tree832876799eccf0f2a89d6eef31535d7222822baa
parent0243ece8b90ba561d926ccd6fdaa38b84e9a93ec (diff)
downloadaur-a14718eaceb662057aa3d636b2406e392a1e7074.tar.gz
update to 9.26
- 24-bit-color.patch rewritten to work with version 9.26 - removed perl-segfault.patch, included in 9.26 - removed sgr-mouse-mode.patch, included in 9.26
-rw-r--r--.SRCINFO21
-rw-r--r--24-bit-color.patch723
-rw-r--r--PKGBUILD61
-rw-r--r--enable-wide-glyphs.patch94
-rw-r--r--improve-font-rendering.patch104
-rw-r--r--perl-segfault.patch33
-rw-r--r--sgr-mouse-mode.patch90
7 files changed, 479 insertions, 647 deletions
diff --git a/.SRCINFO b/.SRCINFO
index e75d77732646..7d80109dafed 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,12 +1,13 @@
pkgbase = rxvt-unicode-truecolor-wide-glyphs
- pkgdesc = Unicode enabled rxvt-clone terminal emulator (urxvt) with true color and enhanced glyphs support
- pkgver = 9.22
- pkgrel = 4
+ pkgdesc = Unicode enabled rxvt-clone terminal emulator (urxvt) with true color, enhanced glyphs and improved font rendering support
+ pkgver = 9.26
+ pkgrel = 1
url = http://software.schmorp.de/pkg/rxvt-unicode.html
arch = i686
arch = x86_64
license = GPL
depends = libxft
+ depends = libxt
depends = perl
depends = startup-notification
optdepends = gtk2-perl: to use the urxvt-tabbed
@@ -19,28 +20,24 @@ pkgbase = rxvt-unicode-truecolor-wide-glyphs
conflicts = urxvt-resize-font
conflicts = urxvt-perls
conflicts = urxvt-perls-git
- source = http://dist.schmorp.de/rxvt-unicode/rxvt-unicode-9.22.tar.bz2
+ source = http://dist.schmorp.de/rxvt-unicode/rxvt-unicode-9.26.tar.bz2
source = urxvt.desktop
source = urxvtc.desktop
source = urxvt-tabbed.desktop
source = resize-font
source = keyboard-select
- source = sgr-mouse-mode.patch
source = 24-bit-color.patch
source = enable-wide-glyphs.patch
source = improve-font-rendering.patch
- source = perl-segfault.patch
- sha1sums = e575b869782fbfed955f84f48b204ec888d91ba1
+ sha1sums = d325d8cdea6bcb8e0b8b219b8451bf5c690b6c62
sha1sums = b5a4507f85ebb7bac589db2e07d9bc40106720d9
sha1sums = 62c4ffecfce6967def394dd4d418b68652372ea2
sha1sums = cd204d608d114d39c80331efe0af0231ad6b7e18
sha1sums = a61366659c73bd551fa99a8415bb71e033897598
sha1sums = 9883d0c31b45f8521829ea6a2041f2e9eb7abe6a
- sha1sums = dfbc8729c545105eff21e20ef3a4a3841a68a192
- sha1sums = 9f5db305863b17175e72f9e2d4a78d0d7f25fd34
- sha1sums = d9f3b52b273d13fbd4089a7869ab2e70bf190bc9
- sha1sums = 2f976cfbb4ae092d331e169b56ec6423b198f462
- sha1sums = 361f4649596342d07311c2590b809b85b3a918ee
+ sha1sums = 560097c0d6377461fcbe4c109f3113a6bcb38982
+ sha1sums = c5ee4a50902d8c8d278938b080464a16d2c6af56
+ sha1sums = 772b62071d73c0021adf334f037b95ef13d34317
pkgname = rxvt-unicode-truecolor-wide-glyphs
diff --git a/24-bit-color.patch b/24-bit-color.patch
index b3b587f77bcf..d66181e9dcb0 100644
--- a/24-bit-color.patch
+++ b/24-bit-color.patch
@@ -1,43 +1,9 @@
---- README.configure
-+++ README.configure
-@@ -9,8 +9,8 @@ CONFIGURE OPTIONS
-
- --enable-everything
- Add (or remove) support for all non-multichoice options listed in
-- "./configure --help", except for "--enable-assert" and
-- "--enable-256-color".
-+ "./configure --help", except for "--enable-assert",
-+ "--enable-256-color" and "--enable-24-bit-color".
-
- You can specify this and then disable options you do not like by
- *following* this with the appropriate "--disable-..." arguments, or
-@@ -251,6 +251,20 @@ CONFIGURE OPTIONS
- dramatically when more than six fonts are in use by a terminal
- instance.
-
-+ --enable-24-bit-color (default: off)
-+ Enable use of 24-bit colors through
-+ SGR 38 ; 2 ; R ; G ; B m
-+ SGR 48 ; 2 ; R ; G ; B m
-+
-+ This switch should break termcap/terminfo compatibility to
-+ "TERM=rxvt-unicode-256color", and consequently set "TERM" to
-+ "rxvt-unicode-24bit" by default but there is no termcap/terminfo
-+ for 24-bit color support
-+
-+ It also results in higher memory usage and can slow down urxvt
-+ dramatically when more than six fonts are in use by a terminal
-+ instance.
-+
- --with-name=NAME (default: urxvt)
- Set the basename for the installed binaries, resulting in "urxvt",
- "urxvtd" etc.). Specify "--with-name=rxvt" to replace with "rxvt".
--- config.h.in
+++ config.h.in
-@@ -380,6 +380,9 @@
+@@ -395,6 +395,9 @@
/* Define if you want 256-color support */
#undef USE_256_COLORS
-
+
+/* Define if you want 24-bit color support */
+#undef USE_24_BIT_COLOR
+
@@ -46,7 +12,7 @@
# undef _ALL_SOURCE
--- configure
+++ configure
-@@ -713,6 +713,7 @@ enable_everything
+@@ -740,6 +740,7 @@
enable_assert
enable_warnings
enable_256_color
@@ -54,7 +20,7 @@
enable_unicode3
enable_combining
enable_xft
-@@ -1386,6 +1387,7 @@ Optional Features:
+@@ -1421,6 +1422,7 @@
--enable-assert enable assertions
--enable-warnings turn on g++ warnings
--enable-256-color enable 256-color support
@@ -62,13 +28,14 @@
--enable-unicode3 use 21 instead of 16 bits to represent unicode characters
--enable-combining enable composition of base and combining characters
--enable-xft enable xft support on systems that have it
-@@ -4820,6 +4822,20 @@ $as_echo "#define USE_256_COLORS 1" >>confdefs.h
-
+@@ -5283,6 +5285,21 @@
+
fi
-
+
+support_24_bit_color=no
+# Check whether --enable-24-bit-color was given.
-+if test "${enable_24_bit_color+set}" = set; then :
++if test ${enable_24_bit_color+y}
++then :
+ enableval=$enable_24_bit_color; if test x$enableval = xyes; then
+ support_24_bit_color=yes
+ fi
@@ -76,19 +43,19 @@
+
+if test x$support_24_bit_color = xyes; then
+
-+$as_echo "#define USE_24_BIT_COLOR 1" >>confdefs.h
++printf "%s\n" "#define USE_24_BIT_COLOR 1" >>confdefs.h
+
+fi
+
# Check whether --enable-unicode3 was given.
- if test "${enable_unicode3+set}" = set; then :
- enableval=$enable_unicode3; if test x$enableval = xyes -o x$enableval = xno; then
+ if test ${enable_unicode3+y}
+ then :
--- configure.ac
+++ configure.ac
-@@ -201,6 +201,16 @@ if test x$support_256_color = xyes; then
+@@ -203,6 +203,16 @@
AC_DEFINE(USE_256_COLORS, 1, Define if you want 256-color support)
fi
-
+
+support_24_bit_color=no
+AC_ARG_ENABLE(24-bit-color,
+ [ --enable-24-bit-color enable 24-bit color support],
@@ -102,44 +69,49 @@
AC_ARG_ENABLE(unicode3,
[ --enable-unicode3 use 21 instead of 16 bits to represent unicode characters],
[if test x$enableval = xyes -o x$enableval = xno; then
---- src/background.C
-+++ src/background.C
-@@ -312,7 +312,7 @@ rxvt_term::render_image (rxvt_image &image)
- img->draw (bg_img, PictOpOver, image.alpha * 1. / 0xffff);
-
- XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
-- img->convert_format (format, pix_colors [Color_bg])->replace (img);
-+ img->convert_format (format, lookup_color(Color_bg, pix_colors))->replace (img);
-
- delete bg_img;
- bg_img = img;
-@@ -471,7 +471,7 @@ rxvt_term::render_root_image ()
- }
-
- XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
-- img->convert_format (format, pix_colors [Color_bg])->replace (img);
-+ img->convert_format (format, lookup_color(Color_bg, pix_colors))->replace (img);
-
- delete bg_img;
- bg_img = img;
-@@ -520,7 +520,7 @@ rxvt_term::bg_init ()
- root_effects.set_blur (rs [Rs_blurradius]);
-
- if (ISSET_PIXCOLOR (Color_tint))
-- root_effects.set_tint (pix_colors_focused [Color_tint]);
-+ root_effects.set_tint (lookup_color(Color_tint, pix_colors_focused));
-
- if (rs [Rs_shade])
- root_effects.set_shade (rs [Rs_shade]);
+--- README.configure
++++ README.configure
+@@ -9,8 +9,8 @@
+
+ --enable-everything
+ Add (or remove) support for all non-multichoice options listed in
+- "./configure --help", except for "--enable-assert" and
+- "--enable-256-color".
++ "./configure --help", except for "--enable-assert",
++ "--enable-256-color" and "--enable-24-bit-color".
+
+ You can specify this and then disable options you do not like by
+ *following* this with the appropriate "--disable-..." arguments, or
+@@ -251,6 +251,20 @@
+
+ It also results in higher memory usage and can slow down urxvt
+ dramatically when more than six fonts are in use by a terminal
++ instance.
++
++ --enable-24-bit-color (default: off)
++ Enable use of 24-bit colors through
++ SGR 38 ; 2 ; R ; G ; B m
++ SGR 48 ; 2 ; R ; G ; B m
++
++ This switch should break termcap/terminfo compatibility to
++ "TERM=rxvt-unicode-256color", and consequently set "TERM" to
++ "rxvt-unicode-24bit" by default but there is no termcap/terminfo
++ for 24-bit color support
++
++ It also results in higher memory usage and can slow down urxvt
++ dramatically when more than six fonts are in use by a terminal
+ instance.
+
+ --with-name=NAME (default: urxvt)
--- src/command.C
+++ src/command.C
-@@ -1843,11 +1843,11 @@ rxvt_term::update_fade_color (unsigned int idx, bool first_time)
+@@ -1824,11 +1824,11 @@
if (rs[Rs_fade])
{
if (!first_time)
- pix_colors_focused [idx].free (this);
+ lookup_color(idx, pix_colors_focused).free (this);
-
+
rgba c;
- pix_colors [Color_fade].get (c);
- pix_colors_focused [idx].fade (this, atoi (rs[Rs_fade]), pix_colors_unfocused [idx], c);
@@ -148,38 +120,34 @@
}
#endif
}
-@@ -3334,7 +3334,7 @@ rxvt_term::process_color_seq (int report, int color, const char *str, char resp)
- if (str[0] == '?' && !str[1])
- {
+@@ -3411,7 +3411,7 @@
+ return;
+
rgba c;
- pix_colors_focused[color].get (c);
+ lookup_color(color, pix_colors_focused).get (c);
-
+ color -= minCOLOR;
+
#if XFT
- if (c.a != rgba::MAX_CC)
-@@ -3482,7 +3482,7 @@ rxvt_term::process_xterm_seq (int op, char *str, char resp)
- bool changed = false;
-
- if (ISSET_PIXCOLOR (Color_tint))
-- changed = root_effects.set_tint (pix_colors_focused [Color_tint]);
-+ changed = root_effects.set_tint (lookup_color(Color_tint, pix_colors_focused));
-
- if (changed)
- update_background ();
-@@ -3876,7 +3876,7 @@ rxvt_term::process_sgr_mode (unsigned int nargs, const int *arg)
+@@ -3906,7 +3906,7 @@
{
unsigned int i;
short rendset;
- int rendstyle;
+ rend_t rendstyle;
-
+
if (nargs == 0)
{
-@@ -3969,6 +3969,14 @@ rxvt_term::process_sgr_mode (unsigned int nargs, const int *arg)
- scr_color ((unsigned int) (minCOLOR + arg[i + 2]), Color_fg);
- i += 2;
- }
+@@ -4012,6 +4012,20 @@
+ break;
+
+ case 38: // set fg color, ISO 8613-6
+#if USE_24_BIT_COLOR
++ if (nargs > i + 2 && arg[i + 1] == 5)
++ {
++ scr_color ((unsigned int) (minCOLOR + arg[i + 2]), Color_fg);
++ i += 2;
++ }
+ else if (nargs > i + 4 && arg[i + 1] == 2)
+ {
+ unsigned int r = arg[i + 2], g = arg[i + 3], b = arg[i + 4];
@@ -187,64 +155,65 @@
+ i += 4;
+ }
+#endif
- break;
- case 39: /* default fg */
- scr_color (Color_fg, Color_fg);
-@@ -3990,6 +3998,14 @@ rxvt_term::process_sgr_mode (unsigned int nargs, const int *arg)
- scr_color ((unsigned int) (minCOLOR + arg[i + 2]), Color_bg);
- i += 2;
- }
++ break;
+ case 48: // set bg color, ISO 8613-6
+ {
+ unsigned int fgbg = arg[i] == 38 ? Color_fg : Color_bg;
+@@ -4024,6 +4038,14 @@
+
+ scr_color (idx, fgbg);
+ }
+#if USE_24_BIT_COLOR
-+ else if (nargs > i + 4 && arg[i + 1] == 2)
-+ {
-+ unsigned int r = arg[i + 2], g = arg[i + 3], b = arg[i + 4];
-+ scr_color_rgb (r, g, b, Color_bg);
-+ i += 4;
-+ }
++ else if (nargs > i + 4 && arg[i + 1] == 2)
++ {
++ unsigned int r = arg[i + 2], g = arg[i + 3], b = arg[i + 4];
++ scr_color_rgb (r, g, b, Color_bg);
++ i += 4;
++ }
+#endif
- break;
- case 49: /* default bg */
- scr_color (Color_bg, Color_bg);
+ else if (nargs > i + 4 && arg[i + 1] == 2)
+ {
+ unsigned int r = arg[i + 2];
--- src/init.C
+++ src/init.C
-@@ -1068,7 +1068,7 @@ rxvt_term::get_colors ()
-
+@@ -1110,7 +1110,7 @@
+
for (i = 0; i < NRS_COLORS; i++)
if (const char *name = rs[Rs_color + i])
- set_color (pix_colors [i], name);
+ set_color (lookup_color(i, pix_colors), name);
-
+
/*
* get scrollBar shadow colors
-@@ -1077,13 +1077,13 @@ rxvt_term::get_colors ()
+@@ -1119,13 +1119,13 @@
* from the fvwm window manager.
*/
#ifdef RXVT_SCROLLBAR
- pix_colors [Color_scroll].fade (this, 50, pix_colors [Color_bottomShadow]);
+ lookup_color(Color_scroll, pix_colors).fade (this, 50, lookup_color(Color_bottomShadow, pix_colors));
-
+
rgba cscroll;
- pix_colors [Color_scroll].get (cscroll);
+ lookup_color(Color_scroll, pix_colors).get (cscroll);
-
+
/* topShadowColor */
- if (!pix_colors[Color_topShadow].set (this,
+ if (!lookup_color(Color_topShadow, pix_colors).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),
-@@ -1325,8 +1325,8 @@ rxvt_term::create_windows (int argc, const char *const *argv)
+@@ -1367,8 +1367,8 @@
window_calc (0, 0);
-
+
/* sub-window placement & size in rxvt_term::resize_all_windows () */
- attributes.background_pixel = pix_colors_focused [Color_border];
- attributes.border_pixel = pix_colors_focused [Color_border];
+ attributes.background_pixel = lookup_color(Color_border, pix_colors_focused);
+ attributes.border_pixel = lookup_color(Color_border, pix_colors_focused);
attributes.colormap = cmap;
-
+
top = XCreateWindow (dpy, parent,
-@@ -1412,8 +1412,8 @@ rxvt_term::create_windows (int argc, const char *const *argv)
+@@ -1465,8 +1465,8 @@
window_vt_x, window_vt_y,
vt_width, vt_height,
0,
@@ -252,23 +221,23 @@
- pix_colors_focused[Color_bg]);
+ lookup_color(Color_fg, pix_colors_focused),
+ lookup_color(Color_bg, pix_colors_focused));
-
+
attributes.bit_gravity = NorthWestGravity;
XChangeWindowAttributes (dpy, vt, CWBitGravity, &attributes);
-@@ -1430,8 +1430,8 @@ rxvt_term::create_windows (int argc, const char *const *argv)
+@@ -1483,8 +1483,8 @@
vt_ev.start (display, vt);
-
+
/* graphics context for the vt window */
- gcvalue.foreground = pix_colors[Color_fg];
- gcvalue.background = pix_colors[Color_bg];
+ gcvalue.foreground = lookup_color(Color_fg, pix_colors);
+ gcvalue.background = lookup_color(Color_bg, pix_colors);
gcvalue.graphics_exposures = 0;
-
+
gc = XCreateGC (dpy, vt,
--- src/main.C
+++ src/main.C
-@@ -254,10 +254,10 @@ rxvt_term::~rxvt_term ()
+@@ -248,10 +248,10 @@
for (int i = 0; i < TOTAL_COLORS; i++)
if (ISSET_PIXCOLOR (i))
{
@@ -280,38 +249,38 @@
+ lookup_color(i, pix_colors_unfocused).free (this);
#endif
}
-
-@@ -971,8 +971,8 @@ rxvt_term::set_window_color (int idx, const char *color)
+
+@@ -965,8 +965,8 @@
}
}
-
+
- pix_colors_focused[idx].free (this);
- set_color (pix_colors_focused[idx], color);
+ lookup_color(idx, pix_colors_focused).free (this);
+ set_color (lookup_color(idx, pix_colors_focused), color);
-
+
done:
/*TODO: handle Color_BD, scrollbar background, etc. */
-@@ -989,12 +989,12 @@ rxvt_term::recolor_cursor ()
+@@ -983,12 +983,12 @@
XColor fg, bg;
-
+
(ISSET_PIXCOLOR (Color_pointer_fg)
- ? pix_colors_focused[Color_pointer_fg]
- : pix_colors_focused[Color_fg]).get (fg);
+ ? lookup_color(Color_pointer_fg, pix_colors_focused)
+ : lookup_color(Color_fg, pix_colors_focused)).get (fg);
-
+
(ISSET_PIXCOLOR (Color_pointer_bg)
- ? pix_colors_focused[Color_pointer_bg]
- : pix_colors_focused[Color_bg]).get (bg);
+ ? lookup_color(Color_pointer_bg, pix_colors_focused)
+ : lookup_color(Color_bg, pix_colors_focused)).get (bg);
-
+
XRecolorCursor (dpy, TermWin_cursor, &fg, &bg);
}
-@@ -1013,14 +1013,14 @@ rxvt_term::get_colorfgbg ()
+@@ -1007,14 +1007,14 @@
char *env_colorfgbg;
-
+
for (i = Color_Black; i <= Color_White; i++)
- if (pix_colors[Color_fg] == pix_colors[i])
+ if (lookup_color(Color_fg, pix_colors) == lookup_color(i, pix_colors))
@@ -319,14 +288,14 @@
sprintf (fstr, "%d", i - Color_Black);
break;
}
-
+
for (i = Color_Black; i <= Color_White; i++)
- if (pix_colors[Color_bg] == pix_colors[i])
+ if (lookup_color(Color_bg, pix_colors) == lookup_color(i, pix_colors))
{
sprintf (bstr, "%d", i - Color_Black);
- #if BG_IMAGE_FROM_FILE
-@@ -1049,8 +1049,8 @@ rxvt_term::set_color (rxvt_color &color, const char *name)
+ #if HAVE_IMG
+@@ -1043,8 +1043,8 @@
void
rxvt_term::alias_color (int dst, int src)
{
@@ -335,9 +304,9 @@
+ lookup_color(dst, pix_colors).free (this);
+ lookup_color(dst, pix_colors).set (this, rs[Rs_color + dst] = rs[Rs_color + src]);
}
-
- /* -------------------------------------------------------------------- *
-@@ -1188,8 +1188,8 @@ rxvt_term::set_widthheight (unsigned int newwidth, unsigned int newheight)
+
+ #ifdef SMART_RESIZE
+@@ -1198,8 +1198,8 @@
void
rxvt_term::im_set_color (unsigned long &fg, unsigned long &bg)
{
@@ -346,11 +315,128 @@
+ fg = lookup_color(Color_fg, pix_colors);
+ bg = lookup_color(Color_bg, pix_colors);
}
-
+
void
+--- src/rxvtfont.C
++++ src/rxvtfont.C
+@@ -243,20 +243,20 @@
+
+ # ifdef HAVE_IMG
+ if (term->bg_img
+- && !term->pix_colors[color].is_opaque ()
++ && !term->lookup_color(color, term->pix_colors).is_opaque ()
+ && ((dst = XftDrawPicture (d))))
+ {
+ XClearArea (disp, d, x, y, w, h, false);
+
+- Picture solid_color_pict = XftDrawSrcPicture (d, &term->pix_colors[color].c);
++ Picture solid_color_pict = XftDrawSrcPicture (d, &term->lookup_color(color, term->pix_colors).c);
+ XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, x, y, w, h);
+ }
+ else
+ # endif
+- XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h);
++ XftDrawRect (d, &term->lookup_color(color, term->pix_colors).c, x, y, w, h);
+
+ #else
+- XSetForeground (disp, gc, term->pix_colors[color]);
++ XSetForeground (disp, gc, term->lookup_color(color, term->pix_colors));
+ XFillRectangle (disp, d, gc, x, y, w, h);
+ #endif
+ }
+@@ -342,7 +342,7 @@
+
+ clear_rect (d, x, y, term->fwidth * len, term->fheight, bg);
+
+- XSetForeground (disp, gc, term->pix_colors[fg]);
++ XSetForeground (disp, gc, term->lookup_color(fg, term->pix_colors));
+
+ while (len)
+ {
+@@ -1053,7 +1053,7 @@
+ int base = ascent; // sorry, incorrect: term->fbase;
+
+ XGCValues v;
+- v.foreground = term->pix_colors[fg];
++ v.foreground = term->lookup_color(fg, term->pix_colors);
+ v.font = f->fid;
+
+ if (enc2b)
+@@ -1062,7 +1062,7 @@
+
+ if (bg == Color_bg && !slow)
+ {
+- v.background = term->pix_colors[bg];
++ v.background = term->lookup_color(bg, term->pix_colors);
+ XChangeGC (disp, gc, GCForeground | GCBackground | GCFont, &v);
+ XDrawImageString16 (disp, d, gc, x, y + base, xc, len);
+ }
+@@ -1094,7 +1094,7 @@
+
+ if (bg == Color_bg && !slow)
+ {
+- v.background = term->pix_colors[bg];
++ v.background = term->lookup_color(bg, term->pix_colors);
+ XChangeGC (disp, gc, GCForeground | GCBackground | GCFont, &v);
+ XDrawImageString (disp, d, gc, x, y + base, xc, len);
+ }
+@@ -1417,7 +1417,7 @@
+
+ if (term->bg_img
+ && (bg == Color_transparent || bg == Color_bg
+- || (bg >= 0 && !term->pix_colors[bg].is_opaque () && ((dst = XftDrawPicture (d2))))))
++ || (bg >= 0 && !term->lookup_color(bg, term->pix_colors).is_opaque () && ((dst = XftDrawPicture (d2))))))
+ {
+ int src_x = x, src_y = y;
+
+@@ -1454,7 +1454,7 @@
+
+ if (dst)
+ {
+- Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c);
++ Picture solid_color_pict = XftDrawSrcPicture (d2, &term->lookup_color(bg, term->pix_colors).c);
+
+ // dst can only be set when bg >= 0
+ XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h);
+@@ -1462,9 +1462,9 @@
+ }
+ else
+ #endif
+- XftDrawRect (d2, &term->pix_colors[bg >= 0 ? bg : Color_bg].c, 0, 0, w, h);
++ XftDrawRect (d2, &term->lookup_color(bg >= 0 ? bg : Color_bg, term->pix_colors).c, 0, 0, w, h);
+
+- XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);
++ XftDrawGlyphSpec (d2, &term->lookup_color(fg, term->pix_colors).c, f, enc, ep - enc);
+ XCopyArea (disp, d2, d, gc, 0, 0, w, h, x, y);
+ }
+ else
+@@ -1473,7 +1473,7 @@
+ else
+ {
+ clear_rect (d, x, y, w, h, bg);
+- XftDrawGlyphSpec (d, &term->pix_colors[fg].c, f, enc, ep - enc);
++ XftDrawGlyphSpec (d, &term->lookup_color(fg, term->pix_colors).c, f, enc, ep - enc);
+ }
+ }
+
+--- src/rxvtfont.h
++++ src/rxvtfont.h
+@@ -72,8 +72,10 @@
+ char *fontdesc;
+
+ // must be power-of-two - 1, also has to match RS_fontMask in rxvt.h
+-#if USE_256_COLORS
+- enum { fontCount = 7 }; // 2 extra colors bits, 2 fewer fontcount bits
++#if USE_24_BIT_COLOR
++ enum { fontCount = 7 }; // 36 extra colors bits, 2 fewer fontcount bits
++#elif USE_256_COLORS
++ enum { fontCount = 7 }; // 2 extra colors bits, 2 fewer fontcount bits
+ #else
+ enum { fontCount = 31 };
+ #endif
--- src/rxvt.h
+++ src/rxvt.h
-@@ -39,7 +39,11 @@ typedef uint32_t text_t;
+@@ -39,7 +39,11 @@
#else
typedef uint16_t text_t; // saves lots of memory
#endif
@@ -361,10 +447,10 @@
+#endif
typedef int32_t tlen_t; // was int16_t, but this results in smaller code and memory use
typedef int32_t tlen_t_; // specifically for use in the line_t structure
-
-@@ -411,43 +415,52 @@ enum {
+
+@@ -342,43 +346,52 @@
#define RS_None 0
-
+
// GET_BGATTR depends on RS_fgShift > RS_bgShift
-#define RS_colorMask ((1UL << Color_Bits) - 1UL)
-#define RS_bgShift 0
@@ -376,7 +462,7 @@
+#define RS_fgShift (RS_bgShift + Color_Bits)
+#define RS_bgMask ((rend_t) (RS_colorMask << RS_bgShift))
+#define RS_fgMask ((rend_t) (RS_colorMask << RS_fgShift))
-
+
// must have space for rxvt_fontset::fontCount * 2 + 2 values
#define RS_fontShift (RS_fgShift + Color_Bits)
-#define RS_Careful (1UL << RS_fontShift) /* be careful when drawing these */
@@ -385,11 +471,11 @@
+#define RS_Careful ((rend_t) (1UL << RS_fontShift)) /* be careful when drawing these */
+#define RS_fontCount ((rend_t) rxvt_fontset::fontCount)
+#define RS_fontMask ((rend_t) ((RS_fontCount << (RS_fontShift + 1)) | RS_Careful)) // includes RS_Careful
-
+
// toggle this to force redraw, must be != RS_Careful and otherwise "pretty neutral"
-#define RS_redraw (2UL << RS_fontShift)
+#define RS_redraw ((rend_t) (2UL << RS_fontShift))
-
+
-#define RS_Sel (1UL << 22)
+#if USE_24_BIT_COLOR
+# define RS_fontCountSize 4
@@ -401,27 +487,27 @@
+
+#define RS_selShift (RS_fontShift + RS_fontCountSize)
+#define RS_Sel ((rend_t) (1UL << RS_selShift))
-
+
// 4 custom bits for extensions
#define RS_customCount 16UL
-#define RS_customShift 23
-#define RS_customMask ((RS_customCount - 1UL) << RS_customShift)
+#define RS_customShift (RS_selShift + 1)
+#define RS_customMask ((rend_t) ((RS_customCount - 1UL) << RS_customShift))
-
+
// font styles
-#define RS_Bold (1UL << RS_styleShift)
-#define RS_Italic (2UL << RS_styleShift)
+#define RS_Bold ((rend_t) (1UL << RS_styleShift))
+#define RS_Italic ((rend_t) (2UL << RS_styleShift))
-
+
-#define RS_styleCount 4
-#define RS_styleShift 27
-#define RS_styleMask (RS_Bold | RS_Italic)
+#define RS_styleCount 4
+#define RS_styleShift (RS_customShift + RS_styleCount)
+#define RS_styleMask ((rend_t) (RS_Bold | RS_Italic))
-
+
// fake styles
-#define RS_Blink (1UL << 29)
-#define RS_RVid (1UL << 30) // reverse video
@@ -429,44 +515,44 @@
+#define RS_Blink ((rend_t) (1UL << (RS_styleShift + 2)))
+#define RS_RVid ((rend_t) (1UL << (RS_styleShift + 3))) // reverse video
+#define RS_Uline ((rend_t) (1UL << (RS_styleShift + 4))) // underline
-
+
-#define RS_baseattrMask (RS_Italic | RS_Bold | RS_Blink | RS_RVid | RS_Uline)
-#define RS_attrMask (RS_baseattrMask | RS_fontMask)
+#define RS_baseattrMask ((rend_t) (RS_Italic | RS_Bold | RS_Blink | RS_RVid | RS_Uline))
+#define RS_attrMask ((rend_t) (RS_baseattrMask | RS_fontMask))
-
+
#define DEFAULT_RSTYLE (RS_None | (Color_fg << RS_fgShift) | (Color_bg << RS_bgShift))
#define OVERLAY_RSTYLE (RS_None | (Color_Black << RS_fgShift) | (Color_Yellow << RS_bgShift))
-@@ -599,7 +612,9 @@ enum colour_list {
+@@ -528,7 +541,9 @@
#endif
};
-
+
-#if USE_256_COLORS
+#if USE_24_BIT_COLOR
-+#define Color_Bits 25
++# define Color_Bits 25
+#elif USE_256_COLORS
- # define Color_Bits 9 // 0 .. maxTermCOLOR
+ # define Color_Bits 9 // 0 .. maxTermCOLOR24
#else
- # define Color_Bits 7 // 0 .. maxTermCOLOR
-@@ -729,21 +744,21 @@ typedef struct _mwmhints
+ # define Color_Bits 8 // 0 .. maxTermCOLOR24
+@@ -664,21 +679,21 @@
#define ROW(n) ROW_of (this, n)
-
+
/* how to build & extract colors and attributes */
-#define GET_BASEFG(x) (((x) & RS_fgMask) >> RS_fgShift)
-#define GET_BASEBG(x) (((x) & RS_bgMask) >> RS_bgShift)
+#define GET_BASEFG(x) ((((rend_t) (x)) & RS_fgMask) >> RS_fgShift)
+#define GET_BASEBG(x) ((((rend_t) (x)) & RS_bgMask) >> RS_bgShift)
-
+
-#define GET_FONT(x) (((x) & RS_fontMask) >> RS_fontShift)
-#define SET_FONT(x,fid) (((x) & ~RS_fontMask) | ((fid) << RS_fontShift))
+#define GET_FONT(x) ((((rend_t) (x)) & RS_fontMask) >> RS_fontShift)
+#define SET_FONT(x,fid) ((((rend_t) (x)) & ~((rend_t) RS_fontMask)) | (((rend_t) (fid)) << RS_fontShift))
-
+
-#define GET_STYLE(x) (((x) & RS_styleMask) >> RS_styleShift)
-#define SET_STYLE(x,style) (((x) & ~RS_styleMask) | ((style) << RS_styleShift))
+#define GET_STYLE(x) ((((rend_t) (x)) & RS_styleMask) >> RS_styleShift)
+#define SET_STYLE(x,style) ((((rend_t) (x)) & ~((rend_t) RS_styleMask)) | (((rend_t) (style)) << RS_styleShift))
-
+
-#define GET_ATTR(x) (((x) & RS_attrMask))
-#define SET_FGCOLOR(x,fg) (((x) & ~RS_fgMask) | ((fg) << RS_fgShift))
-#define SET_BGCOLOR(x,bg) (((x) & ~RS_bgMask) | ((bg) << RS_bgShift))
@@ -475,149 +561,32 @@
+#define SET_FGCOLOR(x,fg) ((((rend_t) (x)) & ~((rend_t) RS_fgMask)) | (((rend_t) (fg)) << RS_fgShift))
+#define SET_BGCOLOR(x,bg) ((((rend_t) (x)) & ~((rend_t) RS_bgMask)) | (((rend_t) (bg)) << RS_bgShift))
+#define SET_ATTR(x,a) ((((rend_t) (x)) & ~((rend_t) RS_attrMask)) | ((rend_t) (a)))
-
+
-#define RS_SAME(a,b) (!(((a) ^ (b)) & ~RS_Careful))
+#define RS_SAME(a,b) (!((((rend_t) (a)) ^ ((rend_t) (b))) & ~((rend_t) RS_Careful)))
-
+
#define PIXCOLOR_NAME(idx) rs[Rs_color + (idx)]
#define ISSET_PIXCOLOR(idx) (!!rs[Rs_color + (idx)])
-@@ -1503,7 +1518,12 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen
- void scr_swap_screen () NOTHROW;
+@@ -1413,7 +1428,12 @@
+ void scr_swap_screen () noexcept;
void scr_change_screen (int scrn);
- void scr_color (unsigned int color, int fgbg) NOTHROW;
-- void scr_rendition (int set, int style) NOTHROW;
+ void scr_color (unsigned int color, int fgbg) noexcept;
+- void scr_rendition (int set, int style) noexcept;
+#if USE_24_BIT_COLOR
-+ void scr_color_24 (unsigned int color, int fgbg) NOTHROW;
-+ void scr_color_rgb (unsigned int r, unsigned int g, unsigned int b, int fgbg) NOTHROW;
++ void scr_color_24 (unsigned int color, int fgbg) noexcept;
++ void scr_color_rgb (unsigned int r, unsigned int g, unsigned int b, int fgbg) noexcept;
+#endif
-+ rxvt_color &lookup_color (unsigned int color, rxvt_color *table) NOTHROW;
-+ void scr_rendition (int set, rend_t style) NOTHROW;
- void scr_add_lines (const wchar_t *str, int len, int minlines = 0) NOTHROW;
- void scr_backspace () NOTHROW;
- void scr_tab (int count, bool ht = false) NOTHROW;
---- src/rxvtfont.C
-+++ src/rxvtfont.C
-@@ -243,20 +243,20 @@ rxvt_font::clear_rect (rxvt_drawable &d, int x, int y, int w, int h, int color)
-
- # ifdef HAVE_BG_PIXMAP
- if (term->bg_img
-- && !term->pix_colors[color].is_opaque ()
-+ && !term->lookup_color(color, term->pix_colors).is_opaque ()
- && ((dst = XftDrawPicture (d))))
- {
- XClearArea (disp, d, x, y, w, h, false);
-
-- Picture solid_color_pict = XftDrawSrcPicture (d, &term->pix_colors[color].c);
-+ Picture solid_color_pict = XftDrawSrcPicture (d, &term->lookup_color(color, term->pix_colors).c);
- XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, x, y, w, h);
- }
- else
- # endif
-- XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h);
-+ XftDrawRect (d, &term->lookup_color(color, term->pix_colors).c, x, y, w, h);
-
- #else
-- XSetForeground (disp, gc, term->pix_colors[color]);
-+ XSetForeground (disp, gc, term->lookup_color(color, term->pix_colors));
- XFillRectangle (disp, d, gc, x, y, w, h);
- #endif
- }
-@@ -342,7 +342,7 @@ rxvt_font_default::draw (rxvt_drawable &d, int x, int y,
-
- clear_rect (d, x, y, term->fwidth * len, term->fheight, bg);
-
-- XSetForeground (disp, gc, term->pix_colors[fg]);
-+ XSetForeground (disp, gc, term->lookup_color(fg, term->pix_colors));
-
- while (len)
- {
-@@ -1053,7 +1053,7 @@ rxvt_font_x11::draw (rxvt_drawable &d, int x, int y,
- int base = ascent; // sorry, incorrect: term->fbase;
-
- XGCValues v;
-- v.foreground = term->pix_colors[fg];
-+ v.foreground = term->lookup_color(fg, term->pix_colors);
- v.font = f->fid;
-
- if (enc2b)
-@@ -1062,7 +1062,7 @@ rxvt_font_x11::draw (rxvt_drawable &d, int x, int y,
-
- if (bg == Color_bg && !slow)
- {
-- v.background = term->pix_colors[bg];
-+ v.background = term->lookup_color(bg, term->pix_colors);
- XChangeGC (disp, gc, GCForeground | GCBackground | GCFont, &v);
- XDrawImageString16 (disp, d, gc, x, y + base, xc, len);
- }
-@@ -1094,7 +1094,7 @@ rxvt_font_x11::draw (rxvt_drawable &d, int x, int y,
-
- if (bg == Color_bg && !slow)
- {
-- v.background = term->pix_colors[bg];
-+ v.background = term->lookup_color(bg, term->pix_colors);
- XChangeGC (disp, gc, GCForeground | GCBackground | GCFont, &v);
- XDrawImageString (disp, d, gc, x, y + base, xc, len);
- }
-@@ -1417,7 +1417,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
-
- if (term->bg_img
- && (bg == Color_transparent || bg == Color_bg
-- || (bg >= 0 && !term->pix_colors[bg].is_opaque () && ((dst = XftDrawPicture (d2))))))
-+ || (bg >= 0 && !term->lookup_color(bg, term->pix_colors).is_opaque () && ((dst = XftDrawPicture (d2))))))
- {
- int src_x = x, src_y = y;
-
-@@ -1454,7 +1454,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
-
- if (dst)
- {
-- Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c);
-+ Picture solid_color_pict = XftDrawSrcPicture (d2, &term->lookup_color(bg, term->pix_colors).c);
-
- // dst can only be set when bg >= 0
- XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h);
-@@ -1462,9 +1462,9 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
- }
- else
- #endif
-- XftDrawRect (d2, &term->pix_colors[bg >= 0 ? bg : Color_bg].c, 0, 0, w, h);
-+ XftDrawRect (d2, &term->lookup_color(bg >= 0 ? bg : Color_bg, term->pix_colors).c, 0, 0, w, h);
-
-- XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);
-+ XftDrawGlyphSpec (d2, &term->lookup_color(fg, term->pix_colors).c, f, enc, ep - enc);
- XCopyArea (disp, d2, d, gc, 0, 0, w, h, x, y);
- }
- else
-@@ -1473,7 +1473,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
- else
- {
- clear_rect (d, x, y, w, h, bg);
-- XftDrawGlyphSpec (d, &term->pix_colors[fg].c, f, enc, ep - enc);
-+ XftDrawGlyphSpec (d, &term->lookup_color(fg, term->pix_colors).c, f, enc, ep - enc);
- }
- }
-
---- src/rxvtfont.h
-+++ src/rxvtfont.h
-@@ -72,8 +72,10 @@ struct rxvt_fontset
- char *fontdesc;
-
- // must be power-of-two - 1, also has to match RS_fontMask in rxvt.h
--#if USE_256_COLORS
-- enum { fontCount = 7 }; // 4 extra colors bits, 4 fewer fontcount bits
-+#if USE_24_BIT_COLOR
-+ enum { fontCount = 7 }; // 36 extra colors bits, 4 fewer fontcount bits
-+#elif USE_256_COLORS
-+ enum { fontCount = 7 }; // 4 extra colors bits, 4 fewer fontcount bits
- #else
- enum { fontCount = 127 };
- #endif
++ rxvt_color &lookup_color (unsigned int color, rxvt_color *table) noexcept;
++ void scr_rendition (int set, rend_t style) noexcept;
+ void scr_add_lines (const wchar_t *str, int len, int minlines = 0) noexcept;
+ void scr_backspace () noexcept;
+ void scr_tab (int count, bool ht = false) noexcept;
--- src/rxvtperl.xs
+++ src/rxvtperl.xs
-@@ -789,6 +789,18 @@ MODULE = urxvt PACKAGE = urxvt
-
+@@ -795,6 +795,18 @@
+
PROTOTYPES: ENABLE
-
+
+TYPEMAP: <<END
+rend_t T_UINT
+
@@ -633,10 +602,10 @@
BOOT:
{
sv_setsv (get_sv ("urxvt::LIBDIR", 1), newSVpvn (LIBDIR, sizeof (LIBDIR) - 1));
-@@ -1069,43 +1081,44 @@ NOW ()
+@@ -1105,43 +1117,43 @@
OUTPUT:
RETVAL
-
+
-int
-GET_BASEFG (int rend)
+rend_t
@@ -645,7 +614,7 @@
RETVAL = GET_BASEFG (rend);
OUTPUT:
RETVAL
-
+
-int
-GET_BASEBG (int rend)
+rend_t
@@ -654,7 +623,7 @@
RETVAL = GET_BASEBG (rend);
OUTPUT:
RETVAL
-
+
-int
-SET_FGCOLOR (int rend, int new_color)
+rend_t
@@ -663,7 +632,7 @@
RETVAL = SET_FGCOLOR (rend, clamp (new_color, 0, TOTAL_COLORS - 1));
OUTPUT:
RETVAL
-
+
-int
-SET_BGCOLOR (int rend, int new_color)
+rend_t
@@ -672,17 +641,16 @@
RETVAL = SET_BGCOLOR (rend, clamp (new_color, 0, TOTAL_COLORS - 1));
OUTPUT:
RETVAL
-
+
-int
-GET_CUSTOM (int rend)
+rend_t
+GET_CUSTOM (rend_t rend)
CODE:
-+
RETVAL = (rend & RS_customMask) >> RS_customShift;
OUTPUT:
RETVAL
-
+
-int
-SET_CUSTOM (int rend, int new_value)
+rend_t
@@ -690,10 +658,10 @@
CODE:
{
if (!IN_RANGE_EXC (new_value, 0, RS_customCount))
-@@ -1515,8 +1528,8 @@ rxvt_term::vt_emask_add (U32 emask)
+@@ -1555,8 +1567,8 @@
THIS->vt_emask_perl |= emask;
THIS->vt_select_input ();
-
+
-U32
-rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle)
+UV
@@ -701,29 +669,29 @@
CODE:
RETVAL = THIS->rstyle;
THIS->rstyle = new_rstyle;
-@@ -2003,10 +2016,10 @@ rxvt_term::cur_charset ()
+@@ -2043,10 +2055,10 @@
RETVAL
-
+
void
-rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, U32 rstyle1 = RS_RVid, U32 rstyle2 = RS_RVid | RS_Uline)
+rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1 = RS_RVid, rend_t rstyle2 = RS_RVid | RS_Uline)
-
+
void
-rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, U32 rstyle = RS_RVid)
+rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle = RS_RVid)
-
+
void
rxvt_term::scr_bell ()
-@@ -2072,7 +2085,7 @@ rxvt_term::cmd_parse (SV *octets)
+@@ -2112,7 +2124,7 @@
}
-
+
SV *
-rxvt_term::overlay (int x, int y, int w, int h, int rstyle = OVERLAY_RSTYLE, int border = 2)
+rxvt_term::overlay (int x, int y, int w, int h, rend_t rstyle = OVERLAY_RSTYLE, int border = 2)
CODE:
{
overlay *o = new overlay (THIS, x, y, w, h, rstyle, border);
-@@ -2171,8 +2184,8 @@ Window
+@@ -2211,8 +2223,8 @@
XCreateSimpleWindow (rxvt_term *term, Window parent, int x, int y, unsigned int width, unsigned int height)
C_ARGS: term->dpy, (Window)parent,
x, y, width, height, 0,
@@ -731,29 +699,29 @@
- term->pix_colors_focused[Color_border]
+ term->lookup_color(Color_border, term->pix_colors_focused),
+ term->lookup_color(Color_border, term->pix_colors_focused)
-
+
#endif
-
-@@ -2299,7 +2312,7 @@ rxvt_term::set_background (rxvt_img *img, bool border = false)
+
+@@ -2346,7 +2358,7 @@
img->reify ()
->replace (img);
-
+
- img->convert_format (XRenderFindVisualFormat (THIS->dpy, THIS->visual), THIS->pix_colors [Color_bg])
+ img->convert_format (XRenderFindVisualFormat (THIS->dpy, THIS->visual), THIS->lookup_color(Color_bg, THIS->pix_colors))
->replace (img);
-
+
THIS->bg_img = img;
--- src/screen.C
+++ src/screen.C
-@@ -625,12 +625,52 @@ rxvt_term::scr_color (unsigned int color, int fgbg) NOTHROW
+@@ -626,12 +626,51 @@
rstyle = SET_BGCOLOR (rstyle, color);
}
-
+
+#if USE_24_BIT_COLOR
+static rxvt_color *scr_colors[1 << 24];
+
+void
-+rxvt_term::scr_color_24 (unsigned int color, int fgbg) NOTHROW
++rxvt_term::scr_color_24 (unsigned int color, int fgbg) noexcept
+{
+ color += TOTAL_COLORS;
+ if (fgbg == Color_fg)
@@ -763,7 +731,7 @@
+}
+
+void
-+rxvt_term::scr_color_rgb (unsigned int r, unsigned int g, unsigned int b, int fgbg) NOTHROW
++rxvt_term::scr_color_rgb (unsigned int r, unsigned int g, unsigned int b, int fgbg) noexcept
+{
+ unsigned int color = (r << 16) + (g << 8) + b;
+ scr_color_24(color, fgbg);
@@ -771,7 +739,7 @@
+#endif
+
+rxvt_color
-+&rxvt_term::lookup_color (unsigned int color, rxvt_color *table) NOTHROW
++&rxvt_term::lookup_color (unsigned int color, rxvt_color *table) noexcept
+{
+#if USE_24_BIT_COLOR
+ if (color >= TOTAL_COLORS) {
@@ -788,19 +756,18 @@
+ return table[color];
+}
+
-+
/* ------------------------------------------------------------------------- */
/*
* Change the rendition style for following text
*/
void
--rxvt_term::scr_rendition (int set, int style) NOTHROW
-+rxvt_term::scr_rendition (int set, rend_t style) NOTHROW
+-rxvt_term::scr_rendition (int set, int style) noexcept
++rxvt_term::scr_rendition (int set, rend_t style) noexcept
{
if (set)
rstyle |= style;
-@@ -1388,13 +1428,13 @@ rxvt_term::scr_erase_screen (int mode) NOTHROW
-
+@@ -1389,13 +1428,13 @@
+
if (mapped)
{
- gcvalue.foreground = pix_colors[bgcolor_of (rstyle)];
@@ -815,10 +782,10 @@
XChangeGC (dpy, gc, GCForeground, &gcvalue);
}
}
-@@ -1715,15 +1755,15 @@ rxvt_term::scr_rvideo_mode (bool on) NOTHROW
- {
- rvideo_state = on;
-
+@@ -1724,15 +1763,15 @@
+ }
+ else
+ #endif
- ::swap (pix_colors[Color_fg], pix_colors[Color_bg]);
+ ::swap (lookup_color(Color_fg, pix_colors), lookup_color(Color_bg, pix_colors));
#ifdef HAVE_IMG
@@ -826,16 +793,16 @@
#endif
- XSetWindowBackground (dpy, vt, pix_colors[Color_bg]);
+ XSetWindowBackground (dpy, vt, lookup_color(Color_bg, pix_colors));
-
+
XGCValues gcvalue;
- gcvalue.foreground = pix_colors[Color_fg];
- gcvalue.background = pix_colors[Color_bg];
+ gcvalue.foreground = lookup_color(Color_fg, pix_colors);
+ gcvalue.background = lookup_color(Color_bg, pix_colors);
XChangeGC (dpy, gc, GCBackground | GCForeground, &gcvalue);
-
+
scr_clear ();
-@@ -2426,14 +2466,14 @@ rxvt_term::scr_refresh () NOTHROW
+@@ -2430,14 +2469,14 @@
{
if (showcursor && focus && row == screen.cur.row
&& IN_RANGE_EXC (col, cur_col, cur_col + cursorwidth))
@@ -850,10 +817,10 @@
#endif
- XSetForeground (dpy, gc, pix_colors[fore]);
+ XSetForeground (dpy, gc, lookup_color(fore, pix_colors));
-
+
XDrawLine (dpy, vt, gc,
xpixel, ypixel + font->ascent + 1,
-@@ -2453,7 +2493,7 @@ rxvt_term::scr_refresh () NOTHROW
+@@ -2457,7 +2496,7 @@
scr_set_char_rend (ROW(screen.cur.row), cur_col, cur_rend);
else if (oldcursor.row >= 0)
{
@@ -862,16 +829,16 @@
if (cursor_type == 1)
XFillRectangle (dpy, vt, gc,
Col2Pixel (cur_col),
-@@ -2463,7 +2503,7 @@ rxvt_term::scr_refresh () NOTHROW
+@@ -2474,7 +2513,7 @@
}
else if (oldcursor.row >= 0)
{
- XSetForeground (dpy, gc, pix_colors[ccol1]);
+ XSetForeground (dpy, gc, lookup_color(ccol1, pix_colors));
-
+
XDrawRectangle (dpy, vt, gc,
Col2Pixel (cur_col),
-@@ -2532,15 +2572,15 @@ rxvt_term::scr_recolor (bool refresh) NOTHROW
+@@ -2543,15 +2582,15 @@
else
# endif
{
@@ -888,9 +855,9 @@
+ XSetWindowBackground (dpy, parent, lookup_color(Color_border, pix_colors));
+ XSetWindowBackground (dpy, vt, lookup_color(Color_bg, pix_colors));
}
-
+
XClearWindow (dpy, parent);
-@@ -2550,7 +2590,7 @@ rxvt_term::scr_recolor (bool refresh) NOTHROW
+@@ -2561,7 +2600,7 @@
if (transparent)
XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative);
else
@@ -899,31 +866,44 @@
scrollBar.state = SB_STATE_IDLE;
scrollBar.show (0);
}
+--- src/scrollbar.C
++++ src/scrollbar.C
+@@ -72,8 +72,8 @@
+ total_width (),
+ term->szHint.height,
+ 0,
+- term->pix_colors[Color_fg],
+- term->pix_colors[color ()]);
++ term->lookup_color(Color_fg, term->pix_colors),
++ term->lookup_color(color (), term->pix_colors));
+ XDefineCursor (term->dpy, win, leftptr_cursor);
+
+ XSelectInput (term->dpy, win,
--- src/scrollbar-next.C
+++ src/scrollbar-next.C
-@@ -154,15 +154,15 @@ scrollBar_t::init_next ()
-
+@@ -154,15 +154,15 @@
+
gcvalue.graphics_exposures = False;
-
+
- gcvalue.foreground = term->pix_colors_focused[Color_Black];
+ gcvalue.foreground = term->lookup_color(Color_Black, term->pix_colors_focused);
blackGC = XCreateGC (term->dpy, win,
GCForeground | GCGraphicsExposures, &gcvalue);
-
+
- gcvalue.foreground = term->pix_colors_focused[Color_White];
+ gcvalue.foreground = term->lookup_color(Color_White, term->pix_colors_focused);
whiteGC = XCreateGC (term->dpy, win,
GCForeground | GCGraphicsExposures, &gcvalue);
-
+
- light = term->pix_colors_focused[Color_scroll];
+ light = term->lookup_color(Color_scroll, term->pix_colors_focused);
#if 0
//color used by rxvt
if (color.set (term, rgba (0xaeba, 0xaaaa, 0xaeba)))
-@@ -172,7 +172,7 @@ scrollBar_t::init_next ()
+@@ -172,7 +172,7 @@
grayGC = XCreateGC (term->dpy, win,
GCForeground | GCGraphicsExposures, &gcvalue);
-
+
- dark = term->pix_colors_focused[Color_Grey25];
+ dark = term->lookup_color(Color_Grey25, term->pix_colors_focused);
#if 0
@@ -931,21 +911,21 @@
if (color.set (term, rgba (0x51aa, 0x5555, 0x5144)))
--- src/scrollbar-plain.C
+++ src/scrollbar-plain.C
-@@ -38,7 +38,7 @@ scrollBar_t::show_plain (int update)
+@@ -38,7 +38,7 @@
XGCValues gcvalue;
-
+
init |= SB_STYLE_PLAIN;
- gcvalue.foreground = term->pix_colors_focused[Color_scroll];
+ gcvalue.foreground = term->lookup_color(Color_scroll, term->pix_colors_focused);
-
+
pscrollbarGC = XCreateGC (term->dpy, win, GCForeground, &gcvalue);
}
--- src/scrollbar-rxvt.C
+++ src/scrollbar-rxvt.C
-@@ -158,11 +158,11 @@ scrollBar_t::show_rxvt (int update)
-
+@@ -158,11 +158,11 @@
+
init |= SB_STYLE_RXVT;
-
+
- gcvalue.foreground = term->pix_colors[Color_topShadow];
+ gcvalue.foreground = term->lookup_color(Color_topShadow, term->pix_colors);
topShadowGC = XCreateGC (term->dpy, term->vt, GCForeground, &gcvalue);
@@ -959,15 +939,15 @@
else
--- src/scrollbar-xterm.C
+++ src/scrollbar-xterm.C
-@@ -49,13 +49,13 @@ scrollBar_t::show_xterm (int update)
+@@ -49,13 +49,13 @@
rxvt_fatal ("can't create bitmap\n");
-
+
gcvalue.fill_style = FillOpaqueStippled;
- gcvalue.foreground = term->pix_colors_focused[Color_scroll];
- gcvalue.background = term->pix_colors_focused[Color_bg];
+ gcvalue.foreground = term->lookup_color(Color_scroll, term->pix_colors_focused);
+ gcvalue.background = term->lookup_color(Color_bg, term->pix_colors_focused);
-
+
xscrollbarGC = XCreateGC (term->dpy, win,
GCForeground | GCBackground
| GCFillStyle | GCStipple, &gcvalue);
@@ -975,17 +955,4 @@
+ gcvalue.foreground = term->lookup_color(Color_border, term->pix_colors_focused);
ShadowGC = XCreateGC (term->dpy, win, GCForeground, &gcvalue);
}
-
---- src/scrollbar.C
-+++ src/scrollbar.C
-@@ -72,8 +72,8 @@ scrollBar_t::resize ()
- total_width (),
- term->szHint.height,
- 0,
-- term->pix_colors[Color_fg],
-- term->pix_colors[color ()]);
-+ term->lookup_color(Color_fg, term->pix_colors),
-+ term->lookup_color(color (), term->pix_colors));
- XDefineCursor (term->dpy, win, leftptr_cursor);
-
- XSelectInput (term->dpy, win, \ No newline at end of file
+
diff --git a/PKGBUILD b/PKGBUILD
index a9716babbd58..77d6b77df341 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,57 +1,68 @@
# Maintainer: mrdotx <klassiker@gmx.de>
_pkgname=rxvt-unicode
pkgname=rxvt-unicode-truecolor-wide-glyphs
-pkgver=9.22
-pkgrel=4
-pkgdesc='Unicode enabled rxvt-clone terminal emulator (urxvt) with true color and enhanced glyphs support'
+pkgver=9.26
+pkgrel=1
+pkgdesc='Unicode enabled rxvt-clone terminal emulator (urxvt) with true color, enhanced glyphs and improved font rendering support'
arch=('i686' 'x86_64')
url='http://software.schmorp.de/pkg/rxvt-unicode.html'
license=('GPL')
-depends=('libxft' 'perl' 'startup-notification')
+depends=(
+ 'libxft'
+ 'libxt'
+ 'perl'
+ 'startup-notification'
+)
optdepends=('gtk2-perl: to use the urxvt-tabbed')
-provides=('rxvt-unicode' 'rxvt-unicode-terminfo' 'urxvt-resize-font' 'urxvt-keyboard-select')
-conflicts=('rxvt-unicode' 'rxvt-unicode-terminfo' 'urxvt-resize-font' 'urxvt-perls' 'urxvt-perls-git')
-source=(http://dist.schmorp.de/rxvt-unicode/$_pkgname-$pkgver.tar.bz2
+provides=(
+ 'rxvt-unicode'
+ 'rxvt-unicode-terminfo'
+ 'urxvt-resize-font'
+ 'urxvt-keyboard-select'
+)
+conflicts=(
+ 'rxvt-unicode'
+ 'rxvt-unicode-terminfo'
+ 'urxvt-resize-font'
+ 'urxvt-perls'
+ 'urxvt-perls-git'
+)
+source=(
+ http://dist.schmorp.de/rxvt-unicode/$_pkgname-$pkgver.tar.bz2
'urxvt.desktop'
'urxvtc.desktop'
'urxvt-tabbed.desktop'
'resize-font'
'keyboard-select'
- 'sgr-mouse-mode.patch'
'24-bit-color.patch'
'enable-wide-glyphs.patch'
'improve-font-rendering.patch'
- 'perl-segfault.patch'
- )
-sha1sums=('e575b869782fbfed955f84f48b204ec888d91ba1'
+)
+sha1sums=('d325d8cdea6bcb8e0b8b219b8451bf5c690b6c62'
'b5a4507f85ebb7bac589db2e07d9bc40106720d9'
'62c4ffecfce6967def394dd4d418b68652372ea2'
'cd204d608d114d39c80331efe0af0231ad6b7e18'
'a61366659c73bd551fa99a8415bb71e033897598'
'9883d0c31b45f8521829ea6a2041f2e9eb7abe6a'
- 'dfbc8729c545105eff21e20ef3a4a3841a68a192'
- '9f5db305863b17175e72f9e2d4a78d0d7f25fd34'
- 'd9f3b52b273d13fbd4089a7869ab2e70bf190bc9'
- '2f976cfbb4ae092d331e169b56ec6423b198f462'
- '361f4649596342d07311c2590b809b85b3a918ee')
+ '560097c0d6377461fcbe4c109f3113a6bcb38982'
+ 'c5ee4a50902d8c8d278938b080464a16d2c6af56'
+ '772b62071d73c0021adf334f037b95ef13d34317')
prepare() {
cd $_pkgname-$pkgver
- # https://aur.archlinux.org/packages/rxvt-unicode-patched
- patch -p0 -i ../sgr-mouse-mode.patch
-
- # https://aur.archlinux.org/packages/rxvt-unicode-truecolor
+ # The repo with original 24-bit-color.patch is no longer available:
+ # https://gist.githubusercontent.com/dan-santana/63271adf12171e0fc0bc/raw/70c6343d1c0b3bca0aba4f587ed501e6cbd98d00/24-bit-color.patch
+ # I have rewritten the patch to work with version 9.26.
+ # If someone has a better solution, please contact me!
patch -p0 -i ../24-bit-color.patch
+ # If you have problems with character rendering, try installing libxft-bgra from aur.
# https://aur.archlinux.org/packages/rxvt-unicode-cvs-patched-wideglyphs
- patch -p1 -i ../enable-wide-glyphs.patch
+ patch -p0 -i ../enable-wide-glyphs.patch
# https://aur.archlinux.org/packages/rxvt-unicode-improve-font-rendering
- patch -p1 -i ../improve-font-rendering.patch
-
- # https://bugs.archlinux.org/task/67691
- patch -p1 -i ../perl-segfault.patch
+ patch -p0 -i ../improve-font-rendering.patch
}
build() {
diff --git a/enable-wide-glyphs.patch b/enable-wide-glyphs.patch
index fb639a81b8e4..4773bbb23e65 100644
--- a/enable-wide-glyphs.patch
+++ b/enable-wide-glyphs.patch
@@ -1,7 +1,5 @@
-diff --git a/config.h.in b/config.h.in
-index 914d6062..2e2e03f3 100644
---- a/config.h.in
-+++ b/config.h.in
+--- config.h.in
++++ config.h.in
@@ -18,6 +18,9 @@
/* Define if you want your background to use the parent window background */
#undef ENABLE_TRANSPARENCY
@@ -12,11 +10,9 @@ index 914d6062..2e2e03f3 100644
/* Define if you want european extended codesets */
#undef ENCODING_EU
-diff --git a/configure b/configure
-index 3e3f78bd..b8b1591d 100755
---- a/configure
-+++ b/configure
-@@ -717,6 +717,7 @@ enable_unicode3
+--- configure
++++ configure
+@@ -745,6 +745,7 @@
enable_combining
enable_xft
enable_font_styles
@@ -24,7 +20,7 @@ index 3e3f78bd..b8b1591d 100755
enable_pixbuf
enable_startup_notification
enable_transparency
-@@ -1390,6 +1391,7 @@ Optional Features:
+@@ -1427,6 +1428,7 @@
--enable-combining enable composition of base and combining characters
--enable-xft enable xft support on systems that have it
--enable-font-styles enable bold and italic support
@@ -32,7 +28,7 @@ index 3e3f78bd..b8b1591d 100755
--enable-pixbuf enable integration with gdk-pixbuf for background images
--enable-startup-notification enable freedesktop startup notification support
--enable-transparency enable transparent backgrounds
-@@ -4780,6 +4782,7 @@ if test "${enable_everything+set}" = set; then :
+@@ -5184,6 +5186,7 @@
support_8bitctrls=no
support_iso14755=no
support_styles=no
@@ -40,7 +36,7 @@ index 3e3f78bd..b8b1591d 100755
support_perl=no
codesets=
fi
-@@ -4808,6 +4811,7 @@ if test "${enable_everything+set}" = set; then :
+@@ -5212,6 +5215,7 @@
#support_8bitctrls=yes
support_iso14755=yes
support_styles=yes
@@ -48,7 +44,7 @@ index 3e3f78bd..b8b1591d 100755
support_perl=yes
codesets=all
fi
-@@ -4909,6 +4913,14 @@ if test "${enable_font_styles+set}" = set; then :
+@@ -5336,6 +5340,14 @@
fi
@@ -61,25 +57,23 @@ index 3e3f78bd..b8b1591d 100755
+
+
# Check whether --enable-pixbuf was given.
- if test "${enable_pixbuf+set}" = set; then :
- enableval=$enable_pixbuf; if test x$enableval = xyes -o x$enableval = xno; then
-@@ -7733,6 +7745,11 @@ if test x$support_styles = xyes; then
+ if test ${enable_pixbuf+y}
+ then :
+@@ -8164,6 +8176,11 @@
+ printf "%s\n" "#define HAVE_POSIX_OPENPT 1" >>confdefs.h
- $as_echo "#define ENABLE_STYLES 1" >>confdefs.h
-
-+fi
+ fi
+if test x$support_wide_glyphs = xyes; then
+
+$as_echo "#define ENABLE_WIDE_GLYPHS 1" >>confdefs.h
+
- fi
- if test x$support_iso14755 = xyes; then
-
-diff --git a/configure.ac b/configure.ac
-index 0da3b596..52ab8e4c 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -132,6 +132,7 @@ AC_ARG_ENABLE(everything,
++fi
+ ac_fn_cxx_check_func "$LINENO" "isastream" "ac_cv_func_isastream"
+ if test "x$ac_cv_func_isastream" = xyes
+ then :
+--- configure.ac
++++ configure.ac
+@@ -134,6 +134,7 @@
support_8bitctrls=no
support_iso14755=no
support_styles=no
@@ -87,7 +81,7 @@ index 0da3b596..52ab8e4c 100644
support_perl=no
codesets=
fi
-@@ -160,6 +161,7 @@ AC_ARG_ENABLE(everything,
+@@ -162,6 +163,7 @@
#support_8bitctrls=yes
support_iso14755=yes
support_styles=yes
@@ -95,7 +89,7 @@ index 0da3b596..52ab8e4c 100644
support_perl=yes
codesets=all
fi
-@@ -225,6 +227,12 @@ AC_ARG_ENABLE(font-styles,
+@@ -237,6 +239,12 @@
support_styles=$enableval
fi])
@@ -108,7 +102,7 @@ index 0da3b596..52ab8e4c 100644
AC_ARG_ENABLE(pixbuf,
[ --enable-pixbuf enable integration with gdk-pixbuf for background images],
[if test x$enableval = xyes -o x$enableval = xno; then
-@@ -648,6 +656,9 @@ fi
+@@ -660,6 +668,9 @@
if test x$support_styles = xyes; then
AC_DEFINE(ENABLE_STYLES, 1, Define if you want bold and italic support)
fi
@@ -118,11 +112,9 @@ index 0da3b596..52ab8e4c 100644
if test x$support_iso14755 = xyes; then
AC_DEFINE(ISO_14755, 1, Define if you want ISO 14755 extended support)
fi
-diff --git a/src/command.C b/src/command.C
-index 19e4fccf..75853d75 100644
---- a/src/command.C
-+++ b/src/command.C
-@@ -237,7 +237,9 @@ rxvt_term::iso14755_51 (unicode_t ch, rend_t r, int x, int y, int y2)
+--- src/command.C
++++ src/command.C
+@@ -237,7 +237,9 @@
# endif
scr_overlay_set (11, y + 1, ch, r);
@@ -132,11 +124,9 @@ index 19e4fccf..75853d75 100644
scr_overlay_set (12, y + 1, NOCHAR, r);
}
-diff --git a/src/rxvtfont.C b/src/rxvtfont.C
-index c56921c8..9d75541a 100644
---- a/src/rxvtfont.C
-+++ b/src/rxvtfont.C
-@@ -471,6 +471,7 @@ rxvt_font_default::draw (rxvt_drawable &d, int x, int y,
+--- src/rxvtfont.C
++++ src/rxvtfont.C
+@@ -471,6 +471,7 @@
else
switch (t)
{
@@ -144,7 +134,7 @@ index c56921c8..9d75541a 100644
case '\t':
case ZERO_WIDTH_CHAR:
case NOCHAR:
-@@ -1026,8 +1027,10 @@ rxvt_font_x11::has_char (unicode_t unicode, const rxvt_fontprop *prop, bool &car
+@@ -1026,8 +1027,10 @@
careful = xcs->lbearing < 0 || xcs->rbearing > prop->width * wcw;
@@ -155,7 +145,7 @@ index c56921c8..9d75541a 100644
return true;
}
-@@ -1345,12 +1348,14 @@ rxvt_font_xft::has_char (unicode_t unicode, const rxvt_fontprop *prop, bool &car
+@@ -1345,12 +1348,14 @@
careful = g.x > 0 || w > prop->width * wcw;
@@ -170,7 +160,7 @@ index c56921c8..9d75541a 100644
return true;
}
-@@ -1395,6 +1400,10 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
+@@ -1395,6 +1400,10 @@
ep->glyph = glyph;
ep->x = x_ + (cwidth - extents.xOff >> 1);
@@ -181,11 +171,9 @@ index c56921c8..9d75541a 100644
ep->y = y_ + ascent;
if (extents.xOff == 0)
-diff --git a/src/screen.C b/src/screen.C
-index 115afbf2..61681b84 100644
---- a/src/screen.C
-+++ b/src/screen.C
-@@ -936,7 +936,61 @@ rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) NOTHROW
+--- src/screen.C
++++ src/screen.C
+@@ -975,7 +975,61 @@
# endif
#endif
@@ -248,7 +236,7 @@ index 115afbf2..61681b84 100644
// if the character doesn't fit into the remaining columns...
if (ecb_unlikely (screen.cur.col > ncol - width && ncol >= width))
-@@ -2387,7 +2441,12 @@ rxvt_term::scr_refresh () NOTHROW
+@@ -2434,7 +2488,12 @@
text--, count++, xpixel -= fwidth;
// force redraw after "careful" characters to avoid pixel droppings
@@ -262,11 +250,9 @@ index 115afbf2..61681b84 100644
drp[col + i + 1] = srp[col + i + 1] ^ RS_redraw;
// force redraw before "careful" characters to avoid pixel droppings
-diff --git a/src/xdefaults.C b/src/xdefaults.C
-index 9b47bf2c..add21eec 100644
---- a/src/xdefaults.C
-+++ b/src/xdefaults.C
-@@ -294,6 +294,9 @@ static const char optionsstring[] = "options: "
+--- src/xdefaults.C
++++ src/xdefaults.C
+@@ -294,6 +294,9 @@
#if ENABLE_STYLES
"styles,"
#endif
diff --git a/improve-font-rendering.patch b/improve-font-rendering.patch
index de8f9789327a..460aca6ca6da 100644
--- a/improve-font-rendering.patch
+++ b/improve-font-rendering.patch
@@ -1,8 +1,6 @@
-diff --git a/src/rxvtfont.C b/src/rxvtfont.C
-index 1914539..4c0189e 100644
---- a/src/rxvtfont.C
-+++ b/src/rxvtfont.C
-@@ -1223,92 +1223,63 @@ rxvt_font_xft::load (const rxvt_fontprop &prop, bool force_prop)
+--- src/rxvtfont.C
++++ src/rxvtfont.C
+@@ -1226,92 +1226,63 @@
return false;
int ftheight = 0;
@@ -19,96 +17,97 @@ index 1914539..4c0189e 100644
- success = false;
- break;
- }
--
+
- FT_Face face = XftLockFace (f);
--
++ p = FcPatternDuplicate (match);
++ f = XftFontOpenPattern (disp, p);
+
- ascent = (face->size->metrics.ascender + 63) >> 6;
- descent = (-face->size->metrics.descender + 63) >> 6;
- height = max (ascent + descent, (face->size->metrics.height + 63) >> 6);
- width = 0;
-
- bool scalable = face->face_flags & FT_FACE_FLAG_SCALABLE;
-
-- XftUnlockFace (f);
-+ p = FcPatternDuplicate (match);
-+ f = XftFontOpenPattern (disp, p);
-
-- int glheight = height;
+ if (!f)
+ {
+ FcPatternDestroy (p);
+ return false;
+ }
+- XftUnlockFace (f);
++ FT_Face face = XftLockFace (f);
+
+- int glheight = height;
++ ascent = f->ascent;
++ descent = f->descent;
++ height = max (ascent + descent, f->height);
++ width = 0;
+
- for (uint16_t *t = extent_test_chars; t < extent_test_chars + ecb_array_length (extent_test_chars); t++)
- {
- FcChar16 ch = *t;
-+ FT_Face face = XftLockFace (f);
++ bool scalable = face->face_flags & FT_FACE_FLAG_SCALABLE;
- if (cs != CS_UNICODE
- && ch > 0x100
- && FROM_UNICODE (cs, ch) == NOCHAR)
- continue;
-+ ascent = f->ascent;
-+ descent = f->descent;
-+ height = max (ascent + descent, f->height);
-+ width = 0;
++ XftUnlockFace (f);
- // ignore characters we wouldn't use anyways
- bool careful;
- if (!has_char (*t, &prop, careful))
- continue;
-+ bool scalable = face->face_flags & FT_FACE_FLAG_SCALABLE;
-
-- XGlyphInfo g;
-- XftTextExtents16 (disp, f, &ch, 1, &g);
-+ XftUnlockFace (f);
-
-- g.width -= g.x;
+ for (uint16_t *t = extent_test_chars; t < extent_test_chars + ecb_array_length (extent_test_chars); t++)
+ {
+ FcChar16 ch = *t;
-- int wcw = WCWIDTH (ch);
-- if (wcw > 0) g.width = (g.width + wcw - 1) / wcw;
+- XGlyphInfo g;
+- XftTextExtents16 (disp, f, &ch, 1, &g);
+ if (cs != CS_UNICODE
+ && ch > 0x100
+ && FROM_UNICODE (cs, ch) == NOCHAR)
+ continue;
-- if (width < g.width ) width = g.width;
-- if (height < g.height ) height = g.height;
-- if (glheight < g.height - g.y) glheight = g.height - g.y;
-- }
+- g.width -= g.x;
+ // ignore characters we wouldn't use anyways
+ bool careful;
+ if (!has_char (*t, &prop, careful))
+ continue;
+- int wcw = WCWIDTH (ch);
+- if (wcw > 0) g.width = (g.width + wcw - 1) / wcw;
++ XGlyphInfo g;
++ XftTextExtents16 (disp, f, &ch, 1, &g);
+
+- if (width < g.width ) width = g.width;
+- if (height < g.height ) height = g.height;
+- if (glheight < g.height - g.y) glheight = g.height - g.y;
+- }
++ g.width -= g.x;
+
- if (!width)
- {
- rxvt_warn ("unable to calculate font width for '%s', ignoring.\n", name);
-+ XGlyphInfo g;
-+ XftTextExtents16 (disp, f, &ch, 1, &g);
++ int wcw = WCWIDTH (ch);
++ if (wcw > 1) g.xOff = g.xOff / wcw;
- XftFontClose (disp, f);
- f = 0;
-+ g.width -= g.x;
++ if (width < g.xOff ) width = g.xOff;
++ if (height < g.height) height = g.height;
++ }
- success = false;
- break;
- }
-+ int wcw = WCWIDTH (ch);
-+ if (wcw > 1) g.xOff = g.xOff / wcw;
-
+-
- if (prop.height == rxvt_fontprop::unset
- || (height <= prop.height && glheight <= prop.height)
- || height <= 2
- || !scalable)
- break;
-+ if (width < g.xOff ) width = g.xOff;
-+ if (height < g.height) height = g.height;
-+ }
++ bool success = true;
- if (ftheight)
- {
@@ -116,8 +115,7 @@ index 1914539..4c0189e 100644
- if (height > prop.height + 1) ftheight++;
- if (height > prop.height + 2) ftheight++;
- if (height > prop.height + 3) ftheight++;
-+ bool success = true;
-
+-
- ftheight -= height - prop.height;
- }
- else
@@ -135,8 +133,8 @@ index 1914539..4c0189e 100644
}
FcPatternDestroy (match);
-@@ -1395,7 +1366,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
-
+@@ -1404,7 +1375,7 @@
+ /* Left-align to bounding box, do not overlap to the left. */
max_it(ep->x, x_);
#endif
- ep->y = y_ + ascent;
@@ -144,12 +142,10 @@ index 1914539..4c0189e 100644
if (extents.xOff == 0)
ep->x = x_ + cwidth;
-diff --git a/src/screen.C b/src/screen.C
-index 9eb375a..7b3cdbf 100644
---- a/src/screen.C
-+++ b/src/screen.C
-@@ -2432,8 +2432,8 @@ rxvt_term::scr_refresh () NOTHROW
- XSetForeground (dpy, gc, pix_colors[fore]);
+--- src/screen.C
++++ src/screen.C
+@@ -2538,8 +2538,8 @@
+ XSetForeground (dpy, gc, lookup_color(fore, pix_colors));
XDrawLine (dpy, vt, gc,
- xpixel, ypixel + font->ascent + 1,
@@ -159,11 +155,9 @@ index 9eb375a..7b3cdbf 100644
}
} /* for (col....) */
} /* for (row....) */
-diff --git a/src/table/jis0208_1990_0.h b/src/table/jis0208_1990_0.h
-index b23378f..0febcd3 100644
---- a/src/table/jis0208_1990_0.h
-+++ b/src/table/jis0208_1990_0.h
-@@ -2241,6 +2241,7 @@ const uint16_t *jis0208_1990_0_f_i[] = {
+--- src/table/jis0208_1990_0.h
++++ src/table/jis0208_1990_0.h
+@@ -2241,6 +2241,7 @@
static uint32_t cs_jis0208_1990_0_from_unicode (unicode_t unicode) {
if (unicode == 0x2312) return 0x225e;
diff --git a/perl-segfault.patch b/perl-segfault.patch
deleted file mode 100644
index c7a4cc927cee..000000000000
--- a/perl-segfault.patch
+++ /dev/null
@@ -1,33 +0,0 @@
---- rxvt-unicode/src/rxvtperl.xs 2020/01/20 09:35:12 1.246
-+++ rxvt-unicode/src/rxvtperl.xs 2020/06/30 07:31:24 1.247
-@@ -372,6 +372,9 @@
-
- static PerlInterpreter *perl;
-
-+#if 0 /* we are not a library anymore, so doing this is just not worth it */
-+/*THINK/TODO: this has the side effect of, of course, not calling destructors. */
-+/* but therse are not guaranteed anyway... */
- rxvt_perl_interp::~rxvt_perl_interp ()
- {
- if (perl)
-@@ -381,6 +384,7 @@
- PERL_SYS_TERM ();
- }
- }
-+#endif
-
- void
- rxvt_perl_interp::init ()
-
---- rxvt-unicode/src/rxvtperl.h 2012/06/12 10:45:53 1.28
-+++ rxvt-unicode/src/rxvtperl.h 2020/06/30 07:31:24 1.29
-@@ -51,7 +51,9 @@
- {
- char **perl_environ;
-
-+ #if 0 // see rxvtperl.xs
- ~rxvt_perl_interp ();
-+ #endif
-
- void init ();
- void init (rxvt_term *term);
diff --git a/sgr-mouse-mode.patch b/sgr-mouse-mode.patch
deleted file mode 100644
index 186e8fdb74f8..000000000000
--- a/sgr-mouse-mode.patch
+++ /dev/null
@@ -1,90 +0,0 @@
---- src/command.C 2014-12-13 13:22:09.000000000 +0100
-+++ src/command.C 2016-01-13 04:50:39.161862513 +0100
-@@ -1280,6 +1280,8 @@
- int x, y;
- int code = 32;
-
-+ if (priv_modes & PrivMode_ExtMouseSgr) code = 0;
-+
- x = Pixel2Col (ev.x) + 1;
- y = Pixel2Row (ev.y) + 1;
-
-@@ -1293,11 +1295,18 @@
- code += 32;
- }
-
-- if (MEvent.button == AnyButton)
-+ if (!(priv_modes & PrivMode_ExtMouseSgr) && MEvent.button == AnyButton)
- button_number = 3;
- else
- {
-- button_number = MEvent.button - Button1;
-+ if (ev.type == MotionNotify) {
-+ if (ev.state & Button1Mask) button_number = 0;
-+ else if (ev.state & Button2Mask) button_number = 1;
-+ else if (ev.state & Button3Mask) button_number = 2;
-+ else return;
-+ } else {
-+ button_number = ev.button - Button1;
-+ }
- /* add 0x3D for wheel events, like xterm does */
- if (button_number >= 3)
- button_number += 64 - 3;
-@@ -1347,16 +1356,22 @@
- #endif
-
- #if ENABLE_FRILLS
-+ if (priv_modes & PrivMode_ExtMouseSgr)
-+ tt_printf ("\033[<%d;%d;%d%c",
-+ code + button_number + key_state,
-+ x,
-+ y,
-+ (ev.type == ButtonRelease ? 'm' : 'M'));
-- if (priv_modes & PrivMode_ExtMouseRight)
-+ else if (priv_modes & PrivMode_ExtMouseRight)
- tt_printf ("\033[%d;%d;%dM",
- code + button_number + key_state,
- x,
- y);
- else if (priv_modes & PrivMode_ExtModeMouse)
- tt_printf ("\033[M%c%lc%lc",
- code + button_number + key_state,
- wint_t (32 + x),
- wint_t (32 + y));
- else
- #endif
- tt_printf ("\033[M%c%c%c",
-@@ -2908,7 +2913,7 @@
- scr_soft_reset ();
-
- static const int pm_h[] = { 7, 25 };
-- static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1005, 1015, 1049 };
-+ static const int pm_l[] = { 1, 3, 4, 5, 6, 9, 66, 1000, 1001, 1002, 1003, 1005, 1006, 1015, 1049 };
-
- process_terminal_mode ('h', 0, ecb_array_length (pm_h), pm_h);
- process_terminal_mode ('l', 0, ecb_array_length (pm_l), pm_l);
-@@ -3713,13 +3718,14 @@
- { 1002, PrivMode_MouseBtnEvent },
- { 1003, PrivMode_MouseAnyEvent },
- #if ENABLE_FRILLS
- { 1005, PrivMode_ExtModeMouse },
-+ { 1006, PrivMode_ExtMouseSgr },
- #endif
- { 1010, PrivMode_TtyOutputInh }, // rxvt extension
- { 1011, PrivMode_Keypress }, // rxvt extension
- #if ENABLE_FRILLS
- { 1015, PrivMode_ExtMouseRight }, // urxvt extension of 1005
- #endif
- // 1035 enable modifiers for alt, numlock NYI
- // 1036 send ESC for meta keys NYI
- // 1037 send DEL for keypad delete NYI
---- src/rxvt.h 2014-12-17 16:33:08.000000000 +0100
-+++ src/rxvt.h 2016-01-13 03:42:31.508911380 +0100
-@@ -644,6 +644,7 @@
- #define PrivMode_ExtModeMouse (1UL<<23) // xterm pseudo-utf-8 hack
- #define PrivMode_ExtMouseRight (1UL<<24) // xterm pseudo-utf-8, but works in non-utf-8-locales
- #define PrivMode_BlinkingCursor (1UL<<25)
-+#define PrivMode_ExtMouseSgr (1UL<<26) // sgr mouse extension
-
- #define PrivMode_mouse_report (PrivMode_MouseX10|PrivMode_MouseX11|PrivMode_MouseBtnEvent|PrivMode_MouseAnyEvent)
-