SDL2 text input
SDL2는 많이 쓰는 툴킷으로 알고 있는데 인터넷 검색을 해봐도 관련 글이 보이지 않는다. 테스트해보기 위해 인터넷 검색을 해봐도 창 띄우는 예제 정도는 있는데 입력에 관한 예제는 잘 보이지 않았다. 가끔 있어도 파편으로만 보여줘서 SDL2 문외한 입장에서 실행해볼 엄두가 나지 않았다.
System and Tools Version
- Ubunt 20.04
- SDL2 2.0.12
- ibus 1.5.22-2ubuntu2.1
- fcitx 1:4.2.9.7-3
TESTIME
분석을 위해 SDL2 소스를 받고 test
디렉토리에서 testime.c
라는 소스를 발견했다.
빌드하려고 보니 configure.in
이런 것들이 보여 머리가 아파온다.
아직도 이런거 쓰나 보다.
꾹 참고 겨우 컴파일해서 돌려보니 화면이 뜬다.
- configure 결과
굳이 ibus나 fcitx를 왜 찾는지는 모르겠지만 일단 희망적이다.
Enabled modules : atomic audio video render events joystick haptic sensor power filesystem threads timers file loadso cpuinfo assembly
Assembly Math : mmx 3dnow sse sse2 sse3
Audio drivers : disk dummy oss alsa(dynamic) pulse(dynamic) sndio
Video drivers : dummy x11(dynamic) opengl opengl_es1 opengl_es2 vulkan
X11 libraries : xcursor xdbe xinerama xinput2 xinput2_multitouch xrandr xscrnsaver xshape xvidmode
Input drivers : linuxev linuxkd
Using libsamplerate : NO
Using libudev : YES
Using dbus : YES
Using ime : YES
Using ibus : YES
Using fcitx : NO
- testime screenshot
ibus
키보드 입력을 해보니 전혀 예상하지 못한 결과들이 나온다.
k
를 쳤을때 ㄱ
이 나오는 것은 맞는데 h
는 ㄴ
이 나오지 않고
뜬금없이 \
이 나오는걸까?
Gnome/Qt 앱들은 잘 돌아간다. 그렇지만 이 라이브러는 자체 모듈을 슨다고 하니 참고가 되지는 않을 것 같고…
INFO: unifont: Loaded 57086 glyphs.
INFO: Using font: unifont-9.0.02.hex
INFO: text editing "", selected range (0, 0)
INFO: text editing "", selected range (0, 0)
INFO: Keyboard: scancode 0x00000004 = A, keycode 0x00000061 = A
INFO: Keyboard: text input "a"
INFO: text inputed: a
INFO: Keyboard: scancode 0x000000E1 = Left Shift, keycode 0x400000E1 = Left Shift
INFO: text editing "", selected range (0, 0)
INFO: text editing "ㄱ", selected range (0, 1)
INFO: text editing "", selected range (0, 0)
INFO: Keyboard: text input "ㄱ`"
INFO: text inputed: aㄱ`
INFO: text editing "", selected range (0, 0)
INFO: text editing "", selected range (0, 0)
INFO: Keyboard: text input "\"
INFO: text inputed: aㄱ`\
INFO: text editing "", selected range (0, 0)
INFO: text editing "", selected range (0, 0)
INFO: Keyboard: text input "\"
INFO: text inputed: aㄱ`\\
INFO: text editing "", selected range (0, 0)
INFO: text editing "", selected range (0, 0)
fcitx
혹시나 하면서 fcitx로 입력기를 변경하고 테스트해 보았더니 한글이 입력됐다. 다만 F9 등을 눌러도 한자 변환은 되지 않는다.
INFO: unifont: Loaded 57086 glyphs.
INFO: Using font: unifont-9.0.02.hex
INFO: Keyboard: scancode 0x000000E0 = Left Ctrl, keycode 0x400000E0 = Left Ctrl
INFO: text editing "ㄱ", selected range (0, 1)
INFO: text editing "가", selected range (0, 1)
INFO: text editing "각", selected range (0, 1)
INFO: Keyboard: text input "가"
INFO: text inputed: 가
INFO: text editing "가", selected range (0, 1)
INFO: Keyboard: scancode 0x000000E0 = Left Ctrl, keycode 0x400000E0 = Left Ctrl
INFO: Keyboard: text input "가"
INFO: text inputed: 가가
INFO: Keyboard: scancode 0x00000028 = Return, keycode 0x0000000D = Return
글자 지우기는 한두 글자는 되는것 같은데 끝에 찌꺼기가 남았다가 하는 등 조금 부자연스럽지만 이건 간단한 테스트 프로그램이어서 그럴것이다.
결론
결론은 ibus 쓰지 말고 fcitx 쓰자인가?
다른 입력기에도 한번 테스트해볼까 했는데 잘못하면 잘 쓰는 조합이 망가질까 두립다. ibus도 immodule들 하고는 곹잘 동작하니 지금까지 썼을텐데 ibus protocol로는 이상한 일을 하는지 찜찜하다.
참고 1. SDL2 컴파일
autoconf로 컴파일할 경우 testime 가 시스템에 설치된 SDL2 라이브러리와 링크된다. 디버깅을 위해 방금 빌드된 라이브러리와 링크하고 싶은데 autoconf 툴들은 다루기 힘들어서 cmake로 컴파일했다.
mkdir build
cd build
cmake .. -DSDL_TEST=ON
make
cmake로 컴파일할 경우 입력기와 연결되지 않아 살펴보니 SDL_config.h
에 다음 항목이 없어서
더해 주고 컴파일 하니 동작한다.
/* Enable ime support */
#define SDL_USE_IME 1
참고 2. Input Method and wayland
XIM 입력기든 wayland든 아직 문제가 많은 것 같다.
그런데 wayland에서 입력 프로토콜이 있어야 하나? 그럼 XInput과 차이가 날게 있나?