국제 언어 환경 설명서

6장 Complex Text Layout

Complex Text Layout(CTL) 확장으로 Motif APIs가 논리적이고 실제적인 텍스트 표현 간의 복합적인 변형을 필요로 하는 쓰기 시스템을 지원할 수 있습니다. 아랍어, 히브루어, 태국어에는 그러한 변형이 필요합니다. CTL Motif는 합자, 분음 기호, 세그먼트 순서와 같은 문자 형성을 제공합니다. 정적 및 동적 텍스트 위짓트의 변형에 대한 지원도 동적 텍스트 위짓트에 대한 양방향 텍스트 기능과 동적 탭 표시와 함께 제공됩니다. 텍스트 렌더링은 표현 레이어를 통해 처리되기 때문에 다른 위짓트 라이브러리는 CTL을 지원하도록 쉽게 확장될 수 있습니다.

이 장은 다음 내용으로 구성되어 있습니다.

CTL 기술의 개요

새 기능을 활용하려면 사용자는 Portable Layout Services (PLS) 라이브러리와 적절한 언어 엔진을 가져야 합니다. CTL은 PLS를 언어 엔진에 대한 인터페이스로 사용하고 언어 엔진을 사용하여 텍스트가 렌더링되기 전에 텍스트를 변형합니다. CTL을 지원하는 응용프로그램은 CTL 설명서의 설명과 같이 추가 자원을 포함해야 합니다.

특정적으로, XomCTL은 기본적인 로켈 종속적 PSL 모듈 변형에 의해 제공되는 다음과 같은 복잡한 언어 형성과 재정렬 기능을 지원합니다.

CTL 구조의 개요

CTL 구조는 그림 6–1과 같이 구성됩니다. 스택 상부에 있는Dt Apps는 텍스트 렌더링을 위해 Motif CTL 기능을 사용합니다. Motif는 PLS를 사용하여 로켈 특정 언어 엔진과 인터페이스를 이루고 위치 변화, 숫자 모양 등을 지원하는 변환을 수행합니다.

CTL 구조는 로켈 특정 엔진을 가진 새로운 언어를 지원합니다. 다시 말해서, 타이어와 베트남어에 대한 지원은 Motif 또는 Dt Apps의 변경 없이 추가될 수 있습니다.

그림 6–1 CTL 구조

그래픽에 대한 설명은 이전 컨텍스트를 참조하십시오.

X 라이브러리 기반 응용프로그램에 대한 CTL 지원

XomCTL(X 라이브러리 출력 모듈의 Complex Text Layout 지원)은 모든 순수 X 윈도우 응용프로그램(X 기반 단말기 에뮬레이터)이 CTL 지원을 갖도록 합니다. XomCTL은 X11 단순 글꼴 지원을 포함하는 완전 기능 개방형 소스 XI18N 구현을 제공합니다.

XOC 자원

다음 XOC 자원은 현재 Solaris 환경에서 지원됩니다.

XNText

사용자가 CTL 작업이 수행되어야 하는 텍스트 버퍼를 설정할 수 있도록 합니다.

XNTextLayoutNumGlyphs

텍스트 버퍼에 있는 텍스트의 글리프 수를 알려줍니다.

XNTextLayoutModifier

Motif의 XmNLayoutModifier와 동일합니다.

XNTextLayoutProperty

PLS 특성, 입력 대 출력 및 출력 대 입력과 동일합니다.

XNTextLayoutMapInpToOut

PLS 특성, 입력 대 출력 및 출력 대 입력과 동일합니다.

XNTextLayoutMapOutToInp

PLS 특성, 입력 대 출력 및 출력 대 입력과 동일합니다.

이 자원에 대한 설명은 X/Open 또는 PLS 이식 가능 서비스의 사양에서 얻을 수 있습니다.

CTL 기술 지원을 위한 Motif 변경 사항

Motif의 다음 변경 사항은 CTL 기술을 지원합니다:

XmNlayoutDirection

객체 레이아웃을 제어합니다.

XmStringDirection

시스템이 문자열의 문자들을 표현하는 방향을 지정합니다.

XmRendition

XmRendition에 가상 자원을 추가합니다.

XmTextXmTextField

XmRendition과 연관된 텍스트의 레이아웃 동작에 영향을 미칩니다.

XmTextFieldGetLayoutModifier

rendition 레이아웃 객체의 레이아웃 수정자 문자열을 반환합니다.

XmTextGetLayoutModifier

위짓트와 관련된 rendition의 현재 레이아웃 객체 설정 값을 반환합니다.

XmTextFieldSetLayoutModifier

rendition에 결합된 레이아웃 객체용 레이아웃 수정자 값을 설정합니다.

XmTextSetLayoutModifier

위짓트와 관련된 rendition의 레이아웃 객체 설정을 수정합니다.

XmStringDirectionCreate

복합 문자열을 작성합니다.

XmNlayoutDirection 자원

XmNlayoutDirection 자원은 객체 레이아웃을 제어합니다. 이 자원은 아래와 같은 방식으로 LayoutObject의 방향 값과 상호 작용합니다.

XmNlayoutDirection 개요, 특히 XmStringDirectionXmNlayoutDirection 간의 상호 작용에 대한 설명은 Motif Programmer's Guide (Release 2.1)의 11.3절을 참조하십시오.

레이아웃 방향 결정하기

