Skip to content

Commit

Permalink
User custom 자판 등록 기능 제공
Browse files Browse the repository at this point in the history
hangul_keyboard_list에 사용자가 생성한 HangulKeyboard를
등록할 수 있는 api를 추가한다.

관련하여 unit test 코드도 추가함.

#21
#28
  • Loading branch information
choehwanjin committed Jun 6, 2018
1 parent fb9fc71 commit 5a06be7
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 0 deletions.
3 changes: 3 additions & 0 deletions hangul/hangul.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
64 changes: 64 additions & 0 deletions hangul/hangulkeyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}
17 changes: 17 additions & 0 deletions test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5a06be7

Please sign in to comment.