这是我的问题:
我正在尝试使用 (string,VoidFunc) 的字典向我的应用程序添加键盘控制
我首先创建一个名为“app”的操作。+ key_name(例如“h”)并做
action.activate.connect( () => f() ) 其中 f 是函数(VoidFunc 实例)。
然后我将该操作添加到我的应用程序中。
然后我使用 Gtk.accelerator_name 创建一个加速器并将其添加到我的应用程序中。
我正在继承 Gtk.Application。
这是完成这项工作的两个主要功能。
private void install_keyboard_support()
{
Gee.HashMap<string,VoidFunc> actions = new Gee.HashMap<string,VoidFunc>();
fill_actions(ref actions);
int i = 0;int sz = actions.size;
while(i < sz)
{
string k = actions.keys.to_array()[i];
var f = actions[k];
var action_name = "app." + k;
var action = new SimpleAction(action_name,null);
action.activate.connect(() => f());
this.add_action(action);
var accel_name = Gtk.accelerator_name(k.data[0],Gdk.ModifierType.CONTROL_MASK);
this.add_accelerator(accel_name,action_name,null);
_puts(@"Added accelerator with name = $accel_name and which trigers $action_name action!");
i++;
}
_puts("Installed keyboard support!");
}
private void fill_actions(ref Gee.HashMap<string,VoidFunc> actions)
{
actions["h"] = () => Process.spawn_command_line_async("xdg-open /usr/share/doc/ewns-viewer/help.html");
}
如您所见,一切都应该正常工作:)。
有效的一件事是做
this.add_accelerator("<Primary>h","app.help",null)
app.help 是一个简单的动作,定义为
var help_action = new SimpleAction("help",null);
help_action.activate.connect(() => Process.spawn_command_line_async("xdg-open /usr/share/doc/ewns-viewer/help.html"));
this.add_action(help_action);