Cim 명세: 공통 입력 방식 명세
본 문서는 Cim(Common Input Method) API를 명세하며, Linux 및 BSD 시스템에서 입력 방식의 단편화 문제를 해결하기 위한 표준 참조 문서로 사용됩니다. 본 명세서는 [RFC 2119] 및 [RFC 8174]에서 정의된 요구 사항 키워드(예: MUST, SHOULD, MAY)를 사용하며, Cim API의 설계, 인터페이스, 구현 고려 사항, 보안 대책, 그리고 미래 확장 방향에 대해 상세히 기술합니다.
1. 문서 상태
본 문서는 Cim API의 표준 참조 자료로 사용됩니다. 이 문서는 Cim이 왜 필요한지, 어떤 기능을 제공하는지, 그리고 구현 시 반드시 고려되어야 하는 주요 사항들을 명시합니다. Cim은 다양한 데스크탑 환경(예: GTK, Qt, X, Wayland)에서 일관된 키보드 입력 동작을 보장하기 위해 단편화된 입력 방식을 하나의 통합 C API로 통합하도록 설계되었습니다. 본 명세서는 Cim 플러그인 개발자, 애플리케이션 개발자, 그리고 시스템 통합 담당자가 Cim을 채택 및 확장할 때 참고 자료로 활용될 것을 의도합니다.
2. 요약 (Abstract)
본 문서는 Cim API의 설계와 구현을 명세합니다. Cim은 외부 라이브러리에 의존하지 않는 순수 C API를 제공하여 Linux 및 BSD와 같은 운영체제에서 입력 방식의 단편화 문제를 해결합니다. 최신 C 표준—특히 C23 고정 크기 열거형을 활용함—을 통해 Cim은 이진 호환성과 API 안정성을 MUST 보장합니다. 그 결과, 개발자들은 불필요한 플랫폼별 중복 구현을 줄이고 최종 사용자에게 일관된 키보드 입력 경험을 제공할 수 있습니다.
3. 문제점 (Problem Statement)
Linux와 BSD 환경에서는 XIM, Gtk IM API, Qt IM API, Wayland IM API와 같이 다양한 입력 방식이 단편화되어 존재합니다. 이와 관련하여 다음과 같은 주요 문제가 발생합니다:
- 입력 방식의 단편화: 각 입력 방식은 고유한 프로토콜과 라이브러리에 의존하므로, 개발자는 각 환경에 대해 별도의 지원을 MUST 구현해야 하며, 이로 인해 코드 중복 및 복잡성이 증가합니다.
- 환경 간 설정 불일치: 데스크탑 환경마다 키보드 레이아웃과 옵션 관리 방식이 달라, 어느 하나의 환경에서 적용된 설정이 다른 환경에 반영되지 않을 수 있습니다.
- 샌드박스 환경의 제약: Snap이나 Flatpak과 같이 격리된 실행 환경에서는 호스트 시스템의 입력 방식과 직접 통합하기 어려워, 결과적으로 입력 기능이 제한되거나 오작동할 수 있습니다. 이에 따라 입력 기능이 제한되거나 오작동할 가능성이 MAY 있습니다.
- 유지보수 부담: 단편화된 입력 방식을 개별적으로 관리해야 하므로, 기능 개선 및 업데이트에 대한 중복 작업이 발생하여 개발 및 유지보수 비용이 증가합니다.
Cim은 키보드 입력 방식을 관리하기 위한 통합 C API를 제공함으로써 이러한 문제들을 해결하도록 설계되었습니다.
4. 서론 (Introduction)
전통적으로 Linux와 BSD 환경에서는 다양한 입력 방식이 공존하여, 환경 간 전환 시 개발자와 사용자가 일관되지 않은 동작과 복잡한 코드 유지보수 문제에 직면하곤 했습니다. Cim은 외부 종속성 없이 순수 C API를 제공함으로써 이러한 단편화 문제를 해소합니다. Cim의 주요 목표는 다음과 같습니다:
- 향상된 통합: Cim은 키보드 입력 이벤트와 텍스트 처리(프리에디트 및 후보 관리)를 하나의 통합 C API로 통합하여, 운영 환경 전반에 걸쳐 일관된 키보드 입력 처리를 보장합니다.
- 휴대성과 경량 설계: Cim은 외부 라이브러리에 의존하지 않고 전적으로 C로 구현되어, 다양한 플랫폼에 쉽게 적용할 수 있습니다.
- 이진 호환성: Cim API는 고정 크기 열거형을 사용함으로써 안정적인 이진 인터페이스와 버전 호환성을 보장합니다. (지원되는 플랫폼에서는 C23 고정 크기 열거형을 활용하며, 그 외의 경우에는 동등한 대체 메커니즘을 사용합니다.)
본 명세서는 Cim API의 전체 구조, 데이터 구조, 인터페이스 함수에 대해 상세히 기술하고, 보안 대책 및 미래 확장에 관한 가이드라인을 제공합니다.
5. 용어 정의 (Terminology)
본 명세서 전반에서 사용되는 용어는 다음과 같습니다:
- Input Method (IM): 사용자 입력(예: 키 입력, 음성, 제스처)을 처리하여 텍스트 또는 명령어로 변환하는 구성 요소입니다. (참고: 본 문서에서는 Cim 구현이 키 입력만 처리합니다.)
- Desktop Environment (데스크탑 환경): 창 관리자, 패널, 유틸리티와 같은 응용 프로그램들의 모음으로, 사용자에게 그래픽 인터페이스를 제공합니다. (예: GNOME, KDE)
- Plugin (플러그인): 호스트 애플리케이션의 핵심 코드를 변경하지 않고 기능을 확장할 수 있도록 동적으로 로드되는 모듈입니다. (예: 호스트 애플리케이션이 입력 기능을 확장하기 위해 Cim과 같은 입력 방식 플러그인을 사용할 수 있습니다.)
- Sandbox Environment (샌드박스 환경): 시스템 자원에 대한 무제한 접근을 제한하여 보안을 강화하기 위해, 코드가 격리되어 실행되는 환경입니다. (예: Snap, Flatpak)
- Fixed-Size Enum (고정 크기 열거형): 명시적으로 정의된 기본 크기(예: 8, 16, 32, 또는 64비트)를 사용하여 일관된 이진 표현을 보장하는 열거형입니다.
6. Cim 구성 방식 개요
6.1 개요
이 장에서는 Cim의 전체 구조와 주요 구성 요소들을 살펴봅니다. Cim은 서로 다른 입력 시스템들의 세부 차이를 추상화하여, 개발자가 하나의 일관된 C API를 통해 입력 처리를 관리할 수 있도록 설계되었습니다. 이 장에서는 Cim의 계층 구조, 모듈 간 상호 작용, 그리고 데이터 흐름 및 이벤트 처리를 중점적으로 다룹니다.
6.2 구성 요소
- 코어 플러그인 모듈
- API 계층: Cim의 외부 인터페이스를 구성하며, 애플리케이션이 직접 호출하는 함수들을 포함합니다.
- 입력 이벤트 핸들링: 다양한 시스템에서 발생하는 입력 이벤트(키보드, 마우스, 터치 등)를 통합하고 추상화하는 역할을 합니다.
- 동적 모듈 로딩: 필요한 입력 플러그인을 런타임에 활성화하거나 교체할 수 있는 유연성을 제공합니다.
- 브릿지 플러그인
- 입력 메소드 플러그인: XIM, Wayland, Gtk IM API, Qt IM API 등 특정 입력 시스템의 기능을 Cim API에 맞게 브릿지 역할을 수행합니다.
- 통합 설정 관리
- 환경 설정 추상화: 각 입력 시스템에서 사용하는 키보드 설정이나 지역화 설정 등의 차이를 내부적으로 통합하여, 애플리케이션은 이를 일관되게 다룰 수 있습니다.
- 상태 동기화: 샌드박스 환경 및 기타 제한된 환경에서도 전역 설정과의 동기화 문제를 해결하는 메커니즘을 포함합니다.
6.3 데이터 흐름 및 이벤트 처리
- 입력 이벤트 수집 다양한 하위 시스템에서 입력 이벤트를 받아 코어 모듈로 전달합니다.
- 이벤트 변환 및 라우팅 입력 이벤트를 공통의 형식으로 변환한 후, 해당 애플리케이션이나 데스크탑 환경에 맞게 라우팅합니다.
- 에러 핸들링 및 로그 기록 발생 가능한 에러 상황을 캡처, 통합 관리하며, 이를 로그 기록 및 알림 시스템과 연동합니다.
6.4 보안 및 안정성 고려사항
- 샌드박스 환경 지원 제한된 권한과 독립된 설정 환경에서도 문제 없이 동작할 수 있도록 설계된 아키텍처 부분을 설명합니다.
- 모듈 격리와 업데이트 각 플러그인 모듈의 독립성 유지, 그리고 업데이트 시 발생할 수 있는 호환성 문제를 방지하는 전략을 다룹니다.
6.5 확장성 및 미래 발전 방향
- 새로운 입력 시스템 대응 향후 추가될 수 있는 입력 방식에 대해 모듈식 확장을 어떻게 지원할 것인지 기술합니다.
- 커뮤니티와의 협력 Cim의 오픈 소스 모델을 활용하여 개발자, 사용자 커뮤니티와 어떻게 상호작용할지 논의합니다.
6.6 요약
Cim Architecture Overview 장은 Cim의 핵심 구성 요소와 동작 원리를 설명하며, 이를 통해 다양한 Linux 및 BSD 기반 환경에서 입력 문제를 통합하고 추상화하는 방법을 제시합니다. 이 구조는 개발자와 사용자 모두에게 일관되고 효율적인 입력 처리를 가능하게 하며, 향후 확장성에도 유연하게 대응할 수 있도록 설계되었습니다.
이 초안은 전반적인 Cim 아키텍처의 구성을 소개하고, 각 구성 요소의 역할 및 상호작용을 자세히 설명하는 데 중점을 두었습니다. 추가적인 세부 내용이나 수정사항이 필요하면 말씀해 주세요.
6. Cim Architecture Overview
Cim 시스템은 다음과 같은 주요 구성 요소로 이루어집니다:
- Cim API (cim.h):
- 버전 정의:
CIM_MAJOR_VERSION 1
CIM_MINOR_VERSION 0
CIM_MICRO_VERSION 0
- 조건부 정의: 최신 컴파일러(GCC ≥ 13, Clang ≥ 16) 환경에서는 C23 고정 크기 열거형을 채택하여 바이너리 호환성을 강화합니다.
- 버전 정의:
- 입력 이벤트 및 데이터 구조:
- CimEvent: 키 입력 이벤트를 나타내며, 키 눌림과 해제 이벤트(
CIM_EVENT_KEY_PRESS
,CIM_EVENT_KEY_RELEASE
)를 처리합니다. - 텍스트 속성 및 전처리:
CimTextAttr
는 언더라인, 하이라이트 등의 텍스트 속성을 정의합니다.CimPreedit
는 입력 전 처리 중인 텍스트와 관련 속성, 커서 위치를 관리합니다.
- 주변 텍스트:
CimSurround
구조체는 입력 컨텍스트 내 주변 텍스트 및 선택 영역 정보를 제공하며, 삭제 등의 편집 작업에 활용됩니다.
- 화면 좌표:
CimRect
는 커서 위치 설정 및 후보 목록 표시 영역 등에서 필요한 사각형 영역을 지정합니다.
- 후보 항목:
CimItem
과CimCandidate
는 입력 후보와 관련된 데이터를 체계적으로 관리합니다.
- 후보 선택:
CimSelection
은 후보 항목에서의 선택 위치(행과 열)를 정의합니다.
- CimEvent: 키 입력 이벤트를 나타내며, 키 눌림과 해제 이벤트(
- 콜백 메커니즘:
- 콜백 타입:
CimCbType
는PREEDIT_START
,PREEDIT_END
,PREEDIT_CHANGED
,COMMIT
,GET_SURROUND
,DELETE_SURROUND
,CANDIDATE_SHOW
,CANDIDATE_HIDE
,CANDIDATE_CHANGED
,CANDIDATE_SELECTED
등 다양한 입력 상태 변화를 나타냅니다.
- 콜백 마스크:
- 각각의 콜백 타입은 비트 마스크(
CIM_CB_*_MASK
)로도 정의되어 있어, 여러 콜백의 동시 활성화를 보다 효과적으로 제어할 수 있습니다.
- 각각의 콜백 타입은 비트 마스크(
- CimCallbacks 구조체:
- 실제 입력 이벤트 발생 시 호출할 함수 포인터들을 포함하며, 개발자는 이 인터페이스를 통해 자신의 입력 처리 로직을 Cim 시스템에 등록할 수 있습니다.
- 콜백 타입:
- 입력 컨텍스트 (CimIc):
- 구조체 정의:
CimIc
구조체는 포커스 전환(focus_in
,focus_out
), 초기화(reset
), 이벤트 필터링(filter_event
), 커서 영역 지정(set_cursor_pos
) 등 입력 컨텍스트 관련 기능을 함수 포인터를 통해 제공합니다.
- API 함수:
cim_ic_new()
,cim_ic_free()
,cim_ic_focus_in()
,cim_ic_focus_out()
,cim_ic_reset()
,cim_ic_filter_event()
,cim_ic_set_cursor_pos()
,cim_ic_set_callbacks()
,cim_ic_get_preedit()
,cim_ic_get_candidate()
,cim_ic_activate_candidate_item()
,cim_ic_change_candidate_page()
등 입력 컨텍스트 제어를 위한 함수들을 제공하며, 이를 통해 통합된 입력 처리 루틴을 구현합니다.
- 구조체 정의:
- 유틸리티 함수:
cim_get_cim_so_path()
는 활성 입력 플러그인(예:~/.config/cim.so
)의 경로를 반환하여, 플러그인 로딩 경로 확인이나 디버깅에 활용됩니다.
5. API Specification
5.1 데이터 구조 및 열거형
5.1.1 이벤트 및 텍스트 속성
- CimEventType:
- 정의: 입력 이벤트의 종류를 나타내며, 키의 눌림(
CIM_EVENT_KEY_PRESS
)과 해제를(CIM_EVENT_KEY_RELEASE
) 구분합니다. - 조건부 정의: 최신 컴파일러 지원 시 C23 열거형을 사용하여
int32_t
크기 및 고정성을 보장합니다.
- 정의: 입력 이벤트의 종류를 나타내며, 키의 눌림(
- CimEvent: c
typedef struct _CimEvent {
CimEventType type;
uint32_t state;
uint32_t keyval;
uint32_t keycode;
} CimEvent;
- 용도: 실제 키 입력 이벤트의 세부 사항(상태, 키 값, 키 코드)을 전달합니다.
- CimTextAttr 및 CimTextAttrType:
- 용도: 텍스트의 시각적 속성을 (예, 언더라인, 하이라이트) 지정합니다.
typedef struct _CimTextAttr {
CimTextAttrType type;
int pos;
int n_chars;
} CimTextAttr;
5.1.2 전처리 및 후보 관련 구조체
- CimPreedit: c
typedef struct _CimPreedit {
char* text;
CimTextAttr* attrs;
int attrs_len;
int cursor_pos;
} CimPreedit;
- 설명: 입력 중인 문장을 편집 전 상태로 유지하며, 속성 정보와 커서 위치를 포함합니다.
- CimSurround: c
typedef struct _CimSurround {
char* text;
int len;
int cursor_pos;
int anchor_pos;
} CimSurround;
- 용도: 주변 텍스트 정보를 전달하며, 특히 삭제 및 편집 작업을 위한 참조용으로 사용됩니다.
- CimRect: c
typedef struct _CimRect {
int x;
int y;
int width;
int height;
} CimRect;
- 설명: 입력 커서 관련 시각적 영역(예, 후보 목록 표시 영역 등)을 지정합니다.
- CimItem 및 CimCandidate:
- CimItem: 단일 후보 항목의 데이터 타입과 연결 데이터를 관리합니다.
- CimCandidate: 후보 항목의 배열 및 테이블 형태, 페이지 정보, 보조 텍스트(auxiliary text)와 관련 커서 위치를 포함합니다.
- CimSelection: 후보 목록에서 선택된 영역(시작/종료 행, 열)을 정의합니다.
5.2 콜백 인터페이스
5.2.1 콜백 타입 및 마스크
- CimCbType: 입력 상태 변화(예, 전처리 시작/종료, 내용 변경, 확정(commit), 후보 표시/숨김 등)를 식별하는 열거형입니다.
- CimCbMask: 각각의 콜백 이벤트에 대응하는 비트 마스크(
1 << <콜백 타입>
)를 정의하여 다양한 이벤트의 동시 처리를 가능하게 합니다.
5.2.2 CimCallbacks
c
typedef struct _CimCallbacks {
void (*preedit_start) (CimIc* ic, void* user_data);
void (*preedit_end) (CimIc* ic, void* user_data);
void (*preedit_changed) (CimIc* ic, const CimPreedit* preedit, void* user_data);
void (*commit) (CimIc* ic, const char* text, void* user_data);
const CimSurround* (*get_surround) (CimIc* ic, void* user_data);
bool (*delete_surround) (CimIc* ic, int offset, int n_chars, void* user_data);
void (*candidate_show) (CimIc* ic, int n_rows, int n_cols, bool show_aux, void* user_data);
void (*candidate_hide) (CimIc* ic, void* user_data);
void (*candidate_changed) (CimIc* ic, const CimCandidate* candidate, void* user_data);
void (*candidate_selected) (CimIc* ic, const CimSelection* selection, void* user_data);
void (*reserved_1) ();
void (*reserved_2) ();
void (*reserved_3) ();
void (*reserved_4) ();
void (*reserved_5) ();
void (*reserved_6) ();
} CimCallbacks;
- 용도: 애플리케이션 또는 입력 도구(IME)는 이 구조체에 자신만의 핸들러를 등록하여 입력 이벤트에 대응할 수 있습니다.
5.3 입력 컨텍스트 (CimIc)
- 구조체 설명:
CimIc
는 Cim API의 핵심 인터페이스로서, 입력 포커스의 전환, 이벤트 처리를 위한 함수 포인터들을 포함합니다. ctypedef struct _CimIc {
void (*focus_in) (CimIc* ic);
void (*focus_out) (CimIc* ic);
void (*reset) (CimIc* ic);
bool (*filter_event) (CimIc* ic, const CimEvent* event);
void (*set_cursor_pos) (CimIc* ic, const CimRect* area);
const CimPreedit* (*get_preedit) (CimIc* ic);
const CimCandidate* (*get_candidate) (CimIc* ic);
void (*set_vcallbacks) (CimIc* ic, va_list ap);
void (*activate_candidate_item) (CimIc* ic, int row, int col);
void (*change_candidate_page) (CimIc* ic, int page_index);
/* reserved members for future extension */
void (*reserved_1) ();
void (*reserved_2) ();
void (*reserved_3) ();
void (*reserved_4) ();
void (*reserved_5) ();
void (*reserved_6) ();
} CimIc;
- API 함수: Cim API는 다음과 같은 함수를 제공하여 CimIc의 생성, 제어, 해제를 지원합니다. c
CimIc* cim_ic_new (void);
void cim_ic_free (CimIc* ic);
void cim_ic_focus_in (CimIc* ic);
void cim_ic_focus_out (CimIc* ic);
void cim_ic_reset (CimIc* ic);
bool cim_ic_filter_event (CimIc* ic, const CimEvent* event);
void cim_ic_set_cursor_pos (CimIc* ic, const CimRect* area);
void cim_ic_set_callbacks (CimIc* ic, ...);
const CimPreedit* cim_ic_get_preedit (CimIc* ic);
const CimCandidate* cim_ic_get_candidate (CimIc* ic);
void cim_ic_activate_candidate_item (CimIc* ic, int row, int col);
void cim_ic_change_candidate_page (CimIc* ic, int page_index);
- 유틸리티 함수: c
char* cim_get_cim_so_path (void);
- 목적: 활성 플러그인 심볼릭 링크(
~/.config/cim.so
)의 경로를 반환합니다.
- 목적: 활성 플러그인 심볼릭 링크(
6. Plugin Deployment and System Integration
6.1 플러그인 위치 및 선택 방법
- 플러그인 배치:
- 입력 방법 플러그인은
/usr/lib/input.d/
경로에 배치합니다. 예:/usr/lib/input.d/im-sample.so
/usr/lib/input.d/im-nimf.so
/usr/lib/input.d/im-ibus.so
/usr/lib/input.d/im-uim.so
/usr/lib/input.d/im-fcitx.so
- 입력 방법 플러그인은
- 종료 플러그인 선택:
- 활성 플러그인은 사용자 홈 디렉터리 내
~/.config/cim.so
에 심볼릭 링크를 부여하여 선택합니다. - 예를 들어, sample 플러그인 사용: bash
ln -sf /usr/lib/input.d/im-sample.so ~/.config/cim.so
- fcitx로 변경 시: bash
ln -sf /usr/lib/input.d/im-fcitx.so ~/.config/cim.so
- 활성 플러그인은 사용자 홈 디렉터리 내
6.2 GUI 툴킷 및 데스크탑 환경 통합
- 환경 변수 설정: 다양한 데스크탑 환경(Gtk, Qt, X, Wayland)에서 Cim을 활용하기 위해 아래와 같이 환경 변수를 설정할 수 있습니다. bash
export QT_IM_MODULE="cim"
export GTK_IM_MODULE="cim"
export XMODIFIERS="@im=cim"
- 전용 플러그인:
- GTK 전용 플러그인:
/usr/local/lib/gtk-4.0/4.0.0/immodules/libim-cim-gtk4.so
/usr/local/lib/gtk-3.0/3.0.0/immodules/im-cim-gtk3.so
/usr/local/lib/gtk-2.0/2.10.0/immodules/im-cim-gtk2.so
- Qt 전용 플러그인:
/usr/local/lib/qt5/plugins/platforminputcontexts/libqt5im-cim.so
/usr/local/lib/qt6/plugins/platforminputcontexts/libqt6im-cim.so
- GTK 전용 플러그인:
- 데몬 (cimd):
- XIM 및 Wayland IM 같은 입력 통신이 필요한 경우, 데몬이 다음과 같이 구성됩니다.
- 실행 파일:
/usr/local/bin/cimd
- 플러그인:
/usr/local/lib/cimd/plugins/cim-xim.so
및/usr/local/lib/cimd/plugins/cim-wayland.so
- 실행 파일:
- XIM 및 Wayland IM 같은 입력 통신이 필요한 경우, 데몬이 다음과 같이 구성됩니다.
7. 구현 시 고려 사항 및 향후 방향
7.1. 고려 사항
- 의존성 제거: CIM API는 C 표준 라이브러리와 기본 데이터 타입만을 사용하여 외부 라이브러리에 의존하지 않도록 설계되었습니다. 이는 독립적이고 가벼운 구현을 가능하게 합니다.
- 바이너리 호환성 보장: 최신 컴파일러 환경에서 C23의 고정 크기 열거형(fixed-size enumerations)을 채택하여 인터페이스의 안정성과 호환성을 확보합니다.
- 확장성:
CimIc
와CimCallbacks
내에 예약된 함수 포인터를 활용해 미래 API 확장 가능성을 열어두었습니다.- 새로운 입력 방식 지원 및 Snap/Flatpak 플랫폼과의 호환을 위한 브릿지 모듈 개발도 고려하고 있습니다.
- Snap 및 Flatpak 환경 대응: 데스크탑 샌드박스 환경에서 CIM 플러그인의 로딩이 제한되는 상황에 대비해
$HOME/.config/cim.so
심볼릭 링크 방식을 제안하거나, 해당 플랫폼 개발자와 협력하여 문제를 해결할 계획입니다.
7.2. 통합 과정
- 기존 입력 방식(IM)과의 단계적 통합을 통해 안정적으로 전환을 시작합니다.
- 주요 데스크탑 환경(Gnome, KDE 등) 및 주요 배포판(Ubuntu, Fedora 등)에서의 광범위한 테스트를 진행합니다.
- 다양한 사용 사례를 기반으로 최적화 작업을 수행하여 성능과 안정성을 강화합니다.
7.3. 예상 결과
CIM 도입을 통해 다음과 같은 긍정적인 결과를 기대할 수 있습니다:
- 효율성 향상: 개발자는 환경별로 중복 작업을 최소화할 수 있어 생산성이 높아집니다.
- 사용자 경험 개선: 다양한 플랫폼에서 일관되고 매끄러운 입력 경험을 제공합니다.
- 샌드박스 환경 지원 강화: Snap 및 Flatpak 환경에서도 안정적이고 호환성 높은 동작을 보장합니다.
8. 결론
Cim Specification은 다양한 입력 방식의 단절 문제를 해소하기 위해 통합 C API를 제공하며, 모든 입력 도구 및 데스크탑 환경(gtk, qt, x, wayland 등)에서 일관된 입력 경험을 보장합니다. 개발자 입장에서는 단일 API 인터페이스로 기존의 분산된 입력 방법들을 통합할 수 있으며, 환경 구성 및 유지 보수가 크게 단순해집니다.
9. Appendix: Summary of Cim API (cim.h)
- 버전 상수:
CIM_MAJOR_VERSION
,CIM_MINOR_VERSION
,CIM_MICRO_VERSION
- 열거형 및 상수:
CimEventType
(키 이벤트: PRESS/RELEASE)CimTextAttrType
(UNDERLINE, HIGHLIGHT)CimItemType
CimCbType
(콜백 타입) 및CimCbMask
(비트 마스크)
- 주요 구조체:
CimEvent
,CimTextAttr
,CimPreedit
,CimSurround
,CimRect
,CimItem
,CimCandidate
,CimSelection
CimCallbacks
: 입력 이벤트 발생 시 호출할 함수 포인터 모음CimIc
: 입력 컨텍스트 인터페이스 (포커스 제어, 이벤트 필터링, 커서 위치, 후보 항목 처리 등)
- API 함수:
- 생성 및 해제:
cim_ic_new()
,cim_ic_free()
- 상태 전환 및 입력 처리 함수:
cim_ic_focus_in()
,cim_ic_focus_out()
,cim_ic_reset()
,cim_ic_filter_event()
,cim_ic_set_cursor_pos()
- 콜백 설정 및 정보 조회:
cim_ic_set_callbacks()
,cim_ic_get_preedit()
,cim_ic_get_candidate()
- 후보 목록 관리 함수:
cim_ic_activate_candidate_item()
,cim_ic_change_candidate_page()
- 유틸리티:
cim_get_cim_so_path()
- 생성 및 해제:
10. Further Discussion
향후 Cim 프로젝트에서는 다음과 같은 추가 논의 및 발전 방향이 고려됩니다:
- 확장 API 개발: 예약 함수 포인터를 활용하여 새로운 입력 이벤트나 확장 기능을 도입할 계획입니다.
- 사용자 구성 도구: 플러그인 선택을 직관적으로 할 수 있는 GUI 구성 도구 개발로 사용자 편의성을 강화합니다.
- 네이티브 샌드박스 지원: Snap이나 Flatpak과 같은 환경에서도 원활히 동작할 수 있도록 추가적인 브릿지 개선과 협력 방안을 모색합니다.