diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2015-02-02 17:57:19 +0100 |
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2015-02-02 17:57:19 +0100 |
| commit | c1b5a7d0785ba72c88eb37fef95af08c7c37555e (patch) | |
| tree | 197f762d31227f8459c12dbf63cd27c40eeb2c9c /unity-shared | |
| parent | a048cb3a357b123e5886bdaef930f0e0439d6cc2 (diff) | |
MenuManager: only grabs the keys for the active window
(bzr r3899.2.47)
Diffstat (limited to 'unity-shared')
| -rw-r--r-- | unity-shared/MenuManager.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/unity-shared/MenuManager.cpp b/unity-shared/MenuManager.cpp index 7aa494260..397cddea4 100644 --- a/unity-shared/MenuManager.cpp +++ b/unity-shared/MenuManager.cpp @@ -55,11 +55,14 @@ struct Manager::Impl : sigc::trackable for (auto const& indicator : indicators_->GetIndicators()) AddIndicator(indicator); + GrabMnemonicsForActiveWindow(); + parent_->show_menus.changed.connect(sigc::mem_fun(this, &Impl::ShowMenus)); indicators_->on_object_added.connect(sigc::mem_fun(this, &Impl::AddIndicator)); indicators_->on_object_removed.connect(sigc::mem_fun(this, &Impl::RemoveIndicator)); indicators_->on_entry_activate_request.connect(sigc::mem_fun(this, &Impl::ActivateRequest)); indicators_->icon_paths_changed.connect(sigc::mem_fun(this, &Impl::IconPathsChanged)); + WindowManager::Default().window_focus_changed.connect(sigc::hide(sigc::mem_fun(this, &Impl::GrabMnemonicsForActiveWindow))); parent_->integrated_menus = g_settings_get_boolean(settings_, LIM_KEY.c_str()); parent_->always_show_menus = g_settings_get_boolean(settings_, ALWAYS_SHOW_MENUS_KEY.c_str()); @@ -109,8 +112,23 @@ struct Manager::Impl : sigc::trackable parent_->appmenu_removed(); } + void GrabMnemonicsForActiveWindow() + { + if (!appmenu_) + return; + + UngrabMnemonics(); + auto active_window = WindowManager::Default().GetActiveWindow(); + + for (auto const& entry : appmenu_->GetEntriesForWindow(active_window)) + GrabEntryMnemonics(entry); + } + void GrabEntryMnemonics(indicator::Entry::Ptr const& entry) { + if (entry->parent_window() != WindowManager::Default().GetActiveWindow()) + return; + gunichar mnemonic; if (pango_parse_markup(entry->label().c_str(), -1, '_', nullptr, nullptr, &mnemonic, nullptr) && mnemonic) @@ -127,7 +145,7 @@ struct Manager::Impl : sigc::trackable return parent_->key_activate_entry.emit(id); }); - entry_actions_[entry] = action; + entry_actions_.insert({entry, action}); key_grabber_->AddAction(*action); } } @@ -143,6 +161,17 @@ struct Manager::Impl : sigc::trackable } } + void UngrabMnemonics() + { + for (auto it = entry_actions_.begin(); it != entry_actions_.end();) + { + auto rm_it = it; + ++it; + key_grabber_->RemoveAction(*rm_it->second); + entry_actions_.erase(rm_it); + } + } + void ActivateRequest(std::string const& entry_id) { parent_->key_activate_entry.emit(entry_id); |
