Sweet, that works. Looking at my program (which I modified), the API isn't that bad. I've attached it as well. I'm getting a warning on the command line now when I quit this program: (test:28463): GLib-GObject-CRITICAL **: file gobject.c: line 1579 (g_object_unref): assertion `G_IS_OBJECT (object)' failed No clue what this means. -Bryan On Fri, 2004-03-19 at 10:25 +0100, Murray Cumming wrote: > On Fri, 2004-03-19 at 00:56, Bryan Forbes wrote: > > I have this small test case that I cannot get the accelerators to work. > > > I don't know where you got the AccelGroup stuff from, but you don't need > it and it doesn't seem to work. Here is a patch to your test that makes > it work for me. You do need to call > add_accel_group(m_refUIManager->get_accel_group()); > on the parent window, and that seems a bit obscure. > > > This also shows that the Action API is quite strange in C++ and I think > > we need some solution to it. > > Can you be more precise? Where exactly is the problem? I don't think > it's very different from the old gtkmm 2.2 menu/toolbar API or the > libgnomeuimm UIInfo API. > > You can make it more compact by doing the Action::create() inside the > add() call. You didn't do that this time because you thought you had to > do the extra accelgroup stuff. > > Had you seen demos/gtk-demo/example_uimanager.cc? > > > Any suggestions would be awesome. I may > > have some ideas tonite when I get back, but for now, I've attached my > > example. > > -- > Murray Cumming > www.murrayc.com > murrayc murrayc com
#include <gtkmm.h>
#include <iostream>
class MyWindow : public Gtk::Window
{
public:
MyWindow();
~MyWindow();
private:
Glib::RefPtr<Gtk::ActionGroup> m_rpActionGroup;
Glib::RefPtr<Gtk::UIManager> m_rpUIManager;
Glib::RefPtr<Gtk::AccelGroup> m_rpAccelGroup;
Gtk::VBox m_VBox;
Gtk::RadioButtonGroup m_RBG_HNL;
void on_open();
void on_quit();
void on_zoom_in();
void on_zoom_out();
void on_full_screen();
void on_quality();
};
void MyWindow::on_open()
{
std::cout << "Open" << std::endl;
}
void MyWindow::on_quit()
{
hide();
}
void MyWindow::on_zoom_in()
{
std::cout << "Zoom In" << std::endl;
}
void MyWindow::on_zoom_out()
{
std::cout << "Zoom Out" << std::endl;
}
void MyWindow::on_full_screen()
{
std::cout << "Full Screen" << std::endl;
}
void MyWindow::on_quality()
{
std::cout << "Quality" << std::endl;
}
MyWindow::MyWindow()
{
static const Glib::ustring ui_description =
"<ui>"
" <menubar name='MainMenu'>"
" <menu action='FileMenu'>"
" <menuitem action='Open'/>"
" <menuitem action='Exit'/>"
" </menu>"
" <menu action='ViewMenu'>"
" <menuitem action='ZoomIn'/>"
" <menuitem action='ZoomOut'/>"
" <separator/>"
" <menuitem action='FullScreen'/>"
" <separator/>"
" <menuitem action='HighQuality'/>"
" <menuitem action='NormalQuality'/>"
" <menuitem action='LowQuality'/>"
" </menu>"
" </menubar>"
"</ui>";
using namespace Gtk;
add(m_VBox);
m_rpActionGroup = ActionGroup::create("MenuActions");
Glib::RefPtr<Action> action;
m_rpActionGroup->add(Action::create("FileMenu", "_File"));
m_rpActionGroup->add(Action::create("ViewMenu","_View"));
m_rpActionGroup->add(Action::create("Open", Gtk::Stock::OPEN, "_Open", "Open a file"),
sigc::mem_fun(*this, &MyWindow::on_open));
m_rpActionGroup->add(Action::create("Exit", Gtk::Stock::QUIT, "_Exit", "Exit the program"),
AccelKey("<control>Q"), sigc::mem_fun(*this, &MyWindow::on_quit));
m_rpActionGroup->add(Action::create("ZoomIn", Gtk::Stock::ZOOM_IN,
"Zoom _In", "Zoom into the image"),
AccelKey("plus"), sigc::mem_fun(*this, &MyWindow::on_zoom_in));
m_rpActionGroup->add(Action::create("ZoomOut", Gtk::Stock::ZOOM_OUT,
"Zoom _Out", "Zoom away from the image"),
AccelKey("minus"), sigc::mem_fun(*this, &MyWindow::on_zoom_out));
m_rpActionGroup->add(ToggleAction::create("FullScreen", "_Full Screen",
"Switch between full screen and windowed mode"),
AccelKey("F11"), sigc::mem_fun(*this, &MyWindow::on_full_screen));
m_rpActionGroup->add(RadioAction::create(m_RBG_HNL, "HighQuality", "_High Quality",
"Display images in high quality, slow mode"),
sigc::mem_fun(*this, &MyWindow::on_quality));
m_rpActionGroup->add(RadioAction::create(m_RBG_HNL, "NormalQuality","_Normal Quality",
"Display images in normal quality"),
sigc::mem_fun(*this, &MyWindow::on_quality));
m_rpActionGroup->add(RadioAction::create(m_RBG_HNL, "LowQuality","_Low Quality",
"Display images in low quality, fast mode"),
sigc::mem_fun(*this, &MyWindow::on_quality));
m_rpUIManager = UIManager::create();
m_rpUIManager->insert_action_group(m_rpActionGroup);
add_accel_group(m_rpUIManager->get_accel_group());
if(!m_rpUIManager->add_ui_from_string(ui_description))
{
std::cout << "Building menus failed" << std::endl;
exit(EXIT_FAILURE);
}
Widget* menubar = m_rpUIManager->get_widget("/MainMenu");
m_VBox.pack_start(*manage(menubar), false, false);
show_all();
}
MyWindow::~MyWindow()
{}
int main(int argc, char* argv[])
{
Gtk::Main myMain(argc, argv);
MyWindow myWindow;
Gtk::Main::run(myWindow);
return 0;
}
Attachment:
signature.asc
Description: This is a digitally signed message part