bug-ncurses
[Top][All Lists]
Advanced

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

Re: Ncurses keypad is not properly working in FreeBSD


From: Archimedes Gaviola
Subject: Re: Ncurses keypad is not properly working in FreeBSD
Date: Wed, 25 Jan 2023 13:02:55 +0800



On Tue, Jan 24, 2023 at 4:59 PM Thomas Dickey <dickey@his.com> wrote:
On Tue, Jan 24, 2023 at 12:09:08PM +0800, Archimedes Gaviola wrote:
>  Hi,
>
> I have a C program that accepts and displays numeric characters in 0-9 only
> and with alphabet keys, function keys are expected not to respond to any
> code from the keyboard using keypad(). I simulated a plain Ncurses C
> program without a window and another one with a window using the newwin()
> function. The program without window works getting no response from
> alphabet keys as well as function keys, however the Enter/return key (ch ==
> KEY_ENTER) is not working instead I use (ch == '\n') to get it to work. The


Hi Thomas,
 
The usual point of confusion for KEY_ENTER is that terminal descriptions
use the escape sequence from the numeric-keypad (active when keypad() is
called), rather than the "Enter" key on the main keyboard.

The numeric keypad in xterm (like vt100, etc), sends escape sequences
when keypad-mode is enabled.  xterm changes those to the "face codes",
e.g., 0, 1, 2, etc., when NumLock is pressed.  Those escape sequences
are documented in the xterm control sequences.

Okay let me check that document.
 

Some other terminals (for which of course no documentation exists)
use different escape sequences (determined by the X keyboard configuration),
e.g., cursor-keys, page up/down, etc.

CDK doesn't know about any of those escape sequences.  If your terminfo
database is reasonably up-to-date, it'll have extended definitions which
allow ncurses to return just keycodes rather than the bytes of the escape
sequence, e.g.,  (using infocmp -x xterm):

        ka2=\EOx, kb1=\EOt, kb3=\EOv, kc2=\EOr,
        kp5=\EOE, kpADD=\EOk, kpCMA=\EOl, kpDIV=\EOo, kpDOT=\EOn,
        kpMUL=\EOj, kpSUB=\EOm, kpZRO=\EOp,

which come from this block in the terminfo.src:

https://invisible-island.net/ncurses/terminfo.src.html#tic-xterm_keypad

xterm+keypad|xterm emulating VT100/VT220 numeric keypad,
        kbeg=\EOE, kp5=\EOE, kpADD=\EOk, kpCMA=\EOl, kpDIV=\EOo,
        kpDOT=\EOn, kpMUL=\EOj, kpSUB=\EOm, kpZRO=\EOp,
        use=vt220+keypad,

Yes it produces similar output by using infocmp -x xterm command. Here,

