Korean commits a syllable as the next one begins, so by the time the 한자 key is pressed only the last syllable is still ours: typing 한자 and then Ctrl+H asked about 자 alone and answered 子, leaving 한子 in the document -- the mixed Hangul and Hanja that was refused as dictionary data, made by the interaction instead. To get 漢字 the key had to be pressed before typing, which no other Korean input method asks for. A request now carries the client's own text just before the cursor, and the reading reaches back through it as far as the dictionary still knows the whole of it: 한 joins 자 and 대한민 joins 국. Nothing but the dictionary says where to stop, because a reading is syllables, so a key holding a space or an already converted Hanja leads nowhere and the reach ends there. A pick answers with the count of runes to take back first; Escape gives back only what was pending, and a query with no candidate types only the part the client lacks. A frontend that sends no surrounding text reaches back by nothing and behaves exactly as before, which is what XIM will keep doing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
133 lines
4.8 KiB
C
133 lines
4.8 KiB
C
/* Included after dat.h and fn.h (or after the source under test). */
|
|
#include "cutest/cutest.h"
|
|
|
|
/*
|
|
* A test's stand-in for imthread: handles engine requests from keyc,
|
|
* tracing each one first. Requests whose op is holdop (every request
|
|
* when holdop is Pumpall) wait on go before the engine sees them.
|
|
*/
|
|
typedef struct Pump Pump;
|
|
struct Pump
|
|
{
|
|
Channel *trace;
|
|
Channel *go;
|
|
Channel *stop;
|
|
Channel *done;
|
|
int holdop;
|
|
int active;
|
|
};
|
|
|
|
enum
|
|
{
|
|
Pumpnone = -1,
|
|
Pumpall = -2,
|
|
};
|
|
|
|
Str mkstr(char*);
|
|
int checkstr(struct ct*, char*, char*, Str*);
|
|
void checkenginepreedit(struct ct*, char*);
|
|
void pumpstart(Pump*, int);
|
|
void pumphold(Pump*, int);
|
|
void pumpstop(Pump*);
|
|
|
|
/* Engine internals reached through engine_test.c. */
|
|
void testengineinit(int);
|
|
void testenginehandle(Keyreq*);
|
|
void* testengineowner(void);
|
|
void testenginepreedit(Str*);
|
|
void testenginecaret(Caret*);
|
|
|
|
void str_init_utf8(struct ct*);
|
|
void str_edit_and_alias(struct ct*);
|
|
void str_utf8_capacity(struct ct*);
|
|
void str_invalid_and_full_appends(struct ct*);
|
|
void trie_exact_prefix_and_duplicate(struct ct*);
|
|
void trie_put_and_unloaded(struct ct*);
|
|
void popup_layout(struct ct*);
|
|
void font_render(struct ct*);
|
|
void production_maps_load(struct ct*);
|
|
void transmap_states(struct ct*);
|
|
void korean_sequences(struct ct*);
|
|
void korean_compound_vowels(struct ct*);
|
|
void korean_compound_finals(struct ct*);
|
|
void korean_backspace(struct ct*);
|
|
void vietnamese_transitions(struct ct*);
|
|
void vietnamese_backspace(struct ct*);
|
|
void vietnamese_state_lifetime(struct ct*);
|
|
void engine_clears_candidates(struct ct*);
|
|
void engine_backspace_clears_candidates(struct ct*);
|
|
void engine_selects_visible_candidate(struct ct*);
|
|
void engine_candidate_shortcut_modifiers(struct ct*);
|
|
void engine_candidate_page_metadata(struct ct*);
|
|
void engine_candidate_page_snapshots(struct ct*);
|
|
void engine_candidate_page_movement(struct ct*);
|
|
void engine_candidate_completion(struct ct*);
|
|
void engine_active_owner_lifecycle(struct ct*);
|
|
void engine_active_owner_reset(struct ct*);
|
|
void engine_active_owner_caret(struct ct*);
|
|
void engine_popup_preedit_capability(struct ct*);
|
|
void engine_vietnamese_client_preedit(struct ct*);
|
|
void engine_commit_contract(struct ct*);
|
|
void engine_language_switch_state(struct ct*);
|
|
void engine_telex_history_bound(struct ct*);
|
|
void engine_korean_modifiers_and_backspace(struct ct*);
|
|
void engine_direct_language_modes(struct ct*);
|
|
void engine_japanese_readings(struct ct*);
|
|
void engine_japanese_candidates(struct ct*);
|
|
void engine_japanese_backspace_and_boundaries(struct ct*);
|
|
void engine_katakana_sequences(struct ct*);
|
|
void engine_emoji_single_candidate(struct ct*);
|
|
void engine_emoji_queries(struct ct*);
|
|
void engine_emoji_japanese_and_multirune(struct ct*);
|
|
void engine_emoji_digit_aliases(struct ct*);
|
|
void engine_emoji_navigation(struct ct*);
|
|
void engine_search_candidate_keys(struct ct*);
|
|
void engine_emoji_preedit_languages(struct ct*);
|
|
void engine_emoji_start_and_unknown(struct ct*);
|
|
void engine_hanja_search(struct ct*);
|
|
void engine_hanja_unknown_and_cancel(struct ct*);
|
|
void engine_hanja_reaches_back(struct ct*);
|
|
void engine_hanja_word_prefix(struct ct*);
|
|
void engine_hanja_korean_keys(struct ct*);
|
|
void engine_hanja_backspace(struct ct*);
|
|
void engine_hanja_input_languages(struct ct*);
|
|
void engine_randomized_stress(struct ct*);
|
|
void engine_full_boundary_passthrough(struct ct*);
|
|
void dictionary_candidates(struct ct*);
|
|
void dictionary_misses(struct ct*);
|
|
void dictionary_prefix(struct ct*);
|
|
void ipc_masks_modifiers(struct ct*);
|
|
void ipc_control_and_caret_frames(struct ct*);
|
|
void ipc_runtime_path(struct ct*);
|
|
void ipc_response_pack_boundaries(struct ct*);
|
|
void ipc_response_empty_and_preedit(struct ct*);
|
|
void ipc_response_max_and_drain(struct ct*);
|
|
void ipc_response_fragmented_and_truncated(struct ct*);
|
|
void ipc_broken_peer_send(struct ct*);
|
|
void server_connection_ownership(struct ct*);
|
|
void server_extension_stream(struct ct*);
|
|
void server_rejects_unknown_extension(struct ct*);
|
|
void ibus_machine_id_fallback(struct ct*);
|
|
void ibus_capability_policy(struct ct*);
|
|
void ibus_private_input_policy(struct ct*);
|
|
void ibus_context_lifecycle(struct ct*);
|
|
void ibus_active_release_lifecycle(struct ct*);
|
|
void compose_sequences(struct ct*);
|
|
void xim_keymap_lookup(struct ct*);
|
|
void xim_compound_text(struct ct*);
|
|
void xim_adapter_key_contract(struct ct*);
|
|
void xim_adapter_release_lifecycle(struct ct*);
|
|
void xim_adapter_free_waits_for_release(struct ct*);
|
|
void xim_adapter_styles(struct ct*);
|
|
void xim_adapter_placement(struct ct*);
|
|
void xim_adapter_placement_updates(struct ct*);
|
|
void xim_adapter_callback_replacement(struct ct*);
|
|
void xim_adapter_callback_unicode(struct ct*);
|
|
void xim_adapter_callback_cleanup(struct ct*);
|
|
void xim_adapter_callback_transfer(struct ct*);
|
|
void xim_adapter_callback_owner_loss(struct ct*);
|
|
void xim_adapter_commit_encoding(struct ct*);
|
|
void wl_modifier_mask(struct ct*);
|
|
void wl_forwarded_keys(struct ct*);
|
|
void wl_repeat_ends(struct ct*);
|