Como os eventos do mouse funcionam no linux?

19

Isso é principalmente por curiosidade, estou tentando entender como funciona a manipulação de eventos em um nível baixo, então por favor não me faça referência 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, Eu suponho que eu preciso usar uma chamada de sistema para ligar alguma função ao kernel, ou talvez você precise verificar constantemente o status do mouse, eu não sei.

Eu assumo que é possível, já que praticamente tudo é possível em C / C ++, sendo tão baixo, estou interessado principalmente em como ele funciona, mesmo que eu provavelmente nunca tenha que implementá-lo sozinho.

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

    
por fiftyeight 29.11.2011 / 01:38

2 respostas

22

Se você está escrevendo um programa do mundo real que usa o mouse no Linux, provavelmente você está escrevendo um aplicativo X, e nesse caso você deve perguntar ao servidor X por 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ê está explorando o seu sistema, ou você não pode usar o X por alguma razão, aqui está como ele funciona na interface do kernel.

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

Em tempos pré-USB, o arquivo de 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 qualquer protocolo de hardware que estivesse embutido no mouse. Atualmente, o subsistema /dev/input/* é o preferido, pois fornece uma maneira unificada e independente de dispositivos de lidar com muitos dispositivos de entrada diferentes. Em particular, /dev/input/mice fornecerá eventos de qualquer mouse conectado ao seu sistema e /dev/input/mouseN fornecerá eventos de um determinado mouse. Na maioria das distribuições Linux modernas, esses arquivos são criados dinamicamente quando você conecta um mouse.

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

    
por 29.11.2011 / 03:36
7

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

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

Se houver algum aplicativo lendo o arquivo de dispositivo correspondente a esse dispositivo, esse aplicativo será informado de que a entrada está aguardando. Por exemplo, se o aplicativo estiver bloqueado em um read system call , então a chamada do sistema retorna.

Em um sistema típico, há um processo lendo eventos de mouses: o servidor X Window . Esse programa gerencia a exibição gráfica e os periféricos de entrada. Aplicações gráficas individuais são então notificadas de eventos de mouse através de um protocolo genérico de evento X, que transporta outros tipos de eventos, tais como pressionamentos de tecla, mudanças de foco de janela, mudanças de visibilidade de janela,…

    
por 30.11.2011 / 00:02