简体   繁体   中英

Motif main window w/o system menu, minimize and maximize boxes how? (C++)

How do I create a Motif main window that doesn't have a system menu, minimize and maximize boxes? I just cannot find out how by googling and reading docs and tutorials. I believe that it should be possible with some additional parameters for XtVaCreateManagedWindow , but which?

I have tried several variants of XtVaSetValues ( topWid , XmNmwmDecorations , ...) but none worked. Instead I get an error message that I need to use a vendor shell for this. Most widget types aren't derived from vendor shells however, and when I eg try to use a dialog shell and put a scrollable text widget inside of it, then then text widget seems to control the dialog.

Apparently it's not (easily) possible to get rid of the window (system) menu, but it seems to be possible to disable window menu items with some code like this:

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

which removes the related window decoration too and apparently even works for non vendor shell widgets.

There should also be the possibility to remove the decorations (ie make them invisible). However, please note that these "system menu" decorations belong to the Window Manager, not your Motif program itself. It is up to the Window Manager to handle your requests or disregard them--you might get vendor-specific behavior with any MWM resources.

Anyway, here's the code sample to try out:

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);

If you intend to run your application from Mwm , you can achieve the desired behavior by setting (eg via XtVaAppInitialize() ) the following X11 resources:

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

These resources are explained in more detail here and here .

Speaking of window menu, this one depends on a specific window manager in use. Mwm , for instance, allows the client to set the menu name using Mwm*YourApplicationClassHere.windowMenu resource, the menu itself must be defined in either ${HOME}/.mwmrc or global mwmrc , or XmNmwmMenu resource of VendorShell . The resulting custom window menu is exposed as a _MOTIF_WM_MENU atom, which seems to be ignored by modern window managers.

Sample mwmrc menu definitions may look like this

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
}

(see the function descriptions ). Custom menu items can be added using f.send_msg (examples here and here ).

I'm pretty sure all of the above also applies to Dtwm ( CDE ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM