AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 705865
Accepted
Thang Bui
Thang Bui
Asked: 2022-06-12 19:27:01 +0800 CST2022-06-12 19:27:01 +0800 CST 2022-06-12 19:27:01 +0800 CST

Iniciar um aplicativo gráfico a partir do módulo do kernel?

  • 772

Meu problema atual é que: no teclado do meu laptop Acer Nitro, há uma tecla Nitro - que é uma tecla especial que nenhuma outra marca de laptop possui. Você vê na imagem abaixo que há uma tecla N estranha ao lado da tecla de retrocesso - essa é a tecla Nitro.

tecla nitro

Eu quero desenvolver um aplicativo GUI de forma que sempre que o botão Nitro for pressionado, meu aplicativo apareça. Estou usando o Ubuntu 22.04.

Pelo que descobri, acho que teria que escrever um LKM para capturar o evento de pressionamento de tecla Nitro e iniciar o aplicativo a partir daí. Estou seguindo a resposta aqui ( https://stackoverflow.com/questions/33836541/linux-kernel-how-to-capture-a-key-press-and-replace-it-with-another-key ) para capturar o evento de pressionamento de tecla.

Gostaria de saber se não há problema em iniciar um aplicativo GTK dentro do LKM - em outras palavras, colocando o código de exemplo aqui ( https://www.gtk.org/docs/getting-started/hello-world ) no meu código do módulo do kernel . Além disso, me pergunto se estou no caminho certo para alcançar meu objetivo.

Desde já, obrigado!

[UPD] Esclarecimento sobre o que eu quero: os laptops Acer Nitro geralmente têm um aplicativo chamado Nitrosense que fornece uma GUI para alterar a cor do teclado e a velocidade do ventilador. A tecla Nitro quando pressionada mostra aos usuários a GUI. No entanto, o aplicativo Nitrosense é apenas para Windows - quero escrever a mesma coisa para o Ubuntu. Até agora, encontrei vários repositórios sobre como alterar a cor do teclado e a velocidade do ventilador, mas não há repositório para um aplicativo que abre quando pressiono a tecla Nitro, então quero construir tal coisa. Estou usando o GNOME 42 no Ubuntu 22.04. O que eu quero é sempre que o usuário (já logado) pressionar a tecla Nitro, uma GUI mostra automaticamente para eu fazer coisas.

[UPD2] Também encontrei este repositório https://github.com/kphanipavan/PredatorNonSense que parece tentar fazer a mesma coisa que minha preocupação em outra marca Acer. Acho que pode ser útil, vamos ver.

[UPD3] Aqui está o evento que encontrei quando useievtest evento nitro key evtest

No entanto, quando tentei xev, não havia nada impresso, o que me faz pensar que o X Server não reconhece o evento de pressionamento de tecla Nitro. Acho que devo procurar documentação para escrever um módulo para enviar o evento de chave Nitro para o X Server?

Tentei acessar as configurações do teclado no GNOME Control Center para tentar adicionar um atalho de teclado, mas também não reconheceu a tecla Nitro - talvez porque o GNOME esteja sendo executado no X Server e o X Server não reconheça o evento da tecla Nitro?

Eu também olhei para o repositório que mencionei no UPD2, então o que o autor fez também foi pesquisar continuamente grepo log de evtestpara ver se a tecla foi pressionada - confira este comando shell https://github.com/kphanipavan/PredatorNonSense/blob /master/PNS.sh .

O que eu acho que também posso fazer é escrever um serviço systemd simples para pesquisar o arquivo do dispositivo de teclado e verificar se o Nitro está pressionado. No entanto, menciona-se que isso pode desperdiçar muitos recursos. Alguma sugestão sobre isso?

ubuntu xorg
  • 2 2 respostas
  • 92 Views

2 respostas

  • Voted
  1. Best Answer
    dirkt
    2022-06-12T23:52:10+08:002022-06-12T23:52:10+08:00

    Eu quero desenvolver um aplicativo GUI de forma que sempre que o botão Nitro for pressionado, meu aplicativo apareça.

    Então você precisa expor o botão Nitro, por exemplo, como um evento de camada de entrada do kernel. Em seguida, algum aplicativo de espaço do usuário pode agir sobre ele e iniciar seu aplicativo de interface do usuário.

    Lembre-se que o Linux é multiusuário, o sistema é projetado para uma situação onde você tem uma única máquina e dezenas de pessoas usando uma GUI com contas diferentes. Então você não pode simplesmente "iniciar um aplicativo", você precisa encontrar o usuário certo. Mas o kernel é independente do usuário.

    Isso significa que algo para esse usuário em particular precisa agir sobre isso. O lugar mais simples para colocar isso é a configuração do Window Manager para esse usuário específico (que seria você, suponho).

    Gostaria de saber se há problema em iniciar um aplicativo GTK dentro do LKM

    Não está bem, e não vai funcionar.


    Recursos:

    • Subsistema de entrada do kernel
    • evtest
    • xev
    • Documentação do kernel HID

    Use evtestpara ver se o Nitrojá produz um evento de pressionamento de tecla. Se isso acontecer, você não precisa escrever um módulo do kernel. Em seguida, use xevpara ver se já foi traduzido em um evento X.

    Se não produzir um evento de pressionamento de tecla, a busca pelo evento real ficará interessante...

    Por fim, descubra qual gerenciador de janelas sua área de trabalho usa, depois pesquise no Google a documentação do seu gerenciador de janelas e descubra como iniciar programas para um determinado pressionamento de tecla.


    (BTW, geralmente é melhor apenas colar o texto recuado por quatro espaços em branco em vez de uma imagem)

    Então esse é um evento comum de pressionamento e liberação de teclas para o código 425 KEY_PRESENTATION.

    Se você quiser criar seu próprio layout de teclado que mapeie esse código para um keysym X, recomendo a leitura de An Unreliable Guide to XKB Configuration (2004) . Copie um layout existente com um novo nome e modifique-o, assim você não o perderá quando os pacotes do sistema forem atualizados.

    Se você quiser que um pequeno programa de espaço do usuário escute essa chave, escolha uma linguagem com uma biblioteca para a camada de entrada do kernel, por exemplo, Python . Certifique-se de usar o link simbólico /dev/input/by-path/...que corresponde ao seu teclado, os /dev/input/eventXnúmeros não são estáveis ​​nas botas.

    • 1
  2. MC68020
    2022-06-13T00:27:08+08:002022-06-13T00:27:08+08:00

    Considerando que seu sistema provavelmente já está configurado para gerenciamento térmico (através do daemon ACPI Thermald ou então), eu definitivamente não tentaria brincar com as velocidades do ventilador nas costas.


    Em relação à capacidade de alterar a cor do teclado, você está correto ao escrever que isso só pode ser feito através de algum driver de dispositivo apropriado.
    Seu teclado (algum dispositivo compatível com HID quase certamente) deve necessariamente expor ao kernel algum dispositivo de saída (diferente do dispositivo de entrada associado à transmissão das teclas do teclado) que precisa ser tratado adequadamente se desejar enviar qualquer ordem para o seu teclado)

    Você pode se inspirar na luz de fundo do teclado Acer Gaming RGB e no módulo de kernel Linux no modo Turbo

    Isso deve basicamente visar a expor os controles na árvore /sys/devices.

    A maneira como você pode agir nesses controles depende de você na área do usuário, desde ecoar ousadamente aos controles /sys/devices até a concepção de qualquer widget gtk.
    Ter isso ativado usando qualquer tecla do teclado (incluindo sua tecla Nitro especial) sendo um problema simples de mapeamento de teclado que seu DE pode ser capaz de lidar com as configurações básicas do sistema.

    • 1

relate perguntas

  • traçar gráfico 2D com pontos de um arquivo

  • Como faço para verificar se estou usando 9.9.9.9 para DNS?

  • Instale várias distribuições Linux em paralelo

  • Qual é a diferença entre as regras base e evdev xkb?

  • O OpenVPN auto-compilado não inicia a partir do systemd

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve