Merge pull request #995 from mitchellh/macos-preedit-bs

macos: if a preedit state is cleared, don't send key event
This commit is contained in:
Mitchell Hashimoto
2023-12-06 09:06:12 -08:00
committed by GitHub
2 changed files with 17 additions and 4 deletions

View File

@ -781,14 +781,19 @@ extension Ghostty {
) ?? event
}
let action = event.isARepeat ? GHOSTTY_ACTION_REPEAT : GHOSTTY_ACTION_PRESS
// By setting this to non-nil, we note that we'rein a keyDown event. From here,
// we call interpretKeyEvents so that we can handle complex input such as Korean
// language.
keyTextAccumulator = []
defer { keyTextAccumulator = nil }
self.interpretKeyEvents([translationEvent])
let action = event.isARepeat ? GHOSTTY_ACTION_REPEAT : GHOSTTY_ACTION_PRESS
// We need to know what the length of marked text was before this event to
// know if these events cleared it.
let markedTextBefore = markedText.length > 0
self.interpretKeyEvents([translationEvent])
// If we have text, then we've composed a character, send that down. We do this
// first because if we completed a preedit, the text will be available here
@ -802,7 +807,10 @@ extension Ghostty {
}
// If we have marked text, we're in a preedit state. Send that down.
if (markedText.length > 0) {
// If we don't have marked text but we had marked text before, then the preedit
// was cleared so we want to send down an empty string to ensure we've cleared
// the preedit.
if (markedText.length > 0 || markedTextBefore) {
handled = true
keyAction(action, event: event, preedit: markedText.string)
}

View File

@ -1085,6 +1085,8 @@ fn resize(self: *Surface, size: renderer.ScreenSize) !void {
///
/// The preedit input must be UTF-8 encoded.
pub fn preeditCallback(self: *Surface, preedit_: ?[]const u8) !void {
// log.debug("text preeditCallback value={any}", .{preedit_});
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
@ -1124,7 +1126,10 @@ pub fn preeditCallback(self: *Surface, preedit_: ?[]const u8) !void {
}
// If we have no codepoints, then we're done.
if (codepoints.items.len == 0) return;
if (codepoints.items.len == 0) {
try self.queueRender();
return;
}
self.renderer_state.preedit = .{
.codepoints = try codepoints.toOwnedSlice(self.alloc),