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);
アレ?と思ったのが GtkShortcutsGroup に配置が add だったこと。
GtkBox のようなパッキングだと思っていた。
ShortcutsSection に max_height プロパティがある。
この数を超える場合はグループを次ペインに全自動で移すようです。
gtk_application_window_set_help_overlay
は凄く重要、GtkApplicationWindow 指定を必ず行うこと。
実際に GNOME アプリで GtkShortcutWindow を出して移動してみよう。
後はこのブログを見ているような人なら説明不要かと。
スクリプト言語から最新 API を試せるって本当に面白いよね。