【问题标题】:Setting the title of a Motif Window设置主题窗口的标题
【发布时间】:2021-09-20 08:06:53
【问题描述】:

我正在尝试设置顶层 Motif 2.1 窗口的标题。

从 O'Reilly 第六卷 A 中,我看到在 Motif 2.1 中建议使用 XtVaOpenApplication 创建顶级 Widget。

this appendix 中可以看到optionsXtNumber(options) 如何通过参数列表作用于资源。

我在调用程序时尝试使用它来生成可选标志-title WINDOW_TITLE,但没有成功。

这是我尝试过的:

#include <stdlib.h>
#include <stdio.h>
 
#include <Xm/Xm.h>
#include <Xm/PushB.h>
 
static XrmOptionDescRec options[] = {
    { "-title", "XmNtitle", XrmoptionIsArg, NULL },
};
 
int main(int argc, char *argv[]) {

    Widget          toplevel;             /* Top Level Button */
    XtAppContext    app;                  /* Application Context */
    char            *window_title = NULL; /* Top Level Window Title */
    
    /* INITIALIZE TOP LEVEL WINDOW */
    XtSetLanguageProc(NULL, NULL, NULL);
    toplevel = XtVaOpenApplication( &app, argv[0], options, XtNumber(options), &argc, argv, NULL, sessionShellWidgetClass, NULL);
    
    /* REALIZE TOPLEVEL WINDOW AND LAUNCH APPLICATION LOOP */
    XtRealizeWidget(toplevel);
    XtAppMainLoop(app);
    
    return 0;

}

程序编译,但对-title MYTITLE 命令行参数没有反应。

这是makefile(适用于 FreeBSD 12):

test:           test.o
                cc -L/usr/local/lib -O -o test test.o -lXm -lXt -lX11

test.o:         test.c
                cc -I/usr/local/include -c test.c

如何根据名为-title 的可选参数更改窗口标题?

【问题讨论】:

  • 我不知道,但我认为这 解析 仅命令行。要设置标题,您还必须对解析的值进行操作。
  • AFAIK -title 是标准 x 工具包命令行选项之一,由 XtVaOpenApplication 自动处理。您不需要在XrmOptionDescRec 中指定它。
  • 是的,我没有意识到这一点。

标签: c x11 motif


【解决方案1】:

正确的 xrm 选项行是

{"-title", ".title", XrmoptionSepArg, NULL}

您实际上不需要指定它,因为它在默认的 Xt 选项表中。

一般情况下,您在指定 xrm 资源名称时省略 XmN

【讨论】:

  • 我不知道-title 是默认 Xt 选项表的一部分。不需要你说的。但是,我也尝试使用{"-foo", "title", XrmoptionSepArg, NULL},因此您可以使用-foo MYTITLE 更改标题(仅作为示例,因为现在很明显不需要它)。我试过在title 之前删除点,它也可以。所以可以用{"-foo", "title", XrmoptionSepArg, NULL}代替{"-foo", ".title", XrmoptionSepArg, NULL}。使用点有什么理由吗?
  • 我不确定前面的点,看起来它是多余的,但它正在 X11 源中使用。
  • 关于XrmOptionDescRec 结构数组的一个不同但相关的问题可以在这里找到:stackoverflow.com/questions/68336568/… 我可以使用结构数组来传递非X11 相关的参数吗?如果没有,我怎样才能将它们合并到程序中?
【解决方案2】:

请您自己进一步调查(我不是 X/Motif 专家),但参数解析似乎有些不对劲。 在调用 XtVaOpenApplication 调用中用 0 替换其大小为 NULL 的选项似乎可以解决问题: toplevel = XtVaOpenApplication( &amp;app, argv[0], NULL, 0, &amp;argc, argv, NULL, sessionShellWidgetClass, NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多