국제 언어 환경 설명서

6장 Complex Text Layout

Complex Text Layout(CTL) 확장은 Motif API가 아랍어, 히브리어 및 타이어에서 필요한 것과 같이 논리적 및 물리적 텍스트 표현 사이의 복잡한 변환을 필요로 하는 쓰기 시스템을 지원할 수 있도록 합니다. CTL Motif는 슬러, 구별 기호, 세그먼트 정렬과 같은 문자 모양을 제공하며 정적 및 동적 텍스트 위짓트의 변환을 지원합니다. 또한 오른쪽에서 왼쪽 및 왼쪽에서 오른쪽 텍스트 방향과 동적 텍스트 위짓트 탭을 지원합니다. 텍스트 렌더링은 표현 레이어를 통해 처리되기 때문에 다른 위짓트 라이브러리는 CTL을 지원하도록 쉽게 확장될 수 있습니다.

CTL 기술의 개요

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

특히, XomCTL은 기본 로켈 종속 PLS 모듈 변환이 제공하는 다음과 같은 복잡한 언어 모양과 재정렬 기능을 지원합니다.

CTL 구조의 개요

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

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

그림 6–1 CTL 구조

Graphic

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

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

New XOC 자원

다음 XOC 자원은 Solaris 9 환경이 제공합니다.

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 자원은 [XmNlayoutDirection 개요, 특히 XmStringDirectionXmNlayoutDirection 간의 상호 작용에 대한 설명은 Motif Programmer's Guide (Release 2.1)의 11.3절을 참조하십시오. ] 객체 레이아웃을 제어합니다. 아래와 같은 방식으로 LayoutObject의 방향 값과 상호 작용합니다.

레이아웃 방향 결정하기

XmNlayoutDirection XmDEFAULT_DIRECTION으로 지정되면 위짓트의 레이아웃 방향은 이를 제어하는 의사 XOC에서 작성시에 설정됩니다. 동적 텍스트(XmTextXmTextField)의 경우 관련 의사 XOC는 위짓트용으로 사용되는 XmRendition과 관련된 것입니다. 정적 텍스트(XmList, XmLabel, XmLabelG)의 경우 레이아웃 방향은 방향을 지정하는 첫 번째 복합 문자열에서 설정됩니다. 지정은 두 가지 중 한 가지 방법으로 수행됩니다:

직접 지정

구성 요소가 XmSTRING_COMPONENT_LAYOUT_PUSH 또는 XmSTRING_COMPONENT_DIRECTION 유형입니다.

간접 지정

구성 요소 유형이 XmSTRING_COMPONENT_LOCALE_TEXT, XmSTRING_COMPONENT_WIDECHAR_TEXT 또는 구성 요소의 관련 XmRendition 및 관련 LayoutObjectXmSTRING_COMPONENT_TEXT입니다.

XmNlayoutDirectionXmDEFAULT_DIRECTION으로 지정되어 있지 않고 XmNlayoutModifier @ls orientation 값이 레이아웃 수정자 문자열에 명시적으로 지정되어 있지 않으면 XmNlayoutDirection 값이 XOC 및 그 LayoutObject를 통해 전달됩니다.

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

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

XmStringDirection

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

XmNlayoutDirection 자원은 방향을 지정하는 구성 요소를 갖고 있지 않은 임의의 복합 문자열(XmString)에 대한 기본 렌더링 방향을 설정합니다. 따라서 레이아웃 방향을 설정하려면 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로 변경할 수 있습니다.

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

XmTextXmTextField

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

XmNrenditionTag

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

XmNalignment

위짓트에서 사용되는 텍스트 배열을 지정합니다. XmALIGNMENT_END XmALIGNMENT_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 인자를 통해 호출되면 인자가 없는 경우와 마찬가지로 삽입 커서를 이동시키며 현재 선택을 확장합니다.

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()는 해당 위짓트와 관련된 rendition의 현재 레이아웃 객체 설정 값에 액세스합니다. 편리한 함수를 이용해 레이아웃 객체 수정자 값이 변경되면 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 widget ,string 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 Arguments

다음 표는 UIL 인자를 보여줍니다.

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

XmNlayoutAttrObject

문자열 

XmNlayoutModifier

문자열 

XmNrenditionTag

문자열 

XmNalignment

정수 

XmNeditPolicy

정수 

CTL 응용프로그램 개발 방법

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

레이아웃 방향

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

XmText 위짓트의 경우 세로 방향도 지정해야 합니다. layoutDirection XmRIGHT_TO_LEFT로 설정하면 문자열 방향은 오른쪽에서 왼쪽으로 설정되지만 커서는 세로 방향으로 움직입니다. 세로 방향이 중요하고 위에서 아래로 정렬할 필요가 있으면 반드시 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM 을 지정하십시오. 이 경우 구성 요소들은 오른쪽에서 왼쪽으로, 그리고 위에서 아래로 배치되어 원하는 동작이 이루어집니다.

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

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

Graphic

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

그림 6–2 레이아웃 방향

Graphic

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

Rendition 만들기

다음 코드는 XmNlabelString이 유형 XmCHARSET_TEXT XmLabel을 태그가 “ArabicShaped.”인 Rendition을 사용해 만듭니다. Rendition은 “ar” (아랍어 로켈용 로켈 이름에 해당)의 XmNlayoutAttrObject 와 출력 버퍼용으로 NUMERALS_CONTEXTUALNumerals 값과 “유니코드-3.0.”의 ShapeCharset 값을 지정하는 레이아웃 수정자를 사용해 작성됩니다.

로켈 지향 레이아웃 모듈은 입력 텍스트를 16비트 유니코드 3.0 코드 세트를 사용해 코드화된 실제 문자의 출력 버퍼로 전송합니다. 명시적 레이아웃 로켈은 지정되어 있기 때문에 이 텍스트는 런타임 로켈 설정에 관계 없이 올바로 렌더링됩니다. 이 예에서는 입력이 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);

Rendition 편집하기

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

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

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 (Open Group: Feb 1997; ISBN 1-85912-142-X; 문서 번호 C616)를 참조하십시오.

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

렌더 테이블을 만들기 전에 먼저 응용프로그램이 테이블의 일부인 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 탭 이동 동작

Graphic

마우스 선택

사용자가 마우스 버튼 1을 사용해 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\