2009-09-07 13 views
2

Comment est-ce que je crée une fenêtre principale de Motif qui n'a pas un menu de système, minimise et maximise des boîtes? Je ne peux tout simplement pas savoir comment en faisant des recherches sur Google et des didacticiels. Je crois que cela devrait être possible avec quelques paramètres supplémentaires pour XtVaCreateManagedWindow, mais lequel?Motif fenêtre principale sans menu système, minimiser et maximiser les boîtes comment? (C++)

J'ai essayé plusieurs variantes de XtVaSetValues (topWid, XmNmwmDecorations, ...) mais aucune n'a fonctionné. Au lieu de cela, je reçois un message d'erreur dont j'ai besoin pour utiliser un shell fournisseur pour cela. Cependant, la plupart des types de widgets ne sont pas dérivés de coquilles de fournisseur, et lorsque, par ex. essayez d'utiliser un shell de dialogue et mettez un widget de texte défilant à l'intérieur de celui-ci, puis le widget de texte semble contrôler le dialogue.

+2

Contrairement à slashdot, ici sur stackoverflow, je ne pense pas que vous détestiez combien vous détestez Linux va inspirer plus de réponses que si vous aviez simplement demandé gentiment. – Alec

Répondre

2

Apparemment, ce n'est pas (facilement) possible de se débarrasser du menu de la fenêtre (système), mais il semble possible de désactiver les options de menu de la fenêtre avec un code comme ceci:

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

qui supprime la connexes la décoration de la fenêtre aussi et semble même fonctionne pour les widgets shell non fournisseur.

2

Il devrait également être possible d'enlever les décorations (c'est-à-dire de les rendre invisibles). Cependant, veuillez noter que ces décorations "menu système" appartiennent au gestionnaire de fenêtres, pas à votre programme Motif lui-même. Il appartient au gestionnaire de fenêtres de gérer vos demandes ou de les ignorer - vous pouvez obtenir un comportement spécifique au fournisseur avec toutes les ressources MWM.

Quoi qu'il en soit, voici l'exemple de code pour essayer:

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

Merci. J'avais essayé ça, mais ça n'a pas fonctionné pour moi (OpenMotif/OpenSuSE 11.1). La solution ci-dessous fonctionne assez bien pour moi cependant. – karx11erx

0

Si vous avez l'intention d'exécuter votre application à partir Mwm, vous pouvez obtenir le comportement souhaité par le réglage (par exemple via XtVaAppInitialize()) les ressources X11 suivantes:

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

Ces ressources sont expliquées plus en détail here et here.

En parlant de menu de fenêtre, celui-ci dépend d'un gestionnaire de fenêtre spécifique en cours d'utilisation. Mwm, par exemple, permet au client de définir le nom du menu en utilisant Mwm*YourApplicationClassHere.windowMenu ressource, le menu lui-même doit être défini soit ${HOME}/.mwmrc ou global mwmrc, ou XmNmwmMenu ressource de VendorShell. Le menu de la fenêtre personnalisée qui en résulte est exposé sous la forme d'un atome _MOTIF_WM_MENU, qui semble être ignoré par les gestionnaires de fenêtres modernes.

Définitions Exemple de menu mwmrc peuvent ressembler à ceci

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 
} 

(voir le function descriptions). Les éléments de menu personnalisés peuvent être ajoutés en utilisant f.send_msg (exemples here et here). Je suis sûr que tout ce qui précède s'applique également à Dtwm (CDE).