國際語言環境指南

第 6 章 複合文字版面配置

複合文字版面配置 (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 架構

前面的文字內容說明該圖形。

基於 X Library 的應用程式的 CTL 支援

XomCTL (X 程式庫輸出模組中的複合文字版面配置支援) 可使所有純 X Windows 應用程式 (例如 X 基礎的終端機模擬器) 具備 CTL 支援。XomCTL 提供包含了 X11 無智型字型支援的完整功能之 Open Source XI18N 實施。

XOC 資源

在目前 Solaris 環境中,提供下列 XOC 資源:

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

傳回產生版面配置物件的版面配置修飾元字串

XmTextGetLayoutModifier

傳回因視窗元件而產生的目前版面配置物件設定

XmTextFieldSetLayoutModifier

設定產生版面配置物件所必需的版面配置修飾元值

XmTextSetLayoutModifier

修改因視窗元件產生的版面配置物件設定

XmStringDirectionCreate

建立複合字串

XmNlayoutDirection 資源

XmNlayoutDirection 資源會控制物件版面配置。此資源以下述方式與 LayoutObject 的方向值交互影響。

如需 XmNlayoutDirection 的概述,請參閱 Motif「Programmer's Guide」(2.1 版) 第 11.3 章節,其中特別說明了 XmStringDirectionXmNlayoutDirection 之間的交互關係。

決定版面配置方向

XmNlayoutDirection 指定為 XmDEFAULT_DIRECTION 時,視窗元件的版面配置方向會在建立時從管理虛擬 XOC 中設定。如果是動態文字 (XmTextXmTextField),視窗元件會使用與 XmRendition 相關聯的管理虛擬 XOC。如果是靜態文字 (XmListXmLabelXmLabelG),版面配置方向是從指定方向的第一個複合字串元件設定的。此種規格以兩種方式的其中一種出現:

如果 XmNlayoutDirection 未指定為 XmDEFAULT_DIRECTIONXmNlayoutModifier @ls orientation 值未在版面配置修飾元字串中明確指定,則 XmNlayoutDirection 值會傳遞到 XOC 及其 LayoutObject

同時明確指定 XmNlayoutDirectionXmNlayoutModifier @ls orientation 值會混淆行為。XmNlayoutDirection 控制視窗元件物件版面配置,而 XmNlayoutModifier @ls orientation 值則控制版面配置變換。

請參閱「CAE Specification: Portable Layout Services: Context-dependent and Directional Text」(The Open Group:Feb 1997;ISBN 1-85912-142-X; document number C616),以取得具移植性功能的說明,具移植性功能是用來處理依賴於上下文且為雙向文字的轉換,以做為現存 POSIX 語言環境模型的邏輯擴充。此文件是專為想要提供複合文字語言支援的系統和應用程式設計者所設計的。

XmStringDirection 資源

XmStringDirection 用來指定系統顯示字串字元之方向的資料類型。

針對任何不具有指定字串方向之元件的複合字串 (XmString),XmNlayoutDirection 資源會設定預設產生方向。因此,如果要設定版面配置方向,您必須為 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

指定產生的字型物件類型。若是 CTL,資源值必須是 XmFONT_IS_XOC 值。如果此值不相符,便會忽略 XmNlayoutAttrObjectXmNlayoutModifier 資源。

如果此資源的值是 XmFont_IS_XOCXmNfont 資源未指定,那麼在建立時,XmNfontName 資源的值會轉換到由 XmNlayoutAttrObject 資源指定之語言環境或目前語言環境中的 XOC 物件。此外,XmNlayoutModifier 資源的值會傳遞到任何與 XOC 相關聯的版面配置物件。

XmNlayoutAttrObject

指定版面配置 AttrObject 引數。此資源是用來建立與此 XmRendition 相關聯之 XOC 相關聯的版面配置物件。請參考版面配置服務 m_create_layout() 規格,以瞭解此字串的語法和語義。如需版面配置修飾元方向輸出值和 XmNlayoutDirection 視窗元件資源之間交互影響的說明,請參閱 XmNfontType 的說明。

XmNlayoutModifier

指定要傳遞到 XOC 的 XmRendition 所使用之版面配置物件的版面配置值。如需此字串的語法和語義,請參閱「CAESpecification」。

使用 XmRendition{Retrieve,Update} 來設定此資源,會導致字串被傳遞到與此產生相關聯之 XOC 相關聯的版面配置物件。您可以使用此機制來動態地配置版面配置服務。如果變更了 OrientationContextTypeOfTextTextShapingShapeCharset,可能會導致意外的行為。

其他版面配置行為

XmNlayoutModifier 會影響與 XmRendition 相關聯之文字的版面配置行為。例如,如果數字的版面配置預設處理是 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 產生回應,且會呼叫正確的 next-previous- 動作。

Xm CTL 延伸較 CSText 延伸略為複雜。Xm CTL 延伸不會對視窗元件的整體方向有所回應,但是會對虛擬 XOC (包括中性穩定) 所指定游標周圍的實際字元特定方向產生回應。

新的資源名稱可讓您控制選取策略、提供產生標籤和控制對齊。

新的 Xm CTL 動作集大致上是 {Character,Word}{Left,Right}{Move,Delete,Kill} 的交叉作用產物。下表將列出動作集。

表 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 的產生標記供視窗元件使用。

XmNalignment

指定視窗元件中使用的文字對齊方向。僅支援 XmALIGNMENT_ENDXmALIGNMENT_CENTER

XmNeditPolicy

指定供視窗元件使用的編輯策略,XmEDIT_LOGICALXmEDIT_VISUAL。在 XmEDIT_VISUAL 的情況下,選取、游標移動和刪除都是以視覺化的樣式呈現。設定此資源也會將一般的鍵盤移動和刪除事件解譯成新的「視覺」動作清單或現有的邏輯動作。

字元方向動作常式

forward-cell()backward-cell() 動作查詢指定方向的字元方向。如果方向是從左至右,這些動作會呼叫對應的 next-/forward-previous-/ backward- 變數。

字元方向的其他行為

動作會使用巢狀層的「版面配置服務」變換 OutToInpProperty 緩衝區來決定字元方向。因此視窗元件的行為取決於每個語言環境的特定轉換。如果 OutToInp 中的資訊,特別是 Property 緩衝區中的資訊不正確,視窗元件可能不會正常運作。尤其當特定語言環境的模組落在此規格之外的範圍時,同樣文字、應用程式、資源值和 LayoutObject 配置的雙向編輯行為在每個平台上會有所不同。

視覺模式動作會導致以顯示格為基礎的行為顯示出來。邏輯模式動作會導致以邏輯字元為基礎的行為。例如,delete-right-character() 作業會刪除與顯示顯示格對應的輸入緩衝區字元。也就是說,輸入緩衝區字元的整個 LayoutObject 變換 “property” 位元組「new cell indicator」是 1,而所有隨後字元的「new cell indicator」是 0。

如需 Property 緩衝區的詳細資訊,請參閱「CAE Specification」中的 m_transform_layout() 規格。

同樣的,就 backward-character() 而言,插入點會在輸入緩衝區中往後移動一個字元,而游標會重現在對應相關輸出緩衝區字元的可視位置。因此,有好幾個按鍵必須移過複合顯示格。當插入點移過像是分音符或連音符片段 (其「new cell indicator」是 0) 的輸入緩衝區字元時,實際上並未變更游標的顯示位置。

此行為表示刪除動作會從邏輯/輸入緩衝區端執行或是從實體/輸出緩衝區端的顯示格層執行。嚴格、實際的字元對應刪除並沒有任何模式,因為輸入緩衝區和輸出緩衝區之間並沒有一對一的對應關係。例如,已知的實體字元只能代表邏輯字元的一部份。

XmText 動作常式

下列清單說明 XmText 動作常式。

left-character(extend)

如果 XmNeditPolicyXmEDIT_LOGICAL,且呼叫它時沒有使用引數,則插入游標會邏輯式地往後移動一個字元。如果插入游標是在行頭,插入游標就會移到前一行的最後一個字元 (如果有的話)。否則,插入游標位置就不會變更。

如果 XmNeditPolicyXmEDIT_VISUAL,那麼游標就會移到游標位置的左側。如果插入游標是在行頭,那它會移到前一行的最後一個字元 (如果有的話)。

如果使用了 extend 引數來呼叫 left-character(),則插入游標會移動,延伸目前的選取範圍,就像沒有使用引數時一樣。

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,那麼在一般模式中,如果選取範圍是非 null,便會刪除此選取範圍。否則,此動作會刪除插入游標左邊的字元。在增加模式中,如果選取範圍是非 null,而游標和選取範圍並未切斷連接,且 XmNpendingDelete 已設為 True,則此動作會刪除選取範圍。否則,此動作會刪除插入游標左邊,對選取範圍產生影響的字元。

delete-left-character() 動作以合理的 XmCR_MODIFYING_TEXT_VALUE 值產生對 XmNmodifyVerifyCallback 程序的呼叫,並以合理的 XmCR_VALUE_CHANGED 值產生對 XmNvalueChangedCallback 程序的呼叫。

delete-right-character()

如果 XmNeditPolicyXmEDIT_VISUAL,它就相當於 delete-next-character()。如果 XmNeditPolicyXmEDIT_VISUAL,那麼在一般模式中,如果選取範圍是非 null,它就會刪除選取範圍。否則,它會刪除插入游標右邊的字元。在增加模式中,如果出現非 null 的選取範圍,且游標和選取範圍並未切斷連接,則 XmNpendingDelete 會設為 True,選取範圍也會被刪除。否則,它會刪除插入游標右邊的字元。這個動作會對選取範圍產生影響。

delete-right-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() 會傳回反映產生版面配置物件狀態的版面配置修飾元字串。

XmTextFieldGetLayoutModifier() 的語法是:

#include <Xm/TextF.h>字串 XmTextFieldGetLayoutModifier(視窗元件 視窗元件)

XmTextFieldGetLayoutModifier() 會存取目前因視窗元件產生的版面配置物件設定的值。如要使用簡易函式變更版面配置物件修飾元的值,XmTextFieldGetLayoutModifier 函式會傳回版面配置物件的完整狀態,而不只是變更的值。

XmTextFieldGetLayoutModifier() 以字串值的形式傳回版面配置物件修飾元的值。

XmTextGetLayoutModifier 資源

XmTextGetLayoutModifier() 會傳回反映產生版面配置物件狀態的版面配置修飾元字串。

XmTextGetLayoutModifier() 的語法是:

#include <Xm/Text.h>String XmTextGetLayoutModifier(視窗元件 視窗元件)

XmTextGetLayoutModifier 會存取目前因視窗元件產生的版面配置物件設定的值。如果使用簡易函式變更版面配置物件修飾元的值,XmTextGetLayoutModifier 函式會傳回版面配置物件的完整狀態,而不只是變更的值。

XmTextGetLayoutModifier 以字串值的形式傳回版面配置物件修飾元的值。

XmTextFieldSetLayoutModifier 資源

XmTextFieldSetLayoutModifier() 會設定版面配置修飾元值,該值會變更版面配置物件的產生行為。

XmTextFieldSetLayoutModifier() 的語法是:

#include <Xm/TextF.h> \
void XmTextFieldSetLayoutModifier(視窗元件 \
視窗元件string layout_modifier)

XmTextFieldSetLayoutModifier 會修改與視窗元件相關聯的版面配置物件產生設定。當您使用此簡易函式設定版面配置物件修飾元時,只有輸入參數中指定的屬性會改變。其餘的屬性則維持不變。

XmTextSetLayoutModifier 資源

XmTextSetLayoutModifier() 會設定版面配置修飾元值,該值會變更版面配置物件的產生行為。

XmTextSetLayoutModifier() 的語法是:

#include <Xm/Text.h>void XmTextSetLayoutModifier(視窗元件 視窗元件,字串 layout_modifier)

XmTextSetLayoutModifier 修改與視窗元件相關聯的版面配置物件產生設定。當您使用此簡易函式設定版面配置物件修飾元時,只有輸入參數中指定的屬性會改變;其餘的屬性則維持不變。

XmStringDirectionCreate 資源

XmStringDirectionCreate 會建立 複合字串。

XmTextSetLayoutModifier() 的語法是:

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

XmStringDirectionCreate 會使用單一元件及給定值的方向來建立複合字串。此外,針對任何不具有指定字串方向之元件的複合字串 (XmString),XmNlayoutDirection 資源會設定預設產生方向。因此,如果要設定版面配置方向,您必須為 XmNlayoutDirection 資源設定適當的值。您不需建立具有特定方向元件的複合字串。

當應用程式產生了 XmString,應用程式應該檢查字串建立時是否有明確方向 (XmStringDirection)。如果沒有提供方向元件給應用程式,應用程式應該檢查目前視窗元件資源的 XmNlayoutDirection 值,並將該值視為 XmString 的預設產生方向。

UIL 引數

下表顯示 UIL 引數名稱及其類型。

表 6–3 UIL
 UIL 引數名稱 引數類型

XmNlayoutAttrObject

字串型 

XmNlayoutModifier

字串型 

XmNrenditionTag

字串型 

XmNalignment

整型 

XmNeditPolicy

整型 

開發 CTL 應用程式

下列章節說明如何開發 CTL 應用程式。

控制版面配置方向

您可以儲存複合字串的方向,這樣資料結構就可以用於描述從左至右方向的文字 (例如,英文、西班牙文、法文和德文)或是從右至左方向文字 (例如,希伯來文和阿拉伯文)。在 Motif 應用程式中,您可以從 VendorShell 或 MenuShell,使用 XmNlayoutDirection 資源來設定版面配置方向。「管理員」及「原始」視窗元件和 Gadget 一樣也擁有 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」的 Rendition,建立一個其 XmNlabelStringXmCHARSET_TEXT 類型的 XmLabel。此 Rendition 是使用「ar」(相對應到阿拉伯文語言環境的語言環境名稱) 的 XmNlayoutAttrObject以及為輸出緩衝區指定 NUMERALS_CONTEXTUALNumerals 值和「iso8859-6」的 ShapeCharset 值之版面配置修飾元字串來建立的。

語言環境特定的版面配置模組會將其本身的輸入文字,轉換為使用 16 位元 Unicode 字碼集進行編碼的實體字元輸出緩衝區。因為已經指定明確版面配置語言環境,這段文字會獨立於執行階段語言環境設定適當地產生。在此範例中,輸入是使用 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。XmNlayoutAttrObjectXmNlayoutModifier 兩個虛擬資源都未被指定,因此將預設為 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);

