GtkShortcutWindow

GTK+ (GNOME) 3.20 の目玉は当然 GtkShortcutWindow です。

メニューバーの中に表示しなければいけないなんて誰も決めていないぞ。
まさか「メニューバーの中のほうが直感的に使える!」なんて言う無知はいないよね。
今だに Ctrl+C すら知らない人が大多数という事実をヲタは知らない。

って、それはどうでもよくて。
実際に GtkShortcutWindow を作ってみよう。

#!/usr/bin/gjs

const Gtk = imports.gi.Gtk;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;

const TestWindow = new Lang.Class({
    Name: 'TestWindow',
    Extends: Gtk.ApplicationWindow,

    _init: function(app) {
        this.parent({
            application: app
        });
        this.resize(300, 300);
        this.show_all();
    }
});

const ShortcutApp = new Lang.Class({
    Name: 'ShortcutApp',
    Extends: Gtk.Application,

    _init: function() {
        // TaskBar Title
        GLib.set_prgname("ShortcutApp");
        // property
        this.parent({
            application_id: 'org.sasakima.shortcutapp',
            flags: Gio.ApplicationFlags.FLAGS_NONE
        });
    },
    vfunc_startup: function() {
        this.parent();
        //
        // Create ShortcutWindow
        this.scwin = new Gtk.ShortcutsWindow();
        let sec = new Gtk.ShortcutsSection({
            visible: true,
            section_name: "Name"
        });
        let doc = new Gtk.ShortcutsGroup({
            title: "Document"
        });
        doc.add(new Gtk.ShortcutsShortcut({
            accelerator: "<ctl>Q",
            title: "Ctrl : <ctl>,  Shift : <shift>, Alt : <alt>"
        }));
        doc.add(new Gtk.ShortcutsShortcut({
            accelerator: "Escape",
            title: "Single Key"
        }));
        doc.add(new Gtk.ShortcutsShortcut({
            accelerator: "1",
            title: "Num Key"
        }));
        sec.add(doc);
        this.scwin.add(sec);
        //
        // Menu
        let menu = new Gio.Menu();
        menu.append("_Keyboard Shortcuts", "app.shortcut_action");
        menu.append("_Quit", "app.quit_action");
        this.set_app_menu(menu);
        // Accel
        this.set_accels_for_action("app.shortcut_action", ["<Control>F1", "question"]);
        this.set_accels_for_action("app.quit_action", ["<Control>Q"]);
        // Action
        let shortcut_action = new Gio.SimpleAction({
            name: "shortcut_action"
        });
        shortcut_action.connect("activate", Lang.bind(this, function(action) {
            this.scwin.show_all();
        }));
        let quit_action = new Gio.SimpleAction({
            name: "quit_action"
        });
        quit_action.connect("activate", Lang.bind(this, function(action) {
            this.quit();
        }));
        this.add_action(shortcut_action);
        this.add_action(quit_action);
    },
    vfunc_activate: function() {
        let w = new TestWindow(this);
        // Set ShortcutWindow Palent
        w.set_help_overlay(this.scwin);
    }
});
let application = new ShortcutApp();
application.run(ARGV);

gtk_shortcutswindow

アレ?と思ったのが GtkShortcutsGroup に配置が add だったこと。
GtkBox のようなパッキングだと思っていた。

ShortcutsSection に max_height プロパティがある。
この数を超える場合はグループを次ペインに全自動で移すようです。

gtk_application_window_set_help_overlay

は凄く重要、GtkApplicationWindow 指定を必ず行うこと。
実際に GNOME アプリで GtkShortcutWindow を出して移動してみよう。

後はこのブログを見ているような人なら説明不要かと。
スクリプト言語から最新 API を試せるって本当に面白いよね。