XmNlayoutDirectionXmDEFAULT_DIRECTION로 지정되면 위짓트의 레이아웃 방향은 만들어질 때 제어하는 의사 XOC에서 설정됩니다. 동적 텍스트(XmTextXmTextField)의 경우 의사 XOC는 위짓트에 대하여 사용되는 XmRendition와 연관된 것입니다. 정적 텍스트(XmList, XmLabel, XmLabelG)의 경우 레이아웃 방향은 방향을 지정하는 첫번째 복합 문자열 구성 요소에서 설정됩니다. 지정은 두 가지 중 한 가지 방법으로 수행됩니다:

XmNlayoutDirectionXmDEFAULT_DIRECTION으로 지정되지 않고 XmNlayoutModifier @ls orientation 값이 레이아웃 수정자 문자열에서 명시적으로 지정되지 않으면 XmNlayoutDirection 값은 XOC 및 해당하는 LayoutObject에 전달됩니다.

XmNlayoutDirectionXmNlayoutModifier @ls orientation 값이 명시적으로 지정되어 있으면 동작이 혼합됩니다. XmNlayoutDirection은 위짓트 객체 레이아웃을 제어하며 XmNlayoutModifier @ls orientation 값은 레이아웃 변환을 제어합니다.

기존 POSIX 로켈 모델에 대한 논리적 확장으로 컨텍스트 종속적 및 양방향 텍스트 변형을 처리하기 위한 이식 가능 함수의 설명은 CAE Specification: Portable Layout Services: Context-dependent and Directional Text(The Open Group: Feb 1997; ISBN 1-85912-142-X; 문서 번호 C616)를 참조하십시오. 이 설명서는 복합 텍스트 언어에 대한 지원을 제공하고자 하는 시스템 및 응용프로그램 프로그래머들을 위한 것입니다.

XmStringDirection 자원

XmStringDirection은 시스템이 문자열의 문자를 표시하는 방향을 지정하는 데 사용되는 유형입니다.

XmNlayoutDirection 자원은 해당 문자열의 방향을 지정하는 구성 요소가 없는 모든 복합 문자열(XmString)에 대하여 기본 rendering 방향을 설정합니다. 따라서 레이아웃 방향을 설정하려면 XmNlayoutDirection 자원을 위한 적절한 값을 설정해야 합니다. 특정 방향 구성 요소를 사용해 복합 문자열을 작성할 필요는 없습니다. 응용프로그램이 XmString을 렌더링하면 해당 응용프로그램은 방향이 명시된 문자열이 작성되었는지 확인합니다(XmStringDirection). 문자열에서 아무런 방향 구성 요소도 제공하지 않으면 응용프로그램은 현재 위짓트를 위한 XmNlayoutDirection 자원의 값을 확인하고 해당 값을 XmString을 위한 기본 렌더링 방향으로 사용합니다.

XmRendition 자원

CTL은 새로운 다음 표에 나열된 의사 자원을 XmRendition에 추가합니다. 의사 자원의 설명은 표를 참조합니다.

표 6–1 XmRendition의 새로운 자원

이름 

클래스/유형 

액세스 

기본값 

XmNfontType

XmCFontType/XmFontType

CSG 

XmAS_IS

XmNlayoutAttrObject

XmClayoutAttrObject/String

CG 

NULL

XmNlayoutModifier

XmClayoutModifier/String

CSG 

NULL

XmNfontType

Rendition 글꼴 객체의 유형을 지원합니다. CTL의 경우 이 자원의 값은 XmFONT_IS_XOC값이어야만 합니다. 값이 일치하지 않으면 XmNlayoutAttrObjectXmNlayoutModifier 자원이 무시됩니다.

이 자원의 값이 XmFont_IS_XOC이고 XmNfont 자원이 지정되지 않으면 작성될 때 XmNfontName 자원의 값이 XmNlayoutAttrObject 자원이 지정하는 로켈 또는 현재 로켈에서 XOC 객체로 변환됩니다. 도, XmNlayoutModifier 자원의 값은 XOC와 연관된 모든 레이아웃 객체에 전달됩니다.

XmNlayoutAttrObject

레이아웃 AttrObject 인자를 지정합니다. 자원은 XmRendition과 관련되어 있는 XOC와 관련된 레이아웃 객체를 작성하는데 사용됩니다. 이 문자열의 구문 및 의미에 대해서는 레이아웃 서비스 m_create_layout() 사양을 참조하십시오. 레이아웃 수정자 방향 출력값과 XmNlayoutDirection 위짓트 자원 간의 상호 작용에 대한 설명은 XmNfontType 설명을 참조하십시오.

XmNlayoutModifier

XmRendition용으로 XOC와 함께 사용된 레이아웃 객체에 전달될 레이아웃 값을 지정합니다. 문자열의 구문과 의미에 대한 내용은 CAE Specification을 참조하십시오.

XmRendition{Retrieve,Update}을 사용하여 이 자원을 설정하면 문자열은 이 rendition과 연관된 XOC와 연관된 레이아웃 객체에 전달됩니다. 이 메커니즘을 통해 레이아웃 서비스를 동적으로 구성할 수 있습니다. Orientation, Context, TypeOfText, TextShaping 또는 ShapeCharset이 변경되면 예상치 못한 동작이 나타날 수 있습니다.

추가 레이아웃 동작

XmNlayoutModifierXmRendition과 연관된 텍스트의 레이아웃 동작에 영향을 미칩니다. 예를 들어, 숫자의 레이아웃 기본 처리가 NUMERALS_NOMINAL인 경우 XmNlayoutModifier@ls numerals=nominal:national 또는 @ls numerals=:national로 설정하여 NUMERALS_NATIONAL로 변경합니다.

레이아웃 값은 다음 그룹으로 구분할 수 있습니다:

