SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
리눅스 데스크톱의
한국어 입력 개요
2018.05.19
Changwoo Ryu <cwryu@debian.org>
● 단순화해서 설명합니다
하드웨어
● Intel 8042 (AT 이후, “PS/2” 키보드 컨트롤러)
○ 요즘은 one-chip으로 메인 보드 칩셋에 내장
● USB HID (Human Interface Device) class
● Bluetooth HID (Human Interface Device) profile
● 각 표준에서 정한 하드웨어 키 코드가 (또는 “hardware scancode”) 입력됨.
OS
● Linux “input” subsystem 키코드로 변환
● Documentation/input/event-codes.txt
● /usr/include/linux/input-event-codes.h
● 리눅스 드라이버에서 하드웨어 코드를 리눅스 이벤트 코드 (“event code”) 변환
● "evdev" 인터페이스를 통해 유저랜드에서 접근 (/dev/input/event0)
GUI server (xorg / wayland compositor)
● (libinput - 키보드 포함 각종 입력 처리)
● XKB - 입력된 HW/OS 의존 키 코드를 논리적 코드로 (“key symbol”) 변환
○ 사용자 설정에 따라 달라짐. 예: Dvorak 사용, 독일어 AZERTY 레이아웃 사용
○ /usr/include/xkbcommon/xkbcommon-keysyms.h
○ 이름처럼 xorg용으로 만들어졌지만 wayland에서도 계속 사용
○ 한국어용 설정도 있음 - 오른쪽 Alt/Ctrl를 한영전환/한자 키로 바꾸기
● 한글?
○ XKB_KEY_Hangul_Kiyeog 등 한글 심볼 정의가 들어 있음 (?!)
○ 하지만 사용하지 않고 한글 입력할 때도 알파벳 사용. 그렇게 하려면 한영 전환, 두벌식 세벌식
설정 등을 GUI server에서 처리해야 하는데 어려움
● 이 키 이벤트가 포커스가 있는 app으로 전달되는데..
GUI client
● 이 key event를 받아서 아무 생각 없이 symbol을 뿌리면 서양 전용 GUI가 됨
● 텍스트 입력 상황일 경우, 이 event를 “입력기”에 의뢰를 하고 결과물 텍스트를
받아옴
입력기 용어
● 입력기 (input method)
○ server - ibus 등의 입력기
○ client - 각 GUI app, 보통 GTK+같은 GUI toolkit에서 처리
● 동작
○ preedit - 입력 중인 글자
■ root - 디스플레이의 구석에 표시 - 사용자 시선 분산으로 불편
■ off-the-spot - 해당 입력 창의 한 구석에 표시 - 마찬가지로 불편
■ over-the-spot - 입력 위치 위에 겹쳐서 쓰기 - font나 style 불일치 등의 문제 흔히 발생
■ on-the-spot - client가 직접 쓰기 - 가장 이상적이지만 GUI toolkit마다 고려해야 함
○ candidate - 사전 선택, 일본어/중국어의 경우에는 고려할 게 많음
○ commit - 확정된 입력 텍스트
XIM
● X Input Method
● 1993-1994, 아직도 최후의 대안인 레가시
● 실패 이유
○ 다른 X11 명세와 마찬가지로 spec이 너무 일반적
■ root, off-the-spot, over-the-spot, on-the-spot 클라이언트별로 다른 방식을 모두 지원하자
니 위치 정보 전달, 폰트 정보 전달 등 걸림돌이 많음
■ ibus, uim도 over-the-spot, on-the-spot 정도만 구현
○ reference 코드가 (IMdkit) 완전하지 않았고 버그 많았음
○ GUI toolkit인 Motif의 구현도 버그 많았고 closed-source라 고칠 수 없었음
시나리오 - XIM
X server App XIM server
Event Event
Preedit,
Commit
IBus, UIM, FCITX 등 입력기 프레임워크
● 다국어 입력 등 편리
● GUI toolkit마다 입력기 플러그인(“immodule”)을 붙일 수 있게 되면서 용이해짐
○ gtk 2 이후, qt 3 이후
● 장점: 각각의 모듈은 각자 역할에 집중하면 됨. 통신, 툴킷, UI 등에 신경 쓸 필
요가 적음.
● 단점: 모든 입력기가 각 GUI toolkit마다 특정 입력기에 대한 고려를 하는 상황
IBus
IBus
daemon
engine
(hangul …)
ibus client
(gtk, qt)
XIM
compat
XIM client
ibus server
candidate
UI,
settings, ...
시나리오 - IBus
X /
Wayland
App IBus server
Event Event
Preedit,
Commit
GUI 서버에서 입력기 처리
● wayland 프로토콜로 이런 게 있으나.. wl_input_method, wl_input_panel,
wl_text_model
○ http://mirrors.ustc.edu.cn/kde-
application/akademy/2012/slides/Wayland_Choosing_a_Better_Input_Method_Architecture_-
_Michael_Hasselmann.pdf
○ ibus-wayland
○ weston에만 구현
● mutter/gnome-shell 3.30 / 3.28.1 부터 “gtk-text-input” 프로토콜 추가
● 직접 ibus에 연결해서 받은 결과물을 클라이언트에 전달
● gtk에 ibus immodule 필요없어지고 wayland “gtk-text-input” 지원 필요
● 장점: GUI toolkit에서 입력기 의존 처리가 필요 없음. 스크린 키보드, 필기 입력,
음성 입력 등 데스크톱 연동이 쉬움.
● 단점: 표준화가 쉽지 않음. gtk-text-input은 gtk/gnome 전용
시나리오 - IBus from GUI server
gnome-shell /
mutter
App
IBus server
Event
Preedit,
Commit
Preedit,
Commit
보너스: libhangul
● “한글 오토마타” 알고리즘 구현
● 키를 입력하면 그 상태의 commit과 preedit string 상태를 알 수 있다.
● 한자 사전 검색
HangulInputContext* hangul_ic_new(const char* keyboard);
void hangul_ic_delete(HangulInputContext *hic);
bool hangul_ic_process(HangulInputContext *hic, int ascii);
const ucschar* hangul_ic_get_preedit_string(HangulInputContext *hic);
const ucschar* hangul_ic_get_commit_string(HangulInputContext *hic);
#include <hangul.h>
#include <glib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
HangulInputContext *ic = hangul_ic_new("2");
for (char* k = &argv[1][0]; *k; k++)
hangul_ic_process(ic, *k);
const ucschar* preedit = hangul_ic_get_preedit_string(ic);
const ucschar* commit = hangul_ic_get_commit_string(ic);
// encoding conversion and print
char *str;
str = g_ucs4_to_utf8(commit, hangul_syllable_len(commit, -1), NULL, NULL, NULL);
printf("commit: %sn", str); g_free(str);
str = g_ucs4_to_utf8(preedit, hangul_syllable_len(preedit, -1), NULL, NULL, NULL);
printf("preedit: %sn", str); g_free(str);
hangul_ic_delete(ic);
}
$ ./a.out rmsh
commit: 그
preedit: 노
$
정리
● 앞으로는?
○ 여러가지가 호환성 유지되면서 변화
○ XIM은 없어지겠지…
○ 마지막 GUI server 쪽에서 입력기에 연결하는 방식이 더 발전적
● 입력 문제는 입력기 탓만 하기에는 여러가지 엮인 소프트웨어가 많다
○ 관련된 여러가지 데스크톱 소프트웨어의 이슈와 개발 방향에 관심이 필요

