diff --git a/crates/gpui/src/platform/windows/events.rs b/crates/gpui/src/platform/windows/events.rs index 8cbe0430db5bb5d51e29c310fca957c3228e2af0..97c3a12bb028ccf518c09da862a02846eca049f4 100644 --- a/crates/gpui/src/platform/windows/events.rs +++ b/crates/gpui/src/platform/windows/events.rs @@ -586,30 +586,32 @@ impl WindowsWindowInner { } fn handle_ime_position(&self, handle: HWND) -> Option { + if let Some(caret_position) = self.retrieve_caret_position() { + self.update_ime_position(handle, caret_position); + } + Some(0) + } + + pub(crate) fn update_ime_position(&self, handle: HWND, caret_position: POINT) { unsafe { let ctx = ImmGetContext(handle); + if ctx.is_invalid() { + return; + } - let Some(caret_position) = self.retrieve_caret_position() else { - return Some(0); + let config = COMPOSITIONFORM { + dwStyle: CFS_POINT, + ptCurrentPos: caret_position, + ..Default::default() }; - { - let config = COMPOSITIONFORM { - dwStyle: CFS_POINT, - ptCurrentPos: caret_position, - ..Default::default() - }; - ImmSetCompositionWindow(ctx, &config as _).ok().log_err(); - } - { - let config = CANDIDATEFORM { - dwStyle: CFS_CANDIDATEPOS, - ptCurrentPos: caret_position, - ..Default::default() - }; - ImmSetCandidateWindow(ctx, &config as _).ok().log_err(); - } + ImmSetCompositionWindow(ctx, &config).ok().log_err(); + let config = CANDIDATEFORM { + dwStyle: CFS_CANDIDATEPOS, + ptCurrentPos: caret_position, + ..Default::default() + }; + ImmSetCandidateWindow(ctx, &config).ok().log_err(); ImmReleaseContext(handle, ctx).ok().log_err(); - Some(0) } } diff --git a/crates/gpui/src/platform/windows/window.rs b/crates/gpui/src/platform/windows/window.rs index e9da322f5327606d141517bdd246bac8e74f2d58..c7df193ad988ef289ad8ac4f96bca63b4ff30b9a 100644 --- a/crates/gpui/src/platform/windows/window.rs +++ b/crates/gpui/src/platform/windows/window.rs @@ -920,8 +920,15 @@ impl PlatformWindow for WindowsWindow { self.state.renderer.borrow().gpu_specs().log_err() } - fn update_ime_position(&self, _bounds: Bounds) { - // There is no such thing on Windows. + fn update_ime_position(&self, bounds: Bounds) { + let scale_factor = self.state.scale_factor.get(); + let caret_position = POINT { + x: (bounds.origin.x.0 * scale_factor) as i32, + y: (bounds.origin.y.0 * scale_factor) as i32 + + ((bounds.size.height.0 * scale_factor) as i32 / 2), + }; + + self.0.update_ime_position(self.0.hwnd, caret_position); } } diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index e63e83193912350341fd71018b4eb34e1d2dec24..872a5cb0428db29eccdbc3a692b56ede9a583f07 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1124,7 +1124,11 @@ impl Buffer { syntax_map, reparse: None, non_text_state_update_count: 0, - sync_parse_timeout: Some(Duration::from_millis(1)), + sync_parse_timeout: if cfg!(any(test, feature = "test-support")) { + Some(Duration::from_millis(10)) + } else { + Some(Duration::from_millis(1)) + }, parse_status: watch::channel(ParseStatus::Idle), autoindent_requests: Default::default(), wait_for_autoindent_txs: Default::default(),