2009-06-29 9 views
14

Dans GTK (ou pygtk ou gtkmm ...)fenêtre de détection de GTK redimensionnement de l'utilisateur

Comment peut-on détecter qu'une fenêtre d'application a été manuellement redimensionnée par l'utilisateur, comme cela est généralement effectuée en faisant glisser le 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.

+0

Avez-vous trouvé un moyen de faire cela? – clahey

+0

Non. Si je le fais, ça va apparaître ici. –

Répondre

7

Avez-vous essayé de vous connecter à l'événement GDK_CONFIGURE?

Extrayez la section «Fenêtre mobile» sous this example. L'exemple montre un rappel effectuant quelque chose lorsque la fenêtre est déplacée, mais l'événement configure est un attrape-tout pour les événements de déplacement, de redimensionnement et de pile.

+1

Le code suivant fonctionne pour ceci: g_signal_connect (G_OBJECT (window), "configure-event" , G_CALLBACK (callback_func), NULL); – Sean

+0

@Sean pouvez-vous fournir une réponse qui fonctionne? –

+0

Je pense que vous pouvez utiliser "check-resize" au lieu de "configure-event" – boldnik

1

Dans PyGTK, j'ai toujours regardé le expose_event pour un redimensionnement de la fenêtre, puis utilisez la méthode get_allocation pour obtenir la nouvelle taille.

+0

Je regarde la structure GdkEventExpose ... est-ce le champ send_event qui me dirait que l'utilisateur l'a fait? –

+1

En fait, vous voulez probablement event_configure, pas event_expose ... mon mauvais. Je pense que cela est appelé à la fois pour les déplacements et les redimensionnements, donc vous devrez vous souvenir de la taille précédente si cela vous intéresse. – eduffy

0

Vous pouvez lancer quelque chose en utilisant gdk_window_get_root_origin pour obtenir le coin supérieur gauche de la fenêtre et gdk_window_get_geometry pour obtenir la largeur et la hauteur. Ensuite, vous pouvez connecter un rappel dans GDK_BUTTON_PRESS_MASK et vérifier si la pression du bouton se produit près de/sur l'un des bords de la fenêtre.

Bien sûr, cela semble assez hackish et cela me dérange vraiment que je ne pouvais pas trouver un moyen simple dans la documentation pour GdkWindow de le faire. Il ya une gdk_window_begin_resize_drag fonction qui vraiment me fait penser qu'il ya une façon plus propre de faire cela, mais je n'ai rien vu de plus évident que ma réponse.

4

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

Une chose que je me suis assuré de gérer était size_request retournant grand, puis petit, et ayant size_allocate être grand, puis petit. Je ne sais pas si c'est possible, mais je l'ai corrigé en m'assurant de ne diminuer que les valeurs attendues pour size_allocate quand j'ai obtenu un plus petit size_allocate, pas quand j'ai eu un plus petit size_request.

Assurez-vous que votre gestionnaire size_request vient après le gestionnaire de classe de base afin que vous obteniez les bonnes valeurs. Je l'ai fait en redéfinissant la méthode puis en appelant la méthode de la classe de base en premier.

J'ai essayé ceci dans les deux dimensions 1 et 2 et il semble fonctionner de toute façon.

2

Dans mon cas, j'essayais de distinguer entre un utilisateur redimensionnant un Gtk.Paned de l'utilisateur redimensionnant la fenêtre entière. Les deux émettent le signal notify::position. Ma solution était, puisque je ne peux pas savoir si l'utilisateur redimensionne la fenêtre du widget, inverser ce que je voulais savoir. Enregistrer si l'utilisateur a repositionné le widget et ignorer les mises à jour si l'utilisateur ne les a pas initiées sur mon widget.

C'est à dire, au lieu de test « si la fenêtre redimensionnée » J'ai enregistré les je pouvais tester à la place « s localement button-press-event et button-release-event donc « si un widget étant repositionné »

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) 

efficacement par enregistré Lorsque l'utilisateur a démarré et terminé l'interaction avec mon widget directement, je pouvais supposer que le reste du temps était dû à la redimensionnement de la fenêtre. (Jusqu'à ce que je trouve plus de cas)

+0

C'est intelligent ... –

Questions connexes