XmText and XmTextField 자원

Xm CTL은 Motif 2.0 CSText 위짓트 다음 패턴화되어 시각적으로 작동하는 이동 및 삭제 활동의 병렬 목록을 추가하여 XmTextXmTextField 를 확장합니다. 표준 Motif 2.1 TextTextField는 논리적 순서와 물리적 순서를 구분하지 않습니다. nextforward은 “오른쪽 방향”을 의미하고 previousbackward는 “왼쪽 방향.”을 의미합니다. 그러나 CSText는 적절한 구분을 하고 엄격하게 물리적인 이름(예를 들어, left-character (), delete-right-word() 등)로 새로운 동작 집합을 정의합니다. 이 활동 루틴 모두는 위짓트의 XmNlayoutDirection 에 민감하게 정의되며 적절한 다음 또는 이전 활동을 호출합니다.

Xm CTL 확장은 CSText 확장보다 다소 복잡합니다. Xm CTL 확장은 중립적 고정화를 포함한 의사 XOC에 의한 결정에 따라 위짓트의 전체 방향보다 커서를 둘러싼 물리적 문자의 구체적 방향에 민감합니다.

새로운 자원 이름을 사용하여 rendition 태그를 제공하고 배열을 제어하기 위한 선택 정책을 제어할 수 있습니다.

새로운 Xm CTL 활동 세트는 대략 {Move,Delete,Kill}, {Left,Right}, {Character,Word}의 조합으로 이루어지며 아래에 나열되어 있습니다. 활동 목록은 다음 표에 나와 있습니다.

표 6–2 Xm CTL의 새로운 자원

이름 

클래스/유형 

액세스 

기본값 

XmNrenditionTag

XmCRenditionTag/XmRString

CSG 

XmFONTLIST_DEFAULT_TAG

XmNalignment

XmCAlignment/XmRAlignment

CSG 

XmALIGNMENT_BEGINNING

XmNeditPolicy

XmCEditPolicy/XmREditPolicy

CSG 

XmEDIT_LOGICAL

XmNrendition 태그

위짓트에 대하여 사용되는, XmNrenderTable 자원에 있는 XmRendition의 rendition 태그를 지정합니다.

XmNalignment

위짓트에서 사용되는 텍스트 배열을 지정합니다. XmALIGNMENT_ENDXmALIGNMENT_CENTER만 지원됩니다.

XmNeditPolicy

위짓트, XmEDIT_LOGICAL 또는 XmEDIT_VISUAL에 대하여 사용되는 편집 정책을 지정합니다. XmEDIT_VISUAL의 경우에는 선택, 커서 이동 및 삭제가 시각적 스타일로 표시됩니다. 자원을 설정하면 표준 키보드 이동 및 삭제 이벤트에 대한 번역도 새 “시각적” 활동 목록이나 기존 논리적 활동으로 변경됩니다.

문자 방향 활동 루틴

forward-cell()backward-cell() 활동은 지정된 방향의 문자 방향을 질의합니다. 방향이 왼쪽에서 오른쪽 방향이면 해당하는 next-/forward- 또는 previous-/backward- 변수를 호출합니다.

문자 방향 추가 동작

이 동작은 중첩 수준에 대하여 레이아웃 서비스 변환 OutToInpProperty 버퍼를 사용하여 문자의 방향을 결정합니다. 따라서 위짓트의 동작은 로켈 지향 변환에 따라 달라집니다. OutToInp의 정보 또는 특히, Property 버퍼가 정확하지 않으면 위짓트는 예기치 않은 동작이 일어날 수 있습니다. 아울러, 로켈 지향 모듈이 본 사양의 범위를 벗어나면 양방향 편집 동작은 동일한 텍스트, 응용프로그램, 자원 값 및 LayoutObject 구성의 경우에도 플랫폼에 따라 차이가 있을 수 있습니다.

시각적 모드 활동은 셀 기반 동작의 표시입니다. 논리적 모드 활동은 논리적 문자 기반 동작을 유발할 수 있습니다. 예를 들어, delete-right-character() 작업은 디스플레이 셀에 해당하는 입력 버퍼 문자들을 삭제합니다. 즉, LayoutObject 변환 “속성” 바이트 “새 셀 표시 기호”가 1인 한 개의 입력 버퍼 문자 및 “새 셀 표시 기호”가 0인 뒤따르는 모든 문자입니다.

Property 버퍼에 대한 자세한 정보는 CAE Specificationm_transform_layout() 사양을 참조하십시오.

마찬가지로 backward-character()의 경우 삽입점은 입력 버퍼에서 한 문자 뒤로 이동되며 커서는 관련된 출력 버퍼 문자에 해당하는 시각적 위치로 복귀합니다. 따라서 복합적인 디스플레이 셀을 가로질러 이동하려면 여러 번 키 입력을 해야 함을 의미합니다; 커서는 삽입 지점이 “새로운 셀 표시 기호”가 0인 구별 기호 또는 합자 조각과 같은 입력 버퍼 문자에 걸쳐 이동함에 따라 실제로 표시 위치를 변경하지 않습니다.

이것은 삭제 작업이 논리/입력 버퍼 측이나 물리적/출력측의 디스플레이 셀 수준에서 일어난다는 것을 의미합니다. 입력 및 출력 버퍼 간의 1 대 1 대응이 성립되지 않기 때문에 엄격한 물리적 문자 대 문자 삭제를 위한 모드는 없습니다. 주어진 물리적 문자는 예를 들어 논리적 문자의 한 단편만을 나타낼 수 있습니다.

