为什么我在 Motif 小部件列表中得到不均匀的垂直填充?
Why am I getting uneven vertical padding in a Motif Widget List?
我正在使用 Motif Widget Scrolledlist。列表创建如下:
/* COMMAND GROUP LIST */
ac = 0;
XtSetArg(al[ac], XmNselectionPolicy, XmSINGLE_SELECT); ac++;
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
XtSetArg(al[ac], XmNtopWidget, printer_menu_button); ac++;
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
XtSetArg(al[ac], XmNbottomPosition, 50); ac++;
command_group_list = XmCreateScrolledList(form, "command_group_list", al, ac);
XtManageChild(command_group_list);
选择打印机时,通过回调函数添加项目。从添加项目的例程中,唯一相关的 Motif 相关命令是:
XmListDeleteAllItems(command_group_list);
...
str = XmStringCreateLocalized(command_group_line);
XmListAddItem(command_group_list, str, 0);
XmStringFree(str);
但是,当我显示列表时,我得到了一个奇怪的底部填充,似乎列表中每个单独项目的高度都大于文本的高度。这可以在这张图片中看到:
虽然在文档(例如 O'Reilly 第六卷 A)中,列表的项目似乎具有“正常”高度。我不知道可能缺少什么。我查看了 6A 中的示例代码是否向列表应用了更多资源,但我找不到任何东西。
例如,从 6A 中提取的此列表屏幕截图显示了您在列表中通常期望的高度:
我正在使用 FreeBSD 和 OpenMotif 2.3。8_1。
会不会是字体问题?
更新:这是添加项目的整个例程,如上所述,唯一的 Motif/X11 代码是删除所有项目并在 for 循环中添加单个项目的 Xm 函数。
这是填充项目的例程(注意大部分是与实际 Motif 问题无关的 C 代码):
/* THIS FUNCTION READS COMMAND GROUPS USED BY THIS PRINTER */
void read_command_group(char *printer_name) {
/* BUILD FILE PATH */
char filepath[256];
strcpy(filepath, "/etc/xcmdprinter/");
strcat(filepath, printer_name);
/* OPEN AND READ FILE */
char line[256];
FILE *fp = fopen(filepath, "r");
while(fgets(line, sizeof(line), fp)) {
if(line[0]=='G') {
XmString str;
char command_group_line[256];
int i=2;
while(line[i]!='[=12=]') {
command_group_line[i-2] = line[i];
i++;
}
command_group_line[i-2] = '[=12=]';
str = XmStringCreateLocalized(command_group_line);
XmListAddItem(command_group_list, str, 0);
XmStringFree(str);
}
}
fclose(fp);
}
/* CALLBACK FUNCTION FOR PRINTER SELECTION */
void select_printer(Widget w, XtPointer client_data, XtPointer call_data) {
XmListDeleteAllItems(command_group_list);
read_command_group((char *)client_data);
}
每一项都包含一个换行符;删除它。
I am also wondering why the focus is displayed with such a strong dotted line.
由列表小部件的资源设置XmNhighlightThickness
,
其默认值为 2.
我正在使用 Motif Widget Scrolledlist。列表创建如下:
/* COMMAND GROUP LIST */
ac = 0;
XtSetArg(al[ac], XmNselectionPolicy, XmSINGLE_SELECT); ac++;
XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
XtSetArg(al[ac], XmNtopWidget, printer_menu_button); ac++;
XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_POSITION); ac++;
XtSetArg(al[ac], XmNbottomPosition, 50); ac++;
command_group_list = XmCreateScrolledList(form, "command_group_list", al, ac);
XtManageChild(command_group_list);
选择打印机时,通过回调函数添加项目。从添加项目的例程中,唯一相关的 Motif 相关命令是:
XmListDeleteAllItems(command_group_list);
...
str = XmStringCreateLocalized(command_group_line);
XmListAddItem(command_group_list, str, 0);
XmStringFree(str);
但是,当我显示列表时,我得到了一个奇怪的底部填充,似乎列表中每个单独项目的高度都大于文本的高度。这可以在这张图片中看到:
虽然在文档(例如 O'Reilly 第六卷 A)中,列表的项目似乎具有“正常”高度。我不知道可能缺少什么。我查看了 6A 中的示例代码是否向列表应用了更多资源,但我找不到任何东西。
例如,从 6A 中提取的此列表屏幕截图显示了您在列表中通常期望的高度:
我正在使用 FreeBSD 和 OpenMotif 2.3。8_1。
会不会是字体问题?
更新:这是添加项目的整个例程,如上所述,唯一的 Motif/X11 代码是删除所有项目并在 for 循环中添加单个项目的 Xm 函数。
这是填充项目的例程(注意大部分是与实际 Motif 问题无关的 C 代码):
/* THIS FUNCTION READS COMMAND GROUPS USED BY THIS PRINTER */
void read_command_group(char *printer_name) {
/* BUILD FILE PATH */
char filepath[256];
strcpy(filepath, "/etc/xcmdprinter/");
strcat(filepath, printer_name);
/* OPEN AND READ FILE */
char line[256];
FILE *fp = fopen(filepath, "r");
while(fgets(line, sizeof(line), fp)) {
if(line[0]=='G') {
XmString str;
char command_group_line[256];
int i=2;
while(line[i]!='[=12=]') {
command_group_line[i-2] = line[i];
i++;
}
command_group_line[i-2] = '[=12=]';
str = XmStringCreateLocalized(command_group_line);
XmListAddItem(command_group_list, str, 0);
XmStringFree(str);
}
}
fclose(fp);
}
/* CALLBACK FUNCTION FOR PRINTER SELECTION */
void select_printer(Widget w, XtPointer client_data, XtPointer call_data) {
XmListDeleteAllItems(command_group_list);
read_command_group((char *)client_data);
}
每一项都包含一个换行符;删除它。
I am also wondering why the focus is displayed with such a strong dotted line.
由列表小部件的资源设置XmNhighlightThickness
,
其默认值为 2.