+void
+ActionManager::enable_accelerators ()
+{
+ /* the C++ API for functions used here appears to be broken in
+ gtkmm2.6, so we fall back to the C level.
+ */
+
+ GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
+ GList* node;
+ GList* acts;
+ string ui_string = "<ui>";
+
+ /* get all actions, build a string describing them all as <accelerator
+ * action="name"/>
+ */
+
+ for (node = list; node; node = g_list_next (node)) {
+
+ GtkActionGroup* group = (GtkActionGroup*) node->data;
+
+ for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
+ ui_string += "<accelerator action=\"";
+
+ /* OK, this is pretty stupid ... there is the full
+ * accel path returned by gtk_action_get_accel_path ()
+ * but of course the UIManager doesn't use that, but
+ * just a name, which is the last component of the
+ * path. What a totally ridiculous design.
+ */
+
+ string fullpath = gtk_action_get_accel_path ((GtkAction*) acts->data);
+
+ ui_string += Glib::path_get_basename (fullpath);
+ ui_string += "\"/>";
+ }
+ }
+
+ ui_string += "</ui>";
+
+ /* and load it */
+
+ ui_manager->add_ui_from_string (ui_string);
+}
+
+struct ActionState {
+ GtkAction* action;
+ bool sensitive;
+ ActionState (GtkAction* a, bool s) : action (a), sensitive (s) {}
+};
+
+typedef std::vector<ActionState> ActionStates;
+
+static ActionStates action_states_to_restore;
+static bool actions_disabled = false;
+
+void
+ActionManager::save_action_states ()
+{
+ /* the C++ API for functions used here appears to be broken in
+ gtkmm2.6, so we fall back to the C level.
+ */
+ GList* list = gtk_ui_manager_get_action_groups (ActionManager::ui_manager->gobj());
+ GList* node;
+ GList* acts;
+
+ for (node = list; node; node = g_list_next (node)) {
+
+ GtkActionGroup* group = (GtkActionGroup*) node->data;
+
+ for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
+ GtkAction* action = (GtkAction*) acts->data;
+ action_states_to_restore.push_back (ActionState (action, gtk_action_get_sensitive (action)));
+ }
+ }
+}
+
+void
+ActionManager::enable_active_actions ()
+{
+ if (!actions_disabled) {
+ return ;
+ }
+
+ for (ActionStates::iterator i = action_states_to_restore.begin(); i != action_states_to_restore.end(); ++i) {
+ if ((*i).action && (*i).sensitive) {
+ gtk_action_set_sensitive ((*i).action, true);
+ }
+ }
+
+ action_states_to_restore.clear ();
+ actions_disabled = false;
+}
+
+void
+ActionManager::disable_active_actions ()
+{
+ if (actions_disabled == true ) {
+ return ;
+ }
+ // save all action's states to action_states_to_restore
+ save_action_states ();
+
+ // set all action's states disabled
+ for (ActionStates::iterator i = action_states_to_restore.begin(); i != action_states_to_restore.end(); ++i) {
+ if ((*i).sensitive) {
+ gtk_action_set_sensitive ((*i).action, false);
+ }
+ }
+ actions_disabled = true;
+}
+