XmText 활동 루틴

다음 목록은 XmText 활동 루틴을 설명합니다.

left-character(extend)

XmNeditPolicyXmEDIT_LOGICAL이고 인자가 없이 호출되면 삽입 커서가 논리적으로 한 문자 뒤로 이동합니다. 삽입 커서가 줄의 시작 부분에 있으면 삽입 커서는 이전 줄의 논리적인 마지막 문자로 이동합니다. 그렇지 않으면 삽입 커서 위치는 변경되지 않습니다.

XmNeditPolicyXmEDIT_VISUAL이면 커서는 커서 위치의 왼쪽으로 이동합니다. 삽입 커서가 줄의 시작 부분에 있으면 삽입 커서는 이전 줄의 끝 문자로 이동합니다.

left-character()가 extend 인자와 함께 호출되면 삽입 커서는 인자가 없는 경우처럼 이동하고 현재 선택을 확장합니다.

left-character() 활동은 합리적인 값 XmCR_MOVING_INSERT_CURSOR을 가진 XmNmotionVerifyCallback 프로시저에 대한 호출을 생성합니다. extend 인자를 통해 호출되면 XmNgainPrimaryCallback 프로시저에 대한 호출을 생성할 수 있습니다. 자세한 정보는 Motif Programmer's Reference의 콜백 설명을 참조하십시오.

right-character(extend)

XmNeditPolicyXmEDIT_LOGICAL이고 아무런 인자가 없이 호출되면 삽입 커서가 논리적으로 한 문자 앞으로 이동합니다. 삽입 커서가 줄의 논리적인 끝 부분에 있으면 삽입 커서는 다음 줄의 논리적인 시작 부분으로 이동합니다.

XmNeditPolicyXmEDIT_VISUAL이면 커서는 커서 위치의 오른쪽으로 이동합니다. 삽입 커서가 줄의 끝 부분에 있으면 삽입 커서는 다음 줄의 시작 부분으로 이동합니다.

extend의 인자를 통해 호출되면 XmNeditPolicy는 인자가 없는 경우와 마찬가지로 삽입 커서를 이동시키고 현재의 선택을 확장합니다.

right-character() 활동은 합리적인 값 XmCR_MOVING_INSERT_CURSOR를 가진 XmNmotionVerifyCallback 프로시저에 대한 호출을 생성합니다. extend 인자를 통해 호출되면 이 활동은 XmNgainPrimaryCallback 프로시저에 대한 호출을 생성할 수 있습니다. 자세한 정보는 Motif Programmer's Reference의 콜백 설명을 참조하십시오.

right-word(extend)

XmNeditPolicyXmEDIT_LOGICAL이고 인자 없이 호출되면 삽입 커서가 논리적인 연속된 문자(있을 경우)의 논리적 시작 문자로 이동합니다. 그렇지 않으면 기존 단어의 논리적 끝 부분으로 이동시킵니다. 삽입 커서가 줄의 논리적인 끝 부분이나 줄의 논리적인 마지막 단어에 있으면 해당 커서를 다음 줄의 논리적인 첫 번째 단어로 이동시킵니다. 그렇지 않으면 기존 단어의 논리적 끝 부분으로 이동시킵니다.

XmNeditPolicyXmEDIT_VISUAL이고 인자가 없이 호출되면 삽입 커서를 줄 끝의 오른쪽 또는 뒤에 있는 첫 번째 흰 색 공백 문자 뒤 비 흰색 공백 문자로 이동시킵니다.

extend의 인자를 통해 호출되면 인자가 없는 경우와 마찬가지로 삽입 커서를 이동시키고 현재의 선택을 확장합니다.

left-word() 활동은 합리적인 값 XmCR_MOVING_INSERT_CURSOR을 가진 XmNmotionVerifyCallback 프로시저에 대한 호출을 생성합니다. extend 인자를 통해 호출되면 이 활동은 XmNgainPrimaryCallback 프로시저에 대한 호출을 생성할 수 있습니다. 자세한 정보는 Motif Programmer's Reference의 콜백 설명을 참조하십시오.

delete-left-character()

XmNeditPolicyXmEDIT_LOGICAL이면 delete-previous-char()에 상응합니다. XmNeditPolicyXmEDIT_VISUAL이면 정상 모드에서 널이 아닌 선택이 있는 경우 해당 선택을 삭제합니다. 그렇지 않으면 삽입 커서의 남은 문자를 삭제합니다. 추가 모드에서 널이 아닌 선택이 있으면 커서는 선택에서 사라지지 않고 XmNpendingDelete가 참으로 설정되며 해당 선택을 삭제합니다. 그렇지 않으면 선택에 영향을 미칠 수 있는 삽입 커서의 왼쪽 문자를 삭제합니다.

delete-left-character() 활동은 합리적인 값 XmCR_MODIFYING_TEXT_VALUE을 가진 XmNmodifyVerifyCallback 프로시저 및 합리적인 값 XmCR_VALUE_CHANGED을 가진 XmNvalueChangedCallback 프로시저에 대한 호출을 생성합니다.

delete-right-character()

XmNeditPolicyXmEDIT_VISUAL이면 delete-next-character()에 상응합니다. XmNeditPolicyXmEDIT_VISUAL이면 정상 모드에서 널이 아닌 선택이 있는 경우 해당 선택을 삭제합니다. 그렇지 않으면 삽입 커서의 오른쪽 문자를 삭제합니다. 추가 모드에서 널이 아닌 선택이 있으면 커서는 선택에서 사라지지 않고 XmNpendingDelete가 참으로 설정되며 해당 선택을 삭제합니다. 그렇지 않으면 삽입 커서의 오른쪽 문자를 삭제합니다. 이 활동은 선택에 영향을 미칠 수 있습니다.

