我正在使用 quickstart 为 Ubuntu 开发一个原生应用程序。如何禁用一些键绑定,例如防止Ctrl+F4关闭窗口和其他键组合?
答案1
这就是您修改 Compiz 管理的全局键绑定的方法。但是,这仅适用于使用 compiz 作为窗口管理器的系统。它需要模块python-compizconfig
。顺便说一句,关闭窗口的默认键是 ALT+F4,它是常规设置插件。
你可以通过以下方式以编程方式执行此操作:
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
请注意,要获取许多设置,您可以使用该keys()
函数列出它们(即),context.Plugins.keys()
因为它们大多只是修改过的字典。
这里有一个代码链接,它帮助我弄清楚了这是如何工作的,因为我找不到任何文档:http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/precise/compizconfig-python/precise/view/head:/src/compizconfig.pyx
实际上,更好的办法可能是捕获发送到窗口的 destroy 或 delete-event 信号,并测试它是否真的源自按键。我编写了一些代码,并能够测试按键,但即使我可以阻止 Gtk.main 循环终止,我也无法阻止窗口被销毁。也许其他人对此有想法。
编辑:这是我的正确运行的代码,但是有没有更好的方法来测试 quit_test 函数中的按键组合?
编辑 2:修改为正确测试修饰键和 F4,但这不起作用?!如果我让它测试Gdk.ModifierType.CONTROL_MASK
,它会起作用,但 MOD1(应该是 Alt 键)不起作用。
#!/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()