예제 #1
0
파일: action.cpp 프로젝트: fcitx/fcitx5
void Action::activate() {
    FCITX_D();
    if (!d->enabled_) {
        return;
    }
    emit<Action::Activated>();
}
예제 #2
0
void SurroundingText::invalidate() {
    FCITX_D();
    d->valid_ = false;
    d->anchor_ = 0;
    d->cursor_ = 0;
    d->text_ = std::string();
}
예제 #3
0
void InputMethodManager::save() {
    FCITX_D();
    InputMethodConfig config;
    std::vector<InputMethodGroupConfig> groups;
    config.currentGroup.setValue(d->currentGroup_);
    config.groupOrder.setValue(std::vector<std::string>{d->groupOrder_.begin(), d->groupOrder_.end()});

    for (auto &p : d->groups_) {
        auto &group = p.second;
        groups.emplace_back();
        auto &groupConfig = groups.back();
        groupConfig.name.setValue(group.name());
        groupConfig.defaultLayout.setValue(group.defaultLayout());
        groupConfig.defaultInputMethod.setValue(group.defaultInputMethod());
        std::vector<InputMethodGroupItemConfig> itemsConfig;
        for (auto &item : group.inputMethodList()) {
            itemsConfig.emplace_back();
            auto &itemConfig = itemsConfig.back();
            itemConfig.name.setValue(item.name());
            itemConfig.layout.setValue(item.layout());
        }

        groupConfig.items.setValue(std::move(itemsConfig));
    }
    config.groups.setValue(std::move(groups));

    RawConfig rawConfig;
    config.save(rawConfig);
    auto file = StandardPath::global().openUserTemp(StandardPath::Type::Config, "fcitx5/profile");
    if (file.fd() >= 0) {
        writeAsIni(rawConfig, file.fd());
    }
}
예제 #4
0
void SurroundingText::setText(const std::string &text, unsigned int cursor, unsigned int anchor) {
    FCITX_D();
    d->valid_ = true;
    d->text_ = text;
    d->cursor_ = cursor;
    d->anchor_ = anchor;
}
예제 #5
0
파일: action.cpp 프로젝트: fcitx/fcitx5
void Action::setMenu(Menu *menu) {
    FCITX_D();
    if (menu) {
        menu->connect<DynamicTrackableObject::Destroyed>([this](void *) { setMenu(nullptr); });
    }
    d->menu_ = menu;
}
예제 #6
0
SignalBase *ConnectableObject::findSignal(const std::string &name) {
    FCITX_D();
    auto iter = d->signals_.find(name);
    if (iter != d->signals_.end()) {
        return iter->second.get();
    }
    return nullptr;
}
예제 #7
0
FocusGroup::~FocusGroup() {
    FCITX_D();
    while (!d->ics.empty()) {
        auto ic = *d->ics.begin();
        ic->setFocusGroup(nullptr);
    }
    d->manager.unregisterFocusGroup(*this);
}
예제 #8
0
void InputMethodManager::setInstance(Instance *instance) {
    FCITX_D();
    d->instance_ = instance;
    d->eventWatcher_.reset(
        d->instance_->watchEvent(EventType::InputContextKeyEvent, EventWatcherPhase::InputMethod, [this](Event &event) {
            FCITX_D();
            auto &keyEvent = static_cast<KeyEvent &>(event);
            auto entry = d->instance_->inputMethodEntry(keyEvent.inputContext());
            if (!entry) {
                return;
            }
            auto engine = static_cast<InputMethodEngine *>(d->instance_->addonManager().addon(entry->addon()));
            if (!engine) {
                return;
            }
            engine->keyEvent(*entry, keyEvent);
        }));
}
예제 #9
0
void FocusGroup::removeInputContext(InputContext *ic) {
    FCITX_D();
    if (ic == d->focus) {
        setFocusedInputContext(nullptr);
    }
    auto iter = d->ics.find(ic);
    assert(iter != d->ics.end());
    d->ics.erase(ic);
}
예제 #10
0
void FocusGroup::setFocusedInputContext(InputContext *ic) {
    FCITX_D();
    assert(!ic || d->ics.count(ic) > 0);
    if (d->focus) {
        d->focus->setHasFocus(false);
    }
    d->focus = ic;
    if (d->focus) {
        d->focus->setHasFocus(true);
    }
}
예제 #11
0
void InputMethodManager::setCurrentGroup(const std::string &groupName) {
    FCITX_D();
    if (std::any_of(d->groups_.begin(), d->groups_.end(),
                    [&groupName](const auto &group) { return group.second.name() == groupName; })) {
        d->currentGroup_ = groupName;
    } else {
        d->currentGroup_ = d->groups_.begin()->second.name();
    }
    // TODO Adjust group order
    // TODO, post event
}
예제 #12
0
void InputMethodManager::buildDefaultGroup() {
    FCITX_D();
    std::string name = _("Default");
    auto result = d->groups_.emplace(name, InputMethodGroup(name));
    auto &group = result.first->second;
    // FIXME
    group.inputMethodList().emplace_back(InputMethodGroupItem("fcitx-keyboard-us"));
    group.setDefaultInputMethod("");
    group.setDefaultLayout("us");
    setCurrentGroup(name);
    setGroupOrder({name});
}
예제 #13
0
void UserInterfaceManager::load() {
    FCITX_D();
    auto names = d->addonManager_->addonNames(AddonCategory::UI);

    // FIXME: implement fallback
    for (auto &name : names) {
        auto ui = d->addonManager_->addon(name);
        if (ui) {
            d->ui_ = ui;
            break;
        }
    }
}
예제 #14
0
void InputMethodManager::setGroupOrder(const std::vector<std::string> &groupOrder) {
    FCITX_D();
    d->groupOrder_.clear();
    std::unordered_set<std::string> added;
    for (auto &groupName : groupOrder) {
        if (d->groups_.count(groupName)) {
            d->groupOrder_.push_back(groupName);
            added.insert(groupName);
        }
    }
    for (auto &p : d->groups_) {
        if (!added.count(p.first)) {
            d->groupOrder_.push_back(p.first);
        }
    }
    assert(d->groupOrder_.size() == d->groups_.size());
}
예제 #15
0
void InputMethodManager::loadConfig() {
    FCITX_D();
    auto &path = StandardPath::global();
    auto file = path.open(StandardPath::Type::Config, "fcitx5/profile", O_RDONLY);
    RawConfig config;
    if (file.fd() >= 0) {
        readFromIni(config, file.fd());
    }
    InputMethodConfig imConfig;
    imConfig.load(config);

    d->groups_.clear();
    std::vector<std::string> tempOrder;
    if (imConfig.groups.value().size()) {
        auto &groupsConfig = imConfig.groups.value();
        for (auto &groupConfig : groupsConfig) {
            // group must have a name
            if (groupConfig.name.value().empty() || groupConfig.defaultLayout.value().empty()) {
                continue;
            }
            auto result = d->groups_.emplace(groupConfig.name.value(), InputMethodGroup(groupConfig.name.value()));
            tempOrder.push_back(groupConfig.name.value());
            auto &group = result.first->second;
            group.setDefaultLayout(groupConfig.defaultLayout.value());
            auto &items = groupConfig.items.value();
            for (auto &item : items) {
                group.inputMethodList().emplace_back(
                    std::move(InputMethodGroupItem(item.name.value()).setLayout(item.layout.value())));
            }
            group.setDefaultInputMethod(groupConfig.defaultInputMethod.value());
        }
    }

    if (d->groups_.size() == 0) {
        buildDefaultGroup();
    } else {
        setCurrentGroup(imConfig.currentGroup.value());
        if (imConfig.groupOrder.value().size()) {
            setGroupOrder(imConfig.groupOrder.value());
        } else {
            setGroupOrder(tempOrder);
        }
    }
}
예제 #16
0
void InputMethodManager::load() {
    FCITX_D();

    auto inputMethods = d->addonManager_->addonNames(AddonCategory::InputMethod);
    auto &path = StandardPath::global();
    auto files = path.multiOpenAll(StandardPath::Type::Data, "fcitx5/inputmethod", O_RDONLY, filter::Suffix(".conf"));
    for (const auto &file : files) {
        auto &files = file.second;
        RawConfig config;
        // reverse the order, so we end up parse user file at last.
        for (auto iter = files.rbegin(), end = files.rend(); iter != end; iter++) {
            auto fd = iter->fd();
            readFromIni(config, fd);
        }

        InputMethodInfo imInfo;
        imInfo.load(config);
        InputMethodEntry entry = toInputMethodEntry(imInfo);
        if (checkEntry(entry, inputMethods) && d->entries_.count(entry.uniqueName()) == 0) {
            d->entries_.emplace(std::string(entry.uniqueName()), std::move(entry));
        }
    }
    for (const auto &addonName : inputMethods) {
        auto addonInfo = d->addonManager_->addonInfo(addonName);
        // on request input method should always provides entry with config file
        if (!addonInfo || addonInfo->onRequest()) {
            continue;
        }
        auto engine = static_cast<InputMethodEngine *>(d->addonManager_->addon(addonName));
        if (!engine) {
            continue;
        }
        auto newEntries = engine->listInputMethods();
        for (auto &newEntry : newEntries) {
            // ok we can't let you register something werid.
            if (checkEntry(newEntry, inputMethods) && newEntry.addon() == addonName &&
                d->entries_.count(newEntry.uniqueName()) == 0) {
                d->entries_.emplace(std::string(newEntry.uniqueName()), std::move(newEntry));
            }
        }
    }

    loadConfig();
}
예제 #17
0
void SurroundingText::deleteText(int offset, unsigned int size) {
    FCITX_D();
    if (!d->valid_) {
        return;
    }

    /*
     * do the real deletion here, and client might update it, but input method
     * itself
     * would expect a up to date value after this call.
     *
     * Make their life easier.
     */
    int cursor_pos = d->cursor_ + offset;
    size_t len = utf8::length(d->text_);
    if (cursor_pos >= 0 && len - cursor_pos >= size) {
        /*
         * the original size must be larger, so we can do in-place copy here
         * without alloc new string
         */
        auto start = utf8::nthChar(d->text_, cursor_pos);
        auto end = utf8::nthChar(d->text_, start, size);

        int copylen = d->text_.length() - end;

        for (int i = 0; i < copylen; i++) {
            d->text_[start + i] = d->text_[end + i];
            d->text_.erase(end);
        }
        d->cursor_ = cursor_pos;
    } else {
        d->text_.clear();
        d->cursor_ = 0;
    }
    d->anchor_ = d->cursor_;
}
예제 #18
0
void ConnectableObject::_registerSignal(std::string name, std::unique_ptr<fcitx::SignalBase> signal) {
    FCITX_D();
    d->signals_.emplace(std::move(name), std::move(signal));
}
예제 #19
0
void SurroundingText::setCursor(unsigned int cursor, unsigned int anchor) {
    FCITX_D();
    d->cursor_ = cursor;
    d->anchor_ = anchor;
}
예제 #20
0
파일: action.cpp 프로젝트: fcitx/fcitx5
Action &Action::setEnabled(bool enabled) {
    FCITX_D();
    d->enabled_ = enabled;
    return *this;
}
예제 #21
0
unsigned int SurroundingText::cursor() const {
    FCITX_D();
    return d->cursor_;
}
예제 #22
0
unsigned int SurroundingText::anchor() const {
    FCITX_D();
    return d->anchor_;
}
예제 #23
0
const InputMethodGroup &InputMethodManager::currentGroup() const {
    FCITX_D();
    return d->groups_.find(d->currentGroup_)->second;
}
예제 #24
0
bool SurroundingText::isValid() const {
    FCITX_D();
    return d->valid_;
}
예제 #25
0
const InputMethodEntry *InputMethodManager::entry(const std::string &name) const {
    FCITX_D();
    return findValue(d->entries_, name);
}
예제 #26
0
void FocusGroup::addInputContext(InputContext *ic) {
    FCITX_D();
    auto iter = d->ics.insert(ic);
    assert(iter.second);
}
예제 #27
0
InputContext *FocusGroup::focusedInputContext() const {
    FCITX_D();
    return d->focus;
}
예제 #28
0
void ConnectableObject::_unregisterSignal(const std::string &name) {
    FCITX_D();
    d->signals_.erase(name);
}
예제 #29
0
int InputMethodManager::groupCount() const {
    FCITX_D();
    return d->groups_.size();
}
예제 #30
0
const std::string &SurroundingText::text() const {
    FCITX_D();
    return d->text_;
}