ncurses에서 function key 입력에 대한 문제

sepiro2000의 이미지

keypad() 를 TRUE로 설정하고 getch() 를 통해 입력을 받았습니다.
그런데 F1~F4는 인식이 안되고, F5~F12만 인식이 됩니다.
콘솔에서 직접하면 문제가 없지만 putty 같은 것을 이용해서 SSH 접속을 해서 하면 위와 같은 문제가 발생합니다.
왜 이런 문제가 발생하는 것일까요??
참고로 putty로 접속한 후 LinM을 실행시키면 여기서는 또 모든 기능키가 인식이 됩니다.
제 프로그램에 문제가 있는 것 같은데요. 왜 그런걸까요?

la9527의 이미지

LinM 에선 keyset을 여러개 설정해서 사용합니다.

키셋이 한가지만 존재 하는게 아니라,
각 콘솔 마다 다 입력되는 키가 다르기 때문이거든요.

LinM의 /etc/linm/keyset.cfg 파일을 보고 내용을 보면,

키값이 10진수로 265도 될수 있고, 다른 콘솔에선 한번 누르면 4개가
한꺼번에(27, 91, 49, 49) 들어오는 것도 있습니다.

따라서 여러개의 키를 다양하게 인식 시켜야 가능합니다.

답변이 되었는지 모르겠네요.

sepiro2000의 이미지

답변 감사합니다. (__)

4개가 한꺼번에 들어온다면 어떤 방법으로 인식시켜야 하는 건가요?
지금 저는 switch(key) 와 case 문 으로 인식시키고 있거든요..

bushi의 이미지

linM 도 ncurses 사용하나요 ? 그런데도 뭔 keyset 을 따로 정의한다면 굉장한 삽질을 하는 ...

putty 로 접속한 후 echo -e "\005" 와 echo $TERM 의 결과가 일치하는 지 확인해보세요.
(대소문자는 상관없습니다)

putty 라는 terminal type 에 대한 정의는 이미 /etc/termcap 에 되어 있습니다.
ncurses 에서 제공하는 demo_termcap.c 정도만 응용하셔도 ...

fedora8 에서 ncurses-devel 을 설치하고 테스트한 결과입니다.

[bushi@rose net]$ echo "#include <ncurses.h>" > ncurses_cfg.h
[bushi@rose net]$ gcc -s -I ./ -I /usr/share/doc/ncurses-devel-5.6/test `ncursesw5-config --cflags` -o demo_termcap demo_termcap.c `ncursesw5-config --libs`
In file included from demo_termcap.c:37:
/usr/share/doc/ncurses-devel-5.6/test/test.priv.h:273:1: warning: "getnstr" redefined
In file included from ./ncurses_cfg.h:1,
                 from /usr/share/doc/ncurses-devel-5.6/test/test.priv.h:37,
                 from demo_termcap.c:37:
/usr/include/ncursesw/ncurses.h:924:1: warning: this is the location of the previous definition
demo_termcap.c: In function ‘dumpit’:
demo_termcap.c:57: warning: assignment makes pointer from integer without a cast
[bushi@rose net]$ 

[bushi@rose net]$ ./demo_termcap xterm | grep "k[0-9,;]"
str k1 = \EOP
str k2 = \EOQ
str k3 = \EOR
str k4 = \EOS
str k5 = \E[15~
str k6 = \E[17~
str k7 = \E[18~
str k8 = \E[19~
str k9 = \E[20~
str k; = \E[21~
[bushi@rose net]$ ./demo_termcap putty | grep "k[0-9,;]"
str k1 = \E[11~
str k2 = \E[12~
str k3 = \E[13~
str k4 = \E[14~
str k5 = \E[15~
str k6 = \E[17~
str k7 = \E[18~
str k8 = \E[19~
str k9 = \E[20~
str k; = \E[21~
[bushi@rose net]$

k1 ~ k; 는 F1 ~ F10 을 지칭하는 예약어입니다.
\E 는 0x1B 에 해당하는 문자입니다. ESC 말입니다.

추가.

혹시 오해하실 것 같아 덧붙이는데요,
저걸 파싱해서 뭘 어떻게 하라는 게 아니라... 코드는 터미널에 따라 틀리다는 것을 말씀드리려한거고
ncurses 는 이미 wrapping 을 해서 투명한 처리를 하고 있습니다.
demo_keyok.c 를 보시면 됩니다.

OTL

la9527의 이미지

ncurses를 좀더 공부해야겠네요.
좋은 방법이네요. LinM 도 참고 삼아야 겠습니다.

답변 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.