Como os eventos do mouse funcionam no linux?

25

Isso é principalmente por curiosidade, estou tentando entender como a manipulação de eventos funciona em um nível baixo; portanto, não me refira a um software que faça isso por mim.

Se, por exemplo, eu quiser escrever um programa em C / C ++ que reaja aos cliques do mouse, presumo que precise usar uma chamada do sistema para conectar alguma função ao kernel ou talvez você precise apenas verificar constantemente o status do mouse, Eu não sei.

Suponho que seja possível, já que quase tudo é possível em C / C ++, sendo tão baixo nível, que estou mais interessado em como funciona, mesmo que provavelmente nunca precise implementá-lo.

A questão é como ele funciona no linux, existem determinadas chamadas de sistema, bibliotecas c etc.?

cinquenta e oito
fonte

Respostas:

28

Se você está escrevendo um programa do mundo real que usa o mouse no Linux, provavelmente está escrevendo um aplicativo X e, nesse caso, deve solicitar ao servidor X eventos de mouse. Qt , GTK e libsdl são algumas bibliotecas C populares que fornecem funções para acessar mouse, teclado, gráficos, timers e outros recursos necessários para escrever programas GUI. Ncurses é uma biblioteca semelhante para aplicativos de terminal.

Mas se você estiver explorando seu sistema ou não puder usar o X por qualquer motivo, veja como ele funciona na interface do kernel.

Uma idéia central da filosofia do UNIX é que "tudo é um arquivo". Mais especificamente, o máximo de coisas possível deve estar acessível através das mesmas chamadas de sistema usadas para trabalhar com arquivos. E assim a interface do kernel para o mouse é um arquivo de dispositivo. Você open()pode, opcionalmente, ligar poll()ou ligar select()para ver se há dados recebidos e read()para ler os dados.

Nos tempos pré-USB, o arquivo do dispositivo específico costumava ser uma porta serial, por exemplo /dev/ttyS0, ou uma porta PS / 2 /dev/psaux. Você conversou com o mouse usando o protocolo de hardware incorporado ao mouse. Atualmente, o /dev/input/*subsistema é o preferido, pois fornece uma maneira unificada e independente de dispositivo de lidar com muitos dispositivos de entrada diferentes. Em particular, /dev/input/micevocê fornecerá eventos de qualquer mouse conectado ao seu sistema e /dev/input/mouseNtambém eventos de um mouse específico. Na maioria das distribuições modernas do Linux, esses arquivos são criados dinamicamente quando você conecta um mouse.

Para obter mais informações sobre exatamente o que você leria ou gravaria no arquivo do dispositivo do mouse, você pode começar com input / input.txt na documentação do kernel. Veja em particular as seções 3.2.2 (mousedev) e 3.2.4 (evdev) e também as seções 4 e 5.

Jander
fonte
8

Geralmente, as informações de dispositivos de hardware são expostas a aplicativos por meio de arquivos de dispositivos . Para mouses, nos sistemas Linux modernos, o dispositivo é /dev/mice(este dispositivo coleta eventos de todos os mouses conectados, também existem dispositivos correspondentes a cada mouse individual).

Quando você move ou clica no mouse, o mouse envia um sinal elétrico ao computador, causando uma interrupção . Um pedaço de código no kernel do Linux chamado manipulador de interrupções, por sua vez, lê os dados do evento (por exemplo, qual botão foi pressionado) e dispara uma cadeia de notificações dentro do kernel.

Se houver algum aplicativo que esteja lendo do arquivo do dispositivo correspondente a esse dispositivo, esse aplicativo será avisado de que a entrada está aguardando. Por exemplo, se o aplicativo estiver bloqueado em uma chamada do sistema , a chamada do sistema retornará.read

Em um sistema típico, há um processo de leitura de eventos de mouse: o servidor X Window . Esse programa gerencia a exibição gráfica e os periféricos de entrada. Aplicativos gráficos individuais são notificados sobre eventos do mouse por meio de um protocolo X genérico, que carrega outros tipos de eventos, como pressionamentos de tecla, alterações no foco da janela, alterações na visibilidade da janela,…

Gilles 'SO- parar de ser mau'
fonte