GNOME 3.32 から ApplicationMenu は無くなったはずだけど。
Gedit や Nautilus の Global Menu には「新しいウインドウ」がある。
自作 GTK+ アプリにもコレを付けてみたい。
“New terminal” desktop action does nothing on Gnome ? Issue #427 ? gnunn1/tilix ? GitHub
色々探してこんなのを見つける。
*.desktop のほうに定義するのね、なるほど。
いやまて。
つまり –new-window というオプションを用意しなきゃいけないヤン!
手抜きなオプション定義にしていたけどキチンと作らないと。
GApplication の handle_local_options シグナルを使えばいいようだ。
Using g_application_add_main_option_entries() with PyGObject ? GitHub
GOptionEntry を使おうとしたら PyGObject だとメンドクサ!
g_application_add_main_option のほうが短いコードでイケるのでコッチで。
とりあえず –version を表示するオプションで上手くいったサンプルコード。
#!/usr/bin/env python3
import sys, gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib
class Win(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.ApplicationWindow.__init__(self, application=app, title='Oppai')
self.show_all()
class App(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
# add --version, -v option
self.add_main_option('version', b'v', GLib.OptionFlags.NONE, GLib.OptionArg.NONE, 'Show Oppai Version', None)
def do_handle_local_options(self, options):
# get option
if options.lookup_value('version', GLib.VariantType.new('b')):
self.show_version()
return 0
return -1
def do_activate(self):
self.window = Win(self)
self.window.present()
def show_version(self):
print('Oppai 0.0.1')
if __name__ == '__main__':
app = App()
app.run(sys.argv)
にて。
–help は全自動で定義される。
add_main_option の第二引数を使う場合はバイナリにするのをお忘れなく。
handle_local_options ハンドラはゼロを戻すとそのまま終了してくれる。
それ以外の説明はいらないよね。
さて肝心の –new-window を定義したら色々困ったぞ。
handle_local_options は startup シグナルより前に飛んでくる。
なので何も定義されていない状態。
しかも GApplication は同じ application-id の app に引数を転送して終了する。
handle_local_options ハンドラからは転送先 app を参照することは不可能。
つまり GtkApplicationWindow はこのハンドラ内では作れないってことだ。
GSettings にフラグを用意するというかなり強引な方法で定義はできた。
コマンドでは上手くいった、よし comipoli.desktop に追記だ。
表示されないんですけど。。。。。
まだ他にやらないといけないことがあるのだろうか?

