2010-04-17 6 views
4

En utilisant GTK, j'essaie de superposer une invite "Plus" (mais cela pourrait aussi bien être n'importe quel objet dessin) dans le coin d'un GtkTextView contenu dans un GtkScrolledWindow. Je dessine l'invite dans le gestionnaire pour le signal expose de la vue de texte. Cela fonctionne, mais quand je fais défiler la fenêtre je reçois des artefacts: l'invite est déplacée avec le contenu de la vue de texte et non effacée. Afin de se débarrasser des artefacts, je déclenche un redessin après chaque défilement. Cela fonctionne principalement, mais vous pouvez toujours voir l'invite sauter de haut en bas lorsque vous faites défiler rapidement. Est-il un moyen d'empêcher cela? Ce serait bien si l'invite "flottait" en haut de la vue de texte.Peinture sur GtkScrolledWindow ou GtkEventBox

J'ai essayé d'entourer la fenêtre défilée dans un GtkEventBox et de peindre l'invite par-dessus, mais cela n'a pas fonctionné non plus; les barres de défilement et la vue de texte peignent toujours sur l'invite, même lorsque vous définissez la fenêtre de la boîte d'événement devant les fenêtres de ses enfants.

MISE À JOUR

Si je connecte le GtkEventBox « s avec rappel g_signal_connect_after() exposer, il est appelé après l'exposé callbacks du GtkScrolledWindow et GtkTextView. La vue de texte dessine toujours sur la boîte d'événement cependant. Je pense que c'est parce que le défilement se produit de manière asynchrone. Quelqu'un a-t-il une idée de comment je peux empêcher que mon dessin soit écrasé?

une mise à jour

donc je suppose que ce que je réellement besoin est un signal pour se connecter lorsque le défilement asynchrone est terminée. Si je peux savoir quand cela est, alors je peux déclencher un autre événement d'exposition sur le GtkEventBox. Comment puis-je recevoir une notification lorsque le défilement est terminé?

+1

Êtes-vous sûr que votre callback 'GtkEventBox' d'exposition est appelé après le' GtkScrolledWindow'? Un couple de printf clarifiera le doute ... – ntd

+0

Bonne idée; Je l'ai testé. Voir modifier à la question. – ptomato

Répondre

1

Utilisez une fenêtre contextuelle pour l'invite. Cela devrait éviter tous les problèmes avec les artefacts de défilement.

+0

J'ai pensé à cela, mais si vous déplacez la fenêtre principale, la fenêtre contextuelle restera là où elle est. Des idées? – ptomato

+0

Je n'ai pas de réponse certaine, mais j'essaierais de me connecter à l'événement configure pour le widget parent ou textview. Regardez aussi set_transient_for(). – ergosys

+0

Cela semble raisonnable, merci! Je ne suis toujours pas sûr que ce soit la solution idéale, mais encore une fois, ce n'est pas ce que j'ai maintenant ;-) – ptomato