複雜文字版面佈局(CTL)延伸功能讓 Motif API 能夠支援需要在邏輯與實體文字表示式之間進行複雜變換的寫入系統,例如阿拉伯語、希伯來語、以及泰語等系統。CTL Motif 提供字元成形設計,例如 ligatures、diacritics 和區段排序,並支援靜態與動態文字 widget 的轉換。它也支援動態文字 widget 由右至左、由左至右的的文字方向和標籤。因為文字轉譯是透過解譯層來處理,因此可以輕易地擴充其他 widget 程式庫來支援 CTL。
若要發揮新功能的效果,使用者必須要有「可攜式版面佈局服務」(PLS)程式庫與適當的語言引擎。CTL 使用 PLS當做語言引擎的介面,並使用語言引擎在翻譯文字之前變換文字。支援 CTL 的應用程式,必須包含在 CTL 文件中所述的其他資源。
特別的是,XomCTL 支援下列複雜語言成形設計以及基礎相依於語言環境的 PLS 模組變換所提供之重新排序功能:
CTL 架構的結構請參閱圖 6–1所示。Dt Apps位於堆疊最頂端,會以 Motif CTL 功能來轉譯文字。Motif 會使用 PLS 依次與特定語言環境語言引擎介面溝通,並執行變換來支援位置變化、數字成形設計等功能。
CTL 架構是為支援新語言所設計的,其方式是增加新的特定語言環境引擎。換句話說,您可以在不改變 Motif 或Dt Apps的情況下增加泰文及越南文支援。
XomCTL( X 程式庫輸出模組中的複雜文字版面佈局支援)允許所有純 X Windows 應用程式(例如 X 基礎的終端機模擬器)具備 CTL 支援。XomCTL 提供包含了 X11 無智型字形支援的完整功能之 Open Source XI18N 實施。
Solaris 9 環境提供下列 XOC 資源:
讓使用者能夠設定需要執行 CTL 作業的文字緩衝區。
將影像編號提供給文字緩衝區中的文字。
與 Motif 的 XmNLayoutModifier 相同。
與 PLS 屬性、輸入至輸出和輸出至輸入相同。
與 PLS 屬性、輸入至輸出和輸出至輸入相同。
與 PLS 屬性、輸入至輸出和輸出至輸入相同。
請參閱 X/Open 或 「PLS 可攜式版面佈局服務」規格書取得這個部分的說明。
下列 Motif 的變更支援 CTL 技術:
控制物件佈局。
指定系統顯示字串字元的方向。
將新的虛擬資源增加至 XmRendition。
傳回產生佈局物件的佈局修改符號字串。
傳回因 widget 而產生的目前佈局物件設定值。
設定產生佈局物件所必需的佈局修改符號值。
修改因 widget 產生的佈局物件設定。
建立複合字串。
XmNlayoutDirection 資源 [如需 XmNlayoutDirection 的概述,請參閱 「Motif 程式設計者指南」(2.1 版)第 11.3 章節,其中特別說明了 XmStringDirection 與 XmNlayoutDirection 之間的交互關係。] 控制物件佈局。. 它以下述方式與 LayoutObject 的方向值交互影響。
當 XmNlayoutDirection 指定為 XmDEFAULT_DIRECTION 時,表示 widget 的佈局方向在建立時就使用虛擬 XOC 設定好了。 在動態文字的情況下 (XmText 和 XmTextField),使用虛擬XOC 與 widget 所使用的 XmRendition 相關聯。在靜態文字的情況下 (XmList, XmLabel, XmLabelG),佈局方向是在第一個指定方向的複合字串元件指定。此種規格以兩種方式的其中一種出現:
元件類型為 XmSTRING_COMPONENT_LAYOUT_PUSH 或 XmSTRING_COMPONENT_DIRECTION.
元件類型為 XmSTRING_COMPONENT_LOCALE_TEXT, XmSTRING_COMPONENT_WIDECHAR_TEXT 或 XmSTRING_COMPONENT_TEXT,視與元件相關聯的 XmRendition和相關聯的 LayoutObject 而定。
當 XmNlayoutDirection 未指定成 XmDEFAULT_DIRECTION,且 XmNlayoutModifier @ls orientation 值未明顯指定於佈局修改符號字串中時, XmNlayoutDirection 值會傳回至 XOC 與其 LayoutObject 之中。
同時指定 XmNlayoutDirection 和 XmNlayoutModifier @ls orientation 值會混淆行為。XmNlayoutDirection 控制 widget 物件佈局,而 XmNlayoutModifier @ls orientation 值則控制佈局變換。
請參閱「CAE 規格: 可攜式佈局服務: 上下文相依與方向文字」。 Open Group: 1997 年 2 月; ISBN 1-85912-142-X; 文件編號 C616 中詳述了將上下文相依和雙向文字轉換的可攜式功能處理成現有 POSIX 語言環境模型的邏輯延伸。 此文件是專為想要提供複合文字語言支援的系統和應用程式設計者所設計的。
XmStringDirection 是用來指定系統顯示字串字元方向的資料類型。
如果複合字串沒有元件指定其方向的話,XmNlayoutDirection 資源會設定任何複合字串產生的預設方向 (XmString)。因此,如果要設定佈局方向,您必須設定適當的 XmNlayoutDirection 值。您不須建立特定方向元件的複合字串。 當應用程式產生了 XmString,應用程式應該檢查看看字串建立時是否有明確方向 (XmStringDirection)。 如果沒有方向元件,應用程式應該檢查目前 widget 資源的 XmNlayoutDirection 值,並將該值視為 XmString 的預設產生方向。
CTL 增加了新的虛擬資源到下表所列的 XmRendition:
表 6–1 XmRendition 中的新資源
名稱 |
類別/類型 |
存取 |
預設值 |
---|---|---|---|
XmNfontType |
XmCFontType/XmFontType |
CSG |
XmAS_IS |
XmNlayoutAttrObject |
XmClayoutAttrObject/String |
CG |
NULL |
XmNlayoutModifier |
XmClayoutModifier/String |
CSG |
NULL |
指定產生的字型物件類型。 如果是 CTL 的話,此資源值必須為 XmFONT_IS_XOC 值。 如果值不相符,就會忽略 XmNlayoutAttrObject 和 XmNlayoutModifier 資源。
當此資源的值為 XmFont_IS_XOC,且未指定 XmNfont 資源,那麼在建立時 XmNfontName 資源的值就會轉換成由 XmNlayoutAttrObject 資源指定語言環境,或目前語言環境的 XOC 物件。另外,XmNlayoutModifier 資源的值會傳送到與 XOC 相關聯的任何佈局物件。
指定佈局 AttrObject 引數。 此資源是用來建立與此 XmRendition 相關聯的 XOC 相關聯之佈局物件。 如需此字串的語法和語意,請參閱佈局服務 m_create_layout() 規格。 如需佈局修改符號方向 輸出值和 XmNlayoutDirection widget 資源值之間交互影響的說明,請參閱 XmNfontType 的說明。
指定要傳送到 XOC 的 XmRendition 所使用的佈局物件之佈局值。如需此字串的語法和語意,請參閱 CAE 規格。
使用 XmRendition{Retrieve,Update} 設定此資源會造成字串傳送到與此產生相關聯的 XOC 相關聯之佈局物件。 這是動態佈局佈局服務的機制。 如果 Orientation、Context、 TypeOfText、 TextShaping 或 ShapeCharset 改變了,將會導致無法預期的後果。
XmNlayoutModifier 會影響與 XmRendition相關聯的文字佈局行為。 例如,如果數字的佈局預設方式是 NUMERALS_NOMINAL,使用者可藉由將 XmNlayoutModifier 設定成 @ls numerals=nominal:national 或 @ls numerals=:national 以將預設佈局變更為 NUMERALS_NATIONAL。
佈局值可分類成下列群組:
編碼描述-TypeOfText、 TextShaping、 ShapeCharset(與語言環境字碼集)
TypeOfText 基本上是呈區段排列的,且以不透明區塊圖示。 透過產生物件動態地修改這些值通常是沒有意義的,且肯定會造成無法預期的後果。
佈局行為-Orientation、 Context、 ImplicitAlg、 Swapping 和 Numerals 。Orientation 和 Context 不可以動態方式修改。 您可以安全地修改 ImplicitAlg 、Swapping 和 Numerals。
Xm CTL 藉由增加一系列視覺上的平行移動和刪除動作來延伸 XmText 和 XmTextField ,在 Motif 2.0 CSText widget 之後就成了固定的形式。 標準 Motif 2.1 Text 和 TextField 的邏輯順序和實際順序並無不同:下一個和向前 都是「往右」的意思,而上一個和向後都是「往左」的意思。不過, CSText 仍會以嚴格的實際名稱提供區隔,並定義一組新的動作(例如,往左字元()、 刪除往右字元()等等)。 所有這些動作的常式都被定義成可對 widget 的 XmNlayoutDirection 產生回應,且會呼叫正確的 下一個-或上一個-動作。 Xm CTL 延伸較 CSText 延伸略為複雜。 Xm CTL 延伸不會對 widget 的整體方向有所回應,但是會對虛擬 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 |
指定 widget 中使用的文字對齊方向。 只支援 XmALIGNMENT_END 和 XmALIGNMENT_CENTER。
指定 widget 的編輯策略,可以選擇 XmEDIT_LOGICAL 或 XmEDIT_VISUAL。 在 XmEDIT_VISUAL 的情況下,選取、游標移動和刪除都是以視覺化的樣式呈現。 設定此資源也會將一般的鍵盤移動和刪除事件解譯成新的「視覺」動作清單或現有的邏輯動作。
forward-cell() 和 backward-cell() 動作查詢指定方向的字元方向。 如果方向是從左至右,就會呼叫對應的下一個-/向前-或 上一個-/向後-變數:
動作使用佈局服務轉換OutToInp 和 Property 緩衝區(嵌套層次)決定了字元的方向。 因此 widget 的行為取決於每個語言環境的特定轉換。 如果 OutToInp 中的資訊,特別是 Property 緩衝區中的資訊不正確,widget 可能不會正常運作。 尤其當特定語言環境的模組落在此規格之外的範圍時,同樣文字、應用程式、資源值和 LayoutObject 佈局的雙向編輯行為在每個平台上會有所不同。
視覺模式動作會導致以顯示格為基礎的行為顯示出來。 邏輯模式動作會導致以邏輯字元為基礎的行為。 例如,delete-right-character() 作業會刪除與顯示顯示格對應的輸入緩衝區字元。 也就是說,輸入緩衝區字元的整個 LayoutObject 變換 “property” 位元組 “new cell indicator” 是 1,而所有隨後的字元為 “new cell indicator” [ 如需 Property 緩衝區的詳細資訊,請參閱「CAE 規格」中的 "m_transform_layout()" 規格。] 的是 0。
同樣的,就 backward-character() 而言,插入點會在輸入緩衝區中往後移動一個字元,而游標會重現在對應相關輸出緩衝區字元的可視位置。 這代表有好幾個按鍵必須移過複合顯示格; 實際上游標顯示位置並不會改變成插入點移過輸入緩衝區字元(「新的顯示格指標為 0(也就是變音符或連字片段)」)後的插入點。
這表示刪除動作會從邏輯/輸入緩衝區面執行,或是從實體/輸出緩衝區面的顯示格面執行。 嚴格、實際的字元對應刪除並沒有一定模式,因為輸入緩衝區和輸出緩衝區之間並沒有一對一的對應關係。 例如,已知的實體字元只能代表邏輯字元的一部份。
下列清單說明 XmText 動作常式。
如果 XmNeditPolicy 是 XmEDIT_LOGICAL,且呼叫時沒有用引數,插入游標會邏輯式地往後移動一個字元。 如果插入游標是在行頭,插入游標就會移到前一行的最後一個字元(如果有的話)。 否則,插入游標位置就不會變更。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標就會移到游標位置的左側。 如果插入游標是在行頭,那它會移到前一行的最後一個字元(如果有的話)。
如果以 extend 引數呼叫 left-character(),插入點就會像在沒有引數時的情況一樣,延伸目前的選取範圍。
left-character() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。 如果用 extend 引數呼叫,此動作就會產生對 XmNgainPrimaryCallback 程序的呼叫。 如需詳細資訊,請參閱「Motif 程式設計者參考手冊」中的回呼說明。
如果 XmNeditPolicy 是 XmEDIT_LOGICAL,且呼叫時沒有用任何引數,插入游標會邏輯式地往前移動一個字元。 如果插入游標是在行尾,插入游標就會移到下一行的開頭(如果有的話)。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標就會移到游標位置的右側。 如果插入游標是在行尾,那插入游標會移到下一行的開頭(如果有的話)。
如果用 extend 引數呼叫,引數會移動插入游標,延伸目前的選取範圍,就像沒有使用引數時一樣。
right-character() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。 如果使用 extend 引數呼叫,就會產生對 XmNgainPrimaryCallback 程序的呼叫。 如需詳細資訊,請參閱「Motif 程式設計者參考手冊」中的回呼說明。
如果 XmNeditPolicy 是 XmEDIT_LOGICAL,且未使用任何引數呼叫,插入游標會移到隨後文字的開頭(如果有的話); 否則,它會移到目前文字的結尾。 如果插入游標位於行尾,或是一行的最後一個字,游標就會移到下一行的第一個字(如果有的話)。 否則,它會移到目前文字的結尾。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,且未使用引數呼叫,插入游標會移到行尾右側或之後第一個空白字元之後的非空白字元。
如果用 extend 引數呼叫,引數會移動插入游標,延伸目前的選取範圍,就像沒有使用引數時一樣。
left-word() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。 如果使用 extend 引數呼叫,就會產生對 XmNgainPrimaryCallback 程序的呼叫。 如需詳細資訊,請參閱「Motif 程式設計者參考手冊」中的回呼說明。
如果 XmNeditPolicy 是 XmEDIT_LOGICAL,它就相當於 delete-previous-char()。 如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼在一般模式中,如果有非空的選取範圍,它就會刪除選取範圍; 否則它會刪除插入游標左邊的字元。 在增加模式中,如果出現非空的選取範圍,而游標和選取範圍並未切斷連接,且 XmNpendingDelete 已設為 True,它將會刪除選取範圍; 否則它會刪除插入游標左邊的字元。 這會影響選取範圍。
delete-left-character() 動作以合理的 XmCR_MODIFYING_TEXT_VALUE 值產生對 XmNmodifyVerifyCallback 程序的呼叫,並以合理的XmCR_VALUE_CHANGED 值產生對 XmNvalueChangedCallback 程序的呼叫。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,它就相當於 delete-next-character()。 如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼在一般模式中,如果有非空的選取範圍,它就會刪除選取範圍; 否則,它會刪除插入游標的右側字元。 在增加模式中,如果出現非空的選取範圍且游標和選取範圍並未切斷連接,則 XmNpendingDelete 會設為 True,選取範圍也會遭到刪除; 否則,它會刪除插入游標的右側字元。 這會影響選取範圍。
delete-right-character() 動作以合理的XmCR_MODIFYING_TEXT_VALUE 值產生對 XmNmodifyVerify-Callback 程序的呼叫,並以合理的XmCR_VALUE_CHANGED 值產生對 XmNvalue-ChangedCallback 程序的呼叫。
某些以顯示格為基礎的常式是為支援字元的複合、變音符和連字片段而執行。 換句話說,兩個或兩個以上的字元可以用佔用了一個顯示顯示格的單一文字影像來代表。
XmText 顯示格動作常式如下所示:
將插入游標往回移一個顯示格。 如果 XmNeditPolicy 是 XmEDIT_LOGICAL,則插入游標就會移到目前顯示格的前一個顯示格開頭(如果有的話); 否則,它會移到目前顯示格的開頭。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標就會移到左側顯示格的開頭(如果有的話)。 prev-cell() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。 如果用 extend 引數來呼叫的話,就會產生對 XmNgainPrimaryCallback 程序的呼叫。 如需詳細資訊,請參閱「Motif 程式設計者參考手冊」中的回呼說明。
將插入游標移到下一個顯示格的開頭(如果有的話); 否則游標會移到顯示格的最後。 如果 XmNeditPolicy 是 XmEDIT_LOGICAL,那麼游標會往前移一個顯示格。
如果 XmNeditPolicy 是 XmEDIT_VISUAL,那麼游標會移到右側顯示格的開頭(如果有的話); 否則,它會移到目前顯示格的最後。forward-cell() 動作以合理的 XmCR_MOVING_INSERT_CURSOR 值產生對 XmNmotionVerifyCallback 程序的呼叫。 如果用 extend 引數來呼叫的話,就會產生對 XmNgainPrimaryCallback 程序的呼叫。 如需詳細資訊,請參閱「Motif 程式設計者參考手冊」中的回呼說明。
XmTextFieldGetLayoutModifier() 傳回佈局修改符號字串,其反映出佈局物件產生的狀態。
XmTextFieldGetLayoutModifier() 的語法是:
#include <Xm/TextF.h> String XmTextFieldGetLayoutModifier( Widget widget)
XmTextFieldGetLayoutModifier() 存取目前與 widget 相關聯的佈局物件產生之設定值。 如要使用簡易函數變更佈局物件修改符號的值,XmTextFieldGetLayoutModifier 函數會傳回佈局物件的完整狀態,而不只是變更的值。
XmTextFieldGetLayoutModifier() 以字串值的形式傳回佈局物件修改符號的值。
XmTextGetLayoutModifier() 傳回佈局修改符號字串,其反映出佈局物件產生的狀態。
XmTextGetLayoutModifier() 的語法是:
#include <Xm/Text.h>String XmTextGetLayoutModifier( Widget widget )
XmTextGetLayoutModifier 存取與 widget 相關聯的目前佈局物件之設定值。如要使用簡易函數變更佈局物件修改符號的值,XmTextGetLayoutModifier 函數會傳回佈局物件的完整狀態,而不只是變更的值。
XmTextGetLayoutModifier 以字串值的形式傳回佈局物件修改符號的值。
XmTextFieldSetLayoutModifier() 設定變更佈局物件產生行為的佈局修改符號值。
XmTextFieldSetLayoutModifier() 的語法是:
#include <Xm/TextF.h>void XmTextFieldSetLayoutModifier( Widget widget ,string layout_modifier)
XmTextFieldSetLayoutModifier 修改與 widget 相關聯的目前佈局物件之設定值。 當您使用此簡易函數來設定佈局物件修改符號時,只有輸入參數中指定的屬性會改變; 剩下的屬性則維持不變。
XmTextSetLayoutModifier() 設定了佈局修改符號值,該符號值改變了產生佈局物件時的行為。
XmTextSetLayoutModifier() 的語法是:
#include <Xm/Text.h>void XmTextSetLayoutModifier( Widget widget ,string layout_modifier)
XmTextSetLayoutModifier 修改與 widget 相關聯的佈局物件產生設定。 當您使用此簡易函數設定佈局物件修改符號時,只有輸入參數中指定的屬性會改變; 剩下的屬性則維持不變。
XmStringDirectionCreate 會建立一個複合字串。
XmTextSetLayoutModifier() 的語法是:
#include <Xm/Xm.h>XmString XmStringDirectionCreate( direction) XmStringDirection direction
XmStringDirectionCreate 以單一元件、給定值的方向建立複合字串。 另一方面, 如果字串沒有元件指定方向,XmNlayoutDirection 資源會設定任何複合字串的預設產生方向 (XmString)。 因此,如果要設定佈局方向,您只要為 XmNlayoutDirection 資源設定適當的值即可。 您不需建立具有特定方向元件的複合字串。 當應用程式產生了 XmString,它應該會查看字串建立時是否有明確方向 (XmStringDirection)。如果沒有方向元件,應用程式應該檢查目前 widget 資源的 XmNlayoutDirection 值,並將該值視為 XmString 的預設產生方向。
下列表格顯示 UIL 引數。
表 6–3 UILUIL 引數名稱 | 引數類型 |
---|---|
XmNlayoutAttrObject |
字串 |
XmNlayoutModifier |
字串 |
XmNrenditionTag |
字串 |
XmNalignment |
整數 |
XmNeditPolicy |
整數 |
下列章節顯示如何開發 CTL 應用程式。
您可以儲存複合字串的方向,這樣資料結構就可以用於描述從左至右方向的文字(例如,英文、西班牙文、法文和德文),或是從右至左方向文字(例如,希伯來文和阿拉伯文)。在 Motif 應用程式中,您可以從 VendorShell 或 MenuShell,使用 XmNlayoutDirection 資源來設定版面佈局方向。「管理員」以及「原始」 widgets(和 Gadgets 一樣)也擁有 XmNlayoutDirection 資源。預設值是得自於具有相同資源的最接近祖先。
在 XmText widget 的狀況中,您也必須指定垂直方向。將 layoutDirection 設定成 XmRIGHT_TO_LEFT,可以讓字串方向成為從右至左,但是游標會垂直向下。 如果垂直方向很重要,且您需要從上到下排列,請務必指定 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM ,來指定元件會先從右至左、再從上至下佈局,這樣才能產生您需要的結果。
此外,XmText 以及 TextField widgets 的行為會受到 XmNalignment 以及 XmNlayoutModifier 資源XmRendition 的影響。這些資源(除了 XmNlayoutDirection)會一起控制「文字」widget 的版面佈局行為。這個行為將說明於 圖 6–2。
該圖所使用的輸入字串為:
下圖 XmNlayoutModifier 字串 @ls orientation= 的設定值會顯示於左邊欄位。
如圖所示,XmNAlignment 會指出文字會配合版面佈局方向向右對齊或向左對齊。 XmNlayoutModifier 會將文字分成幾個段落,並依據方向值將它們由左至右或由右至左排列 。換句話說,如果 XmNlayoutDirection 為 XmRIGHT_TO_LEFT ,且 XmNAlignment 值是 XmALIGNMENT_BEGINNING ,該字串就會向右對齊。
下列程式碼建立一個 XmLabel其XmNlabelString為XmCHARSET_TEXT 類型,使用Rendition其標記為“ArabicShaped。” 該 Rendition是使用XmNlayoutAttrObject 的“ar”所建立(對應於阿拉伯語言環境的語言環境名稱)以及針對輸出緩衝區所指定的版面佈局修改符號字串NumeralsNUMERALS_CONTEXTUAL的值以及ShapeCharset “unicode-3.0”的值。
語言環境特定的版面佈局模組可將其輸入文字,轉換成使用 16 位元 Unicode 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);
下列程式碼建立了 TextField widget 以及RenderTable使用單一的 Rendition。包括XmNlayoutAttrObject以及 XmNlayoutModifier兩個虛擬資源都未被指定因此將預設為NULL。這個值表示與Rendition有關聯的版面佈局物件屬於預設語言環境,若其存在的話。
如果要順利執行這個範例,語言環境必須設定成具有整個字碼集是 ISO 8859-6 且其語言環境特定版面佈局模組可以支援 IMPLICIT_BASIC 演算法。 此Rendition的 LayoutObject的ImplicitAlg值已被修改,方式是透過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(多個)以及 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 規格:可攜式版面佈局服務:相依於上下文以及方向文字」,開放群組: 1997 年 2 月; ISBN 1-85912-142-X;文件編號 C616。
在建立 render 表格之前,應用程式程式必須先建立至少一個該表格中的一個 rendition。 正如其名所示, XmRenderTableAddRenditions()函式也可用新的 rendition 來加強 render 表格。若要建立新的 render 表格,請呼叫XmRenderTableAddRenditions()函式,並以 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);
若要控制文字放置位置,複合字串可能需要包含定位點字元。若要在顯示器上解譯這類字元,widget 便會參照至該 rendition 才能使複合字串有效,其會在該處找到一份定位點停止位置清單。 然而,這個動態的 widgets,TextField 以及 XmText,並不使用 rendition 的定位點資源。而是使用 8*(width of character 0) 公式來計算定位點寬度。
定位點的測量是從複合字串顯示的左邊界開始的距離。如果版面佈局方向是從右至左,這個距離就會從右邊界開始計算。 不管文字方向為何(從右到左的阿拉伯文,或是從左到右的英文)此定位點都會依照版面佈局方向 (XmNlayoutDirection ) 的指定,從右邊或是左邊插入一個空白字元。
定位點後面的文字永遠會對齊於定位點停止位置。定位點停止位置是從 widget 起始處開始計算,其依次受到XmNlayoutDirection 的影響。下圖將說明定位點的行為與其和文字方向性的互動方式,以及 widget 的 XmNlayoutDirection 。
這個說明的輸入為 abc\tdef\tgh。
使用者會以滑鼠按鈕 1 製作主選取。按下這個按鈕便可取消選取任何現有選取,將插入游標和控點移至該按鈕被按下的文字位置。一邊按住同時拖曳滑鼠 1,便可選取所有位於控點和指標位置間的文字,來取消選取該範圍以外的任何文字。
所選取文字會受到 XmNeditPolicy 資源影響,此資源可以設定為XmEDIT_LOGICAL或XmEDIT_VISUAL。如果 XmNeditPolicy 設定為XmEDIT_LOGICAL,且所選取文字為雙向,則此選取文字看起來就不會是連續的,而是一群區段的集合。這是因為邏輯緩衝區內的文字與該顯示並不具有一對一的關聯性。
因此在產生雙向文字的邏輯字元之不連續緩衝區時,就無法產生連續串流字元。相反地,如果 XmNeditPolicy 設定成 XmEDIT_VISUAL,所選取文字看起來就會是連續,而區段位置是在邏輯緩衝區中。 因此在相同游標點上的序列選取、刪除,和雙向文字插入,不會產生相同字串。
可以使用滑鼠的選取作業也同樣可以使用鍵盤。 Shift-arrow的組合鍵可以選取文字。
所選取文字會受到 XmNeditPolicy 資源影響,此資源可以設定成 XmEDIT_LOGICAL 或 XmEDIT_VISUAL。如果 XmNeditPolicy 已設定成 XmEDIT_LOGICAL,且所選文字是雙向的,所選文字看起來就是不連續的。因為在邏輯緩衝區中的文字與該顯示並不具有一對一的關聯性,在產生雙向文字的邏輯字元的不連續緩衝區時,就無法產生連續串流字元。
相反地,當XmNeditPolicy設定為 XmEDIT_VISUAL,選取的文字將連續可視,但是在邏輯緩衝區中被分成區段。因此在相同游標點上的序列選取、刪除,和雙向文字插入,不會產生相同字串。
下列是與幾何學相關的文字資源:
widget 用來選取字型或字型集,以及其他顯示文字屬性的 render 表格XmNrenderTable。
Text以及Textfield widgets 只能使用與字型相關的 rendition 資源,像是XmNfontType 。這些 widgets 也可以指定版面佈局物件的屬性,像是XmNlayoutAttrObject,通常為語言環境的識別碼;以及XmNlayoutModifier,其指定將版面佈局值傳輸通過與 XOC 相關聯的「版面佈局物件」,而 XOC 與XmRendition相關聯。
資源 (XmNwordWrap),可以指定當文字比 widget 寬的時候,文字行是否會在文字邊界中斷。
在字的邊界中斷一行將不會在文字中插入新行。如果是遞迴性語言(例如阿拉伯文),如果文字長度比 widget 還長,該文字就會換行到下一行,但是下一行的第一個字元的形狀和就會和邏輯緩衝區的前一個字元無關。
啟用 Complex Text Layout (CTL) 功能的新 Motif 程式庫,將放在 /usr/dt/lib/libXm.so.4 。如果應用程式連結至 libXm.so.3便無法支援 CTL。ldd app_name 顯示應用程式所連結的程式庫。若要移植現有應用程式以便啟用 CTL,請執行下列步驟。
新增-DSUN_CTL 至 Makefile 。這個旗標很重要,且包括了可支援 CTL 的必要資料結構。其應該在編譯期間設定。
重新編譯現有的應用程式。這個重新編譯將自動與啟用 CTL 的 Motif 程式庫進行連結 libXm.so.4
新增XmText.translations資源至應用程式資源檔案中。如果沒有這些資源,就無法啟動語言環境的版面佈局引擎。
請參考附加至文件的範例應用程式。
請使用在 fontName 資源中可用且適於您的語言環境之字型名稱。
舉例說來,如果您希望在 XmTextField 或 XmText widgets 中可以移動顯示格架構字元(泰文)移動,請依照下列方式設定相關聯 widget 的轉譯:
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\