Skip to content

Commit

Permalink
Use shared OpenBangla/Keyboard.conf file.
Browse files Browse the repository at this point in the history
  • Loading branch information
wengxt committed Mar 24, 2021
1 parent 7ddb526 commit 6a94c43
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 65 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ if (OS_LINUX)
endif()

if (ENABLE_FCITX)
find_package(Fcitx5Core REQUIRED)
find_package(Fcitx5Core 5.0.6 REQUIRED)
endif()
## Find zstd ##
pkg_check_modules(ZSTD REQUIRED libzstd)
Expand Down
3 changes: 3 additions & 0 deletions src/engine/fcitx/openbangla-addon.conf
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ Library=openbangla
Type=SharedLibrary
OnDemand=True
Configurable=True

[Dependencies]
0=core:5.0.6
112 changes: 81 additions & 31 deletions src/engine/fcitx/openbangla.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,12 @@
#include <fcitx/inputcontext.h>
#include <fcitx/inputcontextmanager.h>
#include <fcitx/inputpanel.h>
#include <fcntl.h>
#include <memory>

FCITX_DEFINE_LOG_CATEGORY(openbangla, "openbangla");
#define FCITX_OPENBANGLA_DEBUG() FCITX_LOGC(openbangla, Debug)

namespace fcitx {

class OpenBanglaState : public InputContextProperty {
Expand Down Expand Up @@ -77,7 +81,7 @@ class OpenBanglaState : public InputContextProperty {
} else {
auto txt = riti_suggestion_get_lonely_suggestion(suggestion_.get());
text = txt;
// TODO: free txt
riti_string_free(txt);
}

Text preedit(std::move(text));
Expand Down Expand Up @@ -106,8 +110,8 @@ class OpenBanglaState : public InputContextProperty {
} else {
char *txt = riti_suggestion_get_lonely_suggestion(suggestion_.get());
text = txt;
// TODO: free txt.
ic_->commitString(text);
riti_string_free(txt);
riti_context_candidate_committed(ctx_.get(), 0);
reset();
}
Expand All @@ -123,18 +127,17 @@ class OpenBanglaState : public InputContextProperty {
if (aux && aux[0]) {
ic_->inputPanel().setAuxUp(Text(std::string(aux)));
}
// TODO: free aux
riti_string_free(aux);
auto candidateList = std::make_unique<CommonCandidateList>();
auto len = riti_suggestion_get_length(suggestion_.get());
char *const *suggestions =
riti_suggestion_get_suggestions(suggestion_.get());
char **suggestions = riti_suggestion_get_suggestions(suggestion_.get());
for (decltype(len) i = 0; i < len; i++) {
candidateList->append<OpenBanglaCandidate>(engine_, suggestions[i],
i);
}
// TODO: free suggestions
riti_string_array_free(suggestions, len);

candidateList->setLayoutHint(*engine_->config().candidateWinHorizontal
candidateList->setLayoutHint(engine_->candidateWinHorizontal()
? CandidateLayoutHint::Horizontal
: CandidateLayoutHint::Vertical);
auto index =
Expand Down Expand Up @@ -195,7 +198,7 @@ class OpenBanglaState : public InputContextProperty {
case FcitxKey_Return:
if (riti_context_ongoing_input_session(ctx)) {
commit();
if (*engine_->config().enterKeyClosesPrevWin) {
if (engine_->enterKeyClosesPrevWin()) {
keyEvent.filterAndAccept();
}
}
Expand All @@ -215,7 +218,7 @@ class OpenBanglaState : public InputContextProperty {
case FcitxKey_Right:
case FcitxKey_Left:
if (riti_context_ongoing_input_session(ctx)) {
if (*engine_->config().candidateWinHorizontal &&
if (engine_->candidateWinHorizontal() &&
!riti_suggestion_is_lonely(suggestion_.get()) && candidateList &&
candidateList->toCursorMovable()) {
if (key.sym() == FcitxKey_Right) {
Expand All @@ -235,7 +238,7 @@ class OpenBanglaState : public InputContextProperty {
case FcitxKey_Up:
case FcitxKey_Down:
if (riti_context_ongoing_input_session(ctx)) {
if (!*engine_->config().candidateWinHorizontal &&
if (!engine_->candidateWinHorizontal() &&
!riti_suggestion_is_lonely(suggestion_.get()) && candidateList &&
candidateList->toCursorMovable()) {
if (key.sym() == FcitxKey_Up) {
Expand Down Expand Up @@ -346,6 +349,10 @@ OpenBanglaEngine::OpenBanglaEngine(Instance *instance)

OpenBanglaEngine::~OpenBanglaEngine() {}

void OpenBanglaEngine::activate(const InputMethodEntry &, InputContextEvent &) {
reloadConfig();
}

void OpenBanglaEngine::keyEvent(const InputMethodEntry &, KeyEvent &keyEvent) {
auto ic = keyEvent.inputContext();
auto state = ic->propertyFor(&factory_);
Expand All @@ -358,31 +365,74 @@ void OpenBanglaEngine::reset(const InputMethodEntry &,
state->reset();
}

void OpenBanglaEngine::populateConfig() {
setenv("RITI_LAYOUT_FILE", config_.layoutPath->data(), 1);
setenv("RITI_PHONETIC_DATABASE_ON",
*config_.showCWPhonetic ? "true" : "false", 1);
bool booleanValue(const RawConfig &config, const std::string &path,
bool defaultValue) {
bool value = defaultValue;
if (auto *option = config.valueByPath(path)) {
value = *option == "true";
}
return value;
}

void OpenBanglaEngine::populateConfig(const RawConfig &config) {
// Keep sync with Settings.cpp
std::string layoutPath =
"/usr/share/openbangla-keyboard/layouts/avrophonetic.json";
if (auto *path = config.valueByPath("layout/path")) {
layoutPath = *path;
}
const bool showCWPhonetic =
booleanValue(config, "settings/CandidateWin\\Phonetic", true);
const bool includeEnglishPrevWin =
booleanValue(config, "settings/PreviewWin\\IncludeEnglishPhonetic", true);
const bool showPrevWinFixed =
booleanValue(config, "settings/FixedLayout\\ShowPrevWin", true);
const bool autoVowelFormFixed =
booleanValue(config, "settings/ixedLayout\\AutoVowelForm", true);
const bool autoChandraPosFixed =
booleanValue(config, "settings/FixedLayout\\AutoChandraPos", true);
const bool traditionalKarFixed =
booleanValue(config, "settings/FixedLayout\\TraditionalKar", false);
const bool oldReph =
booleanValue(config, "settings/FixedLayout\\OldReph", true);
const bool numberPadFixed =
booleanValue(config, "settings/FixedLayout\\NumberPad", true);
setenv("RITI_LAYOUT_FILE", layoutPath.data(), 1);
setenv("RITI_PHONETIC_DATABASE_ON", showCWPhonetic ? "true" : "false", 1);
setenv("RITI_PHONETIC_INCLUDE_ENGLISH",
*config_.includeEnglishPrevWin ? "true" : "false", 1);
setenv("RITI_DATABASE_DIR", config_.databasePath->data(), 1);
setenv("RITI_LAYOUT_FIXED_DATABASE_ON",
*config_.showPrevWinFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_VOWEL",
*config_.autoVowelFormFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_CHANDRA",
*config_.autoChandraPosFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_KAR",
*config_.traditionalKarFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_OLD_REPH", *config_.oldReph ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_NUMBERPAD",
*config_.numberPadFixed ? "true" : "false", 1);
includeEnglishPrevWin ? "true" : "false", 1);
setenv("RITI_DATABASE_DIR", "/usr/share/openbangla-keyboard/data", 1);
setenv("RITI_LAYOUT_FIXED_DATABASE_ON", showPrevWinFixed ? "true" : "false",
1);
setenv("RITI_LAYOUT_FIXED_VOWEL", autoVowelFormFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_CHANDRA", autoChandraPosFixed ? "true" : "false",
1);
setenv("RITI_LAYOUT_FIXED_KAR", traditionalKarFixed ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_OLD_REPH", oldReph ? "true" : "false", 1);
setenv("RITI_LAYOUT_FIXED_NUMBERPAD", numberPadFixed ? "true" : "false", 1);
candidateWinHorizontal_ =
booleanValue(config, "settings/CandidateWin\\Horizontal", true);
enterKeyClosesPrevWin_ =
booleanValue(config, "settings/EnterKeyClosesPrevWin", false);
}

void OpenBanglaEngine::reloadConfig() {
readAsIni(config_, "conf/openbangla.conf");
populateConfig();
auto time = StandardPath::global().timestamp(StandardPath::Type::Config,
"OpenBangla/Keyboard.conf");
if (time < lastConfigTimestamp_) {
return;
}

RawConfig config;
auto configFile = StandardPath::global().open(
StandardPath::Type::Config, "OpenBangla/Keyboard.conf", O_RDONLY);
if (configFile.isValid()) {
FCITX_OPENBANGLA_DEBUG() << "Reload openbangla configuration";
lastConfigTimestamp_ = time;
readFromIni(config, configFile.fd());
}
populateConfig(config);
}

FCITX_ADDON_FACTORY(OpenBanglaFactory);
} // namespace fcitx

FCITX_ADDON_FACTORY(fcitx::OpenBanglaFactory);
46 changes: 14 additions & 32 deletions src/engine/fcitx/openbangla.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,62 +27,44 @@
#include <fcitx/inputcontextproperty.h>
#include <fcitx/inputmethodengine.h>
#include <fcitx/instance.h>
#include <limits>

namespace fcitx {

class OpenBanglaState;

FCITX_CONFIGURATION(
OpenBanglaConfig,
Option<bool> enterKeyClosesPrevWin{this, "enterKeyClosesPrevWin",
"enterKeyClosesPrevWin", false};
Option<bool> candidateWinHorizontal{this, "CandidateWinHorizontal",
"CandidateWinHorizontal", true};
Option<std::string> layoutPath{
this, "LayoutPath", "LayoutPath",
"/usr/share/openbangla-keyboard/layouts/avrophonetic.json"};
Option<bool> showCWPhonetic{this, "ShowCWPhonetic", "ShowCWPhonetic", true};
Option<bool> includeEnglishPrevWin{this, "IncludeEnglishPrevWin",
"IncludeEnglishPrevWin", true};
Option<std::string> databasePath{this, "databasePath", "DatabasePath",
"/usr/share/openbangla-keyboard/data"};
Option<bool> showPrevWinFixed{this, "ShowPrevWinFixed", "ShowPrevWinFixed",
true};
Option<bool> autoVowelFormFixed{this, "AutoVowelFormFixed",
"AutoVowelFormFixed", true};
Option<bool> autoChandraPosFixed{this, "AutoChandraPosFixed",
"AutoChandraPosFixed", true};
Option<bool> traditionalKarFixed{this, "TraditionalKarFixed",
"TraditionalKarFixed", false};
Option<bool> oldReph{this, "OldReph", "OldReph", true};
Option<bool> numberPadFixed{this, "NumberPadFixed", "NumberPadFixed",
true};);
FCITX_CONFIGURATION(OpenBanglaConfig,
ExternalOption config{this, "OpenBanglaKeyboard",
_("OpenBangla Keyboard"),
PROJECT_DATADIR "/openbangla-gui"};);

class OpenBanglaEngine final : public InputMethodEngine {
public:
OpenBanglaEngine(Instance *instance);
~OpenBanglaEngine();

void activate(const fcitx::InputMethodEntry &,
fcitx::InputContextEvent &) override;
void keyEvent(const InputMethodEntry &entry, KeyEvent &keyEvent) override;
void reset(const InputMethodEntry &entry, InputContextEvent &event) override;

const auto &config() const { return config_; }
auto *factory() { return &factory_; }
void reloadConfig() override;

const Configuration *getConfig() const override { return &config_; }
void setConfig(const RawConfig &config) override {
config_.load(config, true);
safeSaveAsIni(config_, "conf/openbangla.conf");
populateConfig();
}

auto candidateWinHorizontal() const { return candidateWinHorizontal_; }
auto enterKeyClosesPrevWin() const { return enterKeyClosesPrevWin_; }

private:
void populateConfig();
void populateConfig(const RawConfig &config);

Instance *instance_;
OpenBanglaConfig config_;
FactoryFor<OpenBanglaState> factory_;
int64_t lastConfigTimestamp_ = std::numeric_limits<int64_t>::min();
bool candidateWinHorizontal_ = true;
bool enterKeyClosesPrevWin_ = false;
};

class OpenBanglaFactory : public AddonFactory {
Expand Down
2 changes: 1 addition & 1 deletion src/engine/riti
Submodule riti updated 2 files
+146 −139 include/riti.h
+38 −3 src/ffi.rs

0 comments on commit 6a94c43

Please sign in to comment.