Más contenido relacionado

La actualidad más candente

Houdini .OBJ から .ABC へ
Houdini .OBJ から .ABC へHoudini .OBJ から .ABC へ
Houdini .OBJ から .ABC へKen Taki
 
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁信仁 邱
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
요즘 유행하는 AI 나도 해보자 (feat. CoreML)요즘 유행하는 AI 나도 해보자 (feat. CoreML)
요즘 유행하는 AI 나도 해보자 (feat. CoreML)Chiwon Song
 
RiBLA Broadcast 簡易操作マニュアル
RiBLA Broadcast 簡易操作マニュアルRiBLA Broadcast 簡易操作マニュアル
RiBLA Broadcast 簡易操作マニュアルssuser4339f6
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかKousuke Ruichi
 
Deview2014 Live Broadcasting 추천시스템 발표 자료
Deview2014 Live Broadcasting 추천시스템 발표 자료Deview2014 Live Broadcasting 추천시스템 발표 자료
Deview2014 Live Broadcasting 추천시스템 발표 자료choi kyumin
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki publicKazuaki Ishizaki
 
딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식if kakao
 
続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)TetsuroMatsumura
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
IocコンテナについてAkio Terayama
 
ElixirでFPGAを設計する
ElixirでFPGAを設計するElixirでFPGAを設計する
ElixirでFPGAを設計するHideki Takase
 
