From ed0a6448c6fcb38ce1b36e49345df343c4174596 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Mon, 16 Dec 2013 12:55:13 +0900 Subject: [PATCH] Report cursor width when editing input --- libkkc/context.vala | 9 +++++++++ libkkc/state.vala | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libkkc/context.vala b/libkkc/context.vala index 98bfed6..69db253 100644 --- a/libkkc/context.vala +++ b/libkkc/context.vala @@ -70,6 +70,15 @@ namespace Kkc { } } + /** + * Current cursor width in input string. + */ + public uint input_cursor_width { + get { + return state.input_cursor_width; + } + } + State state; Gee.Map handlers = new HashMap (); diff --git a/libkkc/state.vala b/libkkc/state.vala index 4014a89..9d47321 100644 --- a/libkkc/state.vala +++ b/libkkc/state.vala @@ -109,10 +109,42 @@ namespace Kkc { internal int input_characters_cursor_pos = -1; internal int input_cursor_pos { + get { + if (input_characters_cursor_pos >= 0) { + var index = 0; + var offset = 0; + for (; index < input_characters_cursor_pos; index++) { + offset += input_characters[index].output.char_count (); + } + // Hack for Kana typing rule: add the length of + // unfinished Kana input. Suppose the following + // input when moving cursor in the initial state: + // + // F|F|FFFFF (F = finished characters, | = cursor) + // + // If user types a finished character (e.g. A, I): + // + // FX|F|FFFFF + // + // On the other hand, if user types an unfinished + // character (e.g. KA, CHI, which may be followed + // by sonant marks): + // + // F|X|FFFFFF + // + // For consistency, move the cursor by the width + // of the unfisnished character. + offset += rom_kana_converter.pending_output.char_count (); + return offset; + } + return input_characters_cursor_pos; + } + } + + internal uint input_cursor_width { get { if (input_characters_cursor_pos >= 0) - return input_characters_cursor_pos + - rom_kana_converter.pending_output.char_count (); + return input_characters[input_characters_cursor_pos].output.char_count (); return input_characters_cursor_pos; } }