Skip to content

Commit 5b98a2b

Browse files
committed
WIP
1 parent 5298764 commit 5b98a2b

12 files changed

+214
-1
lines changed

.clang-format

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
Language: Cpp
3+
BasedOnStyle: LLVM
4+
Standard: c++20
5+
...
6+

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,7 @@
3030
*.exe
3131
*.out
3232
*.app
33+
34+
# Common cmake build dirs
35+
cmake-build-*/
36+
build/

CMakeLists.txt

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
cmake_minimum_required(VERSION 3.0)
2+
project(fcitx5-cskk VERSION 0.0.1)
3+
set(CMAKE_CXX_STANDARD 20)
4+
5+
find_package(ECM 1.0.0 REQUIRED)
6+
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
7+
include(FeatureSummary)
8+
include(GNUInstallDirs)
9+
include(ECMUninstallTarget)
10+
11+
find_package(PkgConfig REQUIRED)
12+
find_package(Fcitx5Core REQUIRED)
13+
pkg_check_modules(LIBCSKK "cskk" REQUIRED)
14+
15+
include("${FCITX_INSTALL_CMAKECONFIG_DIR}/Fcitx5Utils/Fcitx5CompilerSettings.cmake")
16+
17+
# Not sure what this does. Need translation?
18+
find_package(Gettext REQUIRED)
19+
add_definitions(-DFCITX_GETTEXT_DOMAIN=\"fcitx5-cskk\" -D_GNU_SOURCE)
20+
fcitx5_add_i18n_definition()
21+
22+
add_subdirectory(src)
23+
add_subdirectory(po)
24+
25+
fcitx5_translate_desktop_file(
26+
org.fcitx.Fcitx5.Addon.Cskk.metainfo.xml.in
27+
org.fcitx.Fcitx5.Addon.Cskk.metainfo.xml XML)
28+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.fcitx.Fcitx5.Addon.Cskk.metainfo.xml" DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
29+
30+
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

Messages.sh

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/bash
2+
gen_pot cxx:appdata:ui:desktop fcitx5-cskk po .

README.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,11 @@
1-
# fcitx5-cskk
1+
# fcitx5-cskk
2+
3+
4+
$ mkdir build
5+
$ cd build
6+
$ cmake ..
7+
$ make && make install
8+
9+
10+
11+
$ make uninstall
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<component type="addon">
3+
<id>org.fcitx.Fcitx5.Addon.Cskk</id>
4+
<extends>org.fcitx.Fcitx5</extends>
5+
<metadata_license>CC0-1.0</metadata_license>
6+
<project_license>GPL-3.0+</project_license>
7+
<name>CSKK</name>
8+
<summary>libCSKK Japanese input method</summary>
9+
<url type="homepage">https://github.com/naokiri/fcitx5-cskk</url>
10+
<url type="bugtracker">https://github.com/naokiri/fcitx5-cskk/issues</url>
11+
<project_group>Fcitx</project_group>
12+
<releases>
13+
<release version="0.0.1" date="2021-04-30"/>
14+
</releases>
15+
</component>

po/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fcitx5_install_translation(fcitx5-cskk)

src/CMakeLists.txt

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
set(CSKK_SOURCES
2+
cskk.cpp
3+
)
4+
add_library(fcitx-cskk MODULE ${CSKK_SOURCES})
5+
target_link_libraries(fcitx-cskk
6+
Fcitx5::Core
7+
Fcitx5::Config
8+
${LIBCSKK_LIBRARIES}
9+
)
10+
11+
install(TARGETS fcitx-cskk DESTINATION "${CMAKE_INSTALL_LIBDIR}/fcitx5")
12+
13+
fcitx5_translate_desktop_file(cskk.conf.in cskk.conf)
14+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cskk.conf" DESTINATION "${CMAKE_INSTALL_DATADIR}/fcitx5/inputmethod")
15+
16+
configure_file(cskk-addon.conf.in.in cskk-addon.conf.in @ONLY)
17+
fcitx5_translate_desktop_file("${CMAKE_CURRENT_BINARY_DIR}/cskk-addon.conf.in" cskk-addon.conf)
18+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cskk-addon.conf" RENAME cskk.conf DESTINATION "${FCITX_INSTALL_PKGDATADIR}/addon")

src/cskk-addon.conf.in.in

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[Addon]
2+
Name=Cskk
3+
Comment=Cskk Input Method For Fcitx
4+
Category=InputMethod
5+
Library=cskk
6+
Type=SharedLibrary
7+
OnDemand=True
8+
Configurable=False
9+
Version=@PROJECT_VERSION@

src/cskk.conf.in

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[InputMethod]
2+
Name=Cskk
3+
Icon=fcitx-cskk
4+
LangCode=ja
5+
Addon=cskk
6+
Label=CSKK
7+
Configurable=False

src/cskk.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2021 Naoaki Iwakiri
3+
* This program is released under GNU General Public License version 3 or later
4+
* You should have received a copy of the GNU General Public License along with
5+
* this program. If not, see <https://www.gnu.org/licenses/>. Creation Date:
6+
* 2021-04-30
7+
*
8+
* SPDX-License-Identifier: GPL-3.0-or-later
9+
* SPDX-FileType: SOURCE
10+
* SPDX-FileName: cskk.cpp
11+
* SPDX-FileCopyrightText: Copyright (c) 2021 Naoaki Iwakiri
12+
*/
13+
#include "cskk.h"
14+
#include <iostream>
15+
16+
namespace fcitx {
17+
CskkEngine::CskkEngine(Instance *instance)
18+
: instance_{instance}, factory_([this](InputContext &ic) {
19+
auto newCskkContext = new FcitxCskkContext(this, &ic);
20+
return newCskkContext;
21+
}) {
22+
instance_->inputContextManager().registerProperty("skkState", &factory_);
23+
};
24+
CskkEngine::~CskkEngine() = default;
25+
void CskkEngine::keyEvent(const InputMethodEntry &, KeyEvent &keyEvent) {
26+
// delegate to state
27+
auto ic = keyEvent.inputContext();
28+
auto state = ic->propertyFor(&factory_);
29+
state->keyEvent(keyEvent);
30+
}
31+
void CskkEngine::save() {}
32+
33+
////////////////////////////////////////////////////////////////////////////////
34+
/// CskkContext
35+
////////////////////////////////////////////////////////////////////////////////
36+
FcitxCskkContext::FcitxCskkContext(CskkEngine *_engine, InputContext *_ic)
37+
: context_(skk_context_new(nullptr, 0)) {
38+
FCITX_UNUSED(_engine);
39+
FCITX_UNUSED(_ic);
40+
}
41+
FcitxCskkContext::~FcitxCskkContext() = default;
42+
void FcitxCskkContext::keyEvent(KeyEvent &keyEvent) {
43+
// TODO: handleCandidate to utilize fcitx's paged candidate list
44+
45+
uint32_t modifiers =
46+
static_cast<uint32_t>(keyEvent.rawKey().states() & KeyState::SimpleMask);
47+
48+
CskkKeyEvent *cskkKeyEvent = skk_key_event_new_from_fcitx_keyevent(
49+
keyEvent.rawKey().sym(), modifiers, keyEvent.isRelease());
50+
51+
if (skk_context_process_key_event(context_, cskkKeyEvent)) {
52+
keyEvent.filterAndAccept();
53+
}
54+
}
55+
} // namespace fcitx

src/cskk.h

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright (c) 2021 Naoaki Iwakiri
3+
* This program is released under GNU General Public License version 3 or later
4+
* You should have received a copy of the GNU General Public License along with
5+
* this program. If not, see <https://www.gnu.org/licenses/>. Creation Date:
6+
* 2021-04-30
7+
*
8+
* SPDX-License-Identifier: GPL-3.0-or-later
9+
* SPDX-FileType: SOURCE
10+
* SPDX-FileName: cskk.h
11+
* SPDX-FileCopyrightText: Copyright (c) 2021 Naoaki Iwakiri
12+
*/
13+
14+
#ifndef FCITX5_CSKK_CSKK_H
15+
#define FCITX5_CSKK_CSKK_H
16+
17+
extern "C" {
18+
#include <cskk/libcskk.h>
19+
}
20+
21+
#include <fcitx/inputmethodengine.h>
22+
#include <fcitx/instance.h>
23+
24+
namespace fcitx {
25+
class FcitxCskkContext;
26+
class CskkEngine final : public InputMethodEngine {
27+
public:
28+
CskkEngine(Instance *instance);
29+
~CskkEngine() override;
30+
31+
void keyEvent(const InputMethodEntry &entry, KeyEvent &keyEvent) override;
32+
// void activate(const InputMethodEntry &, InputContextEvent &) override;
33+
// void deactivate(const InputMethodEntry &entry,
34+
// InputContextEvent &event) override;
35+
36+
void save() override;
37+
38+
private:
39+
Instance *instance_;
40+
FactoryFor<FcitxCskkContext> factory_;
41+
};
42+
43+
class FcitxCskkContext final : public InputContextProperty {
44+
public:
45+
FcitxCskkContext(CskkEngine *engine, InputContext *ic);
46+
~FcitxCskkContext() override;
47+
void keyEvent(KeyEvent &keyEvent);
48+
49+
private:
50+
// TODO: unique_ptr using some wrapper class for Rust exposed pointer? Need
51+
// bit more research.
52+
CskkContext *context_;
53+
};
54+
55+
} // namespace fcitx
56+
#endif // FCITX5_CSKK_CSKK_H

0 commit comments

Comments
 (0)