2010-07-27 9 views
2

Je travaille sur un défaut dans mon code GTK pour l'affichage des menus contextuels. Après avoir créé un menu avec un certain nombre d'éléments de menu, j'utilise gtk_menu_popup() pour afficher le menu. Cette fonction prend un pointeur de fonction de type GtkMenuPositionFunc qui me permet de positionner le menu. Je ne fais vraiment rien ici sauf que je dis à GTK de garder sa position actuelle mais j'appuie sur le menu si une partie du menu est en dehors du moniteur (en utilisant le quatrième argument de la fonction). Mon problème est que lorsque GTK pousse le menu, la position absolue des éléments du menu ne change pas. Par conséquent, leur position de défilement change, ce qui entraîne des barres de défilement dans le menu. Je veux que la position relative des éléments du menu par rapport au menu reste fixe. Est-ce que je peux faire ça? La documentation GTK avertit de ce problème, mais ne dit rien sur la façon de le résoudre. Il y a le lien pour référence:GTK: éléments du menu contextuel de positionnement w.r.t menu contextuel

http://library.gnome.org/devel/gtk/unstable/GtkMenu.html#GtkMenuPositionFunc

EDIT: J'aurais aimé inclure un code, mais la logique est trop dispersée pour cela.

Répondre

0

Je n'ai pas réussi à trouver un moyen de réajuster le décalage de défilement des éléments de menu une fois le menu enfoncé. Ainsi, la solution de contournement utilisée consistait à éviter que GTK ne pousse verticalement le menu. Par conséquent, la demande initiale était de créer le menu à la position (x,y) mais a abouti à longueur L du menu sortant de l'écran, je repositionne le menu à (x,y-L) dans ma fonction de position. De même, si y<0 je change le définir à (x,0). Je dis toujours à GTK de pousser n'importe quel menu qui sort de l'écran pour prendre soin des menus qui dépassent les marges gauche et droite.

0

Vous n'avez pas besoin de fournir une fonction de positionnement si vous voulez juste le comportement par défaut. Le comportement par défaut est de conserver la position actuelle, mais assurez-vous que le menu est adapté au moniteur, vous pouvez donc simplement passer NULL comme fonction de positionnement.

Vous pouvez également jeter un oeil à la façon dont la fonction de positionnement par défaut est écrit: http://git.gnome.org/browse/gtk+/tree/gtk/gtkmenu.c, gtk_menu_position() actuellement à la ligne 4288.

PS. Si votre logique est trop dispersée pour publier un échantillon de code, vous devriez envisager de le nettoyer.

+0

Passer 'NULL' n'est pas vraiment une option car il est utilisé dans certains cas. J'ai essayé de passer 'NULL' pour ce cas spécifique et cela a résolu le problème. Cela signifie-t-il que je ne peux pas demander à GTK de repositionner un menu et lui demander de pousser le menu à l'intérieur s'il sort de l'écran? Cela semble improbable. – 341008

+0

J'ai inclus le lien vers le code source afin que vous puissiez copier la fonction de positionnement par défaut et commencer à partir de là. Si GTK peut faire ce que vous voulez, alors vous aussi. – ptomato