이은석 마비노기 영웅전 포스트모템 2부 (kgc 버전)
이은석   마비노기 영웅전 포스트모템 2부 (kgc 버전)이은석   마비노기 영웅전 포스트모템 2부 (kgc 버전)
이은석 마비노기 영웅전 포스트모템 2부 (kgc 버전)drandom
 
[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸NAVER D2
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4Takeshi Yamamuro
 
The Online Tech of Titanfall
The Online Tech of TitanfallThe Online Tech of Titanfall
The Online Tech of Titanfallvtslothy
 
Extraction des routes par deep learning: ArcGIS Pro 2.9
Extraction des routes par deep learning: ArcGIS Pro 2.9Extraction des routes par deep learning: ArcGIS Pro 2.9
Extraction des routes par deep learning: ArcGIS Pro 2.9YOUSSOUPHA MBODJI
 

La actualidad más candente (20)

Houdini .OBJ から .ABC へ
Houdini .OBJ から .ABC へHoudini .OBJ から .ABC へ
Houdini .OBJ から .ABC へ
 
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁
機器人齊步走 mBlock5 mbot_ver8_探奇邱信仁
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
요즘 유행하는 AI 나도 해보자 (feat. CoreML)요즘 유행하는 AI 나도 해보자 (feat. CoreML)
요즘 유행하는 AI 나도 해보자 (feat. CoreML)
 
RiBLA Broadcast 簡易操作マニュアル
RiBLA Broadcast 簡易操作マニュアルRiBLA Broadcast 簡易操作マニュアル
RiBLA Broadcast 簡易操作マニュアル
 
Plan 9のお話
Plan 9のお話Plan 9のお話
Plan 9のお話
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 
Deview2014 Live Broadcasting 추천시스템 발표 자료
Deview2014 Live Broadcasting 추천시스템 발표 자료Deview2014 Live Broadcasting 추천시스템 발표 자료
Deview2014 Live Broadcasting 추천시스템 발표 자료
 
20160906 pplss ishizaki public
20160906 pplss ishizaki public20160906 pplss ishizaki public
20160906 pplss ishizaki public
 
딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식딥러닝을 이용한 얼굴 인식
딥러닝을 이용한 얼굴 인식
 
MipMap(밉맵)
MipMap(밉맵)MipMap(밉맵)
MipMap(밉맵)
 
続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)
 
Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
ElixirでFPGAを設計する
ElixirでFPGAを設計するElixirでFPGAを設計する
ElixirでFPGAを設計する
 
이은석 마비노기 영웅전 포스트모템 2부 (kgc 버전)
이은석   마비노기 영웅전 포스트모템 2부 (kgc 버전)이은석   마비노기 영웅전 포스트모템 2부 (kgc 버전)
이은석 마비노기 영웅전 포스트모템 2부 (kgc 버전)
 
[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸[216]딥러닝예제로보는개발자를위한통계 최재걸
[216]딥러닝예제로보는개발자를위한통계 최재걸
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
The Online Tech of Titanfall
The Online Tech of TitanfallThe Online Tech of Titanfall
The Online Tech of Titanfall
 
Extraction des routes par deep learning: ArcGIS Pro 2.9
Extraction des routes par deep learning: ArcGIS Pro 2.9Extraction des routes par deep learning: ArcGIS Pro 2.9
Extraction des routes par deep learning: ArcGIS Pro 2.9
 

Similar a Korean input overview in the linux desktop

윈도우 매니저 스터디: 0.윈도우 매니저 소개
윈도우 매니저 스터디: 0.윈도우 매니저 소개윈도우 매니저 스터디: 0.윈도우 매니저 소개
윈도우 매니저 스터디: 0.윈도우 매니저 소개nemoux
 
[DS Meetup] iPad로 가벼운 분석환경 구축해보기
[DS Meetup] iPad로 가벼운 분석환경 구축해보기[DS Meetup] iPad로 가벼운 분석환경 구축해보기
[DS Meetup] iPad로 가벼운 분석환경 구축해보기Minho Lee
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍NDOORS
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)Sang Don Kim
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
 
오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3Changwoo Ryu
 
오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2Changwoo Ryu
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템Young Soo Kim
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템강 민우
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트iFunFactory Inc.
 
