From 23801db2c4124f3831f3ad058a292ac59fcfcb49 Mon Sep 17 00:00:00 2001 From: liangfx Date: Mon, 5 Feb 2024 11:49:57 +0800 Subject: [PATCH] feat: new when for key_binder, ascii_mode & !ascii_mode; --- src/rime/gear/key_binder.cc | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/rime/gear/key_binder.cc b/src/rime/gear/key_binder.cc index 0d8e2f1a67..efa926296a 100644 --- a/src/rime/gear/key_binder.cc +++ b/src/rime/gear/key_binder.cc @@ -22,6 +22,8 @@ namespace rime { enum KeyBindingCondition { kNever, + kWhenAscii, + kWhenNotAscii, kWhenPredicting, // showing prediction candidates kWhenPaging, // user has changed page kWhenHasMenu, // at least one candidate @@ -33,6 +35,8 @@ static struct KeyBindingConditionDef { KeyBindingCondition condition; const char* name; } condition_definitions[] = {{kWhenPredicting, "predicting"}, + {kWhenAscii, "ascii_mode"}, + {kWhenNotAscii, "!ascii_mode"}, {kWhenPaging, "paging"}, {kWhenHasMenu, "has_menu"}, {kWhenComposing, "composing"}, @@ -160,6 +164,15 @@ static void select_schema(Engine* engine, const string& schema) { } } +static void ascii_send(Engine* engine, const int ch) { + if (!engine) + return; + Context* ctx = engine->context(); + ctx->PushInput(ch); + ctx->ClearNonConfirmedComposition(); + ctx->Commit(); +} + void KeyBindings::LoadBindings(const an& bindings) { if (!bindings) return; @@ -186,7 +199,10 @@ void KeyBindings::LoadBindings(const an& bindings) { if (auto target = map->GetValue("send")) { KeyEvent key; if (key.Parse(target->str())) { - binding.target.push_back(std::move(key)); + if (whence->str() != "ascii_mode") + binding.target.push_back(std::move(key)); + else + binding.action = std::bind(&ascii_send, _1, key.keycode()); } else { LOG(WARNING) << "invalid key binding #" << i << "."; continue; @@ -239,6 +255,11 @@ KeyBindingConditions::KeyBindingConditions(Context* ctx) { insert(kWhenComposing); } + if (ctx->get_option("ascii_mode")) + insert(kWhenAscii); + else + insert(kWhenNotAscii); + if (ctx->HasMenu() && !ctx->get_option("ascii_mode")) { insert(kWhenHasMenu); }