如何在Vala中使用GTK3从文件加载加速器映射?

时间:2012-03-08 12:32:56

标签: gtk vala

我在Vala中使用GTK3制作文本编辑器。我在Gtk.MenuBar中有Gtk.Window,我想使用加速器轻松激活其Gtk.MenuItems。但我希望用户能够更改密钥组合,因此我使用方法Gtk.AccelMap.load("accels")从文件加载加速器规范。但是,在调用此方法后,未加载加速器:菜单项没有AccelLabels,并且在按下组合键时未激活。这是我正在处理的两个文件。第一个文件包含我的应用程序的小版本(以显示我正在尝试做的事情),第二个文件是加载accels规范的accels文件,它们必须位于同一目录中。

main.vala

// Compile me with: valac main.vala -o main --pkg gtk+-3.0
public class MyWindow: Gtk.Window {
    public MyWindow() {
    this.set_default_size(500, 500);

    var main_box = new Gtk.VBox(false, 0);
    this.add(main_box);

    var accel_group = new Gtk.AccelGroup();
    this.add_accel_group(accel_group);

    // Load the accelerators from the file
    Gtk.AccelMap.load("accels");

    // Create the action
    var quit_action = new Gtk.Action("file-quit", "Quit", "Quit the application", null);
    quit_action.activate.connect(()=>{
        Gtk.main_quit();
    });
    quit_action.set_accel_group(accel_group);
    quit_action.set_accel_path("<MyWindow>/File/Quit");

    // Menubar
    var menubar = new Gtk.MenuBar();
    main_box.pack_start(menubar, false, false, 0);

    var file = new Gtk.MenuItem.with_label("File");
    menubar.add(file);

    var file_menu = new Gtk.Menu();
    file.set_submenu(file_menu);

    var quit_mi = (Gtk.MenuItem)quit_action.create_menu_item();
    file_menu.append(quit_mi);

    // Label
    var label = new Gtk.Label("My Window");
    main_box.pack_start(label, true, true, 0);

    this.destroy.connect(Gtk.main_quit);
    }
}

int main(string[] args) {
    Gtk.init(ref args);

    var win = new MyWindow();
    win.show_all();

    Gtk.main();
    return 0;
}

“加速”文件

; main GtkAccelMap rc-file         -*- scheme -*-
; this file is an automated accelerator map dump
;
; (gtk_accel_path "<MyWindow>/File/Quit" "<Control>q")

那么,为什么这不起作用?在加载accel文件之前或之后我该做什么?

PS:我不想使用Gtk.UIManager

1 个答案:

答案 0 :(得分:0)

见:https://docs.xfce.org/faq#keyboard_related ” 自 GTK3 以来,此功能已被禁用,这意味着已迁移到 GTK3(例如 xfce4-terminal)的 Xfce 应用程序不支持它。 请参阅特定应用程序的文档以了解如何配置其快捷方式。 "