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.
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.
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:
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.