diff --git a/include/ghostty.h b/include/ghostty.h index e6e625c4b..29da8f37b 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -748,7 +748,6 @@ void ghostty_surface_complete_clipboard_request(ghostty_surface_t, bool); bool ghostty_surface_has_selection(ghostty_surface_t); uintptr_t ghostty_surface_selection(ghostty_surface_t, char*, uintptr_t); -void ghostty_surface_clear_selection(ghostty_surface_t); #ifdef __APPLE__ void ghostty_surface_set_display_id(ghostty_surface_t, uint32_t); diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 362547e9e..14143313e 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1293,11 +1293,6 @@ extension Ghostty.SurfaceView: NSTextInputClient { } func setMarkedText(_ string: Any, selectedRange: NSRange, replacementRange: NSRange) { - // Clear selection when IME input starts - if let surface = self.surface, ghostty_surface_has_selection(surface) { - ghostty_surface_clear_selection(surface) - } - switch string { case let v as NSAttributedString: self.markedText = NSMutableAttributedString(attributedString: v) diff --git a/macos/Sources/Helpers/NSPasteboard+Extension.swift b/macos/Sources/Helpers/NSPasteboard+Extension.swift index 7794946f4..c2801da74 100644 --- a/macos/Sources/Helpers/NSPasteboard+Extension.swift +++ b/macos/Sources/Helpers/NSPasteboard+Extension.swift @@ -18,6 +18,7 @@ extension NSPasteboard { return path } } + return self.string(forType: .string) } diff --git a/src/Surface.zig b/src/Surface.zig index d018d396d..4682f4fb5 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -1591,6 +1591,15 @@ pub fn preeditCallback(self: *Surface, preedit_: ?[]const u8) !void { self.renderer_state.mutex.lock(); defer self.renderer_state.mutex.unlock(); + // We clear our selection when ANY OF: + // 1. We have an existing preedit + // 2. We have preedit text + if (self.renderer_state.preedit != null or + preedit_ != null) + { + self.setSelection(null) catch {}; + } + // We always clear our prior preedit if (self.renderer_state.preedit) |p| { self.alloc.free(p.codepoints); diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 441d10f59..44c4c5f20 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -1550,11 +1550,6 @@ pub const CAPI = struct { return selection.len; } - /// Clear the current selection in the surface. - export fn ghostty_surface_clear_selection(surface: *Surface) void { - surface.core_surface.io.terminal.screen.clearSelection(); - } - /// Tell the surface that it needs to schedule a render export fn ghostty_surface_refresh(surface: *Surface) void { surface.refresh();