Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: GPM + NONBLOCK getc  (Przeczytany 3234 razy)

Ksanderon

  • Gość
GPM + NONBLOCK getc
« dnia: 2012-08-20, 22:37:24 »
Hejka, miałem potrzebę dopisania na szybko obsługi myszki w pewnym programie cui. Mam dziwny problem- pewnie robię coś bardzo nie tak.

Żeby zilustrować problem napisałem minikod. Powinno to obsłużyć nieblokujący odczyt klawiatury(np. do klawiszy specjalnych- jest lepszy sposób?) oraz odczytywać pozycję myszki.

Jeśli zakomentuje się część związaną z gpm nieblokujący odczyt jest ok, myszka oczywiście nie działa.

Jeśli się odkomentuje to jego zachowanie jest nieprzewidywalne. W rxvt nie reaguje na mysz za to Gpm_Getc działa jak powinno czyli się nie blokuje. Pod tildą np. staje się blokujący jak zwykle ale za to myszka reaguje. O co z tym chodzi. Prosze nie odsyłać mnie do ncurses- nie o to mi chodzi że mozna to zrobić tylko dlaczego takie dziwne jest zachowanie. Dodam, że np. mysz i klawisze specjalne w takim mc działają mi na  równie dobrze na obu.

#include 
#include
#include
#include

int mouse_handler(Gpm_Event *event, void *data)
{
printf("mouse: %d %d %d\\n", event->type, event->x, event->y);
return 0;      
}


int main(int argc, char **argv)
{
Gpm_Connect conn;
int oldf = fcntl(0, F_GETFL, 0);

conn.eventMask=~0;
conn.defaultMask=0;
conn.minMod=0;
conn.maxMod=~0;

//gpm_handler = mouse_handler;

//if(Gpm_Open(&conn,0)==-1)printf("Cannot connect to mouse server\\n");
//else
{

fcntl(stdin->_fileno, F_SETFL, oldf | O_NONBLOCK);
while(1)
{
//printf("%x",Gpm_Getc(stdin));
printf("%x",getc(stdin));
}
fcntl(stdin->_fileno, F_SETFL, oldf);
// Gpm_Close();
}

return 0;
}