diff options
author | Peter Varga <pvarga@inf.u-szeged.hu> | 2017-05-09 18:17:54 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-05-17 09:04:15 +0000 |
commit | 59df7bd0a92acf6cb9ef2eac551b7a0913e2cd1f (patch) | |
tree | 44f79e6f2b780441367720e8f9c9a3c06f134f8e /src | |
parent | b56a0dfbcda6a71a06236a29e514b8d4ec5a02ed (diff) |
Fix selectionChanged signal out of input field
Task-number: QTBUG-60688
Change-Id: I6d0b78e6b8df54c40ae30d5f0909c631c440a9cd
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 33 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 4 |
2 files changed, 29 insertions, 8 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 72abe04af..cf22273e4 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -97,6 +97,7 @@ enum ImStateFlags { TextInputStateUpdated = 1 << 0, TextSelectionUpdated = 1 << 1, TextSelectionBoundsUpdated = 1 << 2, + TextSelectionFlags = TextSelectionUpdated | TextSelectionBoundsUpdated, AllFlags = TextInputStateUpdated | TextSelectionUpdated | TextSelectionBoundsUpdated }; @@ -266,8 +267,8 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget , m_needsBeginFrames(false) , m_addedFrameObserver(false) , m_imState(0) - , m_anchorPositionWithinSelection(0) - , m_cursorPositionWithinSelection(0) + , m_anchorPositionWithinSelection(-1) + , m_cursorPositionWithinSelection(-1) , m_cursorPosition(0) , m_emptyPreviousSelection(true) { @@ -776,8 +777,10 @@ void RenderWidgetHostViewQt::OnSelectionBoundsChanged(content::TextInputManager Q_UNUSED(updated_view); m_imState |= ImStateFlags::TextSelectionBoundsUpdated; - if (m_imState == ImStateFlags::AllFlags) + if (m_imState == ImStateFlags::AllFlags + || (m_imState == ImStateFlags::TextSelectionFlags && getTextInputType() == ui::TEXT_INPUT_TYPE_NONE)) { selectionChanged(); + } } void RenderWidgetHostViewQt::OnTextSelectionChanged(content::TextInputManager *text_input_manager, RenderWidgetHostViewBase *updated_view) @@ -794,8 +797,10 @@ void RenderWidgetHostViewQt::OnTextSelectionChanged(content::TextInputManager *t #endif // defined(USE_X11) m_imState |= ImStateFlags::TextSelectionUpdated; - if (m_imState == ImStateFlags::AllFlags) + if (m_imState == ImStateFlags::AllFlags + || (m_imState == ImStateFlags::TextSelectionFlags && getTextInputType() == ui::TEXT_INPUT_TYPE_NONE)) { selectionChanged(); + } } void RenderWidgetHostViewQt::selectionChanged() @@ -803,6 +808,22 @@ void RenderWidgetHostViewQt::selectionChanged() // Reset input manager state m_imState = 0; + // Handle text selection out of an input field + if (getTextInputType() == ui::TEXT_INPUT_TYPE_NONE) { + if (GetSelectedText().empty() && m_emptyPreviousSelection) + return; + + // Reset position values to emit selectionChanged signal when clearing text selection + // by clicking into an input field. These values are intended to be used by inputMethodQuery + // so they are not expected to be valid when selection is out of an input field. + m_anchorPositionWithinSelection = -1; + m_cursorPositionWithinSelection = -1; + + m_emptyPreviousSelection = GetSelectedText().empty(); + m_adapterClient->selectionChanged(); + return; + } + const content::TextInputManager::TextSelection *selection = text_input_manager_->GetTextSelection(); if (!selection) return; @@ -817,8 +838,8 @@ void RenderWidgetHostViewQt::selectionChanged() return; } - uint newAnchorPositionWithinSelection = 0; - uint newCursorPositionWithinSelection = 0; + int newAnchorPositionWithinSelection = 0; + int newCursorPositionWithinSelection = 0; if (text_input_manager_->GetSelectionRegion()->anchor.type() == gfx::SelectionBound::RIGHT) { newAnchorPositionWithinSelection = selection->range.GetMax() - selection->offset; diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 799930830..3b679923e 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -263,8 +263,8 @@ private: gfx::SizeF m_lastContentsSize; uint m_imState; - uint m_anchorPositionWithinSelection; - uint m_cursorPositionWithinSelection; + int m_anchorPositionWithinSelection; + int m_cursorPositionWithinSelection; uint m_cursorPosition; bool m_emptyPreviousSelection; QString m_surroundingText; |