pangi@siquijor:~/ncurses-programming # infocmp -x xterm
#       Reconstructed via infocmp from file: /usr/local/share/terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),
        OTbs, am, bce, km, mc5i, mir, msgr, npc, xenl, AX, XT,
        colors#8, cols#80, it#8, lines#24, pairs#64,
        acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
        dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
        el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
        hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
        il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS,
        invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~,
        kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D,
        kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, ka1=\EOw,
        ka3=\EOy, kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs, kcbt=\E[Z,
        kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q,
        kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~,
        kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
        kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~,
        kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S,
        kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~,
        kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~,
        kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q,
        kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~,
        kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~,
        kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~,
        kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q,
        kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
        kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
        kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
        kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
        kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
        kind=\E[1;2B, kmous=\E[<, knp=\E[6~, kpp=\E[5~,
        kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El,
        memu=\Em, mgc=\E[?69l, nel=\EE, op=\E[39;49m, rc=\E8,
        rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM,
        rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B, rmam=\E[?7l,
        rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l, rmkx=\E[?1l\E>,
        rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec,
        rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm,
        setaf=\E[3%p1%dm,
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
        sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h,
        smcup=\E[?1049h\E[22;0;0t,
        smglr=\E[?69h\E[%i%p1%d;%p2%ds, smir=\E[4h,
        smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m,
        tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
        u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
        Cr=\E]112\007, Cs=\E]12;%p1%s\007, E3=\E[3J,
        Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
        XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, kDC3=\E[3;3~,
        kDC4=\E[3;4~, kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~,
        kDN=\E[1;2B, kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B,
        kDN6=\E[1;6B, kDN7=\E[1;7B, kEND3=\E[1;3F, kEND4=\E[1;4F,
        kEND5=\E[1;5F, kEND6=\E[1;6F, kEND7=\E[1;7F,
        kHOM3=\E[1;3H, kHOM4=\E[1;4H, kHOM5=\E[1;5H,
        kHOM6=\E[1;6H, kHOM7=\E[1;7H, kIC3=\E[2;3~, kIC4=\E[2;4~,
        kIC5=\E[2;5~, kIC6=\E[2;6~, kIC7=\E[2;7~, kLFT3=\E[1;3D,
        kLFT4=\E[1;4D, kLFT5=\E[1;5D, kLFT6=\E[1;6D,
        kLFT7=\E[1;7D, kNXT3=\E[6;3~, kNXT4=\E[6;4~,
        kNXT5=\E[6;5~, kNXT6=\E[6;6~, kNXT7=\E[6;7~,
        kPRV3=\E[5;3~, kPRV4=\E[5;4~, kPRV5=\E[5;5~,
        kPRV6=\E[5;6~, kPRV7=\E[5;7~, kRIT3=\E[1;3C,
        kRIT4=\E[1;4C, kRIT5=\E[1;5C, kRIT6=\E[1;6C,
        kRIT7=\E[1;7C, kUP=\E[1;2A, kUP3=\E[1;3A, kUP4=\E[1;4A,
        kUP5=\E[1;5A, kUP6=\E[1;6A, kUP7=\E[1;7A, ka2=\EOx,
        kb1=\EOt, kb3=\EOv, kc2=\EOr, kp5=\EOE, kpADD=\EOk,
        kpCMA=\EOl, kpDIV=\EOo, kpDOT=\EOn, kpMUL=\EOj, kpSUB=\EOm,
        kpZRO=\EOp, rmxx=\E[29m, smxx=\E[9m,
        xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;,


If you're using the default ncurses on FreeBSD rather than the port,
you'll get something that corresponds more/less to their termcap,
which is rather inaccurate...

Yes I'm using the base or the built-in ncurses of FreeBSD. Just curious why the termcap of FreeBSD is inaccurate? I'm sorry got no history on this one but want to know what happen.
 

> backspace key (ch == KEY_BACKSPACE) is working. For the program with the
> window, I expect it to behave similar to the plain program but the function
> keys such F5 to F12 are showing codes on the screen as well as Insert,
> Delete, Page Up and Page Down keys are also showing codes. Only F1, F2, F3

Insert/Delete, Page Up and Page Down are (on PC keyboards...) in the "editing
keypad", for which some terminals don't agree with the $TERM that the
developers chose.

There's no details on this report, so we can only guess.

Here's the output codes with window in my program. For example when I press the key F5 then it outputs 15 in the screen and so on with the rests of the function keys below.

F5 - 15
F6 - 17
F7 - 18
F8 - 19
F9 - 20
F10 - 21
F11 - 23
F12 - 24

Insert - 2
Delete - 3
Page Up - 5
Page Down - 6

Again, my program without window does not have these outputs. By the way, what makes the difference when using the window in the program as compared to the plain one or without window? I'm figuring-out in looking the specific source if there's a way to tweak the code in order to behave similar to the plain program.


> and F4 are behaving expectedly. The same thing happens to the Enter/return
> and backspace keys I use (ch == '\n') and  (ch == '\b') to get them working.
>
> I need your help in this case if there's something I missed in the Ncurses
> initialization parameters or maybe a sort of environment variable
> configuration problem with my FreeBSD OS. My FreeBSD system is using xterm.
>
> pangi@siquijor:~ # echo $TERM
> xterm
>
> FreeBSD version: FreeBSD 14.0-CURRENT (arm64)
>
> Ncurses version:
> #define NCURSES_VERSION_MAJOR 6
> #define NCURSES_VERSION_MINOR 2
> #define NCURSES_VERSION_PATCH 20210220

this looks like the base/bundled version, which isn't something that I can fix.
For problems with that, FreeBSD has its own bug-reporting system.

Yes, that's right it's the base or built-in ncurses software of FreeBSD.
 

At the moment, the port is up to 6.3, which would have a patch 20211021

https://cgit.freebsd.org/ports/tree/devel/ncurses/

I made a port installation of ncurses port 'pkg install ncurses' but somehow when I compile this 6.3 it crashes my compiled C program when run though this is initial compile only, let me check further if I missed with the proper library.

Thanks and best regards,
Archimedes


reply via email to

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