Accelerators can be confusing. There are 2 ways to do them, one reasonably well documented, the other not documented at all (AFAIK). Here is a sample of the undocumented (and really more complicated) way. HTH I have removed some redundant code, but this should show you the basic steps.
Chuck Crisler class HelloWorld : public Gtk::Window { public: HelloWorld(); virtual ~HelloWorld(); protected: //Signal Handlers virtual void on_button_clicked(); virtual void on_fileopen_activated(); virtual void on_fileclose_activated(); ... //Member widgets. Gtk::Button m_button; Gtk::VBox m_VBox; Gtk::MenuBar m_MainMenu; Gtk::Menu m_FileMenu; Gtk::Menu m_EditMenu; Gtk::MenuItem m_RootMenu1; Gtk::MenuItem m_RootMenu2; Gtk::MenuItem m_FileOpenItem; Gtk::MenuItem m_FileCloseItem; ... Glib::RefPtr<Gtk::AccelGroup> m_oAccelGroup; }; HelloWorld::HelloWorld() : m_button(Gtk::Stock::OK) { //Set border width for window set_border_width( 10 ); set_title( "Menu Test Window" ); // Create the accelerator group for the window. m_oAccelGroup = Gtk::AccelGroup::create( ); // Add that group to the window so that accelerators can be added. add_accel_group( m_oAccelGroup ); Glib::ustring strAccelSignal = "activate"; ... // Setup the file menu options. m_FileOpenItem.add_label("Open", false, Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP); m_FileCloseItem.add_label("Close", false, Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP); ... m_FileExit.signal_activate().connect(sigc::mem_fun(*this, &HelloWorld::on_fileexit_activated)); // Setup the accelerators m_FileOpenItem.add_accelerator( strAccelSignal, m_oAccelGroup, GDK_O, Gdk::CONTROL_MASK, Gtk::ACCEL_MASK ); m_FileCloseItem.add_accelerator( strAccelSignal, m_oAccelGroup, GDK_C, Gdk::CONTROL_MASK, Gtk::ACCEL_MASK ); ... m_FileMenu.append(m_FileOpenItem); m_FileMenu.append(m_FileCloseItem); ... m_RootMenu1.add_label("File", false, Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP); m_RootMenu2.add_label("Edit", false, Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP); m_RootMenu1.set_submenu(m_FileMenu); m_RootMenu2.set_submenu(m_EditMenu); m_RootMenu1.show(); m_RootMenu2.show(); m_MainMenu.append(m_RootMenu1); m_MainMenu.append(m_RootMenu2); m_MainMenu.show(); m_VBox.add(m_MainMenu); ... m_Window.set_size_request( 780, 550 ); m_Window.show(); m_VBox.add(m_Window); m_VBox.show(); add(m_VBox); set_default_size( 800, 600 ); show_all_children(); show(); } ... void HelloWorld::on_fileopen_activated() { std::cout << "Hello World! FileOpen activated." << std::endl; } void HelloWorld::on_fileclose_activated() { std::cout << "Hello World! FileClose activated." << std::endl; } void HelloWorld::on_fileexit_activated() { std::cout << "Hello World! FileExit activated." << std::endl; // Terminate the application. Gtk::Main::quit(); } ... int main(int argc, char *argv[]) { Gtk::Main kit(argc, argv); HelloWorld helloworld; //Shows the window and returns when it is closed. Gtk::Main::run(); return (0); } On Mon, 2009-05-25 at 10:41 -0400, dhk wrote: > Are accelerators only for menu items? I've seen a lot of examples with > accelerators and the all seem to connect to a menu item. I've been > having a difficult time getting accelerators to work even with the > examples. I think I'm missing something. > > One thing I would like is to just have an accelerator execute a function > or a callback. Maybe if I could just print "Hello World" to the > terminal when pressing Alt-F4 would help prove the concept. > > Can someone help? > > Thanks, > > dhk > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list