Index | Thread | Search

From:
Nicholas Marriott <nicholas.marriott@gmail.com>
Subject:
Re: tmux: add utf8 terminal-features
To:
Nicholas Marriott <nicholas.marriott@gmail.com>, tech <tech@openbsd.org>
Date:
Mon, 31 Aug 2026 13:25:44 +0100

Download raw body.

Thread
looks good ok nicm

On Mon, 31 Aug 2026, 11:54 Kirill A. Korinsky, <kirill@korins.ky> wrote:

> On Mon, 31 Aug 2026 10:16:28 +0200,
> Nicholas Marriott <nicholas.marriott@gmail.com> wrote:
> >
> > It is a little unfortunate UTF8 is a client flag rather than tty_term but
> > it kind of has to be, so this looks the right approach.
> >
> > I think tty_feature_present should special-case this as well (you can
> > check term->tty->client->flags) and then you need this in window-client.c
> > also so it shows up in the info pane (C-b D i):
> >
> > --- window-client.c     5 Aug 2026 08:54:56 -0000       1.48
> > +++ window-client.c     31 Aug 2026 08:13:37 -0000
> > @@ -102,7 +102,8 @@ static const char *window_client_info_li
> >         WINDOW_CLIENT_FEATURE(sync) " "
> >         WINDOW_CLIENT_FEATURE(title),
> >         "              #[#{E:tree-mode-border-style},acs]x#[default] "
> > -       WINDOW_CLIENT_FEATURE(usstyle),
> > +       WINDOW_CLIENT_FEATURE(usstyle) " "
> > +       WINDOW_CLIENT_FEATURE(utf8),
> >
> >
> "#[#{E:tree-mode-border-style},acs]qqqqqqqqqqqqqqn#{R:q,#{window_width}}#[default]",
> >
> >         "#[fg=themelightgrey]prefix
> >  #[#{E:tree-mode-border-style},acs]x#[default] "
> >
>
> Thanks, here updated diff which should report utf8 state when it is enabled
> via locale, -u or the new feature.
>
> Ok?
>
> Index: tmux.1
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/tmux/tmux.1,v
> diff -u -p -r1.1159 tmux.1
> --- tmux.1      25 Aug 2026 08:37:08 -0000      1.1159
> +++ tmux.1      31 Aug 2026 10:45:16 -0000
> @@ -5111,6 +5111,8 @@ Supports
>  title setting.
>  .It usstyle
>  Allows underscore style and colour to be set.
> +.It utf8
> +Supports UTF\-8 output.
>  .El
>  .It Ic terminal\-overrides[] Ar string
>  Allow terminal descriptions read using
> Index: tty-features.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/tmux/tty-features.c,v
> diff -u -p -r1.42 tty-features.c
> --- tty-features.c      17 Aug 2026 14:47:41 -0000      1.42
> +++ tty-features.c      31 Aug 2026 10:42:21 -0000
> @@ -358,6 +358,13 @@ static const struct tty_feature tty_feat
>         0
>  };
>
> +/* Terminal supports UTF-8. */
> +static const struct tty_feature tty_feature_utf8 = {
> +       "utf8",
> +       NULL,
> +       0
> +};
> +
>  /* Available terminal features. */
>  static const struct tty_feature *const tty_features[] = {
>         &tty_feature_256,
> @@ -380,7 +387,8 @@ static const struct tty_feature *const t
>         &tty_feature_strikethrough,
>         &tty_feature_sync,
>         &tty_feature_title,
> -       &tty_feature_usstyle
> +       &tty_feature_usstyle,
> +       &tty_feature_utf8
>  };
>
>  /* Parse features for client. */
> @@ -463,6 +471,9 @@ tty_feature_present(struct tty_term *ter
>         u_int                            i;
>         char                            *copy;
>
> +       if (strcmp(name, "utf8") == 0)
> +               return ((term->tty->client->flags & CLIENT_UTF8) != 0);
> +
>         for (i = 0; i < nitems(tty_features); i++) {
>                 tf = tty_features[i];
>                 if (strcmp(tf->name, name) == 0) {
> @@ -476,7 +487,8 @@ tty_feature_present(struct tty_term *ter
>          * We don't just have the feature flag set. Check if the
> capabilities
>          * supported by the client are actual set instead.
>          */
> -       if (tf == NULL || strcmp(name, "ignorefkeys") == 0)
> +       if (tf == NULL || tf->capabilities == NULL ||
> +           strcmp(name, "ignorefkeys") == 0)
>                 return (0);
>         if (tf->flags != 0 && (term->flags & tf->flags) != tf->flags)
>                 return (0);
> @@ -524,6 +536,8 @@ tty_apply_features(struct tty_term *term
>                         }
>                 }
>                 term->flags |= tf->flags;
> +               if (tf == &tty_feature_utf8)
> +                       c->flags |= CLIENT_UTF8;
>         }
>         if ((term->applied_features|feat) == term->applied_features)
>                 return (0);
> Index: window-client.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/tmux/window-client.c,v
> diff -u -p -r1.48 window-client.c
> --- window-client.c     5 Aug 2026 08:54:56 -0000       1.48
> +++ window-client.c     31 Aug 2026 10:42:21 -0000
> @@ -102,7 +102,8 @@ static const char *window_client_info_li
>         WINDOW_CLIENT_FEATURE(sync) " "
>         WINDOW_CLIENT_FEATURE(title),
>         "              #[#{E:tree-mode-border-style},acs]x#[default] "
> -       WINDOW_CLIENT_FEATURE(usstyle),
> +       WINDOW_CLIENT_FEATURE(usstyle) " "
> +       WINDOW_CLIENT_FEATURE(utf8),
>
> "#[#{E:tree-mode-border-style},acs]qqqqqqqqqqqqqqn#{R:q,#{window_width}}#[default]",
>
>         "#[fg=themelightgrey]prefix
> #[#{E:tree-mode-border-style},acs]x#[default] "
>
>
> --
> wbr, Kirill
>