[NDC17] Protocol:hyperspace Diver 개발 포스트모템
[NDC17] Protocol:hyperspace Diver 개발 포스트모템[NDC17] Protocol:hyperspace Diver 개발 포스트모템
[NDC17] Protocol:hyperspace Diver 개발 포스트모템Young Soo Kim
 
강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍chcbaram
 
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)최민호 - 국내 포털에서의 우분투 (2012Y03M31D)
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)Ubuntu Korea Community
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee
 
OSS SW Basics Lecture 14: Open source hardware
OSS SW Basics Lecture 14: Open source hardwareOSS SW Basics Lecture 14: Open source hardware
OSS SW Basics Lecture 14: Open source hardwareJeongkyu Shin
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaLazy Ahasil
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개noerror
 

Similar a Korean input overview in the linux desktop (20)

윈도우 매니저 스터디: 0.윈도우 매니저 소개
윈도우 매니저 스터디: 0.윈도우 매니저 소개윈도우 매니저 스터디: 0.윈도우 매니저 소개
윈도우 매니저 스터디: 0.윈도우 매니저 소개
 
[DS Meetup] iPad로 가벼운 분석환경 구축해보기
[DS Meetup] iPad로 가벼운 분석환경 구축해보기[DS Meetup] iPad로 가벼운 분석환경 구축해보기
[DS Meetup] iPad로 가벼운 분석환경 구축해보기
 
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
(게임개발을위한) printf("Hello World!"); 그 이상의 콘솔 프로그래밍
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
Ch09
Ch09Ch09
Ch09
 
오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3
 
오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
 
[NDC17] Protocol:hyperspace Diver 개발 포스트모템
[NDC17] Protocol:hyperspace Diver 개발 포스트모템[NDC17] Protocol:hyperspace Diver 개발 포스트모템
[NDC17] Protocol:hyperspace Diver 개발 포스트모템
 
강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍
 
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)최민호 - 국내 포털에서의 우분투 (2012Y03M31D)
최민호 - 국내 포털에서의 우분투 (2012Y03M31D)
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
Manage book project
Manage book projectManage book project
Manage book project
 
Manage book project
Manage book projectManage book project
Manage book project
 
OSS SW Basics Lecture 14: Open source hardware
OSS SW Basics Lecture 14: Open source hardwareOSS SW Basics Lecture 14: Open source hardware
OSS SW Basics Lecture 14: Open source hardware
 
C++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & NanaC++ GUI 라이브러리 소개: Qt & Nana
C++ GUI 라이브러리 소개: Qt & Nana
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개
 

Más de gnomekr

20180519 hangul processing
20180519 hangul processing20180519 hangul processing
20180519 hangul processinggnomekr
 
The way of approaching to foss for nursing care business
The way of approaching to foss for nursing care businessThe way of approaching to foss for nursing care business
The way of approaching to foss for nursing care businessgnomekr
 
Chromium ui framework(shared)
Chromium ui framework(shared)Chromium ui framework(shared)
Chromium ui framework(shared)gnomekr
 
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예gnomekr
 
Gnome on wayland at a glance
Gnome on wayland at a glanceGnome on wayland at a glance
Gnome on wayland at a glancegnomekr
 
My ubuntu life-dklee
My ubuntu life-dkleeMy ubuntu life-dklee
My ubuntu life-dkleegnomekr
 
Vision and dream for youth startup company
Vision and dream for youth startup companyVision and dream for youth startup company
Vision and dream for youth startup companygnomekr
 
Hw accelerated webkitgtk+ on raspberry pi
Hw accelerated webkitgtk+ on raspberry piHw accelerated webkitgtk+ on raspberry pi
Hw accelerated webkitgtk+ on raspberry pignomekr
 
Gnome.asia.summit2013 report-pdf
Gnome.asia.summit2013 report-pdfGnome.asia.summit2013 report-pdf
Gnome.asia.summit2013 report-pdfgnomekr
 
System hacking basics
System hacking basicsSystem hacking basics
System hacking basicsgnomekr
 

Más de gnomekr (10)

20180519 hangul processing
20180519 hangul processing20180519 hangul processing
20180519 hangul processing
 
The way of approaching to foss for nursing care business
The way of approaching to foss for nursing care businessThe way of approaching to foss for nursing care business
The way of approaching to foss for nursing care business
 
Chromium ui framework(shared)
Chromium ui framework(shared)Chromium ui framework(shared)
Chromium ui framework(shared)
 
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예
뒷북요정으로 알아보는 사용자 요구 반영의 나쁜 예
 
