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 程式設計者參考手冊」中的回呼說明。