summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChoe Hwanjin <choe.hwanjin@gmail.com>2018-06-06 18:42:04 +0900
committerChoe Hwanjin <choe.hwanjin@gmail.com>2018-06-06 18:42:04 +0900
commit5a06be7d1c49fc3e99b2f0417b10591dfd1ff564 (patch)
tree467024f1af623c9375a2bc22947346b71ef7a5d1
parentfb9fc716d75d79f5ef3142e93220e6cd446aa24c (diff)
downloadlibhangul-5a06be7d1c49fc3e99b2f0417b10591dfd1ff564.tar.gz
User custom 자판 등록 기능 제공
hangul_keyboard_list에 사용자가 생성한 HangulKeyboard를 등록할 수 있는 api를 추가한다. 관련하여 unit test 코드도 추가함. https://github.com/libhangul/libhangul/pull/21 https://github.com/libhangul/libhangul/issues/28
-rw-r--r--hangul/hangul.h3
-rw-r--r--hangul/hangulkeyboard.c64
-rw-r--r--test/test.c17
3 files changed, 84 insertions, 0 deletions
diff --git a/hangul/hangul.h b/hangul/hangul.h
index 61d4357..dcafcd4 100644
--- a/hangul/hangul.h
+++ b/hangul/hangul.h
@@ -108,6 +108,9 @@ void hangul_keyboard_set_type(HangulKeyboard *keyboard, int type);
unsigned int hangul_keyboard_list_get_count();
const char* hangul_keyboard_list_get_keyboard_id(unsigned index_);
const char* hangul_keyboard_list_get_keyboard_name(unsigned index_);
+const HangulKeyboard* hangul_keyboard_list_get_keyboard(const char* id);
+const char* hangul_keyboard_list_register_keyboard(HangulKeyboard* keyboard);
+HangulKeyboard* hangul_keyboard_list_unregister_keyboard(const char* id);
/* combination */
HangulCombination* hangul_combination_new(void);
diff --git a/hangul/hangulkeyboard.c b/hangul/hangulkeyboard.c
index 65035d5..ac94cb8 100644
--- a/hangul/hangulkeyboard.c
+++ b/hangul/hangulkeyboard.c
@@ -1009,6 +1009,12 @@ hangul_keyboard_list_get_keyboard_name(unsigned index_)
return keyboard->name;
}
+/**
+ * @ingroup hangulkeyboards
+ * @brief libhangul에서 제공하는 자판의 HangulKeyboard 포인터를 구하는 함수
+ * @return id로 찾아진 자판의 HangulKeyboard 포인터, 못찾으면 NULL.
+ * 이 스트럭처는 libhangul 내부에서 관리하는 것으로 free해서는 안된다.
+ */
const HangulKeyboard*
hangul_keyboard_list_get_keyboard(const char* id)
{
@@ -1051,3 +1057,61 @@ hangul_keyboard_list_append(HangulKeyboard* keyboard)
return true;
}
+
+/**
+ * @ingroup hangulkeyboards
+ * @brief keyboard 를 글로벌 키보드 리스트에 등록함
+ * @param keyboard 등록할 키보드
+ * @return keyboard 의 id, 키보드를 선택하거나 unregister할때 사용하는 id다.
+ *
+ * 여기에 등록된 키보드는 hangul_ic_select()를 통해서 선택될 수 있게 된다.
+ * 이후 @a keyboard 는 libhangul이 관리하므로 사용자가 임의로 삭제해서는 안된다.
+ * hangul_fini() 함수 안에서 삭제될 것이다.
+ */
+const char*
+hangul_keyboard_list_register_keyboard(HangulKeyboard* keyboard)
+{
+ if (keyboard == NULL)
+ return NULL;
+
+ bool res = hangul_keyboard_list_append(keyboard);
+ if (!res) {
+ return NULL;
+ }
+
+ return keyboard->id;
+}
+
+/**
+ * @ingroup hangulkeyboards
+ * @brief id로 지정된 키보드를 글로벌 키보드 리스트에 삭제함
+ * @param id 삭제할 키보드 id
+ * @return 리스트에서 삭제된 HangulKeyboard 의 포인터, 이 포인터는 더이상 libhangul에서
+ * 관리하지 않으므로 사용자가 hangul_keyboard_delete() 함수로 삭제해야 한다.
+ */
+HangulKeyboard*
+hangul_keyboard_list_unregister_keyboard(const char* id)
+{
+ HangulKeyboard* keyboard = NULL;
+
+ size_t i;
+ for (i = 0; i < hangul_keyboards.n; ++i) {
+ keyboard = hangul_keyboards.keyboards[i];
+ if (strcmp(id, keyboard->id) == 0) {
+ break;
+ }
+ }
+
+ if (keyboard == NULL) {
+ return NULL;
+ }
+
+ for (++i; i < hangul_keyboards.n; ++i) {
+ hangul_keyboards.keyboards[i - 1] = hangul_keyboards.keyboards[i];
+ }
+
+ hangul_keyboards.keyboards[i - 1] = NULL;
+ hangul_keyboards.n--;
+
+ return keyboard;
+}
diff --git a/test/test.c b/test/test.c
index ed27664..c64fd6e 100644
--- a/test/test.c
+++ b/test/test.c
@@ -555,6 +555,23 @@ START_TEST(test_hangul_keyboard)
fail_unless(
(keyboard = hangul_keyboard_new_from_file(TEST_SOURCE_DIR "/recursive.xml")) != NULL
);
+
+ fail_unless(
+ (id = hangul_keyboard_list_register_keyboard(keyboard)) != NULL
+ );
+ fail_unless(
+ strcmp(id, "recursive") == 0
+ );
+ fail_unless(
+ hangul_keyboard_list_get_count() == n + 1
+ );
+ fail_unless(
+ hangul_keyboard_list_get_keyboard(id) == keyboard
+ );
+ fail_unless(
+ hangul_keyboard_list_unregister_keyboard(id) == keyboard
+ );
+
hangul_keyboard_delete(keyboard);
}
END_TEST