Wayland 클라이언트에서 입력기와 통신하는 방법을 찾고 있습니다

hardboiled65의 이미지

요즘 Wayland 클라이언트 프로그래밍에 푹 빠져 있습니다.

https://jan.newmarch.name/Wayland/index.html

이 사이트가 도움이 많이 됐는데 좀 오래되어 나름 최신 프로토콜을 적용하는 연습도 해봤습니다.

GUI 프로그램이 어떻게 돌아가는지 깊이있게 알고싶어서 GTK나 Qt에 의존하지 않고 직접 shared memory에 접근해 렌더링하는 방식으로 예제 애플리케이션들을 짜보고 있는데 대망의 한글 입력 부분을 구현할 단계가 되었습니다만.. 문제는 제가 리눅스에서 입력기가 어떻게 동작하는지 전혀 모른다는 점 입니다.

검색을 좀 해보니

https://tedyin.com/posts/a-brief-intro-to-linux-input-method-framework/

이런 글이 있더라구요. X11에서 직접 fcitx와 통신하는 방법인 것 같은데 여기에서는

XSetLocaleModifiers("@im=fcitx");

와 같이 직접 어떤 입력기를 지정을 해주더군요. /etc/environment 파일에 XMODIFIERS=@im=fcitx 라고 적어주는 방법의 하드코딩 버전? 인거 같습니다.

Wayland에서는 input_method랑 text_input 이라는 unstable 프로토콜이 있습니다. 근데 두 프로토콜의 명세를 살펴봐도 어떤 입력기와 통신할 것인지 명시하는 메소드는 발견하지 못했습니다. 응용 단에서 이 두 프로토콜을 전부 구현해야 하는지도 미지수구요.

그러던 와중에
https://en.opensuse.org/SDB:Enable_input_method_in_Wayland

이 페이지에서 INPUT_METHOD=fcitx 라는 처음 보는 환경변수를 발견했습니다. XMODIFIERS의 Wayland 버전이라는것 같은데 문제는 저 변수명으로 검색해도 별다른 문서가 없다는 겁니다.

제가 정확히 하고 싶은건 간단히 특정 이벤트 발생 시 input method를 활성화해서 입력을 받아 터미널에 글자를 출력해주는 단순 예제입니다. 거기까지만 할 수 있으면 다음 단계로 넘어가기 매우 수월할 것으로 생각합니다.

국내에도 한글 입력기를 구현해 본 분들이 꽤 있는걸로 알고 있습니다. 그래서 도움을 좀 받을 수 있지 않을까 싶어 이렇게 질문을 남겨 봅니다.
Wayland 상에서 돌아가게끔 입력기를 포팅해 본 경험이 있는 분이 직접 답변을 달아주신다면 영광이겠지만, 잘 정리된 관련 문서나 참고할 수 있는 소스코드를 알려주셔도 환영입니다.

입력기가 거의 한중일 주도로 개발되고 있는지라 영어로 된 문서를 찾기가 정말 어렵습니다. 모쪼록 이곳에서 도움을 받을 수 있으면 좋겠습니다.

익명 사용자의 이미지

해보진 않았는데,,, 다음과 같이 zwp_text_input_manager_v3 interface 가 있네요...

$ wayland-info | grep input
interface: 'zwp_text_input_manager_v3',                  version:  1, name: 25
interface: 'gtk_text_input_manager',                     version:  1, name: 26
$ 

아래에 보니깐, 설명이 있긴 한데... 해보진 않아서...
file:///usr/share/wayland-protocols/unstable/text-input/text-input-unstable-v3.xml

해보시고 결과좀 공유해주세요..

hardboiled65의 이미지

역시 영어로 된 문서는 찾아볼 수 없었고 다음과 같이 일본인 개발자분의 예제 코드를 발견할 수 있었습니다.
https://aznote.jakou.com/prog/wayland/p02_textinput.html

이걸 토대로 실제 동작하는 예제를 만들었습니다.
https://github.com/hardboiled65/WaylandClient-text-input

좋은 소식은 fcitx5를 이용해서 원하는 결과를 얻었다는 사실이고, 안좋은 소식은 어째서인지 그놈에서만 동작한다는 것입니다.. 참고로 저는 KDE를 메인으로 사용하고 있습니다. (글 쓰면서 다시 테스트 해보니 단축키가 안먹는 문제고 트레이 아이콘을 클릭하면 동작을 합니다. KWin의 버그라고 하더군요.)

fcitx5 개발자의 말에 따르면 zwp_text_input_manager_v3 인터페이스에 좀 결함이 있다고 하네요. 그래서 GTK나 Qt 에서는 dbus를 이용한 방식을 권장한다고 합니다. Wayland 클라이언트를 직접 구현하는 입장에서 매우 사기가 떨어지는 소식입니다...

새로운 소식이 있으면 또 들르겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.