下列 Motif 更改支持 CTL 技术。
控制对象布局
指定系统显示字符串中字符的方向
将新的伪资源添加到 XmRendition
影响与 XmRendition 关联的文本的布局行为
返回绘制布局对象的布局修饰符字符串
返回与小部件关联的绘制的当前布局对象设置的值
设置与其绘制关联的布局对象的布局修饰符值
修改与小部件关联的绘制的布局对象设置
创建复合字符串
XmNlayoutDirection 资源控制对象布局。此资源以如下所示的方式同 LayoutObject 的定向值进行交互。
有关 XmNlayoutDirection 的概述,尤其是对 XmStringDirection 和 XmNlayoutDirection 之间交互的说明,请参见 Motif《程序员指南》(2.1 版 )的 11.3 节。
如果将 XmNlayoutDirection 指定为 XmDEFAULT_DIRECTION,则小部件的布局方向在创建时从主导伪 XOC 中进行设置。对于动态文本(XmText 和 XmTextField),则主导伪 XOC 是与用于小部件的 XmRendition 关联的伪 XOC。对于静态文本(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 控制小部件对象布局,而 XmNlayoutModifier @ls orientation 值控制布局变换。
请参见《CAE 规范:可移植布局服务:依赖于上下文的定向文本》(开放组:1997 年 2 月;ISBN 1-85912-142-X;文档号码 C616),了解对于处理依赖于上下文的双向文本转换的可移植功能的描述,这些功能是对现有 POSIX 语言环境模型的逻辑扩展。该文档适用于希望为复杂文本语言提供支持的系统和应用程序程序员。
XmStringDirection 是用于指定系统显示字符串中字符方向的数据类型。
XmNlayoutDirection 资源为任何没有指定字符串方向的组件的复合字符串 (XmString) 设置缺省绘制方向。因此,要设置布局方向,需要为 XmNlayoutDirection 资源设置适当的值。不需要创建具有特定方向组件的复合字符串。当应用程序绘制 XmString 时,此应用程序应检查所创建的字符串是否具有显式方向 (XmStringDirection)。如果没有方向组件,应用程序应检查当前小部件的 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 参数。此资源用于创建与此 XOC(它与此 XmRendition 关联)关联的布局对象。有关此字符串的语法和语义,请参考布局服务 m_create_layout() 规范。有关“布局修饰符定向”输出值和 XmNlayoutDirection 小部件资源间交互作用的说明,请参见 XmNfontType 的描述。
指定要传递给与此 XmRendition 的 XOC 一起使用的布局对象的布局值。有关该字符串的语法和语义,请参见《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。
编辑行为-CheckMode
Xm CTL 扩展了 XmText 和 XmTextField,方法是模仿 Motif 2.0 CSText 小部件,添加一组以可视方式运行的相似的移动和删除操作。标准 Motif 2.1 Text 和 TextField 不区分逻辑和物理顺序:下一个和向前意为“向右”,而上一个和向后意为“向左”。然而,CSText 进行了适当的区分并定义了一组具有严格物理名称的新操作(例如,left-character ()、delete-right-word() 等等)。这些操作例程均被定义为对小部件的 XmNlayoutDirection 敏感,并可调用适当的 next- 或 previous- 操作。
Xm CTL 扩展比 CSText 扩展稍微复杂一些。Xm CTL 扩展对小部件的全局定向不敏感,但是对伪 XOC 所确定的光标周围物理字符的特定方向性(包括中性稳定性)敏感。
新资源名称使您能控制选择策略,提供绘制标签及控制对齐方式。
新 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 |
指定位于 XmNrenderTable 资源(用于小部件)中的 XmRendition 的绘制标签。
指定此小部件中使用的文本对齐方式。仅支持 XmALIGNMENT_END 和 XmALIGNMENT_CENTER。
指定此小部件使用的编辑策略(XmEDIT_LOGICAL 或 XmEDIT_VISUAL)。如果指定 XmEDIT_VISUAL ,则选择、光标移动和删除将以可视形式进行。设置该资源还可将标准键盘移动和删除事件的转换更改为新的“可视”操作列表或现有的逻辑操作。
forward-cell() 和 backward-cell() 操作在指定的方向中查询字符的定向。如方向是从左向右,则这些操作调用相应的 next-/forward- 或 previous-/backward- 变式。
这些操作通过使用布局服务变换 OutToInp 和 Property 缓冲区(对于嵌套级)来确定字符的方向。因而,小部件的行为取决于语言环境的特定变换。如果 OutToInp(尤其是 Property 缓冲区)中的信息不正确,则小部件可能会产生意外行为。此外,由于语言环境特定的模块处于该规范的范围之外,相同文本、应用程序、资源值和 LayoutObject 配置的双向编辑行为可能因平台的不同而不同。
可视模式操作导致显示基于单元的行为。逻辑模式操作导致基于字符的逻辑行为。例如,delete-right-character() 操作删除与显示单元相对应的输入缓冲区字符。即一个 LayoutObject 变换“特性”字节“新单元指示器”为 1 的输入缓冲区字符,以及“新单元指示器”为 0 的所有后继字符。
有关 Property 缓冲区的更多信息,请参见《CAE 规范》中的 m_transform_layout()。
同样,对于 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 参数进行调用,则 XmNeditPolicy 将像不带参数调用一样移动插入光标,并扩展当前所选内容。
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 设置为真,则此操作删除此选择。否则,此操作删除插入光标左侧的字符,这可能会影响选择。
delete-left-character() 操作使用原因值 XmCR_MODIFYING_TEXT_VALUE 生成对 XmNmodifyVerifyCallback 过程的调用,并且使用原因值 XmCR_VALUE_CHANGED 生成对 XmNvalueChangedCallback 过程的调用。
如果 XmNeditPolicy为 XmEDIT_VISUAL,则它等效于 delete-next-character()。如果 XmNeditPolicy为 XmEDIT_VISUAL,则在正常模式下,如果有一个非空选择,则它删除此选择。否则,它删除插入光标右侧的字符。在添加模式中,如果有一个非空选择,并且光标未离开所选内容,则将 XmNpendingDelete 设置为真,并删除此选择;否则,删除插入光标右侧的字符。此操可能会对选择造成影响。
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>字符串 XmTextFieldGetLayoutModifier(小部件 小部件)
XmTextFieldGetLayoutModifier() 存取与小部件关联的绘制的当前布局对象设置的值。当使用公用函数更改布局对象修饰符的值时,XmTextFieldGetLayoutModifier 函数返回布局对象的完整状态,而不仅仅返回更改后的值。
XmTextFieldGetLayoutModifier() 以字符串值的形式返回布局对象修饰符值。
XmTextGetLayoutModifier() 返回布局修饰符字符串, 它反映了与其绘制关联的布局对象的状态。
XmTextGetLayoutModifier() 的语法是:
#include <Xm/Text.h>String XmTextGetLayoutModifier(小部件 小部件)
XmTextGetLayoutModifier 存取与小部件关联的绘制的当前布局对象设置的值。当使用公用函数更改布局对象修饰符值时, XmTextGetLayoutModifier 函数返回布局对象的完整状态,而不仅仅返回更改后的值。
XmTextGetLayoutModifier 以字符串值的形式返回布局对象修饰符值。
XmTextFieldSetLayoutModifier() 设置布局修饰符值,这会更改与其绘制关联的布局对象的行为。
XmTextFieldSetLayoutModifier() 的语法是:
#include <Xm/TextF.h> \ void XmTextFieldSetLayoutModifier(小部件 \ 小部件字符串 layout_modifier)
XmTextFieldSetLayoutModifier 修改与小部件关联的绘制的布局对象设置。当布局对象修饰符值使用此公共函数设置时,只有输入参数中指定的属性被更改;其余属性保持不变。
XmTextSetLayoutModifier() 设置布局修饰符值,这会更改与其绘制关联的布局对象的行为。
XmTextSetLayoutModifier() 的语法是:
#include <Xm/Text.h>void XmTextSetLayoutModifier(小部件 小部件,字符串 layout_modifier)
XmTextSetLayoutModifier 修改与小部件关联的绘制的布局对象设置。布局对象修饰符值使用此公共函数设置时,只有输入参数中指定的属性被更改; 其余属性保持不变。
XmStringDirectionCreate 用于创建复合字符串。
XmTextSetLayoutModifier() 的语法是:
#include <Xm/Xm.h>XmString XmStringDirectionCreate(方向)XmStringDirection 方向
XmStringDirectionCreate 创建一个具有单个组件(一个具有给定值的方向)的复合字符串。另一方面,XmNlayoutDirection 资源为任何不具有指定其方向的组件的复合字符串 (XmString) 设置缺省绘制方向。因此,要设置布局方向,需要为 XmNlayoutDirection 资源设置适当值。您不需要创建具有特定方向组件的复合字符串。
当应用程序绘制 XmString 时,此应用程序应检查所创建的字符串是否具有显式方向 (XmStringDirection)。如果没有向应用程序提供方向组件,则此应用程序应检查当前小部件的 XmNlayoutDirection 资源的值并将此值作为 XmString 的缺省绘制方向。