Hello,
I need to build a popup menu on the fly, with values that change
depending on which item the popup has been invoked on.
My original idea was to work like this:
void Foo::invokePopup(...)
{
Gtk::Menu itemPopup;
Gtk::Menu submenu;
for (something)
itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem(...));
for (somethingElse)
submenu.items().push_back(Gtk::Menu_Helpers::MenuElem(...));
itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Submenu...", submenu));
itemPopup.popup(e->button.button, e->button.time);
}
However, the popup() method returns immediately, causing itemPopup and
submenu to be deallocated and the application to segfault or, if I move
itemPopup elsewhere and clear() its items() at the beginning of
invokePopup, the submenu deallocates and appears empty.
Should I do some funky bookkeeping of submenus (and then get mad at when
to deallocate them: before itemPopup().items().clear() or later? I seem
to get segfaults either way) or is there a saner way to do all this?
So far I resolved like this:
class Foo
{
Gtk::Menu itemPopup;
invokePopup(...);
}
void invokePopup(...)
{
Gtk::Menu* submenu = new Gtk::Menu();
submenu->set_managed();
itemPopup.items().clear();
for (something)
itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem(...));
for (somethingElse)
submenu->items().push_back(Gtk::Menu_Helpers::MenuElem(...));
itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Submenu...", *submenu));
itemPopup.popup(e->button.button, e->button.time);
}
however, it means that all the "submenu" that are created keep living at
least until itemPopup is destroyed (which means, at the end of the
application: a memory leak). Or clear() also deallocates managed
widgets? Anything better?
Ciao,
Enrico
P.S.
Referring to the debian libgtkmm2.0-doc, section 10.2 of the book say
"Gtk::Menu contain child Gtk::MenuItems. MenuItems can, in turn, contain
child Menus, to create sub menus." but don't tell how to create
submenus. The whole documentation, instead, seems to contain no
direct reference to Gtk::Menu_Helpers namespace (its elements are
included in the "Menu classes" part, but the Menu_Helpers namespace is
not explicitly mentioned.
--
GPG key: 1024D/797EBFAB 2000-12-05 Enrico Zini <enrico debian org>
Attachment:
signature.asc
Description: Digital signature