diff --git a/change/react-native-windows-537a723b-a3c7-48fe-aec0-c53ca7d201e3.json b/change/react-native-windows-537a723b-a3c7-48fe-aec0-c53ca7d201e3.json new file mode 100644 index 00000000000..87c158c3695 --- /dev/null +++ b/change/react-native-windows-537a723b-a3c7-48fe-aec0-c53ca7d201e3.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "added check for double click on textInput component view connecting it to WM_LBUTTONDBLCLK", + "packageName": "react-native-windows", + "email": "email not defined", + "dependentChangeType": "patch" +} diff --git a/change/react-native-windows-cc8b5ca3-c345-4091-87d2-b21198d72f2c.json b/change/react-native-windows-cc8b5ca3-c345-4091-87d2-b21198d72f2c.json new file mode 100644 index 00000000000..7751bd031c9 --- /dev/null +++ b/change/react-native-windows-cc8b5ca3-c345-4091-87d2-b21198d72f2c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Tooltip positioned incorrectly on non 100% scale factor", + "packageName": "react-native-windows", + "email": "30809111+acoates-ms@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp index c4cb0bbc7cd..bb9066fc530 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp @@ -631,6 +631,19 @@ WPARAM PointerRoutedEventArgsToMouseWParam( return wParam; } +bool WindowsTextInputComponentView::IsDoubleClick() { + using namespace std::chrono; + + auto now = steady_clock::now(); + auto duration = duration_cast(now - m_lastClickTime).count(); + + const int DOUBLE_CLICK_TIME_MS = ::GetDoubleClickTime(); + + m_lastClickTime = now; + + return (duration < DOUBLE_CLICK_TIME_MS); +} + void WindowsTextInputComponentView::OnPointerPressed( const winrt::Microsoft::ReactNative::Composition::Input::PointerRoutedEventArgs &args) noexcept { UINT msg = 0; @@ -647,7 +660,11 @@ void WindowsTextInputComponentView::OnPointerPressed( if (pp.PointerDeviceType() == winrt::Microsoft::ReactNative::Composition::Input::PointerDeviceType::Mouse) { switch (pp.Properties().PointerUpdateKind()) { case winrt::Microsoft::ReactNative::Composition::Input::PointerUpdateKind::LeftButtonPressed: - msg = WM_LBUTTONDOWN; + if (IsDoubleClick()) { + msg = WM_LBUTTONDBLCLK; + } else { + msg = WM_LBUTTONDOWN; + } break; case winrt::Microsoft::ReactNative::Composition::Input::PointerUpdateKind::MiddleButtonPressed: msg = WM_MBUTTONDOWN; diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h b/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h index 1f547f29b6a..c16db25e250 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h @@ -70,6 +70,7 @@ struct WindowsTextInputComponentView std::optional getAccessiblityValue() noexcept override; void setAcccessiblityValue(std::string &&value) noexcept override; bool getAcccessiblityIsReadOnly() noexcept override; + bool IsDoubleClick(); WindowsTextInputComponentView( const winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext &compContext, @@ -141,6 +142,7 @@ struct WindowsTextInputComponentView DWORD m_propBitsMask{0}; DWORD m_propBits{0}; HCURSOR m_hcursor{nullptr}; + std::chrono::steady_clock::time_point m_lastClickTime{}; std::vector m_submitKeyEvents; }; diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp index b33947457ca..6348585ff29 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp @@ -266,7 +266,7 @@ void TooltipTracker::ShowTooltip(const winrt::Microsoft::ReactNative::ComponentV static_cast((tm.width + tooltipHorizontalPadding + tooltipHorizontalPadding) * scaleFactor); tooltipData->height = static_cast((tm.height + tooltipTopPadding + tooltipBottomPadding) * scaleFactor); - POINT pt = {static_cast(m_pos.X), static_cast(m_pos.Y)}; + POINT pt = {static_cast(m_pos.X * scaleFactor), static_cast(m_pos.Y * scaleFactor)}; ClientToScreen(parentHwnd, &pt); RegisterTooltipWndClass();