Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beraldo

[Resolvido] Leitura de teclas

Recommended Posts

Eu preciso fazer um trabalho cuja funcionalidade depende da leitura das teclas, principalmente das setas.

 

Para fins de testes, fiz este programa:

 

#include <stdlib.h>
#include <curses.h>



int main()
{
	int c, i = 1;
	
	initscr();
	cbreak();
	noecho();
	
	do
	{
		c = getch();
		clear();
		printw("%d => ", i);
		switch (c)
		{
			case 65:
				printw("UP KEY");
				break;
			case 68:
				printw("LEFT KEY");
				break;
			case 66:
				printw("DOWN KEY");
				break;
			case 67:
				printw("RIGHT KEY");
				break;
			default:
				printw("Tecla inválida");
		}
		printw(" %d ", c);
		refresh();
		i++;
	}
	while (1);
	
	getch();
	
	endwin();
	
	return 0;
}

Ele funciona perfeitamente, porém, se eu trocar os números pelas respectivas constantes definidas em curses.h (KEY_UP, KEY_DOWN, KEY_LEFT e KEY_RIGHT), o programa não funciona. Vi no código dessa biblioteca, que as constantes são definidas com um zero na frente, o que, até onde sei, representa número octal. Supondo o exemplo de KEY_DOWN:

 

#define KEY_DOWN 0402 /* down-arrow key */

 

(0402) na base 8 = (2 * 8^0 + 4 * 8^2 = 258) na base 10

 

258 != 66

 

:unsure:

 

Isso está muito estranho.

 

Outra coisa que percebi é que a variável i, que criei para controlar o número de teclas pressionadas, cresce de um em um para letras, de três em três para setas e de quatro em quatro para PAGEUP, DEL etc.

 

 

Alguém sabe as respostas para isso tudo (ou pelo menos para uma delas)? :rolleyes:

 

[]s

Beraldo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá incrementando errado porque você não está usando a ncurses do jeito certo. Se bem que é uma droga adivinhar o que tem que chamar o quê (e eu tive que fazer um editor de texto em ncurses...entao ja sofri bastante p/ adorar programas em GUI).

 

 

int main()
{
int c, i = 1;

initscr();
cbreak();
noecho();
WINDOW * this = initscr();
keypad(this,TRUE);
do
{
	c = wgetch(this);
	clear();
	printw("%d => ", i);
	switch (c)
	{
		case KEY_UP:
			printw("UP KEY");
			break;
		case KEY_LEFT:
			printw("LEFT KEY");
			break;
		case KEY_DOWN:
			printw("DOWN KEY");
			break;
		case KEY_RIGHT:
			printw("RIGHT KEY");
			break;
		default:
			printw("Tecla inválida");
	}
	printw(" %d ", c);
	refresh();
	i++;
}
while (1);

getch();
free(this);
endwin();

 

Tenta agora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, era simplesmente por causa das ausência de keypad()...

Eu já tinha visto essa função, mas pensei que era somente para as teclas F1...F12 (exemplo em que vi o uso dessa função).

 

Isso que dá não ler completamente as manpages:

 

The keypad option enables the keypad of the user’s terminal. If en‐

abled (bf is TRUE), the user can press a function key (such as an arrow

key) and wgetch returns a single value representing the function key,

as in KEY_LEFT.

A resposta esta aí... http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

Obrigado, de novo, Ísis

 

[]s

Beraldo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.