Fedora 22 にしてから一ヶ月近いが GTK3 関連でヤル気が出ない。
新規 Widget が GtkPopoverMenu くらいしかないので。
GtkPopover とたいして違わなそうだし。
多分 Nautilus のメニューがコレだと思うけど。
GTK+ Inspector で確認してみるか。

やはりっっってあれ、GtkModelButton って何?
devhelp で確認するとコレも 3.16 からの新規 Widget のようだ。
何故こんなにヒッソリと追加なのよ、よし調べて使ってみよう。
gtk3-demo には無い、海外を検索してもまだ誰もやっていない。
また devhelp のみが頼りか、いつものことだ。
GtkPopoverMenu: GTK+ 3 Reference Manual
GtkPopover のサブクラスなのでやはり GtkBox に積み重ねる必要あり。
action-name プロパティに GAction のアクション名指定だけでイケるっぽい。
今回は devhelp のように GtkBuilder でやってみました。
#!/usr/bin/env python3
from gi.repository import Gtk, Gio
POPOVER = '''<interface>
<object class="GtkPopoverMenu" id="menu">
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="margin">10</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="active">True</property>
<property name="action-name">win.hello</property>
<property name="text" translatable="yes">Hello</property>
</object>
</child>
<child>
<object class="GtkModelButton">
<property name="visible">True</property>
<property name="action-name">win.world</property>
<property name="text" translatable="yes">World</property>
</object>
</child>
</object>
</child>
</object>
</interface>'''
class PopoverMenu(Gtk.ApplicationWindow):
"""
GtkPopoverMenu Test
"""
def __init__(self):
Gtk.ApplicationWindow.__init__(self)
# DrawingAre
area = Gtk.DrawingArea.new()
# Popup Button
button = Gtk.Button.new_with_label("Option")
button.connect("clicked", self.on_option_button_clicked)
# ActionBar
bar = Gtk.ActionBar.new()
bar.pack_end(button)
#
# Popup Contents
builder = Gtk.Builder.new_from_string(POPOVER, -1)
self.menu = builder.get_object("menu")
self.menu.set_relative_to(button)
action = Gio.SimpleAction.new("hello", None)
action.connect("activate", self.hello_cb)
self.add_action(action)
action2 = Gio.SimpleAction.new("world", None)
action2.connect("activate", self.world_cb)
self.add_action(action2)
#
# pack
vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
vbox.pack_start(area, True, True, 0)
vbox.pack_start(bar, False, False, 0)
# self
self.add(vbox)
self.connect("delete-event", Gtk.main_quit)
self.set_title("PopUp")
self.resize(300, 200)
self.show_all()
def hello_cb(self, action, parameter):
self.set_title("Hello")
def world_cb(self, action, parameter):
self.set_title("World")
def on_option_button_clicked(self, widget):
"""
Show Menu
"""
self.menu.show_all()
PopoverMenu()
Gtk.main()

Gedit や eog のプラグインを作っておいて良かった。
多分やっていなければ action-name property でドンズマリしていた。
つまり action-name プロパティには win のプリフィクスが必要。
win なんて自分ではどこにも定義していないけど固定値みたい。
GtkApplication を使わなくてもいるのね、なんでだろう。
margin は 10 にすると Nautilus のメニューとほぼ一致する。
妙にデカい気がするけど多分タッチパネル化の準備だろう。
GtkBuilder の XML で vertical と書くことができるのか。
あまり使わないから知らなかった、整数や文字列だけかと思っていた。
つか devhelp のサンプルコードにコレ入れてくれよ。
この程度なら GtkBuilder よりコードで作ったほうが簡単そう。
他人が読むことを考えると XML のほうが理解しやすいだろうけどNE。