在資源檔案中建立 Render 表格

Rendition 以及 render 表格應該在資源檔案中,針對適當國際化的應用程式進行指定。當您將 render 表格指定於一個檔案時,程式的二進位碼就可因應指定語言環境的特殊需求而獨立產生,且可輕易地依照該語言環境需求完成自訂。

Render 表格會以下列語法指定於資源檔案中 :resource_spec:[tag[,tag]*]

其中 tag 是某些適合 XmNtag rendition 資源的字串。

這一行將建立初始 render 表格,其將包含一個或更多個指定的 rendition。這些 rendition 將附加指定標記:

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

下列範例將說明與 XmRendition (可以使用資源檔案設定) 相關聯的 CTL 資源。fontType 必須設定為 FONT_IS_XOC,才能使版面配置物件生效。layoutModifier (使用 @ls 指定) 已經由 rendition 物件傳遞至版面配置物件。

如需可以使用 layoutModifier 在版面配置上設定之資源的清單,請參閱「CAE Specification: Portable Layout Services: Context-dependent and Directional Text」,The Open Group:Feb 1997;ISBN 1-85912-142-X;document number C616。


範例 6–3 在應用程式中建立 Render 表格

在建立 render 表格之前,應用程式必須先建立至少一個該表格中的一個 rendition。XmRenderTableAddRenditions() 函式一如其名所示,也是使用新的 rendition 來強化 render 表格。若要建立新的 render 表格,請呼叫 XmRenderTableAdd s() 函式,並以 NULL 引數來替換現有的 render 表格。

