2

如何创建没有系统菜单、最小化和最大化框的 Motif 主窗口?我只是无法通过谷歌搜索和阅读文档和教程来了解如何。我相信应该可以使用一些额外的参数XtVaCreateManagedWindow,但是哪个?

我尝试了XtVaSetValues( topWid, XmNmwmDecorations, ...) 的几种变体,但都没有奏效。相反,我收到一条错误消息,我需要为此使用供应商 shell。然而,大多数小部件类型不是从供应商外壳派生的,当我尝试使用对话框外壳并将可滚动的文本小部件放入其中时,文本小部件似乎控制了对话框。

4

3 回答 3

2

显然,摆脱窗口(系统)菜单是不可能的,但似乎可以使用如下代码禁用窗口菜单项:

int i;
XtVaGetValues (widget, XmNmwmFunctions, &i);
i &= ~(MWM_FUNC_ALL | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE | MWM_FUNC_CLOSE);
XtVaSetValues (widget, XmNmwmFunctions, i);

它也删除了相关的窗口装饰,显然甚至适用于非供应商外壳小部件。

于 2009-09-08T12:38:09.770 回答
2

还应该有可能移除装饰(即使它们不可见)。但是,请注意这些“系统菜单”装饰属于窗口管理器,而不是您的 Motif 程序本身。由窗口管理器来处理您的请求或忽略它们——您可能会使用任何 MWM 资源获得特定于供应商的行为。

无论如何,这是要试用的代码示例:

int decors; //bit-mask of flags defining the decorations, from Xm/MwmUtil.h
XtVaGetValues(dlg, XmNmwmDecorations, &decors, NULL);
decors &= ~MWM_DECOR_MENU;
decors &= ~MWM_DECOR_MAXIMIZE;
decors &= ~MWM_DECOR_MINIMIZE;
XtVaSetValues(dlg, XmNmwmDecorations, decors, NULL);
于 2009-09-14T16:12:21.950 回答
0

如果您打算从 运行您的应用程序Mwm,您可以通过设置(例如通过XtVaAppInitialize())以下 X11 资源来实现所需的行为:

! Title bar buttons
Mwm*YourApplicationClassHere.clientDecoration: -minimize -maximize
! Window menu functions
Mwm*YourApplicationClassHere.clientFunctions: -minimize -maximize

这些资源在这里这里有更详细的解释。

说到窗口菜单,这取决于使用的特定窗口管理器。Mwm,例如,允许客户端使用Mwm*YourApplicationClassHere.windowMenu资源设置菜单名称,菜单本身必须定义在${HOME}/.mwmrcor globalmwmrcXmNmwmMenuresource 中VendorShell。生成的自定义窗口菜单显示为_MOTIF_WM_MENU原子,现代窗口管理器似乎忽略了这一点。

示例mwmrc菜单定义可能如下所示

Menu CustomMenu0
{
        Restore         _R      Alt<Key>F5      f.restore
        Move            _M      Alt<Key>F7      f.move
        Size            _S      Alt<Key>F8      f.resize
        Minimize        _n      Alt<Key>F9      f.minimize
        Maximize        _x      Alt<Key>F10     f.maximize
        Lower           _L      Alt<Key>F3      f.lower
        no-label                                f.separator
        Pass\ Keys      _K                      f.pass_keys
        no-label                                f.separator
        Close           _C      Alt<Key>F4      f.kill
}

Menu CustomMenu1
{
        Your\ Application\ Name\ Here           f.title
        no-label                                f.separator
        Close           _C      Alt<Key>F4      f.kill
}

(见功能说明)。可以使用(此处此处f.send_msg的示例)添加自定义菜单项。

我很确定以上所有内容也适用于DtwmCDE)。

于 2015-10-19T15:06:33.483 回答