Não há hardware_keycode para um caractere unicode a menos que você possa digitá-lo pressionando uma tecla. Veja xmodmap sobre como mapear um caractere unicode para uma tecla física do teclado. Aproveite.
Eu escrevi um pequeno programa GTK + 2+ (em Python) que responde a um clique de botão, enviando um gtk.Event
para simular uma tecla pressionada. Ele funciona bem em todas as versões do Ubuntu que eu tenho incluindo o Kubuntu, mas ele falha em todas as versões do Lubuntu.
No Lubuntu, o caractere que é transmitido pelo Evento é determinado por event.hardware_keycode
; event.keyval
não importa. Em todas as outras plataformas, o caractere é determinado por event.keyval
e event.hardware_keycode
não importa.
O problema é que, até onde posso dizer, não é possível especificar caracteres Unicode através de event.hardware_keycode
, porque eles não possuem uma chave correspondente. O Unicode funciona bem em outras plataformas usando keyval.
Alguém sabe como fazer com que o Lubuntu se comporte como o Ubuntu a esse respeito? Se não, alguém pode sugerir um lugar melhor para postar essa pergunta?
Aqui está um programa de teste simples, como solicitado por Sneetsher:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gtk
class KeyPressTest:
def __init__(self):
button = gtk.Button("Test")
button.connect('clicked', self.on_button_clicked)
button.set_can_focus(False)
entry = gtk.Entry()
vbox = gtk.VBox()
vbox.pack_start(button)
vbox.pack_start(entry, expand=False)
window = gtk.Window()
window.connect('destroy', lambda w: gtk.main_quit())
window.add(vbox)
window.show_all()
def on_button_clicked(self, button):
# Lubuntu ignores keyval, so you get "a" in the entry when you click
# the button. Ubuntu ignores hardware_keycode, so you get À. I could
# make the program work on all platforms by specifying both, but what
# is hardware_keycode for unicode characters?
event = gtk.gdk.Event(gtk.gdk.KEY_PRESS)
event.keyval = int(gtk.gdk.unicode_to_keyval(ord(unicode(u"À"))))
event.hardware_keycode = 38 # hardware keycode for "a"
event.window = button.get_window()
event.put()
if __name__ == "__main__":
u = KeyPressTest()
gtk.main()
Aqui está a resposta: Lubuntu tem um conjunto de variáveis de ambiente para especificar o método de entrada:
GTK_IM_MODULE = xim
Desmarque essa variável e o programa acima funciona.
Não há hardware_keycode para um caractere unicode a menos que você possa digitá-lo pressionando uma tecla. Veja xmodmap sobre como mapear um caractere unicode para uma tecla física do teclado. Aproveite.