'Input'에 해당되는 글 1건

"ESC" 키를 누르면 종료하게 됩니다.

Escape seq 로 진입하는 경우에 대한 코드는 머리가 복잡하여 좀 고민좀 해봐야 겠네요.

코드:
/*
Copyright (C) Information Equipment co.,LTD.
All rights reserved.
Code by JaeHyuk Cho <mailto:minzkn@infoeq.com>
CVSTAG="$Header$"
*/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(void)
{
struct termios s_termios, s_termios_save;
int s_key, s_break, s_read_bytes, s_index;
unsigned char s_buffer[ 128 ];
if(tcgetattr(STDIN_FILENO, (struct termios *)(&s_termios)) == 0)
{
  (void)memcpy((void *)(&s_termios_save), (void *)(&s_termios), (size_t)sizeof(struct termios));
#if 0 /* blocking */
  s_termios.c_lflag &= ~(ECHO | ICANON | ISIG);
  s_termios.c_iflag &= ~(BRKINT);
#else
  s_termios.c_lflag |= (ISIG);
  s_termios.c_lflag &= ~(ECHO | ICANON);
  s_termios.c_iflag |= (BRKINT);
  s_termios.c_iflag &= ~(IGNBRK);
#endif
  s_termios.c_cc[VMIN] = 1;
  s_termios.c_cc[VTIME] = 0;
  if(tcsetattr(STDIN_FILENO, TCSAFLUSH, (struct termios *)(&s_termios)) == 0)
  {
   s_break = 0;

   do
   {
    /* read */
    s_read_bytes = (int)read(STDIN_FILENO, (void *)(&s_buffer[0]), (size_t)sizeof(s_buffer));
    if(s_read_bytes <= 0)continue;

    /* debug */
    (void)fputs("VT CODE=\"", stdout);
    for(s_index = 0;s_index < s_read_bytes;s_index++)
    {
     if(s_buffer[s_index] == 0x1b)(void)fputs("ESC", stdout);
     else if((s_buffer[s_index] >= ' ') && (s_buffer[s_index] <= 0x7e))(void)fputc((int)s_buffer[s_index], stdout);
     else (void)fprintf(stdout, "(%02XH)", (int)s_buffer[s_index]);
    }
    (void)fputs("\"\n", stdout);

    /* key map */
    if(s_read_bytes == 1)s_key = (int)s_buffer[0];
    else
    { /* escape seq */
     s_key = 0;
    }

    /* select */
    switch(s_key)
    {
     case 0x0000001b: s_break = 1; break; /* ESC key */
     default:
          break;
    }
   }while(s_break == 0);

   /* restore termios */
   if(tcsetattr(STDIN_FILENO, TCSAFLUSH, (struct termios *)(&s_termios_save)) == 0)
   {
    (void)fprintf(stdout, "leave\n");
   }
   else (void)fprintf(stdout, "error: tcsetattr\n");
  }
  else (void)fprintf(stdout, "error: tcsetattr\n");
}
else (void)fprintf(stdout, "error: tcgetattr\n");
return(0);
}

/* End of source */
크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/99

댓글을 달아 주세요