GTK4: MenuButton

以前 GTK4 のメニューサンプルコードを書いたけど。
toggled なんてシグナルは GTK4 版には無かったね。
エラーが出なかったのは GTK4 に無視されていただけだったようだ。

んで、GTK4 版 GtkMenuButton には primary というプロパティが追加されていた。
コレを True にすると F10 キーでポップアップできるようになる。

ただ、それを利用するとフルスクリーンで使えない。
フルスクリーンにしないアプリなら問題ないんだけど。

それとコレを実装していて気が付いたんだけど。
GTK4 はボタン類の cricked 関数が全部消えている。
つまりコードで模擬クリックすることができなくなってしまった。
アレ便利だったのに、しかたがないから別の手段で。

ということで GTK4 にてフルスクリーン用メニューが別にある場合。
F10 を振り分けする必要がある。

class ComipoliApplication(Gtk.Application):
    def __init__(self, version):
        # etc...

    def do_startup(self):
        Gtk.Application.do_startup(self)
        self.set_accels_for_action('win.action_f10', ['F10'])

GtkApplication.

class ComipoliWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        # etc...
        action_f10 = Gio.SimpleAction.new('action_f10', None)
        action_f10.connect('activate', self.on_action_function_key, 10)
        self.add_action(action_f10)

    def on_action_function_key(self, action, param, num):
        if num == 10:
            if self.is_fullscreen:
                self.upperbar.show()
                GLib.idle_add(self.show_fullscreen_menu)
            else:
                self.menu.popup()

    def show_fullscreen_menu(self):
        self.menuf.popup()
        return False

GtkApplicationWindow.

コレでなんとかなったけど F10 の二度押しで消すことができない。
おまけにポップアップ状態から矢印キーでメニュー選択もできない。
gnome-text-editor も同じだから仕様なんだろうね。

それより、ポップアップを出すとフォーカスを取られてキー操作を受け付けない。
GtkMenuButton の popdown 関数は何のためにあるのだ?
これを利用して F10 二度押しを実装しようとしたけど、無理っぽい。

ということで GTK4 でポップアップを消すには Esc を使いましょう。
逆に言えば現状 GTK4 製かどうかはソレで見分けできる。

今回は GTK4 でのショートカット実装方法でした。
<Control>W とかも同じ方法で実装できるよ。