¿Cómo funcionan los eventos del mouse en Linux?

25

Esto es principalmente por curiosidad, estoy tratando de entender cómo funciona el manejo de eventos en un nivel bajo, así que no me remita a un software que lo haga por mí.

Si, por ejemplo, quiero escribir un programa en C / C ++ que reaccione a los clics del mouse, supongo que necesito usar una llamada del sistema para conectar alguna función al kernel, o tal vez solo necesite verificar constantemente el estado del mouse, No lo sé.

Supongo que es posible ya que casi todo es posible en C / C ++, dado que es tan bajo, estoy interesado principalmente en cómo funciona, aunque probablemente nunca tenga que implementarlo yo mismo.

La pregunta es cómo funciona en Linux, ¿hay ciertas llamadas al sistema, bibliotecas c, etc.?

cincuenta y ocho
fuente

Respuestas:

28

Si está escribiendo un programa del mundo real que usa el mouse en Linux, lo más probable es que esté escribiendo una aplicación X y, en ese caso, debe solicitar al servidor X los eventos del mouse. Qt , GTK y libsdl son algunas bibliotecas C populares que proporcionan funciones para acceder al mouse, teclado, gráficos, temporizadores y otras características necesarias para escribir programas GUI. Ncurses es una biblioteca similar para aplicaciones terminales.

Pero si está explorando su sistema, o no puede usar X por alguna razón, así es como funciona en la interfaz del kernel.

Una idea central en la filosofía de UNIX es que "todo es un archivo". Más específicamente, se debe poder acceder a tantas cosas como sea posible a través de las mismas llamadas al sistema que utiliza para trabajar con archivos. Y así, la interfaz del núcleo para el mouse es un archivo de dispositivo. Usted open(), opcionalmente llame poll()o select()en él para ver si hay datos entrantes y read()para leer los datos.

En tiempos pre-USB, el archivo de dispositivo específico era a menudo un puerto serie, por ejemplo /dev/ttyS0, o un puerto PS / 2, /dev/psaux. Hablaste con el mouse usando el protocolo de hardware que estaba integrado en el mouse. En estos días, /dev/input/*se prefiere el subsistema, ya que proporciona una forma unificada e independiente del dispositivo de manejar muchos dispositivos de entrada diferentes. En particular, /dev/input/micele dará eventos desde cualquier mouse conectado a su sistema, y /dev/input/mouseNle dará eventos desde un mouse en particular. En la mayoría de las distribuciones modernas de Linux, estos archivos se crean dinámicamente cuando conecta un mouse.

Para obtener más información sobre exactamente lo que leería o escribiría en el archivo del dispositivo del mouse, puede comenzar con input / input.txt en la documentación del kernel. Mire en particular las secciones 3.2.2 (mousedev) y 3.2.4 (evdev), y también las secciones 4 y 5.

Jander
fuente
8

En general, la información de los dispositivos de hardware está expuesta a las aplicaciones a través de los archivos del dispositivo . Para los ratones, en los sistemas Linux modernos, el dispositivo es /dev/mice(este dispositivo recopila eventos de todos los ratones conectados, también hay dispositivos correspondientes a cada mouse individual).

Cuando mueve o hace clic con el mouse, el mouse envía una señal eléctrica a la computadora, lo que provoca una interrupción . Un fragmento de código en el núcleo de Linux llamado controlador de interrupciones lee a su vez los datos del evento (por ejemplo, qué botón se presionó) y desencadena una cadena de notificaciones dentro del núcleo.

Si hay alguna aplicación que está leyendo el archivo del dispositivo correspondiente a este dispositivo, se le dice a esa aplicación que la entrada está esperando. Por ejemplo, si la aplicación está bloqueada en una llamada del sistema , la llamada del sistema vuelve.read

En un sistema típico, hay un proceso que lee eventos de ratones: el servidor X Window . Ese programa gestiona la pantalla gráfica y los periféricos de entrada. Las aplicaciones gráficas individuales se notifican de los eventos del mouse a través de un protocolo genérico de eventos X, que lleva otros tipos de eventos, como pulsaciones de teclas, cambios de foco de ventana, cambios de visibilidad de ventana, ...

Gilles 'SO- deja de ser malvado'
fuente