Jak wysłać sygnał configure-event do kontrolki GtkDrawingArea ?

0

Tak jak w temacie.
Próbuję z g_signal_emit_by_name ( G_OBJECT(draw), "configure-event", 0, NULL );
jednak bez skutku i mam komunikat:
Glib_Gobject-WARNING **: gsignal.c:3003 value location for gboolean passed as NULL

0

Funkcja chce boola, a ty im dajesz nulla ;)

gboolean v;
g_signal_emit_by_name ( G_OBJECT(draw), "configure-event", 0, &v );
0

Fakt, działa, ale:
Należy pamiętać jeśli zostanie podpięta funkcja obsługująca to zdarzenie g_signal_connect (G_OBJECT(draw), "configure-event", G_CALLBACK(konfig), GINT_TO_POINTER(3) );
i w niej korzysta się z zmiennych struktury GdkEvent to program się wysypie, dlatego należy wypełnić tą strukture. Poniżej trochę kodu, może komuś się przyda:

 
guint skala;


gboolean konfig (GtkWidget *widget, GdkEvent  *event, gpointer   user_data)
{
    gdouble x, y;

    x = ((GdkEventButton*)event)->x; // 1 sposób dostania się do składowej
    y = event->button.y; // 2 sposób dostania się do składowej

    x = x * skala;
    y = y * (gint) user_data;
    
    return FALSE;
}

int main( int    argc, char **argv )
{
   GtkWidget *draw;
  [...]

  draw = gtk_drawing_area_new();
  g_signal_connect  (G_OBJECT(draw), "configure-event", G_CALLBACK(konfig), GINT_TO_POINTER(3) ); 
  [...]

  GdkEvent ev;
  gboolean v;

  /* Należy wypełnić strukture przynajmniej tymi danymi, które będą używane w funkcji obsługującej zdarzenie configure-event */
  ev.button.x = 2.0;
  ev.button.y=4.9;

  g_signal_emit_by_name ( G_OBJECT(draw), "configure-event", &ev, &v ); // Emisja sygnału configure-event
  g_print ( "Funkcja konfig zwrocila wartość %d\n", v ); 
  [...]
}
0

Trochę rzeźbisz. Wysyłasz sygnał, który informuje o zmianie rozmiaru okna, podajesz tam jakieś dane o buttonie O.o Rzutujesz na GdkEventButton zamiast skorzystać z GdkEventConfigure w handlerze. Może poczytaj tutorial http://developer.gnome.org/gtk-tutorial/2.24/x2470.html bo to chyba chcesz zrobić.

0

To jest tylko wycinek wiekszej całości :)
Emmisja sygnału configure-event potrzebna mi była, aby skrócić testowanie programu. Zmiana rozmiaru okna u mnie pociąga za sobą zmiane rozmiaru obszaru rysunkowego (trzeba przeliczyć/przeskalować punkty), a nadodatek nie musiałem klikać LMB na pozycji 2.0,4.9 :) Być może można było użyć innego sygnału, ale ten sposób okazał się skuteczny...

1 użytkowników online, w tym zalogowanych: 0, gości: 1