xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
10.04k stars 786 forks source link

xmake f --menu not responding in vscode terminal on windows #1610

Closed xq114 closed 2 years ago

xq114 commented 3 years ago

描述问题

Windows上使用VSCode的terminal时,运行xmake f --menu,则上下左右方向键均无响应,只有Enter和Backspace有响应。在其他terminal都正常。

期待的结果

在vscode terminal中也能使用xmake f --menu功能

错误信息

相关环境

请提供编译和运行环境信息,下面是一些必须填写的基础信息,便于我们针对性排查问题:

其他信息

image

xq114 commented 3 years ago

linux下vscode terminal也正常,windows上vscode remote连接linux使用也正常,只有原生windows环境vscode terminal有问题

waruqi commented 3 years ago

这。。还真有在vscode terminal 下用这玩意的哈,等回头有时间看看 = =

waruqi commented 3 years ago

我试了下,可以的么 这边没法复现,不过我这里是 powershell 不是 pwsh

xq114 commented 3 years ago

我试了下,可以的么 这边没法复现,不过我这里是 powershell 不是 pwsh

cmd里也有此问题

waruqi commented 3 years ago

我这里都可以。

xq114 commented 3 years ago

Version: 1.60.0 (user setup) Commit: e7d7e9a9348e6a8cc8c03f877d39cb72e5dfb1ff Date: 2021-09-01T10:41:52.311Z Electron: 13.1.8 Chrome: 91.0.4472.164 Node.js: 14.16.0 V8: 9.1.269.39-electron.0 OS: Windows_NT x64 10.0.19043

waruqi commented 3 years ago

可以直接调下这里 https://github.com/xmake-io/xmake/blob/67c6212a9f7269f17f13f6bf10952c7b1c69d2c5/xmake/core/ui/program.lua#L369

用 log:print()

日志文件在 project/.xmake/ui.log

xq114 commented 3 years ago

image

ui.log里面我按的上(450),下(456),左(452),右(454)都没识别

xq114 commented 3 years ago

在其他terminal里面这些是259、258、260、261

waruqi commented 3 years ago

那这个要调下 pdcurse 里面 getch 为啥不识别了

https://github.com/xmake-io/xmake/blob/67c6212a9f7269f17f13f6bf10952c7b1c69d2c5/core/src/lcurses/lcurses.c#L259

https://github.com/xmake-io/xmake-core-pdcurses/blob/5a522dc7ac23b8571f68851b844d3dd4dc6a67a5/pdcurses/getch.c#L160

waruqi commented 2 years ago

在其他terminal里面这些是259、258、260、261

这些终端才是正常行为,pdcures 里面定义的也是这些。。

#define KEY_DOWN      0x102  /* Down arrow key */
#define KEY_UP        0x103  /* Up arrow key */
#define KEY_LEFT      0x104  /* Left arrow key */
#define KEY_RIGHT     0x105  /* Right arrow key */

https://github.com/wmcbrine/PDCurses/blob/ffb83fab0f7dcabdc40176e2e87fbff46e983d01/curses.h#L632-L635

ui.log里面我按的上(450),下(456),左(452),右(454)都没识别

这个是不正常的,我不知道你这 vscode 下为啥为收到这些,我这都是 259 等正常值。。感觉像是 vscode 的问题,跟 xmake 没啥太大关系

waruqi commented 2 years ago

反正目前这边只能处理收到正常 key code 值,其他未知的 key 也没法额外做特殊 map,所以暂时无解,先 close 了

xq114 commented 2 years ago

我debug了一下,原因是VSCode基于ConPTY,而ConPTY(Pseudo Terminal)相当于加了一层虚拟键盘,所以和普通terminal输出不同。在其他使用ConPTY API的terminal(extraterm,etc)里面都能复现这个问题。ConPTY API不会设置extended,因此具有和Console API不同的行为,而pdcurses没有对ConPTY API的这种行为进行支持。

https://github.com/wmcbrine/PDCurses/blob/HEAD/wincon/pdckbd.c#L444-L453

这里state&extended结果在传统console上是0x100,在ConPTY里面是0,所以原来map到KEY_UP的键会map到KEY_A2,KEY_DOWN map到KEY_C2,以此类推。所以会出不同结果。

https://github.com/wmcbrine/PDCurses/blob/HEAD/wincon/pdckbd.c#L236-L239

https://github.com/wmcbrine/PDCurses/blob/HEAD/wincon/pdckbd.c#L72-L75

关于这些键位,pdcurses的解释是Virtual keyboard上的键,见

https://github.com/wmcbrine/PDCurses/blob/HEAD/curses.h#L766-L774

MS现在在推新的ConPTY,未来基于ConPTY的terminal可能会越来越多,不支持ConPTY还是有影响的。这里还是改下好。

waruqi commented 2 years ago

,而pdcurses没有对ConPTY API的这种行为进行支持。

它没支持,那这是需要 pdcurses 改什么么?我看它不是已经识别标示为 virtual key 了么

如果这些虚拟键位的值在所有 ConPTY 终端上 map 关系一致,key up对应的值固定,我可以外面兼容处理下 map

xq114 commented 2 years ago

,而pdcurses没有对ConPTY API的这种行为进行支持。

它没支持,那这是需要 pdcurses 改什么么?我看它不是已经识别标示为 virtual key 了么

如果这些虚拟键位的值在所有 ConPTY 终端上 map 关系一致,key up对应的值固定,我可以外面兼容处理下 map

是固定的

waruqi commented 2 years ago

https://github.com/xmake-io/xmake/commit/7f3706c2ad219d6632b3be0a4705042ced0d0233 我加上了,再试试

xq114 commented 2 years ago
error: @programdir\core\ui\program.lua:353: table index is nil
stack traceback:
        @programdir\core\base\utils.lua:290: in metamethod 'newindex'
        @programdir\core\ui\program.lua:353: in function 'ui/application._key_map'
        @programdir\core\ui\program.lua:396: in function 'ui/application._input_key'
        @programdir\core\ui\program.lua:143: in function 'ui/application.event' 
        @programdir\core\ui\program.lua:228: in function 'ui/application.loop'  
        @programdir\core\ui\application.lua:110: in function <@programdir\core\ui\application.lua:105>
        [C]: in function 'xpcall'
        @programdir\core\base\utils.lua:280: in function 'sandbox/modules/utils.trycall'
        @programdir\core\ui\application.lua:116: in function 'ui/application.run'
        @programdir\actions\config\menuconf.lua:404: in function <@programdir\actions\config\menuconf.lua:403>
        (...tail calls...)
        @programdir\actions\config\main.lua:282: in function <@programdir\actions\config\main.lua:249>
        (...tail calls...)
        [C]: in function 'xpcall'
        @programdir\core\base\utils.lua:280: in function 'sandbox/modules/utils.trycall'
        (...tail calls...)
        @programdir\core\base\task.lua:519: in function 'base/task.run'
        @programdir\core\main.lua:278: in upvalue 'cotask'
        @programdir\core\base\scheduler.lua:371: in function <@programdir\core\base\scheduler.lua:368>
waruqi commented 2 years ago

改进过了,不过需要等 https://github.com/xmake-io/xmake/actions/runs/1470072651 上跑完,才能全量更新,因为改了 core

xmake update master

waruqi commented 2 years ago

好了,再试下 https://github.com/xmake-io/xmake/actions/runs/1470072651

xq114 commented 2 years ago

现在可以了