/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/*
* nimf-xim.h
* This file is part of Nimf.
* Copyright (C) 2015-2024 Hodong Kim, All rights reserved.
* Unauthorized copying of this software, via any medium is strictly prohibited.
* Proprietary and confidential.
* Written by Hodong Kim <hodong@nimfsoft.art>
*/
#ifndef __NIMF_XIM_H__
#define __NIMF_XIM_H__
#include "nimf-utils.h"
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include "nimf-xim-conn.h"
#include "nimf-service.h"
#include "nimf-server.h"
#include "c-mem.h"
C_BEGIN_DECLS
#define C_XIM_DATA_B_LEN 20
typedef struct _CXimHeader
{
uint8_t major_opcode;
uint8_t minor_opcode;
uint16_t len;
} CXimHeader;
typedef struct
{
uint8_t byte_order;
uint8_t unused;
uint16_t major_version; /* client-major-protocol-version */
uint16_t minor_version; /* client-minor-protocol-version */
uint16_t n_auth_names; /* number of client-auth-protocol-names */
} CXimConnect;
/*
XIM_GET_IC_VALUES (IM library -> IM Server)
2 CARD16 input-method-ID
2 CARD16 input-context-ID
2 n byte length of ic-attribute-id
n LISTofCARD16 ic-attribute-id
p unused, p=Pad(2+n)
*/
typedef struct
{
uint16_t imid;
uint16_t icid;
uint16_t n_attr_ids;
} CXimGetICValues;
/*
XIM_FORWARD_EVENT (IM library <--> IM Server)
2 CARD16 input-method-ID
2 CARD16 input-context-ID
2 BITMASK16 flag
#0001 synchronous
#0002 request filtering (*1)
#0004 request lookupstring (*2)
2 CARD16 serial number
XEVENT X event
(*1) Indicate the receiver should filter events and possible preedit may be invoked.
(*2) Indicate the receiver should only do lookup string. The IM Server is expected
to just do a conversion of the key event to the best candidate. This bit may
affect the state of the preedit state (e.g. compose of dead key sequences).
*/
typedef struct
{
uint16_t imid;
uint16_t icid;
uint16_t flag;
uint16_t serial;
} CXimForwardEvent;
typedef struct
{
uint16_t imid;
uint16_t icid;
int16_t x;
int16_t y;
} CXimExtMove;
typedef struct
{
uint16_t imid;
uint16_t unused;
} CXimPacketClose;
typedef struct
{
uint16_t imid;
uint16_t icid;
} CXimIC, CXimSync, CXimPacketDestroyIc, CXimSetIcFocus, CXimUnsetIcFocus,
CXimResetIc;
typedef union _CXimBody
{
CXimConnect conn;
CXimPacketClose close;
CXimPacketDestroyIc destroy;
CXimSetIcFocus set_ic_focus;
CXimUnsetIcFocus unset_ic_focus;
CXimResetIc reset_ic;
CXimIC ic;
CXimGetICValues icvs;
CXimSync sync;
CXimExtMove move;
} CXimBody;
typedef struct
{
CXimHeader header;
CXimBody body;
} CXimPacket;
/** BEGIN of replies and callbacks */
/* from the server to the client */
typedef struct
{
CXimHeader header;
uint16_t major_version;
uint16_t minor_version;
} CXimPacketConnectReply;
typedef struct
{
CXimHeader header;
/*
XIM_CLOSE_REPLY (IM Server -> IM library)
2 CARD16 input-method-ID
2 unused
*/
uint16_t imid;
uint16_t unused;
} CXimCloseReply;
typedef struct
{
CXimHeader header;
/* XIM_SET_EVENT_MASK
2 CARD16 input-method-ID
2 CARD16 input-context-ID
4 EVENTMASK forward-event-mask (*1)
4 EVENTMASK synchronous-event-mask (*2)
*/
uint16_t imid;
uint16_t icid;
uint32_t forward_event_mask;
uint32_t sync_event_mask;
} CXimSetEvevtMask;
typedef struct
{
CXimHeader header;
/*
XIM_ENCODING_NEGOTIATION_REPLY (IM Server -> IM library)
2 CARD16 input-method-ID
2 CARD16 category of the encoding determined.
#0 name
#1 detailed data
2 INT16 index of the encoding determinated.
2 unused
*/
uint16_t imid;
uint16_t category;
int16_t index;
uint16_t unused;
} CXimEncodingNegotiationReply;
typedef struct
{
CXimHeader header;
/*
XIM_SET_IM_VALUES_REPLY (IM Server -> IM library)
2 CARD16 input-method-ID
2 unused
*/
uint16_t imid;
uint16_t unused;
} CXimSetImValuesReply;
typedef struct
{
CXimHeader header;
uint16_t imid;
uint16_t icid;
} CXimCreateIcReply, CXimDestroyIcReply, CXimSetIcValuesReply, CXimSyncReq,
CXimSyncReply, CXimStatusStart, CXimStatusDone, CXimPreeditStart,
CXimPreeditDone;
typedef struct
{
CXimHeader header;
uint16_t imid;
uint16_t icid;
int32_t retval;
} CXimPreeditStartReply;
/***** End of replies and callbacks *****/
/* See: CXimAttr xim_attrs[] in nimf-xim.c
Caution: CXimAttr xim_attrs order mappings */
typedef enum {
XN_QUERY_INPUT_STYLE,
XN_RESOURCE_NAME,
XN_RESOURCE_CLASS,
N_IM_ATTRS
} NimfXimImAttrType;
/* See: CXimAttr xic_attrs[] in nimf-xim.c
Caution: CXimAttr xic_attrs order mappings */
typedef enum {
XN_INPUT_STYLE,
XN_CLIENT_WINDOW,
XN_FOCUS_WINDOW,
XN_FILTER_EVENTS,
XN_PREEDIT_ATTRIBUTES,
XN_STATUS_ATTRIBUTES,
XN_FONT_SET,
XN_AREA,
XN_AREA_NEEDED,
XN_COLORMAP,
XN_STD_COLORMAP,
XN_FOREGROUND,
XN_BACKGROUND,
XN_BACKGROUND_PIXMAP,
XN_SPOT_LOCATION,
XN_LINE_SPACE,
XN_PREEDIT_STATE,
XN_SEPARATOROF_NESTED_LIST,
N_IC_ATTRS
} NimfXimIcAttrType;
typedef struct _NimfXimConn NimfXimConn;
/*
XIMATTR
2 CARD16 attribute ID (*1)
2 CARD16 type of the value (*2)
2 n length of im-attribute
n STRING8 im-attribute
p unused, p = Pad(2+n)
The im-attribute argument specifies XIM values such as XNQueryInputStyle.
XICATTR
2 CARD16 attribute ID (*1)
2 CARD16 type of the value (*2)
2 n length of ic-attribute
n STRING8 ic-attribute
p unused, p = Pad(2+n)
(*1) XIMATTR and XICATTR are used during the setup stage and XIMATTRIBUTE and
XICATTRIBUTE are used after each attribute ID has been recognized by
the IM Server and the IM library.
*/
typedef struct
{
uint16_t id;
uint16_t type;
uint16_t name_len;
char *name;
} CXimAttr;
/*
* https://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.html' target="_blank">https://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.html#Data_Types
* value types of XIMATTR and XICATTR
*/
#define C_XIM_VALUE_TYPE_SEPARATOR 0
#define C_XIM_VALUE_TYPE_CARD8 1
#define C_XIM_VALUE_TYPE_CARD16 2
#define C_XIM_VALUE_TYPE_CARD32 3
#define C_XIM_VALUE_TYPE_STRING8 4
#define C_XIM_VALUE_TYPE_WINDOW 5
#define C_XIM_VALUE_TYPE_XIM_STYLES 10
#define C_XIM_VALUE_TYPE_X_RECTANGLE 11
#define C_XIM_VALUE_TYPE_X_POINT 12
#define C_XIM_VALUE_TYPE_X_FONT_SET 13
#define C_XIM_VALUE_TYPE_XIM_HOT_KEY_TRIGGERS 15
#define C_XIM_VALUE_TYPE_XIM_STRING_CONVERSION 17
#define C_XIM_VALUE_TYPE_XIM_PREEDIT_STATE 18
#define C_XIM_VALUE_TYPE_XIM_RESET_STATE 19
#define C_XIM_VALUE_TYPE_NESTED_LIST 0x7fff
/*
https://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.html' target="_blank">https://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.html#common_extensions
*/
#define XIM_EXTENSION 128
#define XIM_EXT_SET_EVENT_MASK 0x30
#define XIM_EXT_MOVE 0x33
typedef struct
{
uint16_t major_opcode;
uint16_t minor_opcode;
uint16_t len;
char *name;
} CXimExt;
typedef struct _NimfXim NimfXim;
struct _NimfXim
{
NimfService base;
NimfServer* server;
CSource* xsource;
CRef *received;
CHashMap *conns;
/* client_windows: client window -- ims_window mapping
* This is to prevent memory leaks.
* xterm does not send XIM_DISCONNECT. This leads to memory leaks.
* When the server receives a DestroyNotify, the server finds the ims_window
* corresponding to the client window and removes it.
*/
CHashMap *client_windows;
Display* display;
CHashMap* xim_attr_map;
CHashMap* xic_attr_map;
CXimAttr* xim_attrs;
CXimAttr* xic_attrs;
CHashMap* ext_map;
CHashMap* imids; /* hashmap for creating a unique id from a connection. */
Window im_window;
XIMStyles im_styles;
uint32_t im_event_mask;
Atom atom_xconnect;
Atom atom_protocol;
Atom atom_locales;
Atom atom_transport;
Atom atom_xim_servers;
Atom atom_server;
int error_code;
bool active;
bool is_dispatched;
bool full_sync;
uint8_t byte_order;
#ifdef DEBUG
int depth;
#endif
};
bool nimf_xim_wait (NimfXim *xim, uint16_t icid, uint16_t major_opcode);
C_END_DECLS
#endif /* __NIMF_XIM_H__ */
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.