Existe uma maneira do meu binário reagir a algumas teclas de atalho globais no Linux?

StackOverflow https://stackoverflow.com/questions/74790

  •  09-06-2019
  •  | 
  •  

Pergunta

É possível ouvir uma determinada tecla de atalho (por exemplo:Ctrl-EU) e depois executar uma ação específica?Meu aplicativo é escrito em C, só rodará em Linux e não possui GUI.Existem bibliotecas que ajudam nesse tipo de tarefa?

EDITAR:por exemplo, o amarok tem atalhos globais, por exemplo, se você mapear uma combinação de teclas para uma ação (digamos Ctrl-+, Ctrl e +) você pode executar essa ação ao pressionar as teclas.Se eu mapeasse Ctrl-+ para a ação de aumentar o volume, cada vez que pressiono Ctrl-+ o volume deve aumentar em uma certa quantia.

Obrigado

Foi útil?

Solução

Quão globais suas teclas de atalho precisam ser?É suficiente que sejam globais para uma sessão X?Nesse caso, você poderá abrir uma conexão Xlib e ouvir os eventos necessários.

Normalmente, os eventos de teclado no X são entregues à janela que atualmente está em foco e propagados pela hierarquia até serem manipulados.É evidente que não é isso que queremos.Precisamos processar o evento antes que qualquer outra janela possa acessá-lo.Precisamos ligar XGrabKey na janela raiz com o código-chave e modificadores de nossa tecla de atalho para fazer isso.

Encontrei um bom exemplo aqui.

Outras dicas

Eu penso smoofra está no caminho certo aqui;você deseja registrar uma tecla de atalho global com o X para poder interceptar os pressionamentos de tecla e tomar as medidas apropriadas. Xlib é provavelmente o que você quer, e XGrabKey é a função, eu acho.

Receio que não seja fácil aprender;Localizei este exemplo que parece útil: TinyWM.Também encontrei um exemplo usando Java/JNI (acessando a mesma função Xlib subjacente).

Você deve olhar o código fonte do xbindkeys.

A programação Xlib é bastante misteriosa, a documentação é difícil de encontrar e há problemas sutis de portabilidade.Será melhor copiar algum código resistente à batalha.

Uma maneira de fazer isso é fazer com que seu aplicativo escute em uma determinada porta, ou arquivo de soquete, as solicitações recebidas.

Em seguida, você pode escrever um pequeno aplicativo cliente que se conecte a essa porta ou arquivo de soquete e envie comandos para o aplicativo em execução.

Em seguida, você pode configurar seu gerenciador de janelas para vincular certas combinações de teclas para iniciar seu pequeno aplicativo cliente.

No UNIX, seu acesso a um shell de linha de comando é feito por meio de um terminal.Isto remonta aos dias em que as pessoas acessavam seus grandes computadores compartilhados literalmente através de terminais conectados diretamente às máquinas (por exemplo,por um cabo serial).

Na verdade, o programa 'xterm' ou qualquer outro derivado que você use em sua máquina UNIX é apropriadamente chamado de emulador de terminal - ele se comporta (tanto do seu ponto de vista quanto do sistema operacional) como uma daquelas máquinas terminais antiquadas.

Isso torna um pouco complicado lidar com entradas de maneiras interessantes, uma vez que existem muitos tipos diferentes de terminais e seu sistema UNIX precisa conhecer as capacidades de cada tipo.Essas capacidades eram tradicionalmente armazenadas em um termcap arquivo, e acho que sistemas mais modernos usam informações do termo em vez de.Tentar

man 5 terminfo

em um sistema Linux para obter mais informações.

Agora, a boa notícia é que você não precisa mexer muito com os recursos do terminal, etc.ter um aplicativo de linha de comando que faça coisas interessantes com recursos de entrada ou de janelas.Há uma biblioteca, maldições, isso vai ajudar.Olho para cima

man 3 ncurses

em seu sistema Linux para obter mais informações.Você provavelmente encontrará um tutorial decente sobre o uso de maldições online.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top