2010-07-22 4 views
2

J'écris un code de fenêtre de bas niveau pour une fenêtre dans x (en C++), et je veux empêcher l'utilisateur de maximiser ou de minimiser la fenêtre. Cela ne me dérange pas si cela est fait en rejetant la demande de redimensionnement, ou en supprimant les boutons eux-mêmes. Cependant, je suis lié à x et ne peux pas utiliser qt ou d'autres bibliothèques de plus haut niveau que je sais fournir cette fonctionnalité. Pour l'instant, tout ce que j'ai réussi à faire est d'intercepter l'événement ResizeRequest, puis de redéfinir la taille de la fenêtre en utilisant XResizeWindow ... mais cela fait que la fenêtre maximise momentanément puis retourne à son état d'origine. Existe-t-il un moyen de rejeter directement une ResizeRequest, ce qui semble être la bonne façon de gérer cela, mais une bonne partie du googling et du chalutage de documents n'a pas trouvé de solution.empêcher la maximisation/minimisation de fenêtre dans le système de fenêtres x

merci, James

Répondre

3

vous ne pouvez pas. Essentiellement, vous vous battez comme un enfoiré contre le gestionnaire de fenêtres (et contre l'utilisateur à la fin). Par exemple, vous pouvez observer les événements PropertyNotify pour vérifier si votre fenêtre (ou plutôt la fenêtre à laquelle votre fenêtre est attachée (fournie par le gestionnaire de fenêtres)) est minimisée. et ensuite vous le minimisez. et ensuite l'utilisateur le minimise, ou le gestionnaire de fenêtres. techniquement, vous pouvez vous battre contre, mais je vous déconseille fortement. Cela dit: vous pouvez essayer de donner quelques indications au gestionnaire de fenêtres sur ce que vous pensez être approprié pour la fenêtre. voir http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html#id2523223:

_NET_WM_ALLOWED_ACTIONS 

est une propriété du gestionnaire de fenêtres gère par fenêtre (pour dire aux autres outils ce qui est possible avec cette fenêtre). l'une de ces actions est

_NET_WM_ACTION_RESIZE indicates that the window may be resized. 
(Implementation note: Window Managers can identify a non-resizable 
window because its minimum and maximum size in WM_NORMAL_HINTS will 
be the same.) 

donc, si vos utilisateurs utilisent un gestionnaire de fenêtres qui interprête WM_NORMAL_HINTS correctement et laisse tomber tout Redimensionnement, maximiser, réduisant au minimum: vous pouvez sentir la chance.

Que voulez-vous vraiment réaliser? une sorte de mode kiosque? une sorte de commerce équitable où les gens qui se promènent ne peuvent pas «fermer», fermer, redimensionner, bidouiller avec l'application que vous présentez?

si c'est le cas: pensez à exécuter une session sans aucun gestionnaire de fenêtres impliqué. il suffit de démarrer votre application aussi grande que vous en avez besoin et fait.

+0

Je souhaite créer une fenêtre non redimensionnable. C'est sûrement possible, les gestionnaires de plus haut niveau y parviennent. Par exemple, dans Java, vous pouvez définir une fenêtre non redimensionnable et désactiver les boutons Agrandir/Réduire. –

+0

@james Mais pourquoi voulez-vous une fenêtre non redimensionnable. Est-ce que quelque chose va se casser si la fenêtre est redimensionnée, ou êtes-vous simplement imposer vos idées sur votre utilisateur. Que faire si l'utilisateur change la taille de la police dans la fenêtre? Que faire s'il y a un message dans la fenêtre qui est plus long que prévu. À moins d'une bonne raison, ne prenez pas les capacités à l'écart de l'utilisateur. – KeithB

+0

juste parce qu'il n'y a pas de "boutons" ne veut rien dire. alt + leftmouse dans la plupart des gestionnaires de fenêtres et c'est parti. vous pouvez définir des indications de taille (man XSizeHints) et un gestionnaire de fenêtres conforme respectera ces "astuces". – akira

2

Techniquement, vous ne pouvez rien empêcher, puisque les WM peuvent faire ce qu'ils veulent, mais la plupart des gestionnaires de fenêtres raisonnables vous permettent de contrôler cela.

La méthode moderne préférée pour le faire est de définir le type sémantique _NET_WM_WINDOW_TYPE si l'un de ceux-ci est applicable. Par exemple, dans de nombreux WM, un type de dialogue peut impliquer une non-maximisable. http://standards.freedesktop.org/wm-spec/1.3/

Il semblerait qu'aucun d'entre eux ne s'applique à votre application, probablement, vous devrez donc définir les indicateurs spécifiques.

Pour éviter la maximisation, vous souhaitez simplement rendre la fenêtre non redimensionnable. Comme vous l'avez découvert, "combattre" le redimensionnement en le redimensionnant est une mauvaise idée. Il a entre autres choses un potentiel de boucle infini.

XSetWMSizeHints() est la méthode correcte pour éviter la maximisation. Définissez la taille minimale = taille maximale. voila, pas redimensionnable.Pour éviter la minimisation, vous devez utiliser un peu de vieil héritage cruft appelé les conseils Mwm. Malheureusement, cela implique de couper et coller une définition de structure, puis de définir une propriété sur les bits de la structure.

Je viens de googlé pour MWM hints docs, et l'un des résultats est moi qui suggère de documenter eux, il y a 9 ans ;-) http://mail.gnome.org/archives/wm-spec-list/2001-December/msg00044.html Malheureusement, aucun des résultats sont réels docs.

Vous pouvez probablement le comprendre à partir http://git.gnome.org/browse/gtk+/tree/gdk/x11/MwmUtil.h et gdk_window_set_mwm_hints() http://git.gnome.org/browse/gtk+/tree/gdk/x11/gdkwindow-x11.c#n4389

MwmUtil.h est le struct qui est coupé et-collé partout (dans la plupart des boîtes à outils) et gestionnaires de fenêtres.

L'indice _NET_WM_ALLOWED_ACTIONS est défini dans votre fenêtre par le WM indiquant les fonctionnalités que le WM a décidé de placer sur la fenêtre. L'objectif principal de cette indication est que les pagers et les listes de tâches et autres composants de bureau peuvent alors proposer les actions correspondantes pour la fenêtre.

Les spécifications qui couvrent tout cela sont l'ICCCM (ancienne spécification, encore la plupart du temps valide) et l'EMWH (nouvelles extensions et clarifications, puisque ICCCM a laissé beaucoup de choses non traitées).

Pour plus de détails gores, essayez le code source ... par exemple recalc_window_features() dans le fichier window.c de metacity, actuellement en ligne 6185 http://git.gnome.org/browse/metacity/tree/src/core/window.c#n6185

Un ajustement philosophique lors du codage pour X: kilométrage varie avec le gestionnaire de fenêtre . Les gens «ordinaires» que beaucoup de gens utilisent généralement suivront les spécifications et travailleront comme prévu. Cependant, il y a toutes sortes de MM là-bas, certains brisés, d'autres délibérément excentriques. La pire chose que vous pouvez faire est d'essayer de "se battre" ou de contourner le WM, parce que, fondamentalement, toutes les façons de le faire finiront par casser l'application lorsque vous utilisez un WM sain. Votre meilleur pari est de faire suivre les spécifications, de travailler avec les WMs normaux, et si les utilisateurs sont contrariés qu'ils peuvent redimensionner votre fenêtre non-redimensionnable parce que leur WM le permet, il suffit de leur dire de se plaindre à quiconque fournit cette WM. . Tout le point de la conception WM enfichable est que le WM détermine certains de ce comportement, plutôt que l'application.

Bonne chance. Modern X est assez complexe et coder Xlib sans toolkit est une sorte de demander que les choses soient ... pas tout à fait raison. Mais vous pouvez probablement le faire assez bien. :-P

Questions connexes