Перейти к содержанию

проблема с терминалом в linux


Рекомендуемые сообщения

В-общем, пишу я такую вещь: надо чтобы нажатая клавиша выводилась на экран, но не просто, а большого размера.

Вот тут сорцы: http://www.shpi0.ru/lab3.zip

А вот в чем собственно проблема.

Вот основная функция программы:

int main()
{
    tKey KeyPressed=KT;
    init_term();
    cursor(0);
    ClearScreen();
    SetColor(Cyan,Black);
    while (KeyPressed!=KQ)
    {
	ClearScreen();
	printf("Press one of this keys: T, Z, Y, F, I. (Q to quit).\n");
	DrawLetter(KeyPressed);
	KeyPressed=readkey();
    }
    DrawLetter(KeyPressed);
    SetColor(White,Black);
    restore_term();
    cursor(1);
    return 0;
}
Вот функция readkey()
tKey readkey (void)
{
  char input_char;
  int read_chars;

  while ((read_chars = read (INPUT_STREAM, &input_char, 1)) > 0){
      switch (input_char){
	  case 'T': return (KT);
	  case 't': return (KT);
	  case 'Y': return (KY);
	  case 'y': return (KY);
	  case 'I': return (KI);
	  case 'i': return (KI);
	  case 'F': return (KF);
	  case 'f': return (KF);
	  case 'Z': return (KZ);
	  case 'z': return (KZ);
	  case 'L': return (KL);
	  case 'l': return (KL);
	  case 'q': return (KQ);
	  case 'Q': return (KQ);
	  default: return (KUNDEF);
	}
    }
  return (KUNDEF);
}
Я не пойму почему так, но у меня как бы кнопка нажатая считывается каждую секунду. То есть вот если я сделал проверку на правильность кнопки (надо только 6 букв чтобы выводилось), то при нажатии на нужную кнопку все работает - но через секунду сбрасывается с сообщением о том что нажата неправильная кнопка.

Насколько я понял здесь еще что-то с терминалом связано. Вот функция инициализации терминала:

int init_term (void)
{
  if (!isatty (INPUT_STREAM) || !isatty (OUTPUT_STREAM))
    return (1);

  if (WinSize()) return (1);

  if (tcgetattr (INPUT_STREAM, &old_tcset) == -1
      || tcgetattr (INPUT_STREAM, &new_tcset) == -1)
    return (1);

  new_tcset.c_iflag &= 0;		
  new_tcset.c_lflag &= ~(ICANON | ECHO);  
  new_tcset.c_cc[VMIN] = 0;
  new_tcset.c_cc[VTIME] = 10;


  if (tcsetattr (INPUT_STREAM, TCSAFLUSH, &new_tcset) == -1)
    return (1);

  return (0);
}
Когда я изменяю new_tcset.c_cc[VTIME], соответственно меняется и время пока нажатая клавиша самопроизвольно не считывается.

Помогите пожалуйста, сдавать на той неделе уже... Да и самому интересно разобраться Smile

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...