gpui: Fix pre-edit position after applying scale factor (#18214)

before:

![image](https://github.com/user-attachments/assets/20590089-3333-4ca8-a371-b07acfbe43f9)

after:

![image](https://github.com/user-attachments/assets/2d25623e-0602-4d24-b563-64e1d2ec3492)

Release Notes:

- N/A
This commit is contained in:
wannacu 2024-09-30 18:57:59 +08:00 committed by GitHub
parent 65f6a7e5bc
commit 8ae74bc6df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 31 additions and 21 deletions

View file

@ -2612,6 +2612,12 @@ impl From<ScaledPixels> for f64 {
} }
} }
impl From<ScaledPixels> for u32 {
fn from(pixels: ScaledPixels) -> Self {
pixels.0 as u32
}
}
/// Represents a length in rems, a unit based on the font-size of the window, which can be assigned with [`WindowContext::set_rem_size`][set_rem_size]. /// Represents a length in rems, a unit based on the font-size of the window, which can be assigned with [`WindowContext::set_rem_size`][set_rem_size].
/// ///
/// Rems are used for defining lengths that are scalable and consistent across different UI elements. /// Rems are used for defining lengths that are scalable and consistent across different UI elements.

View file

@ -23,8 +23,8 @@ use crate::{
point, Action, AnyWindowHandle, AppContext, AsyncWindowContext, BackgroundExecutor, Bounds, point, Action, AnyWindowHandle, AppContext, AsyncWindowContext, BackgroundExecutor, Bounds,
DevicePixels, DispatchEventResult, Font, FontId, FontMetrics, FontRun, ForegroundExecutor, DevicePixels, DispatchEventResult, Font, FontId, FontMetrics, FontRun, ForegroundExecutor,
GPUSpecs, GlyphId, ImageSource, Keymap, LineLayout, Pixels, PlatformInput, Point, GPUSpecs, GlyphId, ImageSource, Keymap, LineLayout, Pixels, PlatformInput, Point,
RenderGlyphParams, RenderImage, RenderImageParams, RenderSvgParams, Scene, SharedString, Size, RenderGlyphParams, RenderImage, RenderImageParams, RenderSvgParams, ScaledPixels, Scene,
SvgSize, Task, TaskLabel, WindowContext, DEFAULT_WINDOW_SIZE, SharedString, Size, SvgSize, Task, TaskLabel, WindowContext, DEFAULT_WINDOW_SIZE,
}; };
use anyhow::Result; use anyhow::Result;
use async_task::Runnable; use async_task::Runnable;
@ -381,7 +381,7 @@ pub(crate) trait PlatformWindow: HasWindowHandle + HasDisplayHandle {
fn set_client_inset(&self, _inset: Pixels) {} fn set_client_inset(&self, _inset: Pixels) {}
fn gpu_specs(&self) -> Option<GPUSpecs>; fn gpu_specs(&self) -> Option<GPUSpecs>;
fn update_ime_position(&self, _bounds: Bounds<Pixels>); fn update_ime_position(&self, _bounds: Bounds<ScaledPixels>);
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
fn as_test(&mut self) -> Option<&mut TestWindow> { fn as_test(&mut self) -> Option<&mut TestWindow> {

View file

@ -84,7 +84,7 @@ use crate::{
use crate::{ use crate::{
AnyWindowHandle, CursorStyle, DisplayId, KeyDownEvent, KeyUpEvent, Keystroke, Modifiers, AnyWindowHandle, CursorStyle, DisplayId, KeyDownEvent, KeyUpEvent, Keystroke, Modifiers,
ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent,
NavigationDirection, Pixels, PlatformDisplay, PlatformInput, Point, ScrollDelta, NavigationDirection, Pixels, PlatformDisplay, PlatformInput, Point, ScaledPixels, ScrollDelta,
ScrollWheelEvent, TouchPhase, ScrollWheelEvent, TouchPhase,
}; };
use crate::{LinuxCommon, WindowParams}; use crate::{LinuxCommon, WindowParams};
@ -313,7 +313,7 @@ impl WaylandClientStatePtr {
} }
} }
pub fn update_ime_position(&self, bounds: Bounds<Pixels>) { pub fn update_ime_position(&self, bounds: Bounds<ScaledPixels>) {
let client = self.get_client(); let client = self.get_client();
let mut state = client.borrow_mut(); let mut state = client.borrow_mut();
if state.composing || state.text_input.is_none() || state.pre_edit_text.is_some() { if state.composing || state.text_input.is_none() || state.pre_edit_text.is_some() {

View file

@ -26,7 +26,7 @@ use crate::platform::{PlatformAtlas, PlatformInputHandler, PlatformWindow};
use crate::scene::Scene; use crate::scene::Scene;
use crate::{ use crate::{
px, size, AnyWindowHandle, Bounds, Decorations, GPUSpecs, Globals, Modifiers, Output, Pixels, px, size, AnyWindowHandle, Bounds, Decorations, GPUSpecs, Globals, Modifiers, Output, Pixels,
PlatformDisplay, PlatformInput, Point, PromptLevel, ResizeEdge, Size, Tiling, PlatformDisplay, PlatformInput, Point, PromptLevel, ResizeEdge, ScaledPixels, Size, Tiling,
WaylandClientStatePtr, WindowAppearance, WindowBackgroundAppearance, WindowBounds, WaylandClientStatePtr, WindowAppearance, WindowBackgroundAppearance, WindowBounds,
WindowControls, WindowDecorations, WindowParams, WindowControls, WindowDecorations, WindowParams,
}; };
@ -1010,7 +1010,7 @@ impl PlatformWindow for WaylandWindow {
} }
} }
fn update_ime_position(&self, bounds: Bounds<Pixels>) { fn update_ime_position(&self, bounds: Bounds<ScaledPixels>) {
let state = self.borrow(); let state = self.borrow();
state.client.update_ime_position(bounds); state.client.update_ime_position(bounds);
} }

View file

@ -38,7 +38,8 @@ use crate::platform::{LinuxCommon, PlatformWindow};
use crate::{ use crate::{
modifiers_from_xinput_info, point, px, AnyWindowHandle, Bounds, ClipboardItem, CursorStyle, modifiers_from_xinput_info, point, px, AnyWindowHandle, Bounds, ClipboardItem, CursorStyle,
DisplayId, FileDropEvent, Keystroke, Modifiers, ModifiersChangedEvent, Pixels, Platform, DisplayId, FileDropEvent, Keystroke, Modifiers, ModifiersChangedEvent, Pixels, Platform,
PlatformDisplay, PlatformInput, Point, ScrollDelta, Size, TouchPhase, WindowParams, X11Window, PlatformDisplay, PlatformInput, Point, ScaledPixels, ScrollDelta, Size, TouchPhase,
WindowParams, X11Window,
}; };
use super::{button_of_key, modifiers_from_state, pressed_button_from_mask}; use super::{button_of_key, modifiers_from_state, pressed_button_from_mask};
@ -188,7 +189,7 @@ impl X11ClientStatePtr {
} }
} }
pub fn update_ime_position(&self, bounds: Bounds<Pixels>) { pub fn update_ime_position(&self, bounds: Bounds<ScaledPixels>) {
let client = self.get_client(); let client = self.get_client();
let mut state = client.0.borrow_mut(); let mut state = client.0.borrow_mut();
if state.composing || state.ximc.is_none() { if state.composing || state.ximc.is_none() {

View file

@ -4,9 +4,9 @@ use crate::{
platform::blade::{BladeRenderer, BladeSurfaceConfig}, platform::blade::{BladeRenderer, BladeSurfaceConfig},
px, size, AnyWindowHandle, Bounds, Decorations, DevicePixels, ForegroundExecutor, GPUSpecs, px, size, AnyWindowHandle, Bounds, Decorations, DevicePixels, ForegroundExecutor, GPUSpecs,
Modifiers, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, Modifiers, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler,
PlatformWindow, Point, PromptLevel, ResizeEdge, Scene, Size, Tiling, WindowAppearance, PlatformWindow, Point, PromptLevel, ResizeEdge, ScaledPixels, Scene, Size, Tiling,
WindowBackgroundAppearance, WindowBounds, WindowDecorations, WindowKind, WindowParams, WindowAppearance, WindowBackgroundAppearance, WindowBounds, WindowDecorations, WindowKind,
X11ClientStatePtr, WindowParams, X11ClientStatePtr,
}; };
use blade_graphics as gpu; use blade_graphics as gpu;
@ -1412,7 +1412,7 @@ impl PlatformWindow for X11Window {
} }
} }
fn update_ime_position(&self, bounds: Bounds<Pixels>) { fn update_ime_position(&self, bounds: Bounds<ScaledPixels>) {
let mut state = self.0.state.borrow_mut(); let mut state = self.0.state.borrow_mut();
let client = state.client.clone(); let client = state.client.clone();
drop(state); drop(state);

View file

@ -3,8 +3,9 @@ use crate::{
platform::PlatformInputHandler, point, px, size, AnyWindowHandle, Bounds, DisplayLink, platform::PlatformInputHandler, point, px, size, AnyWindowHandle, Bounds, DisplayLink,
ExternalPaths, FileDropEvent, ForegroundExecutor, KeyDownEvent, Keystroke, Modifiers, ExternalPaths, FileDropEvent, ForegroundExecutor, KeyDownEvent, Keystroke, Modifiers,
ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels, ModifiersChangedEvent, MouseButton, MouseDownEvent, MouseMoveEvent, MouseUpEvent, Pixels,
PlatformAtlas, PlatformDisplay, PlatformInput, PlatformWindow, Point, PromptLevel, Size, Timer, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformWindow, Point, PromptLevel,
WindowAppearance, WindowBackgroundAppearance, WindowBounds, WindowKind, WindowParams, ScaledPixels, Size, Timer, WindowAppearance, WindowBackgroundAppearance, WindowBounds,
WindowKind, WindowParams,
}; };
use block::ConcreteBlock; use block::ConcreteBlock;
use cocoa::{ use cocoa::{
@ -1119,7 +1120,7 @@ impl PlatformWindow for MacWindow {
None None
} }
fn update_ime_position(&self, _bounds: Bounds<Pixels>) { fn update_ime_position(&self, _bounds: Bounds<ScaledPixels>) {
unsafe { unsafe {
let input_context: id = msg_send![class!(NSTextInputContext), currentInputContext]; let input_context: id = msg_send![class!(NSTextInputContext), currentInputContext];
let _: () = msg_send![input_context, invalidateCharacterCoordinates]; let _: () = msg_send![input_context, invalidateCharacterCoordinates];

View file

@ -1,8 +1,8 @@
use crate::{ use crate::{
AnyWindowHandle, AtlasKey, AtlasTextureId, AtlasTile, Bounds, DispatchEventResult, GPUSpecs, AnyWindowHandle, AtlasKey, AtlasTextureId, AtlasTile, Bounds, DispatchEventResult, GPUSpecs,
Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, PlatformWindow, Pixels, PlatformAtlas, PlatformDisplay, PlatformInput, PlatformInputHandler, PlatformWindow,
Point, Size, TestPlatform, TileId, WindowAppearance, WindowBackgroundAppearance, WindowBounds, Point, ScaledPixels, Size, TestPlatform, TileId, WindowAppearance, WindowBackgroundAppearance,
WindowParams, WindowBounds, WindowParams,
}; };
use collections::HashMap; use collections::HashMap;
use parking_lot::Mutex; use parking_lot::Mutex;
@ -274,7 +274,7 @@ impl PlatformWindow for TestWindow {
unimplemented!() unimplemented!()
} }
fn update_ime_position(&self, _bounds: Bounds<Pixels>) {} fn update_ime_position(&self, _bounds: Bounds<ScaledPixels>) {}
fn gpu_specs(&self) -> Option<GPUSpecs> { fn gpu_specs(&self) -> Option<GPUSpecs> {
None None

View file

@ -685,7 +685,7 @@ impl PlatformWindow for WindowsWindow {
Some(self.0.state.borrow().renderer.gpu_specs()) Some(self.0.state.borrow().renderer.gpu_specs())
} }
fn update_ime_position(&self, _bounds: Bounds<Pixels>) { fn update_ime_position(&self, _bounds: Bounds<ScaledPixels>) {
// todo(windows) // todo(windows)
} }
} }

View file

@ -3610,7 +3610,9 @@ impl<'a> WindowContext<'a> {
self.on_next_frame(|cx| { self.on_next_frame(|cx| {
if let Some(mut input_handler) = cx.window.platform_window.take_input_handler() { if let Some(mut input_handler) = cx.window.platform_window.take_input_handler() {
if let Some(bounds) = input_handler.selected_bounds(cx) { if let Some(bounds) = input_handler.selected_bounds(cx) {
cx.window.platform_window.update_ime_position(bounds); cx.window
.platform_window
.update_ime_position(bounds.scale(cx.scale_factor()));
} }
cx.window.platform_window.set_input_handler(input_handler); cx.window.platform_window.set_input_handler(input_handler);
} }