Index: ash/common/system/chromeos/ime_menu/ime_list_view.cc |
diff --git a/ash/common/system/chromeos/ime_menu/ime_list_view.cc b/ash/common/system/chromeos/ime_menu/ime_list_view.cc |
index 1452eeb447d518398a7e8a9e0cff73c60718c128..2b00748d41cfb349f2bea3a080a007b86f954463 100644 |
--- a/ash/common/system/chromeos/ime_menu/ime_list_view.cc |
+++ b/ash/common/system/chromeos/ime_menu/ime_list_view.cc |
@@ -141,6 +141,14 @@ class ImeListItemView : public ActionableView { |
// ActionableView: |
bool PerformAction(const ui::Event& event) override { |
ime_list_view_->HandleViewClicked(this); |
+ |
+ if (ime_list_view_->should_focus_ime_after_selection_with_keyboard() && |
+ event.type() == ui::EventType::ET_KEY_PRESSED) { |
+ ime_list_view_->set_last_item_selected_with_keyboard(true); |
+ } else { |
+ ime_list_view_->CloseImeListView(); |
+ } |
+ |
return true; |
} |
@@ -253,7 +261,9 @@ class MaterialKeyboardStatusRowView : public views::View { |
ImeListView::ImeListView(SystemTrayItem* owner, |
bool show_keyboard_toggle, |
SingleImeBehavior single_ime_behavior) |
- : TrayDetailsView(owner) { |
+ : TrayDetailsView(owner), |
+ last_item_selected_with_keyboard_(false), |
+ should_focus_ime_after_selection_with_keyboard_(false) { |
SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate(); |
IMEInfoList list; |
delegate->GetAvailableIMEList(&list); |
@@ -296,6 +306,10 @@ void ImeListView::Update(const IMEInfoList& list, |
Layout(); |
SchedulePaint(); |
+ |
+ if (should_focus_ime_after_selection_with_keyboard_ && |
+ last_item_selected_with_keyboard_) |
+ FocusCurrentImeIfNeeded(); |
} |
void ImeListView::ResetImeListView() { |
@@ -305,6 +319,12 @@ void ImeListView::ResetImeListView() { |
keyboard_status_ = nullptr; |
} |
+void ImeListView::CloseImeListView() { |
+ last_selected_item_id_.clear(); |
+ last_item_selected_with_keyboard_ = false; |
+ GetWidget()->Close(); |
+} |
+ |
void ImeListView::AppendIMEList(const IMEInfoList& list) { |
DCHECK(ime_map_.empty()); |
for (size_t i = 0; i < list.size(); i++) { |
@@ -389,6 +409,8 @@ void ImeListView::PrependMaterialKeyboardStatus() { |
void ImeListView::HandleViewClicked(views::View* view) { |
if (view == keyboard_status_) { |
WmShell::Get()->ToggleIgnoreExternalKeyboard(); |
+ last_selected_item_id_.clear(); |
+ last_item_selected_with_keyboard_ = false; |
return; |
} |
@@ -397,6 +419,7 @@ void ImeListView::HandleViewClicked(views::View* view) { |
if (ime != ime_map_.end()) { |
WmShell::Get()->RecordUserMetricsAction(UMA_STATUS_AREA_IME_SWITCH_MODE); |
std::string ime_id = ime->second; |
+ last_selected_item_id_ = ime_id; |
delegate->SwitchIME(ime_id); |
} else { |
std::map<views::View*, std::string>::const_iterator property = |
@@ -404,10 +427,9 @@ void ImeListView::HandleViewClicked(views::View* view) { |
if (property == property_map_.end()) |
return; |
const std::string key = property->second; |
+ last_selected_item_id_ = key; |
delegate->ActivateIMEProperty(key); |
- } |
- |
- GetWidget()->Close(); |
+ }; |
} |
void ImeListView::HandleButtonPressed(views::Button* sender, |
@@ -415,6 +437,19 @@ void ImeListView::HandleButtonPressed(views::Button* sender, |
if (material_keyboard_status_view_ && |
sender == material_keyboard_status_view_->toggle()) { |
WmShell::Get()->ToggleIgnoreExternalKeyboard(); |
+ last_selected_item_id_.clear(); |
+ last_item_selected_with_keyboard_ = false; |
+ } |
+} |
+ |
+void ImeListView::FocusCurrentImeIfNeeded() { |
+ views::FocusManager* manager = GetFocusManager(); |
+ if (!manager || manager->GetFocusedView() || last_selected_item_id_.empty()) |
+ return; |
+ |
+ for (auto ime_map : ime_map_) { |
+ if (ime_map.second == last_selected_item_id_) |
+ (ime_map.first)->RequestFocus(); |
} |
} |