13
0

hand-merge libs/gtkmm2ext part of f49d31a82 from Tracks; provides a way to disable/re-enable OS X main menu

This commit is contained in:
Paul Davis 2015-05-06 11:51:04 -04:00
parent 7e097c5efc
commit 2363fb71e3
2 changed files with 60 additions and 52 deletions

View File

@ -289,17 +289,15 @@ struct ActionState {
typedef std::vector<ActionState> ActionStates;
static std::stack<boost::shared_ptr<ActionStates> > state_stack;
static ActionStates action_states_to_restore;
static bool actions_disabled = false;
static boost::shared_ptr<ActionStates>
get_action_state ()
void
ActionManager::save_action_states ()
{
boost::shared_ptr<ActionStates> state = boost::shared_ptr<ActionStates>(new ActionStates);
/* 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;
@ -308,52 +306,46 @@ get_action_state ()
GtkActionGroup* group = (GtkActionGroup*) node->data;
/* first pass: collect them all */
typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
action_list the_acts;
for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
GtkAction* action = (GtkAction*) acts->data;
state->push_back (ActionState (action, gtk_action_get_sensitive (action)));
action_states_to_restore.push_back (ActionState (action, gtk_action_get_sensitive (action)));
}
}
return state;
}
void
ActionManager::push_action_state ()
{
state_stack.push (get_action_state());
}
void
ActionManager::pop_action_state ()
{
if (state_stack.empty()) {
warning << string_compose (_("programming error: %1"), X_("ActionManager::pop_action_state called with empty stack")) << endmsg;
return;
}
boost::shared_ptr<ActionStates> as = state_stack.top ();
state_stack.pop ();
for (ActionStates::iterator i = as->begin(); i != as->end(); ++i) {
gtk_action_set_sensitive ((*i).action, (*i).sensitive);
}
}
void
ActionManager::disable_all_actions ()
ActionManager::enable_active_actions ()
{
push_action_state ();
boost::shared_ptr<ActionStates> as = state_stack.top ();
if (!actions_disabled) {
return ;
}
for (ActionStates::iterator i = as->begin(); i != as->end(); ++i) {
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;
}
void
@ -464,9 +456,25 @@ ActionManager::get_action_from_name (const char* name)
void
ActionManager::set_sensitive (vector<RefPtr<Action> >& actions, bool state)
{
// if actions weren't disabled
if (!actions_disabled) {
for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) {
(*i)->set_sensitive (state);
}
}
else {
// actions were disabled
// so we should just set necessary action's states in action_states_to_restore
for (vector<RefPtr<Action> >::iterator i = actions.begin(); i != actions.end(); ++i) {
// go through action_states_to_restore and set state of actions
for (ActionStates::iterator j = action_states_to_restore.begin(); j != action_states_to_restore.end(); ++j) {
// all actions should have their individual name, so we can use it for comparison
if (gtk_action_get_name ((*j).action) == (*i)->get_name ()) {
(*j).sensitive = state;
}
}
}
}
}
void

View File

@ -94,9 +94,9 @@ namespace ActionManager {
LIBGTKMM2EXT_API extern void set_toggleaction_state (std::string, bool);
LIBGTKMM2EXT_API extern void push_action_state ();
LIBGTKMM2EXT_API extern void pop_action_state ();
LIBGTKMM2EXT_API extern void disable_all_actions ();
LIBGTKMM2EXT_API extern void save_action_states ();
LIBGTKMM2EXT_API extern void enable_active_actions ();
LIBGTKMM2EXT_API extern void disable_active_actions ();
};
#endif /* __libgtkmm2ext_actions_h__ */