delete-left-character() 활동은 합리적인 값 XmCR_MODIFYING_TEXT_VALUE을 가진 XmNmodifyVerify-Callback 프로시저 및 합리적인 값 XmCR_VALUE_CHANGED을 가진 XmNvalue-ChangedCallback 프로시저에 대한 호출을 생성합니다.

문자 구성, 묶음 기호 및 분음 부호를 지원하기 위해 일부 셀 기반 루틴이 구축됩니다. 다시 말해, 두 개 이상의 문자가 단일 표시 셀을 점유하는 도형 문자로 표현됩니다.

XmText 셀 활동 루틴은 다음 목록에서 설명합니다.

backward-cell(extend)

삽입 커서를 한 셀 뒤로 이동합니다. XmNeditPolicy XmEDIT_LOGICAL이면 삽입 커서는 현재의 셀보다 논리적으로 앞선 셀의 시작 부분으로 이동합니다. 그렇지 않으면 현재 셀의 시작 부분으로 이동합니다.

XmNeditPolicyXmEDIT_VISUAL이면 커서는 커서 왼쪽 셀의 시작 부분으로 이동합니다. prev-cell() 활동은 합리적인 값 XmCR_MOVING_INSERT_CURSOR을 가진 XmNmotionVerifyCallback 프로시저에 대한 호출을 생성합니다. extend 인자를 통해 호출되면 XmNgainPrimaryCallback 프로시저에 대한 호출을 생성할 수 있습니다. 자세한 정보는 Motif Programmer's Reference의 콜백 설명을 참조하십시오.

forward-cell(extend)

삽입 커서를 논리적인 다음 셀의 시작 부분으로 이동시킵니다. 그렇지 않으면 커서를 셀의 끝 부분으로 이동시킵니다. XmNeditPolicyXmEDIT_LOGICAL이면 커서는 한 셀 앞으로 이동합니다.

XmNeditPolicyXmEDIT_VISUAL이면 커서는 커서 위치 오른쪽의 셀의 시작 위치로 이동하고(있을 경우) 그렇지 않으면 현재 셀의 끝 부분으로 이동합니다. forward-cell() 활동은 합리적인 값 XmCR_MOVING_INSERT_CURSOR을 가진 XmNmotionVerifyCallback 프로시저에 대한 호출을 생성합니다. extend 인자를 통해 호출되면 XmNgainPrimaryCallback 프로시저에 대한 호출을 생성할 수 있습니다. 자세한 정보는 Motif Programmer's Reference의 콜백 설명을 참조하십시오.

XmTextFieldGetLayoutModifier 자원

XmTextFieldGetLayoutModifier()는 해당 rendition에 연결된 레이아웃 객체의 상태를 반영하는 레이아웃 수정자 문자열을 반환합니다.

XmTextFieldGetLayoutModifier()용 구문:

#include <Xm/TextF.h>string XmTextFieldGetLayoutModifier(Widget widget)

XmTextFieldGetLayoutModifier()는 위짓트에 연관된 renditin의 현재 레이아웃 객체 설정의 값에 액세스합니다. 편리한 함수를 이용해 레이아웃 객체 수정자 값이 변경되면 XmTextFieldGetLayoutModifier 함수가 변경된 값 뿐 아니라 레이아웃 객체의 전체 상태를 반환합니다.

XmTextFieldGetLayoutModifier()는 문자열 값 형태로 레이아웃 객체 수정자 값을 반환합니다.

XmTextGetLayoutModifier 자원

XmTextGetLayoutModifier()는 해당 rendition에 연결된 레이아웃 객체의 상태를 반영하는 레이아웃 수정자 문자열을 반환합니다.

XmTextGetLayoutModifier()용 구문:

#include <Xm/Text.h>String XmTextGetLayoutModifier(Widget widget)

XmTextGetLayoutModifier는 위짓트와 연관된 rendition의 현재 레이아웃 객체 설정의 값에 액세스합니다. 편리한 함수를 사용해 레이아웃 객체 수정자 값을 변경하면 XmTextGetLayoutModifier 함수는 변경된 값 뿐 아니라 전체 레이아웃 객체의 상태를 반환합니다.

XmTextGetLayoutModifier는 문자열 값의 형태로 레이아웃 객체 수정자 값을 반환합니다.

XmTextFieldSetLayoutModifier 자원

XmTextFieldSetLayoutModifier()는 해당 rendition에 연결된 레이아웃 객체의 동작을 변경하는 레이아웃 수정자 값을 설정합니다.

XmTextFieldSetLayoutModifier()용 구문:

#include <Xm/TextF.h> \
void XmTextFieldSetLayoutModifier(Widget \
widgetstring layout_modifier)

XmTextFieldSetLayoutModifier는 위짓트와 관련된 rendition의 레이아웃 객체 설정을 수정합니다. 편리한 함수를 사용해 레이아웃 객체 수정자 값이 설정되면 입력 매개변수에 지정된 속성들만이 변경됩니다; 그 밖의 속성은 바뀌지 않습니다.

XmTextSetLayoutModifier 자원

XmTextSetLayoutModifier()은 해당 rendition의 레이아웃 객체의 동작을 변경하는 레이아웃 수정자 값을 설정합니다.

XmTextSetLayoutModifier()용 구문:

#include <Xm/Text.h>void XmTextSetLayoutModifier(Widget widget,string layout_modifier)

