summaryrefslogtreecommitdiff
path: root/hangul/hangulinputcontext.c
diff options
context:
space:
mode:
Diffstat (limited to 'hangul/hangulinputcontext.c')
-rw-r--r--hangul/hangulinputcontext.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/hangul/hangulinputcontext.c b/hangul/hangulinputcontext.c
index f4addda..0585d71 100644
--- a/hangul/hangulinputcontext.c
+++ b/hangul/hangulinputcontext.c
@@ -235,6 +235,7 @@ struct _HangulInputContext {
unsigned int use_jamo_mode_only : 1;
unsigned int option_auto_reorder : 1;
+ unsigned int option_combi_on_double_stroke : 1;
};
#include "hangulkeyboard.h"
@@ -851,6 +852,27 @@ hangul_ic_choseong_to_jongseong(HangulInputContext* hic, ucschar cho)
return 0;
}
+static ucschar
+hangul_ic_combine(HangulInputContext* hic, ucschar first, ucschar second)
+{
+ if (!hic->option_combi_on_double_stroke) {
+ if (hangul_keyboard_get_type(hic->keyboard) == HANGUL_KEYBOARD_TYPE_JAMO) {
+ /* 옛한글은 아래 규칙을 적용하지 않아야 입력가능한 글자가 있으므로
+ * 적용하지 않는다. */
+ if (first == second &&
+ hangul_is_jamo_conjoinable(first)) {
+ return 0;
+ }
+ }
+ }
+
+ ucschar combined = 0;
+ combined = hangul_combination_combine(hic->keyboard->combination,
+ first, second);
+
+ return combined;
+}
+
static bool
hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
{
@@ -866,8 +888,7 @@ hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
if (hic->buffer.jongseong) {
if (hangul_is_choseong(ch)) {
jong = hangul_ic_choseong_to_jongseong(hic, ch);
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jongseong, jong);
+ combined = hangul_ic_combine(hic, hic->buffer.jongseong, jong);
if (hangul_is_jongseong(combined)) {
if (!hangul_ic_push(hic, combined)) {
if (!hangul_ic_push(hic, ch)) {
@@ -944,8 +965,7 @@ hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
}
}
} else if (hangul_is_jungseong(ch)) {
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jungseong, ch);
+ combined = hangul_ic_combine(hic, hic->buffer.jungseong, ch);
if (hangul_is_jungseong(combined)) {
if (!hangul_ic_push(hic, combined)) {
return false;
@@ -961,8 +981,7 @@ hangul_ic_process_jamo(HangulInputContext *hic, ucschar ch)
}
} else if (hic->buffer.choseong) {
if (hangul_is_choseong(ch)) {
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.choseong, ch);
+ combined = hangul_ic_combine(hic, hic->buffer.choseong, ch);
/* 초성을 입력한 combine 함수에서 종성이 나오게 된다면
* 이전 초성도 종성으로 바꿔 주는 편이 나머지 처리에 편리하다.
* 이 기능은 MS IME 호환기능으로 ㄳ을 입력하는데 사용한다. */
@@ -1027,8 +1046,7 @@ hangul_ic_process_jaso(HangulInputContext *hic, ucschar ch)
} else {
ucschar choseong = 0;
if (hangul_is_choseong(hangul_ic_peek(hic))) {
- choseong = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.choseong, ch);
+ choseong = hangul_ic_combine(hic, hic->buffer.choseong, ch);
}
if (choseong) {
if (!hangul_ic_push(hic, choseong)) {
@@ -1068,8 +1086,7 @@ hangul_ic_process_jaso(HangulInputContext *hic, ucschar ch)
} else {
ucschar jungseong = 0;
if (hangul_is_jungseong(hangul_ic_peek(hic))) {
- jungseong = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jungseong, ch);
+ jungseong = hangul_ic_combine(hic, hic->buffer.jungseong, ch);
}
if (jungseong) {
if (!hangul_ic_push(hic, jungseong)) {
@@ -1096,8 +1113,7 @@ hangul_ic_process_jaso(HangulInputContext *hic, ucschar ch)
} else {
ucschar jongseong = 0;
if (hangul_is_jongseong(hangul_ic_peek(hic))) {
- jongseong = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jongseong, ch);
+ jongseong = hangul_ic_combine(hic, hic->buffer.jongseong, ch);
}
if (jongseong) {
if (!hangul_ic_push(hic, jongseong)) {
@@ -1154,8 +1170,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
jong = ch;
else
jong = hangul_ic_choseong_to_jongseong(hic, ch);
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jongseong, jong);
+ combined = hangul_ic_combine(hic, hic->buffer.jongseong, jong);
if (hangul_is_jongseong(combined)) {
if (!hangul_ic_push(hic, combined)) {
if (!hangul_ic_push(hic, ch)) {
@@ -1229,8 +1244,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
}
}
} else if (hangul_is_jungseong(ch)) {
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.jungseong, ch);
+ combined = hangul_ic_combine(hic, hic->buffer.jungseong, ch);
if (hangul_is_jungseong(combined)) {
if (!hangul_ic_push(hic, combined)) {
return false;
@@ -1253,8 +1267,7 @@ hangul_ic_process_romaja(HangulInputContext *hic, int ascii, ucschar ch)
}
} else if (hic->buffer.choseong) {
if (hangul_is_choseong(ch)) {
- combined = hangul_combination_combine(hic->keyboard->combination,
- hic->buffer.choseong, ch);
+ combined = hangul_ic_combine(hic, hic->buffer.choseong, ch);
if (combined == 0) {
hic->buffer.jungseong = 0x1173;
hangul_ic_flush_internal(hic);
@@ -1574,6 +1587,8 @@ hangul_ic_get_option(HangulInputContext* hic, int option)
switch (option) {
case HANGUL_IC_OPTION_AUTO_REORDER:
return hic->option_auto_reorder;
+ case HANGUL_IC_OPTION_COMBI_ON_DOUBLE_STROKE:
+ return hic->option_combi_on_double_stroke;
}
return false;
@@ -1586,6 +1601,9 @@ hangul_ic_set_option(HangulInputContext* hic, int option, bool value)
case HANGUL_IC_OPTION_AUTO_REORDER:
hic->option_auto_reorder = value;
break;
+ case HANGUL_IC_OPTION_COMBI_ON_DOUBLE_STROKE:
+ hic->option_combi_on_double_stroke = value;
+ break;
}
}
@@ -1746,6 +1764,7 @@ hangul_ic_new(const char* keyboard)
hic->use_jamo_mode_only = FALSE;
hic->option_auto_reorder = false;
+ hic->option_combi_on_double_stroke = false;
hangul_ic_set_output_mode(hic, HANGUL_OUTPUT_SYLLABLE);
hangul_ic_select_keyboard(hic, keyboard);