2010-01-31 10 views
22

Según referencia GObject¿Qué hace g_signal_connect_swapped()?

g_signal_connect_swapped (instancia, detailed_signal, c_handler, datos); conecta una función GCallback a una señal para un objeto particular. La instancia en la que se emite la señal y los datos se intercambiarán al llamar al controlador.

No entiendo muy bien lo que esto significa. ¿Significa esto que el data apuntará al objeto apuntado por instance y instance apuntará al objeto señalado por data o estoy cometiendo un error aquí?

Si es el caso anterior, ¿cuál es la lógica detrás de esto?

Respuesta

40

Usted comprende correctamente.

Esto le permite hacer trucos como los siguientes: Tiene un botón (llamémoslo button), que se supone que oculta otro widget (llamémoslo textview) cuando se presiona.

A continuación, puede hacer

g_signal_connect_swapped(button, 'clicked', G_CALLBACK(gtk_widget_hide), textview); 

para lograrlo. Cuando se presiona el botón, genera la señal de "clic" y se llama a la devolución de llamada con textview como primer argumento, y button como el segundo. En este caso, la devolución de llamada es gtk_widget_hide() que solo toma un argumento, por lo que se ignora el segundo argumento, porque así es como funciona la convención de llamadas C.

Es lo mismo que el siguiente, pero más corto.

static void 
on_button_clicked(GtkButton *button, GtkWidget *textview) 
{ 
    gtk_widget_hide(textview); 
} 

...elsewhere... 

    g_signal_connect(button, 'clicked', G_CALLBACK(on_button_clicked), textview); 

Básicamente le ahorrará tener que escribir una función extra si codifica manualmente su interfaz. Por supuesto, puede haber un uso mucho más práctico que nunca he entendido.

+1

También es bueno para hacer generalmente eventos de niños invocar manejadores con 'self' como primer argumento, por ejemplo:' g_signal_connect_swapped (self-> some_internal_child, "button-press-event", (GCallback) my_mouse_handler, self) '. Hacer eso sin 'intercambio 'significaría tener una fea firma en el lado receptor con un primer argumento que probablemente no sea interesante en la mayoría de los casos, y que a menudo puede obtener de' self-> 'de todos modos. O al menos así es como he usado esto hasta ahora ... –