Skip to content

Commit f193b28

Browse files
committed
Refactor JNI InputMethodStatus
1 parent 6e22d34 commit f193b28

File tree

3 files changed

+57
-48
lines changed

3 files changed

+57
-48
lines changed

app/src/main/cpp/helper-types.h

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,35 @@
77

88
class InputMethodStatus {
99
public:
10-
const fcitx::InputMethodEntry *entry;
10+
// fcitx::InputMethodEntry
11+
std::string uniqueName;
12+
std::string name;
13+
std::string nativeName;
14+
std::string icon;
15+
std::string label;
16+
std::string languageCode;
17+
std::string addon;
18+
bool configurable = false;
19+
// fcitx::InputMethodEngine
1120
std::string subMode;
1221
std::string subModeLabel;
1322
std::string subModeIcon;
1423

1524
InputMethodStatus(const fcitx::InputMethodEntry *entry,
1625
fcitx::InputMethodEngine *engine,
17-
fcitx::InputContext *ic)
18-
: entry(entry) {
19-
if (engine) {
20-
subMode = engine->subMode(*entry, *ic);
21-
subModeLabel = engine->subModeLabel(*entry, *ic);
22-
subModeIcon = engine->subModeIcon(*entry, *ic);
23-
}
26+
fcitx::InputContext *ic) {
27+
uniqueName = entry->uniqueName();
28+
name = entry->name();
29+
nativeName = entry->nativeName();
30+
icon = entry->icon();
31+
label = entry->label();
32+
languageCode = entry->languageCode();
33+
addon = entry->addon();
34+
configurable = entry->isConfigurable();
35+
subMode = engine->subMode(*entry, *ic);
36+
subModeLabel = engine->subModeLabel(*entry, *ic);
37+
subModeIcon = engine->subModeIcon(*entry, *ic);
2438
}
25-
26-
InputMethodStatus(const fcitx::InputMethodEntry *entry)
27-
: entry(entry) {}
2839
};
2940

