Jak działają zdarzenia myszy w systemie Linux?

25

Wynika to głównie z ciekawości, staram się zrozumieć, jak działa obsługa zdarzeń na niskim poziomie, więc nie odsyłaj mnie do oprogramowania, które zrobi to za mnie.

Jeśli na przykład chcę napisać program w C / C ++, który reaguje na kliknięcia myszą, zakładam, że muszę użyć wywołania systemowego, aby podpiąć jakąś funkcję do jądra, a może po prostu trzeba ciągle sprawdzać stan myszy, Nie wiem

Zakładam, że jest to możliwe, ponieważ prawie wszystko jest możliwe w C / C ++, ponieważ jestem na tak niskim poziomie, jestem najbardziej zainteresowany tym, jak to działa, chociaż prawdopodobnie nigdy nie będę musiał go sam implementować.

Pytanie brzmi, jak to działa w systemie Linux, czy są pewne wywołania systemowe, biblioteki itp.?

pięćdziesiąt osiem
źródło

Odpowiedzi:

28

Jeśli piszesz program w świecie rzeczywistym, który używa myszy w systemie Linux, najprawdopodobniej piszesz aplikację X. W takim przypadku powinieneś zapytać serwer X o zdarzenia myszy. Qt , GTK i libsdl to niektóre popularne biblioteki C, które zapewniają funkcje dostępu do myszy, klawiatury, grafiki, timerów i innych funkcji potrzebnych do pisania programów GUI. Ncurses to podobna biblioteka dla aplikacji terminalowych.

Ale jeśli eksplorujesz swój system lub nie możesz używać X z jakiegokolwiek powodu, oto jak działa on w interfejsie jądra.

Podstawową ideą filozofii UNIX jest to, że „wszystko jest plikiem”. Mówiąc dokładniej, jak najwięcej rzeczy powinno być dostępnych za pośrednictwem tych samych wywołań systemowych, których używasz do pracy z plikami. Interfejs jądra myszy jest plikiem urządzenia. Ty open(), opcjonalnie zadzwoń poll()lub zadzwoń select(), aby sprawdzić, czy nadchodzą dane i read()odczytać dane.

W czasach pre-USB, plik był często specyficzne urządzenie port szeregowy, np /dev/ttyS0, lub port PS / 2 /dev/psaux. Rozmawiałeś z myszą, używając dowolnego protokołu sprzętowego wbudowanego w mysz. Obecnie /dev/input/*podsystem jest preferowany, ponieważ zapewnia ujednolicony, niezależny od urządzenia sposób obsługi wielu różnych urządzeń wejściowych. W szczególności /dev/input/miceda ci zdarzenia z dowolnej myszy podłączonej do twojego systemu i /dev/input/mouseNda ci zdarzenia z określonej myszy. W większości współczesnych dystrybucji Linuksa pliki te są tworzone dynamicznie po podłączeniu myszy.

Aby uzyskać więcej informacji o tym, co dokładnie przeczytałeś lub zapiszesz w pliku urządzenia myszy, możesz zacząć od input / input.txt w dokumentacji jądra. Spójrz w szczególności na sekcje 3.2.2 (mousedev) i 3.2.4 (evdev), a także sekcje 4 i 5.

Jander
źródło
8

Zasadniczo informacje z urządzeń są udostępniane aplikacjom za pomocą plików urządzeń . W przypadku myszy w nowoczesnych systemach Linux urządzenie to /dev/mice(to urządzenie zbiera zdarzenia od wszystkich podłączonych myszy, są też urządzenia odpowiadające każdej myszy).

Po przesunięciu lub kliknięciu myszą mysz wysyła sygnał elektryczny do komputera, co powoduje, że wywołuje on przerwanie . Fragment kodu w jądrze Linuksa, zwany modułem obsługi przerwań, z kolei odczytuje dane zdarzenia (np. Który przycisk został naciśnięty) i uruchamia łańcuch powiadomień w jądrze.

Jeśli jakaś aplikacja odczytuje z pliku urządzenia odpowiadającego temu urządzeniu, ta aplikacja jest informowana, że ​​dane wejściowe czekają. Na przykład, jeśli aplikacja jest zablokowana w wywołaniu systemowym , wówczas wywołanie systemowe powraca.read

W typowym systemie istnieje jeden proces odczytujący zdarzenia myszy: serwer X Window . Ten program zarządza wyświetlaczem graficznym i wejściowymi urządzeniami peryferyjnymi. Poszczególne aplikacje graficzne są następnie powiadamiane o zdarzeniach myszy za pomocą ogólnego protokołu zdarzeń X, który przenosi inne typy zdarzeń, takie jak naciśnięcia klawiszy, zmiany fokusu okna, zmiany widoczności okna,…

Gilles „SO- przestań być zły”
źródło