Exemple #1
0
std::string UIStyleSettings::GetActiveColorScheme() {
	RimeConfig config = {0};
	api_->settings_get_config(settings_, &config);
	const char* value = rime_get_api()->config_get_cstring(&config, "style/color_scheme");
	if (!value) return std::string();
	return std::string(value);
}
LRESULT DictManagementDialog::OnBackup(WORD, WORD code, HWND, BOOL&) {
	int sel = user_dict_list_.GetCurSel();
	if (sel < 0 || sel >= user_dict_list_.GetCount()) {
		MessageBox(L"請在左列選擇要導出的詞典名稱。", L":-(", MB_OK | MB_ICONINFORMATION);
		return 0;
	}
	boost::filesystem::wpath path;
	{
		char dir[MAX_PATH] = {0};
		rime_get_api()->get_user_data_sync_dir(dir, _countof(dir));
		WCHAR wdir[MAX_PATH] = {0};
		MultiByteToWideChar(CP_ACP, 0, dir, -1, wdir, _countof(wdir));
		path = wdir;
	}
	if (_waccess(path.wstring().c_str(), 0) != 0 &&
		!boost::filesystem::create_directories(path)) {
		MessageBox(L"未能完成導出操作。會不會是同步文件夾無法訪問?", L":-(", MB_OK | MB_ICONERROR);
		return 0;
	}
	WCHAR dict_name[100] = {0};
	user_dict_list_.GetText(sel, dict_name);
	path /= std::wstring(dict_name) + L".userdb.txt";
	if (!api_->backup_user_dict(wcstoutf8(dict_name))) {
		MessageBox(L"不知哪裏出錯了,未能完成導出操作。", L":-(", MB_OK | MB_ICONERROR);
		return 0;
	}
	else if (_waccess(path.wstring().c_str(), 0) != 0) {
		MessageBox(L"咦,輸出的快照文件找不着了。", L":-(", MB_OK | MB_ICONERROR);
		return 0;
	}
	std::wstring param = L"/select, \"" + path.wstring() + L"\"";
	ShellExecute(NULL, L"open", L"explorer.exe", param.c_str(), NULL, SW_SHOWNORMAL);
	return 0;
}
int Configurator::Run(bool installing)
{
	RimeModule* levers = rime_get_api()->find_module("levers");
	if (!levers) return 1;
	RimeLeversApi* api = (RimeLeversApi*)levers->get_api();
	if (!api) return 1;

	bool reconfigured = false;

	RimeSwitcherSettings* switcher_settings = api->switcher_settings_init();
	UIStyleSettings ui_style_settings;

	bool skip_switcher_settings = installing && !api->is_first_run((RimeCustomSettings*)switcher_settings);
	bool skip_ui_style_settings = installing && !api->is_first_run(ui_style_settings.settings());

	(skip_switcher_settings || configure_switcher(api, switcher_settings, &reconfigured)) &&
		(skip_ui_style_settings || configure_ui(api, &ui_style_settings, &reconfigured));

	api->custom_settings_destroy((RimeCustomSettings*)switcher_settings);

	if (installing || reconfigured) {
		return UpdateWorkspace(reconfigured);
	}
	return 0;
}
Exemple #4
0
bool UIStyleSettings::GetPresetColorSchemes(std::vector<ColorSchemeInfo>* result) {
	if (!result) return false;
	result->clear();
	RimeConfig config = {0};
	api_->settings_get_config(settings_, &config);
	RimeApi* rime = rime_get_api();
	RimeConfigIterator preset = {0};
	if (!rime->config_begin_map(&preset, &config, "preset_color_schemes")) {
		return false;
	}
	while (rime->config_next(&preset)) {
		std::string name_key(preset.path);
		name_key += "/name";
		const char* name = rime->config_get_cstring(&config, name_key.c_str());
		std::string author_key(preset.path);
		author_key += "/author";
		const char* author = rime->config_get_cstring(&config, author_key.c_str());
		if (!name) continue;
		ColorSchemeInfo info;
		info.color_scheme_id = preset.key;
		info.name = name;
		if (author) info.author = author;
		result->push_back(info);
	}
	return true;
}
int Configurator::UpdateWorkspace(bool report_errors) {
	HANDLE hMutex = CreateMutex(NULL, TRUE, L"WeaselDeployerMutex");
	if (!hMutex)
	{
		LOG(ERROR) << "Error creating WeaselDeployerMutex.";
		return 1;
	}
	if (GetLastError() == ERROR_ALREADY_EXISTS)
	{
		LOG(WARNING) << "another deployer process is running; aborting operation.";
		CloseHandle(hMutex);
		if (report_errors)
		{
			MessageBox(NULL, L"正在執行另一項部署任務,方纔所做的修改將在輸入法再次啓動後生效。", L"【小狼毫】", MB_OK | MB_ICONINFORMATION);
		}
		return 1;
	}

	weasel::Client client;
	if (client.Connect())
	{
		LOG(INFO) << "Turning WeaselServer into maintenance mode.";
		client.StartMaintenance();
	}

	{
		RimeApi* rime = rime_get_api();
		// initialize default config, preset schemas
		rime->deploy();
		// initialize weasel config
		rime->deploy_config_file("weasel.yaml", "config_version");
	}

	CloseHandle(hMutex);  // should be closed before resuming service.

	if (client.Connect())
	{
		LOG(INFO) << "Resuming service.";
		client.EndMaintenance();
	}
	return 0;
}
int Configurator::SyncUserData() {
	HANDLE hMutex = CreateMutex(NULL, TRUE, L"WeaselDeployerMutex");
	if (!hMutex)
	{
		LOG(ERROR) << "Error creating WeaselDeployerMutex.";
		return 1;
	}
	if (GetLastError() == ERROR_ALREADY_EXISTS)
	{
		LOG(WARNING) << "another deployer process is running; aborting operation.";
		CloseHandle(hMutex);
		MessageBox(NULL, L"正在執行另一項部署任務,請稍候再試。", L"【小狼毫】", MB_OK | MB_ICONINFORMATION);
		return 1;
	}

	weasel::Client client;
	if (client.Connect())
	{
		LOG(INFO) << "Turning WeaselServer into maintenance mode.";
		client.StartMaintenance();
	}

	{
		RimeApi* rime = rime_get_api();
		if (!rime->sync_user_data())
		{
			LOG(ERROR) << "Error synching user data.";
			return 1;
		}
		rime->join_maintenance_thread();
	}

	CloseHandle(hMutex);  // should be closed before resuming service.

	if (client.Connect())
	{
		LOG(INFO) << "Resuming service.";
		client.EndMaintenance();
	}
	return 0;
}
int Configurator::DictManagement() {
	HANDLE hMutex = CreateMutex(NULL, TRUE, L"WeaselDeployerMutex");
	if (!hMutex)
	{
		LOG(ERROR) << "Error creating WeaselDeployerMutex.";
		return 1;
	}
	if (GetLastError() == ERROR_ALREADY_EXISTS)
	{
		LOG(WARNING) << "another deployer process is running; aborting operation.";
		CloseHandle(hMutex);
		MessageBox(NULL, L"正在執行另一項部署任務,請稍候再試。", L"【小狼毫】", MB_OK | MB_ICONINFORMATION);
		return 1;
	}

	weasel::Client client;
	if (client.Connect())
	{
		LOG(INFO) << "Turning WeaselServer into maintenance mode.";
		client.StartMaintenance();
	}

	{
		RimeApi* rime = rime_get_api();
		if (RIME_API_AVAILABLE(rime, run_task))
		{
			rime->run_task("installation_update");  // setup user data sync dir
		}
		DictManagementDialog dlg;
		dlg.DoModal();
	}

	CloseHandle(hMutex);  // should be closed before resuming service.

	if (client.Connect())
	{
		LOG(INFO) << "Resuming service.";
		client.EndMaintenance();
	}
	return 0;
}
SwitcherSettingsDialog::SwitcherSettingsDialog(RimeSwitcherSettings* settings)
	: settings_(settings), loaded_(false), modified_(false)
{
	api_ = (RimeLeversApi*)rime_get_api()->find_module("levers")->get_api();
}
Exemple #9
0
static void* FcitxRimeCreate(FcitxInstance* instance)
{
    FcitxRime* rime = (FcitxRime*) fcitx_utils_malloc0(sizeof(FcitxRime));
    rime->owner = instance;
    rime->api = rime_get_api();
    rime->firstRun = true;
    if (!rime->api) {
        free(rime);
        return NULL;
    }

    FcitxRimeStart(rime, false);

    FcitxIMIFace iface;
    memset(&iface, 0, sizeof(FcitxIMIFace));
    iface.Init = FcitxRimeInit;
    iface.ResetIM = FcitxRimeReset;
    iface.DoInput = FcitxRimeDoInput;
    iface.DoReleaseInput = FcitxRimeDoReleaseInput;
    iface.GetCandWords = FcitxRimeGetCandWords;
    iface.ReloadConfig = FcitxRimeReloadConfig;

    FcitxInstanceRegisterIMv2(
        instance,
        rime,
        "rime",
        _("Rime"),
        "rime",
        iface,
        10,
        "zh"
    );

    FcitxUIRegisterComplexStatus(
        instance,
        rime,
        "rime-enzh",
        "",
        "",
        FcitxRimeToggleEnZh,
        FcitxRimeGetIMIcon);

    FcitxUIRegisterComplexStatus(
        instance,
        rime,
        "rime-deploy",
        _("Deploy"),
        _("Deploy"),
        FcitxRimeToggleDeploy,
        FcitxRimeGetDeployIcon);

    FcitxUIRegisterComplexStatus(
        instance,
        rime,
        "rime-sync",
        _("Synchronize"),
        _("Synchronize"),
        FcitxRimeToggleSync,
        FcitxRimeGetSyncIcon);

    FcitxUISetStatusVisable(instance, "rime-enzh", false);
    FcitxUISetStatusVisable(instance, "rime-sync", false);
    FcitxUISetStatusVisable(instance, "rime-deploy", false);
    FcitxIMEventHook hk;
    hk.arg = rime;
    hk.func = FcitxRimeResetUI;

    FcitxInstanceRegisterResetInputHook(instance, hk);
    
    FcitxMenuInit(&rime->schemamenu);
    rime->schemamenu.name = strdup(_("Schema List"));
    rime->schemamenu.candStatusBind = strdup("rime-enzh");
    rime->schemamenu.MenuAction = FcitxRimeSchemaMenuAction;
    rime->schemamenu.UpdateMenu = FcitxRimeSchemaMenuUpdate;
    rime->schemamenu.priv = rime;
    rime->schemamenu.isSubMenu = false;
    FcitxUIRegisterMenu(rime->owner, &rime->schemamenu);

    return rime;
}
DictManagementDialog::DictManagementDialog()
{
	api_ = (RimeLeversApi*)rime_get_api()->find_module("levers")->get_api();
}
Exemple #11
0
static jstring get_version(JNIEnv *env, jobject thiz) {
  RimeApi* rime = rime_get_api();
  const char* c = rime->get_version();
  return newJstring(env, c);
}
Exemple #12
0
static jboolean select_candidate(JNIEnv *env, jobject thiz, jint session_id, jint index) {
  RimeApi* rime = rime_get_api();
  return rime->select_candidate(session_id, index);
}
Exemple #13
0
UIStyleSettings::UIStyleSettings()
{
	api_ = (RimeLeversApi*)rime_get_api()->find_module("levers")->get_api();
	settings_ = api_->custom_settings_init("weasel", "Weasel::UIStyleSettings");
}
Exemple #14
0
std::string UIStyleSettings::GetColorSchemePreview(const std::string& color_scheme_id) {
	return std::string(rime_get_api()->get_shared_data_dir())
		+ "\\preview\\color_scheme_" + color_scheme_id + ".png";
}