Hi internals

I would like to propose extending PHP with support functions to enable
interactive console work on Windows system. I mean the ability to
control a PHP script running from the console using arrow keys, or
function keys like "F1", etc. For example, when a list is displayed to
the user and the user can select the desired item using the arrow keys
and confirm it with the Enter key.

An analysis of other solutions, a detailed description of the problems
and a proof of concept is in the proposal in the issue here:
https://github.com/php/php-src/issues/12227

The short version is that on Linux you can use "fread" function to read
these keys (arrows, etc.) if you use an external `stty` command to set
the console input processing modes (for example the laravel/prompts
package use "stty -icanon -isig -echo"). However, there is no
equivalent of the `stty` command for Windows (without the need to use
the FFI extension, or the need to call an external program to read
pressed keys, see issue for more details), so I propose to extend PHP
with support functions for setting the console input mode
(ENABLE_ECHO_INPUT, ENABLE_LINE_INPUT, ENABLE_PROCESSED_INPUT,
ENABLE_VIRTUAL_TERMINAL_INPUT) by "SetConsoleMode" function, see:
https://learn.microsoft.com/en-us/windows/console/setconsolemode

I would like to know your opinion on this proposal. Or if you have any
questions.

And then as a next step I would like to create an RFC proposing these
functions for Windows support. And possibly I could help with
implementation (see my proof of concept in the issue).

Alternatively, there is the question of whether to generalize this and
directly design a multiplatform API that would allow to read these keys
without the need to use any external programs even on Linux (where
"stty" is used). But I don't know which has a better chance of
implementation, a simple extension for Windows or a more complex
multiplatform solution.

Best regards
Patrik Pasterčík

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to