Skip to content

Commit c800a50

Browse files
Cong Liurogerwang
authored andcommitted
reland "fixed multiple menu shortcuts issues"
This commit fixed following issues: * shortcuts was not unregistered when the item was removed or detached * shortcuts didn't work with inserted items fixed nwjs#5657
1 parent 327e8cb commit c800a50

File tree

5 files changed

+45
-7
lines changed

5 files changed

+45
-7
lines changed

src/api/menu/menu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class Menu : public Base {
104104

105105
#if defined(OS_WIN) || defined(OS_LINUX)
106106
void UpdateKeys(views::FocusManager *focus_manager);
107+
void RemoveKeys();
107108
ui::NwMenuModel* model() { return menu_model_.get(); }
108109
aura::Window* GetActiveNativeView(content::RenderFrameHost* rfh);
109110
#endif

src/api/menu/menu_views.cc

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ void Menu::Append(MenuItem* menu_item) {
8585
}
8686

8787
void Menu::Insert(MenuItem* menu_item, int pos) {
88+
if (pos < 0 || pos > (int)menu_items_.size()) return;
89+
8890
if (menu_item->submenu_)
8991
menu_model_->InsertSubMenuAt(pos, menu_item->id(), menu_item->label_,
9092
menu_item->submenu_->menu_model_.get());
@@ -97,13 +99,17 @@ void Menu::Insert(MenuItem* menu_item, int pos) {
9799

98100
is_menu_modified_ = true;
99101
menu_item->menu_ = this;
100-
102+
menu_items_.insert(menu_items_.begin() + pos, menu_item);
101103
}
102104

103105
void Menu::Remove(MenuItem* menu_item, int pos) {
106+
if (pos < 0 || pos >= (int)menu_items_.size()) return;
107+
104108
menu_model_->RemoveItemAt(pos);
109+
menu_items_.erase(menu_items_.begin() + pos);
105110
is_menu_modified_ = true;
106111
menu_item->menu_ = NULL;
112+
menu_item->RemoveKeys();
107113
}
108114

109115
void Menu::Popup(int x, int y, content::RenderFrameHost* rfh) {
@@ -142,14 +148,22 @@ void Menu::UpdateKeys(views::FocusManager *focus_manager){
142148
return ;
143149
} else {
144150
focus_manager_ = focus_manager;
145-
std::vector<MenuItem*>::iterator it = menu_items_.begin();
146-
while(it!=menu_items_.end()){
147-
(*it)->UpdateKeys(focus_manager);
148-
++it;
151+
for(auto item : menu_items_) {
152+
item->UpdateKeys(focus_manager);
149153
}
150154
}
151155
}
152156

157+
void Menu::RemoveKeys() {
158+
if (!focus_manager_) return;
159+
160+
for(auto item: menu_items_) {
161+
item->RemoveKeys();
162+
}
163+
164+
focus_manager_ = NULL;
165+
}
166+
153167
void Menu::UpdateStates() {
154168
}
155169

src/api/menuitem/menuitem.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ class MenuItem : public Base {
7676
#endif
7777

7878
#if defined(OS_WIN) || defined(OS_LINUX)
79-
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
80-
bool CanHandleAccelerators() const override;
79+
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
80+
bool CanHandleAccelerators() const override;
8181
void UpdateKeys(views::FocusManager *focus_manager);
82+
void RemoveKeys();
8283
#endif
8384

8485
void OnClick();

src/api/menuitem/menuitem_views.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ void MenuItem::SetChecked(bool checked) {
168168
}
169169

170170
void MenuItem::SetSubmenu(Menu* menu) {
171+
if (submenu_) submenu_->RemoveKeys();
172+
171173
submenu_ = menu;
172174
}
173175

@@ -192,6 +194,18 @@ void MenuItem::UpdateKeys(views::FocusManager *focus_manager){
192194
}
193195
}
194196

197+
void MenuItem::RemoveKeys() {
198+
if (!focus_manager_) return;
199+
200+
if (enable_shortcut_) {
201+
focus_manager_->UnregisterAccelerator(accelerator_, this);
202+
}
203+
if (submenu_) {
204+
submenu_->RemoveKeys();
205+
}
206+
focus_manager_ = NULL;
207+
}
208+
195209
#if defined(OS_WIN) || defined(OS_LINUX)
196210
bool MenuItem::AcceleratorPressed(const ui::Accelerator& accelerator) {
197211
#if defined(OS_WIN)

src/api/nw_window_api.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ bool NwCurrentWindowInternalClearMenuFunction::RunAsync() {
339339
browser_view_layout->set_menu_bar(NULL);
340340
native_app_window_views->layout_();
341341
native_app_window_views->SchedulePaint();
342+
window->menu_->RemoveKeys();
343+
window->menu_ = NULL;
342344
#endif
343345
return true;
344346
}
@@ -360,7 +362,12 @@ bool NwCurrentWindowInternalSetMenuFunction::RunNWSync(base::ListValue* response
360362
nw::ObjectManager* obj_manager = nw::ObjectManager::Get(browser_context());
361363
Menu* menu = (Menu*)obj_manager->GetApiObject(id);
362364

365+
#if defined(OS_LINUX) || defined(OS_WIN)
366+
Menu* old_menu = window->menu_;
367+
#endif
368+
363369
window->menu_ = menu;
370+
364371
#if defined(OS_MACOSX)
365372
response->Append(NWChangeAppMenu(menu));
366373
#endif
@@ -376,6 +383,7 @@ bool NwCurrentWindowInternalSetMenuFunction::RunNWSync(base::ListValue* response
376383
menubar->UpdateMenu(menu->model());
377384
native_app_window_views->layout_();
378385
native_app_window_views->SchedulePaint();
386+
if (old_menu) old_menu->RemoveKeys();
379387
menu->UpdateKeys( native_app_window_views->widget()->GetFocusManager() );
380388
response->Append(std::unique_ptr<base::ListValue>(new base::ListValue()));
381389
#endif

0 commit comments

Comments
 (0)