Gnome on wayland at a glance
Gnome on wayland at a glanceGnome on wayland at a glance
Gnome on wayland at a glance
 
My ubuntu life-dklee
My ubuntu life-dkleeMy ubuntu life-dklee
My ubuntu life-dklee
 
Vision and dream for youth startup company
Vision and dream for youth startup companyVision and dream for youth startup company
Vision and dream for youth startup company
 
Hw accelerated webkitgtk+ on raspberry pi
Hw accelerated webkitgtk+ on raspberry piHw accelerated webkitgtk+ on raspberry pi
Hw accelerated webkitgtk+ on raspberry pi
 
Gnome.asia.summit2013 report-pdf
Gnome.asia.summit2013 report-pdfGnome.asia.summit2013 report-pdf
Gnome.asia.summit2013 report-pdf
 
System hacking basics
System hacking basicsSystem hacking basics
System hacking basics
 

Korean input overview in the linux desktop

  • 1. 리눅스 데스크톱의 한국어 입력 개요 2018.05.19 Changwoo Ryu <cwryu@debian.org>
  • 3. 하드웨어 ● Intel 8042 (AT 이후, “PS/2” 키보드 컨트롤러) ○ 요즘은 one-chip으로 메인 보드 칩셋에 내장 ● USB HID (Human Interface Device) class ● Bluetooth HID (Human Interface Device) profile ● 각 표준에서 정한 하드웨어 키 코드가 (또는 “hardware scancode”) 입력됨.
  • 4. OS ● Linux “input” subsystem 키코드로 변환 ● Documentation/input/event-codes.txt ● /usr/include/linux/input-event-codes.h ● 리눅스 드라이버에서 하드웨어 코드를 리눅스 이벤트 코드 (“event code”) 변환 ● "evdev" 인터페이스를 통해 유저랜드에서 접근 (/dev/input/event0)
  • 5. GUI server (xorg / wayland compositor) ● (libinput - 키보드 포함 각종 입력 처리) ● XKB - 입력된 HW/OS 의존 키 코드를 논리적 코드로 (“key symbol”) 변환 ○ 사용자 설정에 따라 달라짐. 예: Dvorak 사용, 독일어 AZERTY 레이아웃 사용 ○ /usr/include/xkbcommon/xkbcommon-keysyms.h ○ 이름처럼 xorg용으로 만들어졌지만 wayland에서도 계속 사용 ○ 한국어용 설정도 있음 - 오른쪽 Alt/Ctrl를 한영전환/한자 키로 바꾸기 ● 한글? ○ XKB_KEY_Hangul_Kiyeog 등 한글 심볼 정의가 들어 있음 (?!) ○ 하지만 사용하지 않고 한글 입력할 때도 알파벳 사용. 그렇게 하려면 한영 전환, 두벌식 세벌식 설정 등을 GUI server에서 처리해야 하는데 어려움 ● 이 키 이벤트가 포커스가 있는 app으로 전달되는데..
  • 6. GUI client ● 이 key event를 받아서 아무 생각 없이 symbol을 뿌리면 서양 전용 GUI가 됨 ● 텍스트 입력 상황일 경우, 이 event를 “입력기”에 의뢰를 하고 결과물 텍스트를 받아옴
  • 7. 입력기 용어 ● 입력기 (input method) ○ server - ibus 등의 입력기 ○ client - 각 GUI app, 보통 GTK+같은 GUI toolkit에서 처리 ● 동작 ○ preedit - 입력 중인 글자 ■ root - 디스플레이의 구석에 표시 - 사용자 시선 분산으로 불편 ■ off-the-spot - 해당 입력 창의 한 구석에 표시 - 마찬가지로 불편 ■ over-the-spot - 입력 위치 위에 겹쳐서 쓰기 - font나 style 불일치 등의 문제 흔히 발생 ■ on-the-spot - client가 직접 쓰기 - 가장 이상적이지만 GUI toolkit마다 고려해야 함 ○ candidate - 사전 선택, 일본어/중국어의 경우에는 고려할 게 많음 ○ commit - 확정된 입력 텍스트
  • 8. XIM ● X Input Method ● 1993-1994, 아직도 최후의 대안인 레가시 ● 실패 이유 ○ 다른 X11 명세와 마찬가지로 spec이 너무 일반적 ■ root, off-the-spot, over-the-spot, on-the-spot 클라이언트별로 다른 방식을 모두 지원하자 니 위치 정보 전달, 폰트 정보 전달 등 걸림돌이 많음 ■ ibus, uim도 over-the-spot, on-the-spot 정도만 구현 ○ reference 코드가 (IMdkit) 완전하지 않았고 버그 많았음 ○ GUI toolkit인 Motif의 구현도 버그 많았고 closed-source라 고칠 수 없었음
  • 9. 시나리오 - XIM X server App XIM server Event Event Preedit, Commit
  • 10. IBus, UIM, FCITX 등 입력기 프레임워크 ● 다국어 입력 등 편리 ● GUI toolkit마다 입력기 플러그인(“immodule”)을 붙일 수 있게 되면서 용이해짐 ○ gtk 2 이후, qt 3 이후 ● 장점: 각각의 모듈은 각자 역할에 집중하면 됨. 통신, 툴킷, UI 등에 신경 쓸 필 요가 적음. ● 단점: 모든 입력기가 각 GUI toolkit마다 특정 입력기에 대한 고려를 하는 상황
  • 11. IBus IBus daemon engine (hangul …) ibus client (gtk, qt) XIM compat XIM client ibus server candidate UI, settings, ...
  • 12. 시나리오 - IBus X / Wayland App IBus server Event Event Preedit, Commit
  • 13. GUI 서버에서 입력기 처리 ● wayland 프로토콜로 이런 게 있으나.. wl_input_method, wl_input_panel, wl_text_model ○ http://mirrors.ustc.edu.cn/kde- application/akademy/2012/slides/Wayland_Choosing_a_Better_Input_Method_Architecture_- _Michael_Hasselmann.pdf ○ ibus-wayland ○ weston에만 구현 ● mutter/gnome-shell 3.30 / 3.28.1 부터 “gtk-text-input” 프로토콜 추가 ● 직접 ibus에 연결해서 받은 결과물을 클라이언트에 전달 ● gtk에 ibus immodule 필요없어지고 wayland “gtk-text-input” 지원 필요 ● 장점: GUI toolkit에서 입력기 의존 처리가 필요 없음. 스크린 키보드, 필기 입력, 음성 입력 등 데스크톱 연동이 쉬움. ● 단점: 표준화가 쉽지 않음. gtk-text-input은 gtk/gnome 전용
  • 14. 시나리오 - IBus from GUI server gnome-shell / mutter App IBus server Event Preedit, Commit Preedit, Commit
  • 15. 보너스: libhangul ● “한글 오토마타” 알고리즘 구현 ● 키를 입력하면 그 상태의 commit과 preedit string 상태를 알 수 있다. ● 한자 사전 검색 HangulInputContext* hangul_ic_new(const char* keyboard); void hangul_ic_delete(HangulInputContext *hic); bool hangul_ic_process(HangulInputContext *hic, int ascii); const ucschar* hangul_ic_get_preedit_string(HangulInputContext *hic); const ucschar* hangul_ic_get_commit_string(HangulInputContext *hic);
  • 16. #include <hangul.h> #include <glib.h> #include <stdio.h> int main(int argc, char *argv[]) { HangulInputContext *ic = hangul_ic_new("2"); for (char* k = &argv[1][0]; *k; k++) hangul_ic_process(ic, *k); const ucschar* preedit = hangul_ic_get_preedit_string(ic); const ucschar* commit = hangul_ic_get_commit_string(ic); // encoding conversion and print char *str; str = g_ucs4_to_utf8(commit, hangul_syllable_len(commit, -1), NULL, NULL, NULL); printf("commit: %sn", str); g_free(str); str = g_ucs4_to_utf8(preedit, hangul_syllable_len(preedit, -1), NULL, NULL, NULL); printf("preedit: %sn", str); g_free(str); hangul_ic_delete(ic); } $ ./a.out rmsh commit: 그 preedit: 노 $
  • 17. 정리 ● 앞으로는? ○ 여러가지가 호환성 유지되면서 변화 ○ XIM은 없어지겠지… ○ 마지막 GUI server 쪽에서 입력기에 연결하는 방식이 더 발전적 ● 입력 문제는 입력기 탓만 하기에는 여러가지 엮인 소프트웨어가 많다 ○ 관련된 여러가지 데스크톱 소프트웨어의 이슈와 개발 방향에 관심이 필요