É assim que você modifica os atalhos globais gerenciados pelo Compiz. No entanto, isso só funcionaria para sistemas que usam o compiz como gerenciador de janelas. Requer o módulo python-compizconfig
. BTW, o padrão para fechar a janela é ALT + F4, é o plugin de configurações gerais.
Veja como você pode fazer isso de maneira programática:
import compizconfig
context=compizconfig.Context()
commandplugin=context.Plugins['core']
c0=commandplugin.Screen['close_window_key']
defaultkey=c0.Value # store the oldkey so you can put it back at the end
c0.Value='' # Unset the key
context.Write() #Note that sometimes you have to pass False to get it to update settings
Observe que, para obter muitas das configurações, você pode usar a função keys()
para listá-las (ou seja, context.Plugins.keys()
, já que elas são apenas dicionários modificados.
Aqui está um link para o código que me ajudou a descobrir como isso funciona, já que não consigo encontrar nenhuma documentação: link
O que pode realmente ser melhor, é capturar o sinal do evento destroy ou delete enviado para a janela e testar para ver se ele realmente se originou com um pressionamento de tecla. Eu escrevi algum código e pude testar o pressionamento de tecla, mas mesmo que eu possa impedir que o loop Gtk.main seja terminado, não posso impedir que a janela seja destruída. Talvez outra pessoa tenha uma ideia sobre isso.
Edit: Aqui está o meu código que funciona corretamente, mas existe uma maneira melhor de testar o combo de teclas na função quit_test?
Edit2: Modificado para testar as teclas modificadoras e F4 corretamente, mas isso NÃO FUNCIONA ?! Ele funcionará se eu fizer o teste para Gdk.ModifierType.CONTROL_MASK
, mas MOD1, que deve ser a tecla Alt, não funciona.
#!/usr/bin/python
from gi.repository import Gtk
keypress=True
def quit_test(widget, data):
global keypress
print "destroying"
if keypress:
keypress=False
return True
else:
Gtk.main_quit()
widget.destroy()
def handle_keys(widget,event):
global keypress
modifiers=Gtk.accelerator_get_default_mod_mask()
for mod in dir(Gdk.ModifierType): #just printing what the modifier is
if (event.state&modifiers) == getattr(Gdk.ModifierType,mod): print mod
if event.keyval==Gdk.KEY_F4 and (event.state&modifiers)==Gdk.ModifierType.MOD1_MASK:
keypress=True
print event.keyval, keypress
win=Gtk.Window()
win.connect('delete-event', quit_test)
win.connect('key-press-event', handle_keys)
label=Gtk.Label("just some text")
win.add(label)
win.show_all()
Gtk.main()