下列程式碼將使用 rendition,將 XmNfontType 設定為 XmFONT_IS_XOC,來建立 render 表格。

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);

水平定位點

複合字串可以包含用於控制文字位置的定位點字元。若要為顯示目的解譯這些字元,視窗元件會提交定位停駐點清單給產生,以使複合字串生效。然而,動態視窗元件的 TextField XmText,並不使用產生的定位點資源。而是使用 8*(字元 0 的寬度) 公式來計算定位點寬度。

定位點的測量是從複合字串顯示的左邊界開始的距離。如果版面配置方向是從右至左,這個距離就會從右邊界開始計算。不管文字方向為何 (從右到左的阿拉伯文或是從左到右的英文),此定位點都會依照版面配置方向 (XmNlayoutDirection ) 的指定,從右邊或是左邊插入一個空白字元。

定位點後面的文字永遠會對齊於定位點停止位置。定位點停止位置是從視窗元件起始處開始計算,其依次受到 XmNlayoutDirection 的影響。下圖將說明定位點的行為及其行為與文字方向性的互動方式以及與視窗元件的 XmNlayoutDirection 的互動方式。

這個說明的輸入是 abc\tdef\tgh

圖 6–3 定位點行為

此圖例展示出現在從左至右以及從右至左文字中的定位點。