3041
class AddonStatus {

app/src/main/cpp/native-lib.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,12 @@ class Fcitx {
142142
return entries;
143143
}
144144

145-
InputMethodStatus inputMethodStatus() {
145+
std::unique_ptr<InputMethodStatus> inputMethodStatus() {
146146
auto *ic = p_frontend->call<fcitx::IAndroidFrontend::activeInputContext>();
147-
auto *engine = p_instance->inputMethodEngine(ic);
148-
const auto *entry = p_instance->inputMethodEntry(ic);
149-
if (engine) {
150-
return {entry, engine, ic};
151-
}
152-
return {entry};
147+
if (!ic) return nullptr;
148+
auto *entry = p_instance->inputMethodEntry(ic);
149+
auto *engine = static_cast<fcitx::InputMethodEngine *>(p_instance->addonManager().addon(entry->addon(), true));
150+
return std::make_unique<InputMethodStatus>(entry, engine, ic);
153151
}
154152

155153
void setInputMethod(const std::string &ime) {
@@ -282,9 +280,9 @@ class Fcitx {
282280
auto &globalConfig = p_instance->globalConfig();
283281
auto &addonManager = p_instance->addonManager();
284282
const auto &enabledAddons = globalConfig.enabledAddons();
285-
std::unordered_set<std::string> enabledSet(enabledAddons.begin(), enabledAddons.end());
283+
const std::unordered_set<std::string> enabledSet(enabledAddons.begin(), enabledAddons.end());
286284
const auto &disabledAddons = globalConfig.disabledAddons();
287-
std::unordered_set<std::string>
285+
const std::unordered_set<std::string>
288286
disabledSet(disabledAddons.begin(), disabledAddons.end());
289287
std::vector<AddonStatus> addons;
290288
for (const auto category: {fcitx::AddonCategory::InputMethod,
@@ -304,7 +302,7 @@ class Fcitx {
304302
} else if (enabledSet.count(info->uniqueName())) {
305303
enabled = true;
306304
}
307-
addons.emplace_back(AddonStatus(info, enabled));
305+
addons.emplace_back(info, enabled);
308306
}
309307
}
310308
return addons;
@@ -390,7 +388,7 @@ class Fcitx {
390388
fcitx::StatusGroup::InputMethod,
391389
fcitx::StatusGroup::AfterInputMethod}) {
392390
for (auto act: ic->statusArea().actions(group)) {
393-
actions.emplace_back(ActionEntity(act, ic));
391+
actions.emplace_back(act, ic);
394392
}
395393
}
396394
return actions;
@@ -484,33 +482,33 @@ Java_org_fcitx_fcitx5_android_core_Fcitx_startupFcitx(JNIEnv *env, jclass clazz,
484482
}
485483
FCITX_INFO() << "Starting...";
486484

487-
setenv("SKIP_FCITX_PATH", "true", 1);
488-
489485
auto locale_ = CString(env, locale);
490486
auto appData_ = CString(env, appData);
491487
auto appLib_ = CString(env, appLib);
492488
auto extData_ = CString(env, extData);
493489
auto extCache_ = CString(env, extCache);
494490

495-
std::string lang_ = fcitx::stringutils::split(*locale_, ":")[0];
496-
std::string config_home = fcitx::stringutils::joinPath(*extData_, "config");
497-
std::string data_home = fcitx::stringutils::joinPath(*extData_, "data");
498-
std::string usr_share = fcitx::stringutils::joinPath(*appData_, "usr", "share");
499-
std::string locale_dir = fcitx::stringutils::joinPath(usr_share, "locale");
500-
std::string libime_data = fcitx::stringutils::joinPath(usr_share, "libime");
501-
std::string lua_path = fcitx::stringutils::concat(
491+
const std::string lang_ = fcitx::stringutils::split(*locale_, ":")[0];
492+
const std::string config_home = fcitx::stringutils::joinPath(*extData_, "config");
493+
const std::string data_home = fcitx::stringutils::joinPath(*extData_, "data");
494+
const std::string usr_share = fcitx::stringutils::joinPath(*appData_, "usr", "share");
495+
const std::string locale_dir = fcitx::stringutils::joinPath(usr_share, "locale");
496+
const std::string libime_data = fcitx::stringutils::joinPath(usr_share, "libime");
497+
const std::string lua_path = fcitx::stringutils::concat(
502498
fcitx::stringutils::joinPath(data_home, "lua", "?.lua"), ";",
503499
fcitx::stringutils::joinPath(data_home, "lua", "?", "init.lua"), ";",
504500
fcitx::stringutils::joinPath(usr_share, "lua", "5.4", "?.lua"), ";",
505501
fcitx::stringutils::joinPath(usr_share, "lua", "5.4", "?", "init.lua"), ";",
506502
";" // double semicolon, for default path defined in luaconf.h
507503
);
508-
std::string lua_cpath = fcitx::stringutils::concat(
504+
const std::string lua_cpath = fcitx::stringutils::concat(
509505
fcitx::stringutils::joinPath(data_home, "lua", "?.so"), ";",
510506
fcitx::stringutils::joinPath(usr_share, "lua", "5.4", "?.so"), ";",
511507
";"
512508
);
513509

510+
// prevent StandardPath from resolving it's hardcoded installation path
511+
setenv("SKIP_FCITX_PATH", "1", 1);
514512
// for fcitx default profile [DefaultInputMethod]
515513
setenv("LANG", lang_.c_str(), 1);
516514
// for libintl-lite loading gettext .mo translations
@@ -545,7 +543,7 @@ Java_org_fcitx_fcitx5_android_core_Fcitx_startupFcitx(JNIEnv *env, jclass clazz,
545543
fcitx::registerDomain("fcitx5-chinese-addons", locale_dir_char);
546544
fcitx::registerDomain("fcitx5-android", locale_dir_char);
547545

548-
int extDomainsSize = env->GetArrayLength(extDomains);
546+
const int extDomainsSize = env->GetArrayLength(extDomains);
549547
for (int i = 0; i < extDomainsSize; i++) {
550548
auto domain = JRef<jstring>(env, env->GetObjectArrayElement(extDomains, i));
551549
fcitx::registerDomain(CString(env, domain), locale_dir_char);
@@ -604,8 +602,9 @@ Java_org_fcitx_fcitx5_android_core_Fcitx_startupFcitx(JNIEnv *env, jclass clazz,
604602
auto imChangeCallback = []() {
605603
auto env = GlobalRef->AttachEnv();
606604
auto vararg = JRef<jobjectArray>(env, env->NewObjectArray(1, GlobalRef->Object, nullptr));
607-
const auto status = Fcitx::Instance().inputMethodStatus();
608-
auto obj = JRef(env, fcitxInputMethodStatusToJObject(env, status));
605+
std::unique_ptr<InputMethodStatus> status = Fcitx::Instance().inputMethodStatus();
606+
if (!status) return;
607+
auto obj = JRef(env, fcitxInputMethodStatusToJObject(env, *status));
609608
env->SetObjectArrayElement(vararg, 0, obj);
610609
env->CallStaticVoidMethod(GlobalRef->Fcitx, GlobalRef->HandleFcitxEvent, 6, *vararg);
611610
};
@@ -684,8 +683,8 @@ extern "C"
684683
JNIEXPORT void JNICALL
685684
Java_org_fcitx_fcitx5_android_core_Fcitx_sendKeyToFcitxChar(JNIEnv *env, jclass clazz, jchar c, jint state, jboolean up, jint timestamp) {
686685
RETURN_IF_NOT_RUNNING
687-
fcitx::Key parsedKey{fcitx::Key::keySymFromString((const char *) &c),
688-
fcitx::KeyStates(static_cast<uint32_t>(state))};
686+
const fcitx::Key parsedKey{fcitx::Key::keySymFromString(reinterpret_cast<const char *>(&c)),
687+
fcitx::KeyStates(static_cast<uint32_t>(state))};
689688
Fcitx::Instance().sendKey(parsedKey, up, timestamp);
690689
}
691690

@@ -753,8 +752,9 @@ extern "C"
753752
JNIEXPORT jobject JNICALL
754753
Java_org_fcitx_fcitx5_android_core_Fcitx_inputMethodStatus(JNIEnv *env, jclass clazz) {
755754
RETURN_VALUE_IF_NOT_RUNNING(nullptr)
756-
const auto &status = Fcitx::Instance().inputMethodStatus();
757-
return fcitxInputMethodStatusToJObject(env, status);
755+
auto status = Fcitx::Instance().inputMethodStatus();
756+
if (!status) return nullptr;
757+
return fcitxInputMethodStatusToJObject(env, *status);
758758
}
759759

760760
extern "C"

app/src/main/cpp/object-conversion.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,14 @@ jobjectArray fcitxInputMethodEntriesToJObjectArray(JNIEnv *env, const std::vecto
3131
}
3232

3333
jobject fcitxInputMethodStatusToJObject(JNIEnv *env, const InputMethodStatus &status) {
34-
const auto entry = status.entry;
35-
if (status.subMode.empty()) return fcitxInputMethodEntryToJObject(env, entry);
3634
return env->NewObject(GlobalRef->InputMethodEntry, GlobalRef->InputMethodEntryInitWithSubMode,
37-
*JString(env, entry->uniqueName()),
38-
*JString(env, entry->name()),
39-
*JString(env, entry->icon()),
40-
*JString(env, entry->nativeName()),
41-
*JString(env, entry->label()),
42-
*JString(env, entry->languageCode()),
43-
entry->isConfigurable(),
35+
*JString(env, status.uniqueName),
36+
*JString(env, status.name),
37+
*JString(env, status.icon),
38+
*JString(env, status.nativeName),
39+
*JString(env, status.label),
40+
*JString(env, status.languageCode),
41+
status.configurable,
4442
*JString(env, status.subMode),
4543
*JString(env, status.subModeLabel),
4644
*JString(env, status.subModeIcon)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy