@@ -7920,7 +7920,9 @@ static int lua_UiTextArea(lua_State* L)
79207920 focusedLayout->HitTestTextPosition(
79217921 hitPosition, trailing, &caretX, &caretY,
79227922 &caretMetrics));
7923- if (hasCaret && s && s->engine)
7923+ if (hasCaret && s && s->engine &&
7924+ s->engine->RuntimeConsumeHostInputCaretVisibilityRequest(
7925+ BoundWidgetId(L), id))
79247926 {
79257927 const float caretTop = padding + caretY;
79267928 const float caretBottom = caretTop +
@@ -26483,6 +26485,7 @@ void WidgetEngine::RuntimeRegisterHostControl(const std::wstring& widgetId,
2648326485 focusedHostInput_.cursor = *cursor;
2648426486 focusedHostInput_.compositionText.clear();
2648526487 focusedHostInput_.compositionCursor = 0;
26488+ focusedHostInput_.caretVisibility.Request();
2648626489 }
2648726490 }
2648826491 }
@@ -26613,6 +26616,7 @@ bool WidgetEngine::RuntimeFocusHostInput(const std::wstring& widgetId,
2661326616 found->selectAll ? 0 : storedText.size();
2661426617 focusedHostInput_.compositionText.clear();
2661526618 focusedHostInput_.compositionCursor = 0;
26619+ focusedHostInput_.caretVisibility.Request();
2661626620 }
2661726621 }
2661826622 focusedHostInput_.multiline = found->multiline;
@@ -26645,8 +26649,10 @@ bool WidgetEngine::RuntimeFocusHostInput(const std::wstring& widgetId,
2664526649 {
2664626650 focusedHostInput_.selectionAnchor = *anchor;
2664726651 focusedHostInput_.cursor = *cursor;
26652+ focusedHostInput_.caretVisibility.Request();
2664826653 }
2664926654 }
26655+ focusedHostInput_.caretVisibility.Request();
2665026656 if (hostInputFocusCallback_)
2665126657 hostInputFocusCallback_();
2665226658 return true;
@@ -26702,6 +26708,7 @@ bool WidgetEngine::RuntimeFocusHostInput(const std::wstring& widgetId,
2670226708 focusedHostInput_.step = found->step;
2670326709 focusedHostInput_.maximumUtf8Bytes =
2670426710 found->maximumUtf8Bytes;
26711+ focusedHostInput_.caretVisibility.Request();
2670526712 DispatchHostInputAction(widgetId, id,
2670626713 focusedHostInput_.focusAction, "focus",
2670726714 focusedHostInput_.text, false,
@@ -26913,6 +26920,17 @@ bool WidgetEngine::RuntimeFocusViewTarget(const std::wstring& widgetId,
2691326920 return true;
2691426921}
2691526922
26923+ bool WidgetEngine::RuntimeConsumeHostInputCaretVisibilityRequest(
26924+ const std::wstring& widgetId, const std::string& id)
26925+ {
26926+ if (!focusedHostInput_.active ||
26927+ focusedHostInput_.widgetId != widgetId ||
26928+ focusedHostInput_.id != id ||
26929+ focusedHostInput_.surface != CurrentWidgetSurface(d2dState_))
26930+ return false;
26931+ return focusedHostInput_.caretVisibility.Consume();
26932+ }
26933+
2691626934void WidgetEngine::BeginHostLogicalSlotPointer(
2691726935 LuaWidget& widget, int x, int y)
2691826936{
@@ -27950,6 +27968,7 @@ bool WidgetEngine::HandleHostInputPointerMove(
2795027968 }
2795127969 focusedHostInput_.cursor = HitTestHostInputPosition(
2795227970 *control, widgetId, x, y);
27971+ focusedHostInput_.caretVisibility.Request();
2795327972 RuntimeInvalidateHost(widgetId);
2795427973 return true;
2795527974}
@@ -27977,9 +27996,12 @@ bool WidgetEngine::HandleHostInputPointerUp(
2797727996 HostControlBelongsToSurface(item, surface);
2797827997 });
2797927998 if (control != controls.rend())
27999+ {
2798028000 focusedHostInput_.cursor =
2798128001 HitTestHostInputPosition(
2798228002 *control, widgetId, x, y);
28003+ focusedHostInput_.caretVisibility.Request();
28004+ }
2798328005 }
2798428006 DispatchHostInputSelectionChange(widgetId,
2798528007 focusedHostInput_.id,
@@ -28175,6 +28197,7 @@ bool WidgetEngine::RuntimePerformAccessibilityAction(
2817528197 focusedHostInput_.selectionAnchor = value.size();
2817628198 focusedHostInput_.compositionText.clear();
2817728199 focusedHostInput_.compositionCursor = 0;
28200+ focusedHostInput_.caretVisibility.Request();
2817828201 }
2817928202
2818028203 if (control->controlled)
@@ -28591,6 +28614,7 @@ bool WidgetEngine::SetHostInputComposition(
2859128614 focusedHostInput_.compositionText = text;
2859228615 focusedHostInput_.compositionCursor =
2859328616 std::min(cursor, text.size());
28617+ focusedHostInput_.caretVisibility.Request();
2859428618 RuntimeInvalidateHost(focusedHostInput_.widgetId);
2859528619 return true;
2859628620}
@@ -28628,6 +28652,7 @@ bool WidgetEngine::CommitHostInputComposition(
2862828652 {
2862928653 focusedHostInput_.compositionText.clear();
2863028654 focusedHostInput_.compositionCursor = 0;
28655+ focusedHostInput_.caretVisibility.Request();
2863128656 RuntimeInvalidateHost(focusedHostInput_.widgetId);
2863228657 return true;
2863328658 }
@@ -28636,6 +28661,7 @@ bool WidgetEngine::CommitHostInputComposition(
2863628661 focusedHostInput_.cursor;
2863728662 focusedHostInput_.compositionText.clear();
2863828663 focusedHostInput_.compositionCursor = 0;
28664+ focusedHostInput_.caretVisibility.Request();
2863928665 if (focusedHostInput_.liveUpdate)
2864028666 {
2864128667 if (focusedHostInput_.controlled)
@@ -28660,6 +28686,7 @@ void WidgetEngine::ClearHostInputComposition()
2866028686 return;
2866128687 focusedHostInput_.compositionText.clear();
2866228688 focusedHostInput_.compositionCursor = 0;
28689+ focusedHostInput_.caretVisibility.Request();
2866328690 RuntimeInvalidateHost(focusedHostInput_.widgetId);
2866428691}
2866528692
@@ -28714,6 +28741,7 @@ bool WidgetEngine::HandleHostInputChar(wchar_t ch)
2871428741 focusedHostInput_.cursor = nextCursor;
2871528742 focusedHostInput_.selectionAnchor =
2871628743 focusedHostInput_.cursor;
28744+ focusedHostInput_.caretVisibility.Request();
2871728745 if (focusedHostInput_.liveUpdate)
2871828746 {
2871928747 if (focusedHostInput_.controlled)
@@ -28794,6 +28822,7 @@ bool WidgetEngine::HandleHostInputKey(WPARAM key)
2879428822 if (!shift)
2879528823 focusedHostInput_.selectionAnchor =
2879628824 focusedHostInput_.cursor;
28825+ focusedHostInput_.caretVisibility.Request();
2879728826 dispatchSelectionChange();
2879828827 RuntimeInvalidateHost(focusedHostInput_.widgetId);
2879928828 return true;
@@ -28836,6 +28865,7 @@ bool WidgetEngine::HandleHostInputKey(WPARAM key)
2883628865 {
2883728866 focusedHostInput_.selectionAnchor = 0;
2883828867 focusedHostInput_.cursor = focusedHostInput_.text.size();
28868+ focusedHostInput_.caretVisibility.Request();
2883928869 dispatchSelectionChange();
2884028870 RuntimeInvalidateHost(focusedHostInput_.widgetId);
2884128871 return true;
@@ -29099,6 +29129,7 @@ bool WidgetEngine::HandleHostInputKey(WPARAM key)
2909929129
2910029130 if (changed)
2910129131 {
29132+ focusedHostInput_.caretVisibility.Request();
2910229133 if (focusedHostInput_.liveUpdate)
2910329134 {
2910429135 if (focusedHostInput_.controlled)
@@ -29373,6 +29404,13 @@ bool WidgetEngine::HandleHostUiPointer(const std::wstring& widgetId, int x, int
2937329404 if (!result.moved)
2937429405 continue;
2937529406 offset = result.offset;
29407+ if (focusedHostInput_.active &&
29408+ focusedHostInput_.widgetId == widgetId &&
29409+ focusedHostInput_.id == it->id &&
29410+ focusedHostInput_.surface == normalizedSurface)
29411+ {
29412+ focusedHostInput_.caretVisibility.PreserveManualScroll();
29413+ }
2937629414 const std::string targetKey = it->id;
2937729415 {
2937829416 snowdesktop::widget_runtime::WidgetTrustedGestureScope
@@ -29406,6 +29444,7 @@ bool WidgetEngine::HandleHostUiPointer(const std::wstring& widgetId, int x, int
2940629444 focusedHostInput_.selectionAnchor =
2940729445 focusedHostInput_.cursor;
2940829446 focusedHostInput_.pointerSelecting = true;
29447+ focusedHostInput_.caretVisibility.Request();
2940929448 RuntimeInvalidateHost(widgetId);
2941029449 }
2941129450 return true;
0 commit comments