2009-06-29 13 views
14

In GTK (o pygtk o gtkmm ...)GTK ridimensionare dall'utente

Come posso rilevare che una finestra è stata manualmente ridimensionato dall'utente, come tipicamente fatto trascinando il bordo della finestra?

Devo trovare un modo per differenziare il ridimensionamento manuale da ridimensionamenti che derivano da gtk, come le modifiche nel contenuto della finestra.

+0

Hai trovato un modo per farlo? – clahey

+0

No. Se lo faccio, verrà visualizzato qui. –

risposta

7

Hai provato a collegarti all'evento GDK_CONFIGURE?

Verificare this example nella sezione "Finestra mobile". L'esempio mostra un callback che fa qualcosa quando viene spostata la finestra, ma l'evento configure è un catch-all per spostare, ridimensionare e impilare gli eventi dell'ordine.

+1

Il seguente codice funziona per questo: g_signal_connect (G_OBJECT (finestra), "configure-event" , G_CALLBACK (callback_func), NULL); – Sean

+0

@Sean puoi fornire una risposta che funzioni? –

+0

Penso che si possa usare "check-resize" invece "configure-event" – boldnik

1

In PyGTK, ho sempre guardato per il expose_event per ridimensionare una finestra, quindi utilizzare il metodo get_allocation per ottenere la nuova dimensione.

+0

Sto osservando la struttura GdkEventExpose ... è il campo send_event che mi dice che l'utente l'ha fatto? –

+1

In realtà, probabilmente vuoi event_configure, non event_expose ... my bad. Penso che sia richiesto sia per le mosse sia per il ridimensionamento, quindi dovrai ricordare la dimensione precedente se è tutto ciò che ti interessa. – eduffy

0

Potrebbe essere possibile lanciare qualcosa utilizzando gdk_window_get_root_origin per ottenere l'angolo in alto a sinistra della finestra e gdk_window_get_geometry per ottenere la larghezza e l'altezza. Quindi è possibile agganciare una richiamata nel GDK_BUTTON_PRESS_MASK e verificare se il pulsante viene premuto vicino/su uno dei bordi della finestra.

Naturalmente, questo sembra abbastanza logico e mi infastidisce davvero il fatto che non sono riuscito a trovare un modo semplice nella documentazione di GdkWindow per farlo. C'è una funzione gdk_window_begin_resize_drag che in realtà mi fa pensare che ci sia un modo più pulito per farlo, ma non ho visto nulla di più ovvio della mia risposta.

4

Sono riuscito a farcela guardando i segnali size_allocate e size_request su GtkWindow. Se size_request diventasse mai più piccolo, ho chiamato resize(1,1). Se size_allocate era mai più grande del previsto, ho spento il sistema.

Una cosa che mi sono assicurato di gestire era size_request restituendo grande, poi piccolo, e avendo size_allocate essere grande e poi piccolo. Non so se questo è possibile, ma l'ho risolto facendo in modo di ridurre solo i valori attesi per size_allocate quando ho ottenuto un size_allocate più piccolo, non quando ho ottenuto un size_request minore.

Assicurarsi che il gestore size_request arrivi dopo il gestore della classe base in modo da ottenere i valori corretti. Ho fatto questo sovrascrivendo il metodo e poi chiamando per primo il metodo della classe base.

Ho provato questo in entrambe le dimensioni 1 e 2 e sembra funzionare in entrambi i modi.

2

Nel mio caso stavo cercando di distinguere tra un utente che ridimensiona un Gtk.Paned dall'utente che ridimensiona l'intera finestra. Entrambi hanno emesso il segnale notify::position.

La mia soluzione era, dal momento che non posso sapere se l'utente sta ridimensionando la finestra dal widget, invertire ciò che volevo sapere. Registra se l'utente ha riposizionato il widget e ignora gli aggiornamenti se l'utente non li ha avviati sul mio widget.

vale a dire, invece di test "se la finestra viene ridimensionata" ho registrato le button-press-event e button-release-event 's localmente così ho potuto invece verificare 'se widget di essere rimesso in posizione'

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) 

efficacemente registrati quando l'utente iniziava e finiva di interagire direttamente con il mio widget, potevo supporre che il resto del tempo fosse dovuto alla ridimensionamento della finestra. (Fino a quando trovo più casi)

+0

Questo è intelligente ... –