Linux: getchar()

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 5378
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Linux: getchar()

Inlägg av Marta »

För att läsa tangentbordet i ett textlägesprogram använder jag nu getchar(). Specialtangenter skall användas och då kräker denna funktion en jätteharrang. Finns det någon alterbativ funktion som bara ger ett enda, eller fast antal, värden?

Vad värre är, spyan inleds med 0x1b !!! Hur f*n skall då Esc kunna användas? Är det möjligt att se om en spya ligger köad, eller är det timerelände som gäller?
Användarvisningsbild
MadModder
Co Admin
Inlägg: 24551
Blev medlem: 6 september 2003, 13:32:07
Ort: MadLand (Enköping)
Kontakt:

Re: Linux: getchar()

Inlägg av MadModder »

Kanske detta https://github.com/pkubik/readkey

Sen hittade jag detta:
” Back in the day, programs that wanted to distinguish between the press of an escape key and the press of an arrow or numeric keypad key had to fiddle with the termios VTIME and VMIN values. Multiple characters that appeared within a few tenths of a second of each other were considered to have come from an arrow or numerical keypad key”
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 5378
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Linux: getchar()

Inlägg av Marta »

Tack för svar.

Då är det så här bakvänt. Den som designade getchar() måste ha druckit mycket jäst Jolt efter en alldeles för lång dag när han hittade på eländet. :?
Palle500
Inlägg: 1770
Blev medlem: 6 juni 2015, 14:53:06

Re: Linux: getchar()

Inlägg av Palle500 »

Getchar() gör väl det den skall, visar vilka tangenter som tryckts? Sen att tangentbordet skickar en kaskad av tangenttryckningar för vissa tangenter är väl inte funktionens fel?
Men jag har aldrig programmerat i Linux så kanske jag som fattar fel.
Användarvisningsbild
hawkan
Inlägg: 1870
Blev medlem: 14 augusti 2011, 10:27:40

Re: Linux: getchar()

Inlägg av hawkan »

Ncurses getch() kan ge funktionstangenter om jag kommer ihåg rätt
Men man vill kanske inte använda ncurses av andra skäl.
xxargs
Inlägg: 9851
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Linux: getchar()

Inlägg av xxargs »

Gräver man mot lågnivå så hittar man mycket historiskt skit som måste hanteras, som alla glömt bort men faktiskt är kvar men väl gömt bakom funktioner... och PC-världen är väl en av de sämsta när det gäller hela tiden plåstrad HW och dess quirkar stackade på varandra.
SvenW
Inlägg: 1080
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: Linux: getchar()

Inlägg av SvenW »

Man kan använda Xlib, men det är ju inte jätteenkelt, som du säkert vet.
Där får man ut tangentkoder på låg nivå.
Användarvisningsbild
bit96
Inlägg: 2379
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: Linux: getchar()

Inlägg av bit96 »

Funktionen getchar() är mycket primitiv vilket man snabbt konstaterade redan på 80-talet.
Minsta "feltryck" på någon F-tangent eller liknande och programmet spårar ur.

Sedan dess har jag alltid använt en egen funktion som kapslar in getchar() med egen buffert och hantering av fler-teckens-tangenter.
Man kompletterar även med egna funktioner motsvarande clearbuffer() och ungetchar().
Dessutom behöver man en tabell/#DEFINE/motsavarnde med vad de olika ASCII- och ICKEASCII-koderna motsvarar för tangent.
Allt hamnar i en liten .c-fil och .h-fil som enkelt inkluderas i projektet.

Därefter är det hur lätt som helst att hantera alla tänkbara knapptryck och knapptrycks-kombinationer på tangentbordet.
De man inte behöver bara ignoreras utan att programmet kraschar.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 5378
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Linux: getchar()

Inlägg av Marta »

Det är väl något i den stilen jag har nu. Kommer den i otakt kan det ske lite magiska saker, men den kommer snabbt rätt igen.

Tangentbordet kräker väl en del på vissa knappar, men just det borde systemet hantera och erbjuda en alternativ ny funktion som ger ett entydigt värde i fast format för alla tangenterna. Xlib har det, varför inte glibc?

Med egna teckentabeller till Xlib är nästan allt "fritt". Det är Alt-F som där är problem med och något med program som tar över en viss kombination i alla lägen.
getchar() har många problemtangenter, men antar rätt parameterblock löser det mesta.

Saknar också en event driven funktion, men de blir väl ungefär detsamma med en blocking. Det viktiga är att den inte vrålkör i en väntloop och konsumerar CPU till ingenting.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 5378
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Linux: getchar()

Inlägg av Marta »

Hur f*n får jag bort xon/xoff från getchar?

Skickar en termios med IXON och IXOFF clearade, men detta hänger kvar ändå.

Löste det själv. c_iflag, inte c_lflag...
Skriv svar