[Rd] Customizing width of input in Rterm

Iago Giné-Vázquez |@go@g|ne @end|ng |rom @jd@e@
Mon Mar 10 17:22:23 CET 2025


Thank you, Ivan!

On 26/02/2025 12:42, Ivan Krylov wrote:

> В Fri, 21 Feb 2025 11:52:41 +0100
> Iago Giné-Vázquez<iago.gine using sjd.es> пишет:
>
>> When using Rterm.exe (on Windows, I didn’t check Linux) only a
>> limited number of characters is displayed in the input lines,
>> independent on the |width| option, and, when navigating through the
>> command history this becomes very uncomfortable, since a command is
>> not fully displayed and, for example, it is very difficult to know
>> which parts of a command are being edited.
> The patch at the end of this message reads the console width on startup
> and handles the console resize events while getline() is running. The
> automatic resizing doesn't look nice due to gl_redraw() starting a new
> line newline before redrawing the prompt, but it works.
>
> This may have accessibility implications since it changes the behaviour
> of Rterm.exe, which is what A. Jonathan R. Godfrey recommends for blind
> Windows users [1]. I've experimented with NVDA and didn't notice
> anything breaking in Windows 10 terminal or mintty.exe, but it's hard
> to be sure without the real experience of using a screen reader.
>
> Is this approach worth adopting? Is it better to erase the current line
> instead of starting a new one? options(setWidthOnResize) could be
> implemented similarly but may require more care due to
> R_SetOptionWidth(...) evaluating R code.
>
> Index: src/gnuwin32/getline/getline.c
> ===================================================================
> --- src/gnuwin32/getline/getline.c	(revision 87795)
> +++ src/gnuwin32/getline/getline.c	(working copy)
> @@ -25,6 +25,7 @@
>   int 		(*gl_in_hook)(char *) = 0;
>   int 		(*gl_out_hook)(char *) = 0;
>   int 		(*gl_tab_hook)(char *, int, int *) = gl_tab;
> +static int      do_setwidth(int w);
>   
>   #include <Rconfig.h>
>   #include <R_ext/Riconv.h>
> @@ -214,6 +215,10 @@
>            The bug still exists in Windows 10, and thus we now call
>            GetConsoleInputW to get uchar.UnicodeChar. */
>         ReadConsoleInputW(Win32InputStream, &r, 1, &a);
> +      if (r.EventType == WINDOW_BUFFER_SIZE_EVENT) {
> +        if (do_setwidth(r.Event.WindowBufferSizeEvent.dwSize.X))
> +          gl_redraw();
> +      }
>         if (!(r.EventType == KEY_EVENT)) break;
>         st = r.Event.KeyEvent.dwControlKeyState;
>         vk = r.Event.KeyEvent.wVirtualKeyCode;
> @@ -487,6 +492,11 @@
>       gl_w2e_map = gl_realloc(NULL, 0, BUF_SIZE, sizeof(size_t));
>   
>       gl_char_init();
> +
> +    CONSOLE_SCREEN_BUFFER_INFO csb;
> +    GetConsoleScreenBufferInfo(Win32OutputStream, &csb);
> +    do_setwidth(csb.dwSize.X);
> +
>       gl_init_done = 1;
>   }
>   
> @@ -536,13 +546,21 @@
>       BUF_SIZE = newsize;
>   }
>   
> +static int
> +do_setwidth(int w)
> +{
> +    /* may be called from gl_getc if a resize event is received */
> +    if (w > 20) {
> +	gl_w_termw = w;
> +	return 1;
> +    }
> +    return 0;
> +}
> +
>   void
>   gl_setwidth(int w)
>   {
> -    /* not used in R; should arrange for redraw */
> -    if (w > 20)
> -	gl_w_termw = w;
> -    else
> +    if (!do_setwidth(w))
>   	gl_error("\n*** Error: minimum screen width is 21\n");
>   }
>   
>
>
​

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 665 bytes
Desc: OpenPGP digital signature
URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20250310/365bb625/attachment.sig>


More information about the R-devel mailing list