Come funzionano gli eventi del mouse in Linux?


25

Questo è principalmente per curiosità, sto cercando di capire come la gestione degli eventi funziona a un livello basso, quindi per favore non fare riferimento a un software che lo farà per me.

Se ad esempio voglio scrivere un programma in C / C ++ che reagisce ai clic del mouse, presumo che sia necessario utilizzare una chiamata di sistema per agganciare alcune funzioni al kernel, o forse è necessario controllare costantemente lo stato del mouse, Non lo so.

Presumo che sia possibile dato che quasi tutto è possibile in C / C ++, essendo di livello così basso, sono principalmente interessato a come funziona, anche se probabilmente non dovrò mai implementarlo da solo.

La domanda è: come funziona in Linux, ci sono alcune chiamate di sistema, librerie c, ecc.?

Risposte:


28

Se stai scrivendo un programma del mondo reale che utilizza il mouse in Linux, molto probabilmente stai scrivendo un'applicazione X, e in tal caso dovresti chiedere al server X gli eventi del mouse. Qt , GTK e libsdl sono alcune librerie C popolari che forniscono funzioni per l'accesso a mouse, tastiera, grafica, timer e altre funzionalità necessarie per scrivere programmi GUI. Ncurses è una libreria simile per applicazioni terminali.

Ma se stai esplorando il tuo sistema o non puoi usare X per qualsiasi motivo, ecco come funziona nell'interfaccia del kernel.

Un'idea centrale nella filosofia UNIX è che "tutto è un file". Più specificamente, quante più cose possibili dovrebbero essere accessibili attraverso le stesse chiamate di sistema utilizzate per lavorare con i file. E quindi l'interfaccia del kernel per il mouse è un file di dispositivo. Puoi open(), facoltativamente, chiamare poll()o select()su di esso per vedere se ci sono dati in arrivo e read()per leggere i dati.

In tempi pre-USB, il file di dispositivo specifico era spesso una porta seriale, ad esempio /dev/ttyS0, o una porta PS / 2, /dev/psaux. Hai parlato con il mouse usando qualsiasi protocollo hardware incorporato nel mouse. Al giorno d'oggi, /dev/input/*si preferisce il sottosistema, in quanto fornisce un modo unificato e indipendente dal dispositivo di gestire molti dispositivi di input diversi. In particolare, /dev/input/miceti darà eventi da qualsiasi mouse collegato al tuo sistema e /dev/input/mouseNti darà eventi da un determinato mouse. Nella maggior parte delle moderne distribuzioni Linux, questi file vengono creati dinamicamente quando si collega un mouse.

Per ulteriori informazioni su cosa esattamente leggere o scrivere nel file del dispositivo del mouse, è possibile iniziare con input / input.txt nella documentazione del kernel. Guarda in particolare le sezioni 3.2.2 (mousedev) e 3.2.4 (evdev), e anche le sezioni 4 e 5.


8

In genere, le informazioni provenienti dai dispositivi hardware sono esposte alle applicazioni tramite i file dei dispositivi . Per i mouse, sui moderni sistemi Linux, il dispositivo è /dev/mice(questo dispositivo raccoglie eventi da tutti i mouse collegati, ci sono anche dispositivi corrispondenti a ogni singolo mouse).

Quando si sposta o si fa clic con il mouse, il mouse invia un segnale elettrico al computer, provocandone l' interruzione . Un pezzo di codice nel kernel di Linux chiamato un gestore di interrupt a sua volta legge i dati dell'evento (ad es. Quale pulsante è stato premuto) e innesca una catena di notifiche all'interno del kernel.

Se è presente un'applicazione che legge dal file del dispositivo corrispondente a questo dispositivo, a quell'applicazione viene comunicato che l'input è in attesa. Ad esempio, se l'applicazione viene bloccata in una chiamata di sistema , viene restituita la chiamata di sistema.read

Su un sistema tipico, esiste un processo che legge gli eventi dei mouse: il server X Window . Tale programma gestisce la visualizzazione grafica e le periferiche di input. Le singole applicazioni grafiche vengono quindi informate degli eventi del mouse attraverso un protocollo di eventi X generico, che trasporta altri tipi di eventi come la pressione dei tasti, i cambiamenti di messa a fuoco della finestra, i cambiamenti di visibilità della finestra, ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.