2011-09-18 12 views
7

Zastanawiam się, czy istnieje coś takiego jak ruchy myszy w NCurses i czy istnieje sposób ich złapania. Po Interfacing with the mouse (od NCurses programming HOWTO) wydaje się, że po włączeniu bitu REPORT_MOUSE_POSITION w wywołaniu mousemask, można rzeczywiście złapać zdarzenia ruchu myszy.Wydarzenia związane z ruchami myszy w NCurses

Próbowałem tego i nie działa. Mam coś takiego:

int ch, count=0; 
mmask_t old; 

initscr(); 
noecho(); 
cbreak(); 
mousemask (ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old); 
keypad (stdscr, TRUE); 

while ((ch = getchar()) != 'q') 
{ 
    count++; 
    if (ch == KEY_MOUSE) 
    { 
    MEVENT event; 
    assert (getmouse (&event) == OK); 
    mvprintw (0, 0, "Mouse Event!\n"); 
    } 
    mvprintw (1, 1, "Event number %4d",count); 
} 

... 

Spodziewałem się, że kiedy poruszę kursorem myszy, zwiększę licznik zdarzeń. Ale tak się nie stało. Próbowałem również przenieść go, gdy przycisk myszy 1 jest wyłączony, aby zobaczyć, czy generuje zdarzenia "przeciągnij", a także nie zrobił nic. Pytanie brzmi, czy to po prostu problem z moim emulatorem terminala? A może nie rozumiem, co NCurses uważa za ruchy myszy? Wszystkie pozostałe zdarzenia myszy zostały odebrane (i mogę obsługiwać programy w konsoli korzystającej z myszy).

Próbowałem gnome-terminal, xterm i kilka innych rzeczy. Próbowałem również środowiska tekstowego (bez X) przechodząc do tty na moim komputerze z Linuksem (Fedora 15, Ctrl + Alt + F2) i to nie działało.

Na koniec, zakładając, że otrzymałem to prawo i te zdarzenia powinny zostać zgłoszone, co to jest pole bstate z MEVENT dla evenetu ruchu myszy?

Wielkie dzięki z góry!

Odpowiedz

16

potrzebował:

  1. terminal, który obsługuje raportowania zdarzenia myszy;
  2. wskazuje na wpis terminfo, który ma odpowiedni wpis XM, aby poprawnie zainicjować terminal.

xterm co najmniej spełnia (1); dla (2) prawdopodobnie będziesz musiał ustawić inną wartość dla TERM.

Spróbuj:

  • TERM=xterm-1002 uzyskać zdarzenie pozycji, gdy kursor przesuwa się do innej komórki, podczas gdy przycisk jest wciśnięty; lub
  • TERM=xterm-1003, aby zawsze uzyskiwać zdarzenie pozycji za każdym razem, gdy kursor przesunie się do innej komórki, nawet jeśli nie zostanie naciśnięty żaden przycisk.

Powstałe zdarzenia mają bit REPORT_MOUSE_POSITION ustawiony na polu bstate.

(Sekcja „przenoszenia” na stronie curs_mouse(3x) man opisuje końcową inicjalizacji, a sekcja „Tracking Mouse” dokumentacji Xterm Control Sequences opisuje odpowiednie rozszerzenia „tryb prywatny”).

Kod że” ve podane powyżej musi używać getch(), a nie getchar(); i potrzebuje refresh() w pętli! Poza tym działa to z xterm przy użyciu jednego z odpowiednich ustawień TERM.

+0

Napisałem getchar in stackoverflow przypadkowo, mój prawdziwy kod użył getcha.Pominąłem odświeżenie po wpisaniu pseudokodu: P Tak, dziękuję - Twoja sugestia z xterm działała bardzo dobrze! –