Allow IME Text Wrapping (#5005)
## Summary of the Pull Request This PR turns on TextWrapping on `TSFInputControl::TextBlock`. Once the TextBlock hits the end of the Terminal window, it will wrap downwards, but the TextBlock will have as much width as it had when composition started. Unfortunately, this means if composition starts right at the end of the Terminal with enough width for just one character, there will be a vertical line of characters down the right side of the Terminal 😅. It's definitely not ideal, and I imagine this won't be the last time we visit this issue, but for now users can see what they're typing. ## PR Checklist * [x] Closes #3657 * [x] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/Terminal) and sign the CLA * [x] Tests added/passed ## Validation Steps Performed Played around with IME towards the edge of the Terminal window.
This commit is contained in:
parent
a68fa47e52
commit
5672636568
|
@ -163,24 +163,27 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation
|
|||
// Get scale factor for view
|
||||
const double scaleFactor = DisplayInformation::GetForCurrentView().RawPixelsPerViewPixel();
|
||||
|
||||
// Set the selection layout bounds
|
||||
Rect selectionRect = Rect(screenCursorPos.X, screenCursorPos.Y, 0, fontHeight);
|
||||
// position textblock to cursor position
|
||||
Canvas().SetLeft(TextBlock(), clientCursorPos.X);
|
||||
Canvas().SetTop(TextBlock(), ::base::ClampedNumeric<double>(clientCursorPos.Y));
|
||||
|
||||
// calculate FontSize in pixels from DIPs
|
||||
const double fontSizePx = (fontHeight * 72) / USER_DEFAULT_SCREEN_DPI;
|
||||
TextBlock().FontSize(fontSizePx);
|
||||
TextBlock().FontFamily(Media::FontFamily(fontArgs->FontFace()));
|
||||
|
||||
const auto widthToTerminalEnd = Canvas().ActualWidth() - ::base::ClampedNumeric<double>(clientCursorPos.X);
|
||||
TextBlock().MaxWidth(widthToTerminalEnd);
|
||||
|
||||
// Set the text block bounds
|
||||
const auto yOffset = ::base::ClampedNumeric<float>(TextBlock().ActualHeight()) - fontHeight;
|
||||
const auto textBottom = ::base::ClampedNumeric<float>(screenCursorPos.Y) + yOffset;
|
||||
Rect selectionRect = Rect(screenCursorPos.X, textBottom, 0, fontHeight);
|
||||
request.LayoutBounds().TextBounds(ScaleRect(selectionRect, scaleFactor));
|
||||
|
||||
// Set the control bounds of the whole control
|
||||
Rect controlRect = Rect(screenCursorPos.X, screenCursorPos.Y, 0, fontHeight);
|
||||
request.LayoutBounds().ControlBounds(ScaleRect(controlRect, scaleFactor));
|
||||
|
||||
// position textblock to cursor position
|
||||
Canvas().SetLeft(TextBlock(), clientCursorPos.X);
|
||||
Canvas().SetTop(TextBlock(), ::base::ClampedNumeric<double>(clientCursorPos.Y));
|
||||
|
||||
TextBlock().Height(fontHeight);
|
||||
// calculate FontSize in pixels from DIPs
|
||||
const double fontSizePx = (fontHeight * 72) / USER_DEFAULT_SCREEN_DPI;
|
||||
TextBlock().FontSize(fontSizePx);
|
||||
|
||||
TextBlock().FontFamily(Media::FontFamily(fontArgs->FontFace()));
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
Visibility="Collapsed">
|
||||
<TextBlock x:Name="TextBlock"
|
||||
IsTextSelectionEnabled="false"
|
||||
TextWrapping="Wrap"
|
||||
TextDecorations="Underline" />
|
||||
</Canvas>
|
||||
</UserControl>
|
||||
|
|
Loading…
Reference in a new issue