滑鼠選取

使用者以滑鼠按鈕 1 做了主要選取。按下此按鈕取消選取任何現存的選取,並將插入游標和控點移動到使用者在文字中按下按鈕的所在位置。一邊按住同時拖曳滑鼠 1,便可選取所有位於控點和指標位置間的文字,來取消選取該範圍以外的任何文字。

所選取文字會受到 XmNeditPolicy 資源影響,此資源可以設定為 XmEDIT_LOGICALXmEDIT_VISUAL。如果 XmNeditPolicy 設定為 XmEDIT_LOGICAL,且所選取文字為雙向,則此選取文字看起來就不會是連續的,而是一群區段的集合。邏輯緩衝區中的文字與該顯示並不具有一對一的關聯性。

因此,雙向文字之邏輯字元的連續緩衝區,不會產生連續字元串流。相反地,如果 XmNeditPolicy 設定為 XmEDIT_VISUAL,所選取文字看起來是連續的,但在邏輯緩衝區中則被分為區段。因此在相同游標點上的序列選取、刪除和雙向文字插入,不會產生相同字串。

鍵盤選取

可以使用滑鼠的選取作業也同樣可以使用鍵盤。Shift 和方向鍵的組合可執行文字選取動作。

所選取文字會受到 XmNeditPolicy 資源影響,此資源可以設定為 XmEDIT_LOGICALXmEDIT_VISUAL。如果 XmNeditPolicy 已設定為 XmEDIT_LOGICAL,且所選文字是雙向的,所選文字看起來就是不連續的。因為在邏輯緩衝區中的文字與該顯示並不具有一對一的關聯性,因此,雙向文字之邏輯字元的連續緩衝區,不會產生連續字元串流。

相反地,如果 XmNeditPolicy 設定為 XmEDIT_VISUAL,所選取文字看起來是連續的,但在邏輯緩衝區中則被分為區段。因此在相同游標點上的序列選取、刪除和雙向文字插入,不會產生相同字串。

文字資源與幾何學

下列是與幾何學有關的文字資源:

移植指令

啟用「複合文字版面配置 (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 資源中可用且適於您的語言環境之字型名稱。


舉例說來,如果您希望在 XmTextFieldXmText 視窗元件中可以移動顯示格架構字元 (泰文),請依照下列方式設定相關聯視窗元件的轉譯:

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\