| Index: chrome/browser/chromeos/input_method/candidate_window.cc
|
| diff --git a/chrome/browser/chromeos/input_method/candidate_window.cc b/chrome/browser/chromeos/input_method/candidate_window.cc
|
| index cc6343e70f711d120205b11c3fa6f1fd1b17f119..08ed88474fda37359bd5ff462013cc462954cec3 100644
|
| --- a/chrome/browser/chromeos/input_method/candidate_window.cc
|
| +++ b/chrome/browser/chromeos/input_method/candidate_window.cc
|
| @@ -534,7 +534,8 @@ class CandidateWindowControllerImpl : public CandidateWindowController,
|
| virtual void OnHideAuxiliaryText();
|
| virtual void OnHideLookupTable();
|
| virtual void OnHidePreeditText();
|
| - virtual void OnSetCursorLocation(int x, int y, int width, int height);
|
| + virtual void OnSetCursorLocation(const gfx::Rect& cursor_position,
|
| + const gfx::Rect& composition_head);
|
| virtual void OnUpdateAuxiliaryText(const std::string& utf8_text,
|
| bool visible);
|
| virtual void OnUpdateLookupTable(const InputMethodLookupTable& lookup_table);
|
| @@ -782,7 +783,7 @@ CandidateWindowView::CandidateWindowView(views::Widget* parent_frame)
|
| previous_shortcut_column_size_(0, 0),
|
| previous_candidate_column_size_(0, 0),
|
| previous_annotation_column_size_(0, 0),
|
| - is_suggestion_window_location_available_(false),
|
| + should_show_at_composition_head_(false),
|
| should_show_upper_side_(false),
|
| was_candidate_window_open_(false) {
|
| }
|
| @@ -917,21 +918,14 @@ bool CandidateWindowView::ShouldUpdateCandidateViews(
|
| const InputMethodLookupTable& old_table,
|
| const InputMethodLookupTable& new_table) {
|
|
|
| - // Check if mozc lookup table location is changed.
|
| - if (old_table.mozc_candidates.has_window_location() ||
|
| - new_table.mozc_candidates.has_window_location()) {
|
| -
|
| - if (!old_table.mozc_candidates.IsInitialized() ||
|
| - !new_table.mozc_candidates.IsInitialized()) {
|
| + // Check only candidate category because other fields are not used in
|
| + // CandidateWindowView.
|
| + // TODO(nona): Remove mozc_candidates(crbug.com/129403).
|
| + if (old_table.mozc_candidates.has_category() ||
|
| + new_table.mozc_candidates.has_category()) {
|
| + if (old_table.mozc_candidates.category() !=
|
| + new_table.mozc_candidates.category())
|
| return true;
|
| - }
|
| -
|
| - std::string old_serialized_msg;
|
| - std::string new_serialized_msg;
|
| -
|
| - old_table.mozc_candidates.SerializeToString(&old_serialized_msg);
|
| - new_table.mozc_candidates.SerializeToString(&new_serialized_msg);
|
| - return old_serialized_msg != new_serialized_msg;
|
| }
|
|
|
| // Check if most table contents are identical.
|
| @@ -958,22 +952,12 @@ void CandidateWindowView::UpdateCandidates(
|
| // Initialize candidate views if necessary.
|
| MaybeInitializeCandidateViews(new_lookup_table);
|
|
|
| - // Store mozc specific window location.
|
| - if (new_lookup_table.mozc_candidates.has_window_location() &&
|
| - new_lookup_table.mozc_candidates.window_location() ==
|
| - mozc::commands::Candidates::COMPOSITION) {
|
| - DCHECK(new_lookup_table.mozc_candidates.has_composition_rectangle());
|
| - suggestion_window_location_.set_x(
|
| - new_lookup_table.mozc_candidates.composition_rectangle().x());
|
| - suggestion_window_location_.set_y(
|
| - new_lookup_table.mozc_candidates.composition_rectangle().y());
|
| - suggestion_window_location_.set_width(
|
| - new_lookup_table.mozc_candidates.composition_rectangle().width());
|
| - suggestion_window_location_.set_height(
|
| - new_lookup_table.mozc_candidates.composition_rectangle().height());
|
| - is_suggestion_window_location_available_ = true;
|
| + if (new_lookup_table.mozc_candidates.has_category() &&
|
| + new_lookup_table.mozc_candidates.category() ==
|
| + mozc::commands::SUGGESTION) {
|
| + should_show_at_composition_head_ = true;
|
| } else {
|
| - is_suggestion_window_location_available_ = false;
|
| + should_show_at_composition_head_ = false;
|
| }
|
|
|
| // Compute the index of the current page.
|
| @@ -1161,7 +1145,7 @@ void CandidateWindowView::MaybeInitializeCandidateViews(
|
| }
|
|
|
| bool CandidateWindowView::IsCandidateWindowOpen() const {
|
| - return !is_suggestion_window_location_available_ &&
|
| + return !should_show_at_composition_head_ &&
|
| candidate_area_->visible() && candidate_area_->IsShown();
|
| }
|
|
|
| @@ -1219,13 +1203,13 @@ void CandidateWindowView::CommitCandidate() {
|
| void CandidateWindowView::ResizeAndMoveParentFrame() {
|
| // If rendering operation comes from mozc-engine, uses mozc specific location,
|
| // otherwise lookup table is shown under the cursor.
|
| - const int x = is_suggestion_window_location_available_ ?
|
| - suggestion_window_location_.x() : cursor_location_.x();
|
| + const int x = should_show_at_composition_head_?
|
| + composition_head_location_.x() : cursor_location_.x();
|
| // To avoid lookup-table overlapping, uses maximum y-position of mozc specific
|
| // location and cursor location, because mozc-engine does not consider about
|
| // multi-line composition.
|
| - const int y = is_suggestion_window_location_available_ ?
|
| - std::max(suggestion_window_location_.y(), cursor_location_.y()) :
|
| + const int y = should_show_at_composition_head_?
|
| + std::max(composition_head_location_.y(), cursor_location_.y()) :
|
| cursor_location_.y();
|
| const int height = cursor_location_.height();
|
| const int horizontal_offset = GetHorizontalOffset();
|
| @@ -1664,24 +1648,23 @@ void CandidateWindowControllerImpl::OnHidePreeditText() {
|
| }
|
|
|
| void CandidateWindowControllerImpl::OnSetCursorLocation(
|
| - int x,
|
| - int y,
|
| - int width,
|
| - int height) {
|
| + const gfx::Rect& cursor_location,
|
| + const gfx::Rect& composition_head) {
|
| // A workaround for http://crosbug.com/6460. We should ignore very short Y
|
| // move to prevent the window from shaking up and down.
|
| const int kKeepPositionThreshold = 2; // px
|
| const gfx::Rect& last_location =
|
| candidate_window_->cursor_location();
|
| - const int delta_y = abs(last_location.y() - y);
|
| - if ((last_location.x() == x) && (delta_y <= kKeepPositionThreshold)) {
|
| + const int delta_y = abs(last_location.y() - cursor_location.y());
|
| + if ((last_location.x() == cursor_location.x()) &&
|
| + (delta_y <= kKeepPositionThreshold)) {
|
| DVLOG(1) << "Ignored set_cursor_location signal to prevent window shake";
|
| return;
|
| }
|
|
|
| // Remember the cursor location.
|
| - candidate_window_->set_cursor_location(
|
| - gfx::Rect(x, y, width, height));
|
| + candidate_window_->set_cursor_location(cursor_location);
|
| + candidate_window_->set_composition_head_location(composition_head);
|
| // Move the window per the cursor location.
|
| candidate_window_->ResizeAndMoveParentFrame();
|
| infolist_window_->ResizeAndMoveParentFrame();
|
|
|