Glfw: Retorno de chamada de caractere com modificadores que é SEMPRE invocado para chars com mods pressionados

Criado em 4 jan. 2020  ·  4Comentários  ·  Fonte: glfw/glfw

Oi,

Atualmente não é possível receber eventos de personagem com modificadores para todos os personagens que foram digitados.

Minha demonstração foi: Um usuário está digitando Ctrl+[ no layout de teclado padrão (en_US) funciona bem com o retorno de chamada de tecla e char, mas se você usar (por exemplo) o layout de teclado de_DE (alemão [y]), então, para enviar Ctrl=[ , o que o usuário deve pressionar é Ctrl+AltGr+8 . Isso é capturado pelo retorno de chamada de tecla como Ctrl+Alt+8 (o que não é útil porque o aplicativo do usuário em si NÃO DEVE reimplementar o mapeamento do layout do teclado nem sei qual mapeamento de teclado o usuário possui) e, mais importante, o retorno de chamada de caractere não é invocado para isso, nem o callback de caractere com modificador está sendo invocado para isso.

Meu pedido basicamente é deixar o callback de caracteres com mods saber sobre TODOS os caracteres sendo digitados com todos os modificadores - também parece um bug para mim que este callback não seja invocado em layouts de teclado não en_US (meu caso de teste : de_DE), então não tenho certeza se realmente é um bug ou uma solicitação de recurso.

ps: Não encontrei nenhum recurso informando por que glfwSetCharModsCallback está sendo preterido. Parece que esta é a única função que faz sentido para eu usar (embora atualmente não esteja funcionando totalmente); talvez alguém saiba onde olhar para esta decisão?

Muito obrigado antecipadamente,
Cristão.

input

Comentários muito úteis

Se você der uma olhada nos problemas de glfwSetCharCallback, verá que não funcionou para o caso de uso que você descreveu.

Basicamente, um pressionamento de tecla como CTRL+ALT+8 não resultará em um caractere, portanto, não haverá chamada para glfwSetCharCallback nem para glfwCharCallback. Isso não ocorre porque o GLFW está fazendo algo para removê-lo, mas porque nenhum caractere existe para representar essa combinação de teclas.

No entanto, a combinação de teclas ALT+8 representa um caractere, [ para o layout do teclado em seu exemplo.

Portanto, a solução que propus no fórum é que precisamos estender glfwGetKeyName para ser capaz de lidar com traduções na presença de teclas modificadoras. Portanto, a nova versão seria algo como:

const char* glfwGetKeyName ( int key, int scancode, int mods );

Observe que o glfw teria que ignorar os mods CTRL ou os usuários da API precisariam saber que CTRL como um mod não resultará em nenhum caractere. Eu preferiria o último por ser mais óbvio.

Todos 4 comentários

Se você der uma olhada nos problemas de glfwSetCharCallback, verá que não funcionou para o caso de uso que você descreveu.

Basicamente, um pressionamento de tecla como CTRL+ALT+8 não resultará em um caractere, portanto, não haverá chamada para glfwSetCharCallback nem para glfwCharCallback. Isso não ocorre porque o GLFW está fazendo algo para removê-lo, mas porque nenhum caractere existe para representar essa combinação de teclas.

No entanto, a combinação de teclas ALT+8 representa um caractere, [ para o layout do teclado em seu exemplo.

Portanto, a solução que propus no fórum é que precisamos estender glfwGetKeyName para ser capaz de lidar com traduções na presença de teclas modificadoras. Portanto, a nova versão seria algo como:

const char* glfwGetKeyName ( int key, int scancode, int mods );

Observe que o glfw teria que ignorar os mods CTRL ou os usuários da API precisariam saber que CTRL como um mod não resultará em nenhum caractere. Eu preferiria o último por ser mais óbvio.

Muito obrigado por esclarecer.

Acredite ou não, trabalhando também em um emulador de terminal C ++ com OpenGL e enfrentando exatamente o mesmo problema. Praticamente estou portando o trabalho em https://github.com/zokrezyl/asciterm para C ++.

Temos alguma solução alternativa para o atm? Por falar nisso. @christianparpart , ficaria feliz em conversar sobre sua abordagem de design se você estiver planejando uma implementação de código aberto.

EDITAR: @christianparpart Suponho que este seja o código-fonte: https://github.com/christianparpart/contour

Ei @zokrezyl

Isso parece incrível, eu acho que é melhor apenas me enviar um e-mail se você quiser detalhes. Eu ficaria feliz em conversar. ... [email protected] é como você pode me encontrar.

Mas com relação a glfw. Kitty mantém seu próprio fork e eu acabei de migrar para o QtGui. E para ser sincero, não me arrependo. :)

Vejo você em seu e-mail,
Cristão.

Esta página foi útil?
0 / 5 - 0 avaliações