screen-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [screen-devel] [PATCH] ansi: add support for xterm OSC 11


From: Amadeusz Sławiński
Subject: Re: [screen-devel] [PATCH] ansi: add support for xterm OSC 11
Date: Thu, 31 Aug 2017 11:32:44 +0200

Hey,

On Wed, 30 Aug 2017 17:23:41 +0200
Lubomir Rintel <address@hidden> wrote:

> It allows for getting and setting the background color. Notably, Vim uses
> OSC 11 to learn whether it's running on a light or dark colored terminal
> and choose a color scheme accordingly.
> 
> Tested with gnome-terminal and xterm. When called with "?" argument the
> current background color is returned:
> 
>   $ echo -ne "\e]11;?\e\\"
>   $ 11;rgb:2323/2727/2929
> 
> Signed-off-by: Lubomir Rintel <address@hidden>
> ---
>  src/ansi.c    | 16 +++++++++-------
>  src/display.c |  6 +++++-
>  2 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/src/ansi.c b/src/ansi.c
> index 8f3ddd6..034648b 100644
> --- a/src/ansi.c
> +++ b/src/ansi.c
> @@ -1250,22 +1250,24 @@ static int StringEnd(Window *win)
>                       }
>                       break;
>               }
> -             if (typ == 0 || typ == 1 || typ == 2 || typ == 20 || typ == 39 
> || typ == 49) {
> +             if (typ == 0 || typ == 1 || typ == 2 || typ == 20 || typ == 39 
> || typ == 49 || typ == 11) {

Values here are in growing order, so put typ == 11 between 2 and 20 checks, for 
clarity.

>                       int typ2;
>                       typ2 = typ / 10;
> -                     if (--typ2 < 0)
> -                             typ2 = 0;
>                       if (strcmp(win->w_xtermosc[typ2], p)) {
> -                             strncpy(win->w_xtermosc[typ2], p, 
> ARRAY_SIZE(win->w_xtermosc[typ2]) - 1);
> -                             
> win->w_xtermosc[typ2][ARRAY_SIZE(win->w_xtermosc[typ2]) - 1] = 0;
> +                             if (typ != 11 || strcmp("?", p)) {
> +                                     strncpy(win->w_xtermosc[typ2], p, 
> ARRAY_SIZE(win->w_xtermosc[typ2]) - 1);
> +                                     
> win->w_xtermosc[typ2][ARRAY_SIZE(win->w_xtermosc[typ2]) - 1] = 0;
> +                             }
>  
>                               for (display = displays; display; display = 
> display->d_next) {
>                                       if (!D_CXT)
>                                               continue;
>                                       if (D_forecv->c_layer->l_bottom == 
> &win->w_layer)
> -                                             SetXtermOSC(typ2, 
> win->w_xtermosc[typ2]);
> -                                     if ((typ2 == 2 || typ2 == 3) && 
> D_xtermosc[typ2])
> +                                             SetXtermOSC(typ2, p);
> +                                     if ((typ2 == 3 || typ2 == 4) && 
> D_xtermosc[typ2])
>                                               Redisplay(0);
> +                                     if (typ == 11 && !strcmp("?", p))
> +                                             break;
>                               }
>                       }
>               }
> diff --git a/src/display.c b/src/display.c
> index 94eb2e5..af4ec2a 100644
> --- a/src/display.c
> +++ b/src/display.c
> @@ -2128,6 +2128,7 @@ void SetXtermOSC(int i, char *s)
>  {
>       static char *oscs[][2] = {
>               {WT_FLAG ";", "screen"},        /* set window title */
> +             {"11;", ""},    /* background RGB */
>               {"20;", ""},    /* background */
>               {"39;", "black"},       /* default foreground (black?) */
>               {"49;", "white"}        /* default background (white?) */
> @@ -2147,7 +2148,10 @@ void SetXtermOSC(int i, char *s)
>       AddStr("\033]");
>       AddStr(oscs[i][0]);
>       AddStr(s);
> -     AddChar(7);
> +     if (i == 1)
> +             AddStr("\033\\");
> +     else
> +             AddChar(7);

From what I can see string terminator can either be "\e\\" or '\a'
(http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Commands),
so it would be nice if we could handle both correctly, without forcing
one depending on i parameter.

In xterm I see:
$ echo -ne "\e]11;?\e\\"
^[]11;rgb:0000/0000/0505^[\
$ echo -ne "\e]11;?\a"
^[]11;rgb:0000/0000/0505^G

>  }
>  
>  void ClearAllXtermOSC()

Do notice that you change SetXtermOSC, and there are 2 places in code,
where code loops over all values, so you need to also update those.

display.c-2160- for (i = 3; i >= 0; i--)
display.c:2161:         SetXtermOSC(i, 0);

process.c-5671- for (i = 3; i >= 0; i--)
process.c:5672:         SetXtermOSC(i, p ? p->w_xtermosc[i] : 0);

Cheers,
Amadeusz



reply via email to

[Prev in Thread] Current Thread [Next in Thread]