GTK detecting fenêtre redimensionnée par l'utilisateur

en GTK (ou pygtk ou gtkmm...)

Comment puis-je détecter qu'une fenêtre d'application manuellement redimensionné par l'utilisateur, comme est généralement fait en faisant glisser le bord de la fenêtre?

je dois trouver un moyen de différencier les redimensionnements manuels des redimensionnements qui proviennent de gtk, tels que les changements dans le contenu de la fenêtre.

15
demandé sur Drew Dormann 2009-06-29 23:27:13

5 réponses

avez-vous essayé de vous connecter à L'événement GDK_CONFIGURE?

découvrez cet exemple en vertu de la "Fenêtre mobile". L'exemple montre un callback qui fait quelque chose lorsque la fenêtre est déplacée, mais l'événement configure est un catch-all pour les événements de déplacement, de redimensionnement et d'ordre de pile.

7
répondu luke 2009-08-12 16:33:57

j'ai réussi à en sortir en regardant pour size_allocate et size_request signaux sur l' GtkWindow. Si size_request jamais plus petit, j'ai appelé resize(1,1). Si size_allocate était plus grand que prévu, j'ai éteint le système.

une chose que je me suis assuré de gérer était size_request retour grand, petit, et avoir size_allocate être grand et petit. Je ne sais pas si c'est possible, mais je l'ai corrigé en veillant à seulement diminuer les valeurs attendues pour size_allocate quand j'ai eu un petit size_allocate, pas quand je suis devenu plus petit!--1-->.

assurez-vous que votre size_request handler vient après le handler de la classe de base pour que vous obteniez les bonnes valeurs. J'ai fait cela en dépassant la méthode et en appelant la méthode de classe de base d'abord.

j'ai essayé ceci en 1 et 2 dimensions et cela semble fonctionner dans les deux cas.

4
répondu clahey 2009-08-25 22:20:28

dans mon cas, j'essayais de faire la différence entre un utilisateur qui redimensionne un Gtk.Vitrage de l'utilisateur du redimensionnement de la fenêtre. Les deux émis le notify::position signal.

ma solution était, puisque je ne peux pas savoir si l'utilisateur redimensionne la fenêtre à partir du widget, inverser ce que je voulais savoir. Enregistrez si l'Utilisateur a re-positionné le widget et ignorez les mises à jour si l'utilisateur ne les a pas initialisées sur mon widget.

C'est à dire, au lieu de tester "si la fenêtre est redimensionnée" j'ai enregistré button-press-event et button-release-event's localement afin que je puisse au lieu de test "si widget de re-positionnés"

from gi.repository import Gtk

class MyPaned(Gtk.Paned):
    _user_activated = False

    def on_position(self, _, gparamspec):
        if self._user_activated:
            # widget touched

        else:
            # window resized (probably)

    def on_button_press(self, *_):
        self._user_activated = True

    def on_button_release(self, *_):
        self._user_activated = False


    dev __init__(self, *args):
        super(MyPaned, self).__init__(*args)
        self.connect('notify::position', self.on_position)
        self.connect('button-press-event', self.on_button_press)
        self.connect('button-release-event', self.on_button_release)

effectivement enregistré lorsque l'Utilisateur a commencé et terminé l'interaction avec mon widget directement, je pouvais supposer que le reste du temps était dû à la fenêtre étant redimensionné. (Jusqu'à ce que je trouve plus de cas)

3
répondu ThorSummoner 2016-07-08 01:29:14

à PyGTK, j'ai toujours regardé pour le expose_event pour redimensionner une fenêtre, puis utilisez le get_allocation méthode pour obtenir la nouvelle taille.

2
répondu eduffy 2009-06-29 19:39:06

Vous pouvez être en mesure de jeter quelque chose ensemble à l'aide de gdk_window_get_root_origin pour obtenir l'angle supérieur gauche de la fenêtre et gdk_window_get_geometry pour obtenir la largeur et la hauteur. Ensuite, vous pouvez brancher un rappel dans le masque GDK_BUTTON_PRESS_MASK et vérifier si la pression sur le bouton se produit près/sur l'un des bords de la fenêtre.

bien sûr, cela semble tout à fait hackish et il a vraiment qui me dérange, que je ne pouvais pas trouver quelque manière simple dans le documentation pour GdkWindow pour le faire. Il y a un gdk_window_begin_resize_drag fonction vraiment me fait penser qu'il y a une façon plus propre de faire cela, mais je n'ai rien vu de plus évident que ma réponse.

0
répondu Eric 2009-08-13 17:54:43