signals - example - import gtk
¿Qué hace g_signal_connect_swapped()? (1)
Según referencia de GObject
g_signal_connect_swapped (instance, detailed_signal, c_handler, data); conecta una función GCallback a una señal para un objeto en particular. La instancia en la que se emite la señal y los datos se intercambiarán al llamar al controlador.
No entiendo lo que esto significa. ¿Esto significa que los data
apuntarán al objeto apuntado por instance
y la instance
apuntará al objeto apuntado por data
o estoy cometiendo un error aquí?
Si el primero es el caso, ¿cuál es la lógica detrás de esto?
Lo entiendes 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 vista de textview
) cuando se presiona.
Entonces puedes hacer
g_signal_connect_swapped(button, ''clicked'', G_CALLBACK(gtk_widget_hide), textview);
para lograr eso. Cuando se presiona el botón, genera la señal de ''clic'', y la devolución de llamada se llama con vista de 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 el segundo argumento se ignora, porque esa es la forma en que funciona la convención de llamada C.
Es lo mismo que lo 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 evita tener que escribir una función adicional si codifica manualmente su interfaz. Por supuesto, puede haber un uso mucho más práctico que nunca he entendido.