XmTextSetLayoutModifier는 위짓트와 관련된 rendition의 레이아웃 객체 설정을 수정합니다. 레이아웃 객체 수정자 값이 이 편리한 기능을 사용하여 설정되면 입력 매개변수에 지정된 속성만 변경되고 나머지 속성은 변하지 않습니다.

XmStringDirectionCreate 자원

XmStringDirectionCreate복합 문자열을 작성합니다.

XmTextSetLayoutModifier()용 구문:

#include <Xm/Xm.h>XmString XmStringDirectionCreate(direction)XmStringDirection direction

XmStringDirectionCreate는 단일 구성 요소를 가진 복합 문자열을 주어진 값의 방향으로 작성합니다. 한편, XmNlayoutDirection 자원은 문자열을 위한 방향을 지정하는 구성 요소를 갖고 있지 않은 임의의 복합 문자열(XmString)을 위한 기본 렌더링 방향을 설정합니다. 따라서 레이아웃 방향을 설정하려면 XmNlayoutDirection 자원을 위한 적절한 값을 설정해야 합니다. 특정 방향 구성 요소를 갖는 복합 문자열을 만들 필요는 없습니다.

응용프로그램이 XmString을 렌더링하면 해당 응용프로그램은 방향이 명시된 문자열이 작성되었는지 확인합니다(XmStringDirection). 문자열에서 아무런 방향 구성 요소도 제공하지 않으면 응용프로그램은 현재 위짓트를 위한 XmNlayoutDirection 자원의 값을 확인하고 해당 값을 XmString을 위한 기본 렌더링 방향으로 사용합니다.

UIL 인자

다음 표는 UIL 인자 이름 및 유형을 보여줍니다.

표 6–3 UIL
 UIL 인자 이름 인자 유형

XmNlayoutAttrObject

String 

XmNlayoutModifier

String 

XmNrenditionTag

String 

XmNalignment

Integer 

XmNeditPolicy

Integer 

CTL 응용프로그램 개발하기

다음 절에서는 CTL 응용프로그램 개발법을 설명합니다.

레이아웃 방향 제어

복합 문자열의 방향은 영어, 스페인어, 프랑스어 및 독일어와 같이 왼쪽에서 오른쪽으로 쓰는 언어나 히브리어 및 아랍어와 같은 오른쪽에서 왼쪽으로 쓰는 언어의 텍스트 모두에 데이터 구조가 유용하도록 저장됩니다. Motif 응용프로그램에서는 VendorShell 또는 MenuShell에서 XmNlayoutDirection 자원을 사용해 레이아웃 방향을 설정할 수 있습니다. 관리자 및 프리미티브 위짓트(Gadgets 포함) 역시 XmNlayoutDirection 자원을 갖고 있습니다. 기본 값은 동일한 자원을 갖고 있는 가장 가까운 상위로부터 상속됩니다.

XmText 위짓트의 경우 가로 방향은 물론 세로 방향을 지정해야 합니다. layoutDirection XmRIGHT_TO_LEFT로 설정하면 문자열 방향은 오른쪽에서 왼쪽으로 설정되지만 커서는 세로 방향으로 움직입니다. 세로 방향이 중요하고 위에서 아래 방향 할당이 필요할 경우 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM을 지정하도록 하십시오. 이 설정은 구성 요소가 먼저 오른쪽에서 왼쪽으로 배치된 다음 위에서 아래로 배치되도록 지정하여 원하는 동작을 얻습니다.

XmTextTextField 위짓트의 동작은 XmRenditionXmNalignmentXmNlayoutModifier 자원의 영향도 받습니다. 이 자원들은 XmNlayoutDirection과 함께 텍스트 위짓트의 레이아웃 동작을 제어합니다. 이 동작은 그림 6–2에 표시되어 있습니다.

그림에서 사용된 입력 문자열:

이 그림은 동일한 행의 영어 및 아랍어 문자의 양방향 텍스트 레이아웃을 보여줍니다.

다음 그림을 위한 XmNlayoutModifier 문자열 @ls orientation= 설정 값은 왼쪽 열에 표시되어 있습니다.

그림 6–2 레이아웃 방향

그림은 왼쪽에서 오른쪽과 오른쪽에서 왼쪽 텍스트에 대한 시작 및 코드화 할당을 보여줍니다.

그림에서 보이는 바와 같이, XmNalignment는 레이아웃 방향에 따라 텍스트 오른쪽을 비울 것인지, 아니면 왼쪽을 비울 것인지를 지정합니다. XmNlayoutModifier는 텍스트를 세그먼트로 나눈 뒤 방향 값에 따라 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 배열합니다. 다시 말해 XmNlayoutDirectionXmRIGHT_TO_LEFT 이고 XmNAlignment 값이 XmALIGNMENT_BEGINNING 이면 문자열 오른쪽이 비워집니다.


예 6–1 Rendition 만들기

다음 코드 는 태그가 “ArabicShaped”인 렌더링을 사용하여 XmNlabelString이 유형 XmCHARSET_TEXTXmLabel을 만듭니다. Rendition은 “ar”(아랍어 로켈의 로켈 이름)의 XmNlayoutAttrObject와 출력 버퍼에 대하여 “iso8859–6”의 NUMERALS_CONTEXTUALShapeCharset 값의 Numerals을 지정하는 레이아웃 수정자 문자열로 만듭니다.

