國際語言環境指南

支援 CTL 技術的 Motif 變更

下列 Motif 的變更支援 CTL 技術:

XmNlayoutDirection

控制物件版面配置

XmStringDirection

指定系統顯示字串字元的方向

XmRendition

將新的虛擬資源增加至 XmRendition

XmText 和 XmTextField

影響與 XmRendition 關聯之文字的版面配置行為

XmTextFieldGetLayoutModifier

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

XmTextGetLayoutModifier

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

XmTextFieldSetLayoutModifier

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

XmTextSetLayoutModifier

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

XmStringDirectionCreate

建立複合字串

XmNlayoutDirection 資源

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

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

決定版面配置方向

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

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

同時明確指定 XmNlayoutDirection 和 XmNlayoutModifier @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 值。如果此值不相符,便會忽略 XmNlayoutAttrObject 和 XmNlayoutModifier 資源。

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

XmNlayoutAttrObject

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

XmNlayoutModifier

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

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

其他版面配置行為

XmNlayoutModifier 會影響與 XmRendition 相關聯之文字的版面配置行為。例如,如果數字的版面配置預設處理是 NUMERALS_NOMINAL,但您藉由將 XmNlayoutModifier 設定為 @ls numerals=nominal:national 或 @ls numerals=:national 來變更為 NUMERALS_NATIONAL。

版面配置值可分類成下列群組:

XmText 和 XmTextField 資源

Xm CTL 在 Motif 2.0 CSText 視窗元件之後擴充了 XmText 和 XmTextField,其方法是增加可經由視覺化圖案來操作之移動和刪除動作的平行集。標準 Motif 2.1 Text 和 TextField 的邏輯順序和實際順序並無不同:next 和 forward 表示 “到右邊”,previous 和 backward 表示 “到左邊”。然而,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_END 和 XmALIGNMENT_CENTER。

XmNeditPolicy

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

字元方向動作常式

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

字元方向的其他行為

動作會使用巢狀層的「版面配置服務」變換 OutToInp 和 Property 緩衝區來決定字元方向。因此視窗元件的行為取決於每個語言環境的特定轉換。如果 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)

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

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

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

left-character() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。如果使用 extend 引數來呼叫的話,這個動作就會產生對 XmNgainPrimaryCallback 程序的呼叫。如需詳細資訊,請參閱「Motif Programmer's Reference」中的回呼說明。

right-character(extend)

如果 XmNeditPolicy 是 XmEDIT_LOGICAL,且呼叫它時沒有使用任何引數,則插入游標會邏輯式地往前移動一個字元。如果插入游標是在行尾,此動作會將插入游標移到下一行的開頭 (如果有的話)。

如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標就會移到游標位置的右側。如果插入游標是在行尾,那插入游標會移到下一行的開頭 (如果有的話)。

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

right-character() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。如果使用 extend 引數來呼叫的話,這個動作就會產生對 XmNgainPrimaryCallback 程序的呼叫。如需詳細資訊,請參閱「Motif Programmer's Reference」中的回呼說明。

right-word(extend)

如果 XmNeditPolicy 是 XmEDIT_LOGICAL,且呼叫它時沒有使用任何引數,則插入游標會移到接續文字的起始字元 (如果有的話)。否則,游標會移到目前文字的結尾。如果插入游標位於行尾或是一行的最後一個字,游標就會移到下一行的第一個字 (如果有的話)。否則,游標會移到目前文字的結尾。

如果 XmNeditPolicy 是 XmEDIT_VISUAL,且未使用引數呼叫,插入游標會移到行尾右側或之後第一個空白字元之後的非空白字元。

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

left-word() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。如果使用 extend 引數來呼叫的話,這個動作就會產生對 XmNgainPrimaryCallback 程序的呼叫。如需詳細資訊,請參閱「Motif Programmer's Reference」中的回呼說明。

delete-left-character()

如果 XmNeditPolicy 是 XmEDIT_LOGICAL,它就相當於 delete-previous-char()。如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼在一般模式中,如果選取範圍是非 null,便會刪除此選取範圍。否則,此動作會刪除插入游標左邊的字元。在增加模式中,如果選取範圍是非 null,而游標和選取範圍並未切斷連接,且 XmNpendingDelete 已設為 True,則此動作會刪除選取範圍。否則,此動作會刪除插入游標左邊,對選取範圍產生影響的字元。

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

delete-right-character()

如果 XmNeditPolicy 是 XmEDIT_VISUAL,它就相當於 delete-next-character()。如果 XmNeditPolicy 是 XmEDIT_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,則插入游標就會移到目前顯示格的前一個顯示格開頭 (如果有的話)。否則,游標會移到目前顯示格的開頭。

如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標就會移到左側顯示格的開頭 (如果有的話)。prev-cell() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。如果使用 extend 引數來呼叫的話,這個動作就會產生對 XmNgainPrimaryCallback 程序的呼叫。如需詳細資訊,請參閱「Motif Programmer's Reference」中的回呼說明。

forward-cell(extend)

將插入游標移到下一個顯示格的開頭 (如果有的話)。否則,此動作會將游標移到顯示格結尾。如果 XmNeditPolicy 是 XmEDIT_LOGICAL,那麼游標會往前移一個顯示格。

如果 XmNeditPolicy 是 XmEDIT_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 的預設產生方向。