로켈 특정 레이아웃 모듈은 16비트 유니코드 코드 세트를 사용하여 입력 텍스트를 코드화된 물리적 문자의 출력 버퍼로 변환합니다. 명시적 레이아웃 로켈은 지정되어 있기 때문에 이 텍스트는 런타임 로켈 설정에 관계 없이 올바로 렌더링됩니다. 이 예에서는 입력이 ISO 8859–6으로 코드화됩니다.

int n;
Arg args[10];
Widget w;
XmString labelString;
XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
      /* alef lam baa noon taa - iso8859-6 */
labelString = XmStringGenerate("\307\344\310\346\312\", NULL
			                          XmCHARSET_TEXT, "ArabicShaped");
w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent,
                             XmNlabelString, labelString,
		                          XmNlabelType, XmSTRING,
                             NULL);
n = 0;
XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*");
      n++;
XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++;
XtSetArg(args[n], XmNlayoutModifier, 
          "@ls numerals=:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, argcs
s, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);


예 6–2 Rendition 편집하기

다음 코드는 단일 Rendition을 사용하여 TextField 위짓트와 RenderTable을 만듭니다. XmNlayoutAttrObject XmNlayoutModifier 의사 자원은 지정되지 않은 채로 남았으므로 NULL로 설정됩니다. 이 값은 Rendition 명령과 관련된 레이아웃 객체가 존재하는 경우 기본 로켈에 속한다는 것을 의미합니다.

이 예제가 올바로 작동하려면 로켈을 코드 세트가 ISO 8859-6이고 로켈 지향 레이아웃 모듈이 IMPLICIT_BASIC 알고리즘을 지원할 수 있는 로켈로 설정되어야 합니다. Rendition의 LayoutObjectImplicitAlg 값은 Rendition의 XmNlayoutModifier 의사 자원에 의해 수정됩니다.

int n;
Arg args[10];
Widget w;
	XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
w = XmCreateTextField(parent, "text field", args, 0);
n = 0;
	XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*");
     n++;
	XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);
	....
n = 0;
XtSetArg(args[n], XmNlayoutModifier, "@ls implicitalg=basic");
     n++;
XmRenditionUpdate(rendition, args, n);

자원 파일에서 렌더 테이블 만들기

응용프로그램의 국제화가 올바로 이루어지려면 Rendition과 렌더 테이블을 지정해야 합니다. 렌더 테이블이 파일에서 지정되면 프로그램 바이너리는 주어진 로켈의 요건에 독립적으로 만들어지므로 로컬 요건에 맞추어 쉽게 사용자 정의할 수 있습니다.

렌더 테이블은 다음 구문에 의해 리소스 파일에서 지정됩니다: resource_spec:[tag[,tag]*]

이 때 tag는 rendition의 XmNtag 자원에 적합한 일부 문자열입니다.

이 줄은 지정된 바와 같이 한 개 이상의 rendition을 포함한 최초의 렌더 테이블을 만듭니다. rendition은 지정된 태그에 부착됩니다:

resource_spec[*|.] rendition[*|.]resource_name:value

다음 예제에서는 리소스 파일을 사용해 설정할 수 있는 XmRendition과 관련된 CTL 자원들을 보여줍니다. 레이아웃 객체가 효과를 발휘하려면 fontTypeFONT_IS_XOC로 설정해야 합니다. @ls를 사용해 지정된 layoutModifier는 rendition 객체에 의해 레이아웃 객체에 전달됩니다.

layoutModifier을 사용하여 레이아웃 객체에서 설정될 수 있는 자원의 완전한 목록은 CAE Specification: Portable Layout Services: Context-dependent and Directional Text, The Open Group: Feb 1997; ISBN 1-85912-142-X; 문서 번호 C616을 참조하십시오.


예 6–3 응용프로그램에서 렌더 테이블 만들기

렌더 테이블을 만들기 전에 먼저 응용프로그램이 테이블의 일부인 rendition 중 최소 한 개를 작성해야 합니다. XmRenderTableAddRenditions() 함수는 이름이 암시하듯이 새 rendition으로 렌더 테이블을 증대시키는 데에도 사용됩니다. 새 렌더 테이블을 만들려면 기존 렌더 테이블 대신 NULL 인자로 XmRenderTableAddRenditions() 기능을 호출하십시오.

다음 코드는 XmFONT_IS_XOC에 설정된 XmNfontType으로 만든 rendition을 사용해 렌더 테이블을 만듭니다.

int n;
Arg args[10];
Widget w;
XmString labelString;
XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
      /* alef lam baa noon taa - iso8859-6 */
labelString = XmStringGenerate("\307\344\310\346\312\", NULL
			                           XmCHARSET_TEXT, "ArabicShaped");
w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent,
                            XmNlabelString, labelString,
		                         XmNlabelType, XmSTRING,
                            NULL);
n = 0;
XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*");
     n++;
XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++;
XtSetArg(args[n], XmNlayoutModifier, 
          "@ls numerals=nominal:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);

수평 탭

복합 문자열에는 텍스트의 위치를 제어하는 탭 문자가 들어있을 수 있습니다. 표시에서 이들 문자를 해석하기 위해 위짓트는 해당 복합 문자열에 효과를 주는 rendition에 대하여 탭 정지 목록을 참조합니다. 하지만 동적 위짓트인 TextField XmText는 rendition의 탭 자원을 사용하지 않습니다. 대신 위짓트는 8*(width of character 0) 공식을 사용해 탭 너비를 계산합니다.

탭 측정치는 복합 문자열 표시의 왼쪽 여백으로부터의 거리입니다. 레이아웃 방향이 오른쪽에서 왼쪽으로인 경우 거리는 오른쪽 여백으로부터 측정됩니다. 텍스트의 방향에 관계 없이(아랍어 오른쪽에서 왼쪽, 또는 영어 왼쪽에서 오른쪽), 탭은 레이아웃 방향(XmNlayoutDirection )에 의해 지정된 데로 오른쪽이나 왼쪽에 공백을 삽입합니다.

탭 뒤의 텍스트는 항상 탭 스톱에 맞추어집니다. 탭 스톱은 위짓트의 시작 위치부터 계산되며 XmNlayoutDirection의 영향을 받습니다. 탭의 동작과 텍스트 방향성 및 위짓트의 XmNlayoutDirection 과의 상호 작용은 다음 그림에 나타나 있습니다.

이 그림을 위한 입력은 abc\tdef\tgh입니다.

그림 6–3 탭 이동 동작

그림은 왼쪽에서 오른쪽, 오른쪽에서 왼쪽 텍스트에서 탭이 나타나는 모양을 보여줍니다.

마우스 선택

사용자는 마우스 버튼 1로 기본 선택을 합니다. 이 버튼을 누르면 기존 선택이 선택 해제되고 삽입 커서 및 앵커를 버튼을 누른 텍스트 위치로 이동합니다. 마우스 버튼 1을 누른 채 끌면 앵커와 포인터 위치 사이의 모든 텍스트가 선택되고 해당 범위 밖의 텍스트는 선택 해제됩니다.

선택된 텍스트는 자원의 영향을 받으며 XmNeditPolicy 자원은 XmEDIT_LOGICAL 또는 XmEDIT_VISUAL로 설정할 수 있습니다. 만일 XmNeditPolicyXmEDIT_LOGICAL로 설정되어 있고 선택된 텍스트가 양방향이면 선택된 텍스트는 연속적이지 않은 세그먼트의 모음이 됩니다. 논리 버퍼의 텍스트가 디스플레이와 1 대 1 대응이 이루어지지 않기 때문입니다.

결과적으로 양방향 텍스트의 논리적 문자의 연속적 버퍼는 렌더링될 때 연속적인 문자 스트림으로 만들어지지 않습니다. 거꾸로, XmNeditPolicy XmEDIT_VISUAL로 설정되면 선택된 텍스트는 시각적으로 연속적일 수 있지만 논리적 버퍼에서 세그먼트화되지 않습니다. 따라서 동일한 커서 포인트에서의 양방향 텍스트의 선택, 삭제 및 삽입 순서는 항상 동일한 결과를 가져오지는 않습니다.

키보드 선택

선택 작업은 마우스와 키보드로 수행할 수 있습니다. Shift와 화살표 키를 조합하여 텍스트를 선택할 수 있습니다.

선택된 텍스트는 자원의 영향을 받으며 XmNeditPolicy 자원은 XmEDIT_LOGICAL 또는 XmEDIT_VISUAL로 설정할 수 있습니다. XmNeditPolicy XmEDIT_LOGICAL로 설정되고 선택된 텍스트가 양방향이면 선택된 텍스트는 시각적으로 연속적인 것으로 보이지 않습니다. 논리 버퍼의 텍스트가 디스플레이와 1 대 1 대응이 이루어지지 않기 때문에 양방향 텍스트의 논리적 문자의 연속적 버퍼는 렌더링될 때 연속적인 문자 스트림을 만들어내지 않습니다.

거꾸로, XmNeditPolicy XmEDIT_VISUAL로 설정되면 선택된 텍스트는 시각적으로 연속적일 수 있지만 논리적 버퍼에서 세그먼트화되지 않습니다. 따라서 동일한 커서 포인트에서의 양방향 텍스트의 선택, 삭제 및 삽입 순서는 항상 동일한 결과를 가져오지는 않습니다.

텍스트 자원 및 기하학

다음 텍스트 자원은 기하학과 관련이 있습니다.

이식 관련 지침

Complex Text Layout (CTL)용으로 활성화된 새 Motif 라이브러리는 /usr/dt/lib/libXm.so.4 에 있습니다. 응용프로그램이 libXm.so.3에 연결되면 CTL을 지원하지 않습니다. ldd app_name은 응용프로그램이 연결할 라이브러리를 보여줍니다. CTL을 활성화하기 위해 기존 응용프로그램을 이식하려면 다음 단계를 따라야 합니다.

  1. -DSUN_CTLMakefile 에 추가하십시오.

    이 플래그는 중요한 것으로 CTL을 지원하기 위해 필요한 데이터 구조를 포함하고 있습니다. 이 값은 컴파일 과정에서 설정해야 합니다.

  2. 기존 응용프로그램을 다시 컴파일하십시오.

    컴파일을 다시 하면 자동으로 CTL을 사용할 수 있는 Motif 라이브러리 libXm.so.4에 연결됩니다.

  3. XmText.translations 자원을 응용프로그램 리소스 파일에 추가하십시오. 리소스가 없으면 로켈의 레이아웃 엔진이 실행되지 않습니다.

  4. 설명서에 첨부된 예제 응용프로그램을 참조하십시오.


주 –

fontName 자원에서 자신의 로켈에 적합한 사용 가능한 글꼴 이름을 사용하십시오.


예를 들어, XmTextField 또는 XmText 위짓트에서 셀 기반 문자 이동(태국어)을 원하면 해당 위짓트의 번역을 다음과 같이 설정하십시오:

XmText.translations: #override \n\

<Key>osfRight:forward-cell() \n\

<Key>osfLeft:backward-cell() \n\

<Key>osfDelete:delete-next-cell() \n\

<Key>osfBackSpace:delete-previous-cell() \n\