Usandon parametros personalizados

Caundo conectamos las señales, esposibe sumar un parametro extra personalizado a callback. Esto es muy beneficioso para pasar el objeto que quieres para ejecutar una acción a la función callback.

Por ejemplo, cuando un boton se presiona querriamos destruir la instancia padre de GtkWindow que la instancia de GtkButton habia sumado.

Podes hacer esto incluyendo un tercer parametro opcional a llamada a connect() . ESto sera pasado a la funcion que maneja la señal como el parametro final del callback.

Ejemplo 2.3. Usando parametros personalizados con el método connect() .

<?php

function button_clicked($button, $window) 
{
    $window->destroy();
    gtk::main_quit();
}

$window = &new GtkWindow();

$button = &new GtkButton("exit");
$button->connect("clicked","button_clicked", $window);

$window->add($button);
$window->show_all();

gtk::main();

?>
En el ejemplo anterior podes ver que no solo pasamos la variable $button , una instancia de GtkButton, a el callback "clicked" pero ademas pasamos la variable $window, una instancia de la clase GtkWindow. Esto nos permite llamar a el método destroy() en la ventana.

Podes tener tantos parametros personalizados como quieras.

Si se pasa la variablee $button como nuestro parametro objeto llamador y la variable $window como nuestro parametro personalizado, podemos entonces utilizar la misma callback para mas de un GtkButton o mas de una GtkWindow. Fijese que los nombres dados a los parametros dentro de callback son irrelevantes fuera de la función de callback; PHP-GTK se fija la posición de los parametros en el método connect*, luego llama y pasa estos parametros a las variables listadas en la declaración del callback como un array, por eso cada instancia de la conección usando la misma estructura de parametros puedes usar el mismo callback. Esto se demuestra en el codigo abajo usando solo un parametro personalizado, pero es igualmente cierto para mas de uno.

Ambos connect_object() y connect_object_after() permiten pasar un objeto distinto a el objeto que llama como primer parametro enviado a la función callback. Esto es principalmente usado llamando funciones estaticas de PHP-GTK, como en (por ejemplo) la función gtk::main_quit() :

Ejemplo 2.5. Usando el método connect_object() para especificar la función como callback.

<?php

$window = &new GtkWindow();
$window->connect_object("destroy", array("gtk", 
"main_quit"));
$window->show();

gtk::main();

?>
Podria ser llamado con una funcion estatca o un metodo usando la sintaxis gtkobject::method expresada como un array.

Tambien quiere decir que puede tener una sola callback para multiple señales. Por ejemplo, podrias crear una ventan que contenga (dentro de los widgets necesarios) una GtkMenuBar, una GtkToolbar y un GtkButton. Cuando elije Exit el usuario de cualquier de esos widgets una función de shutdown podria invorcarse pasandolo la instancia de GtkWindow como primer parametro, permitiendo asi que la ventana sea destruida desde cualquiera de sus conecciones. La función callback y sus conecciones en esta instancia se verian de la siguiente manera:

Ejemplo 2.6. Usando el método connect_object() para pasar otro objeto como primer parametro.

<?php

function destroy_window($window)
{
    $window->destroy();
    gtk::main_quit();
}

$exit_button->connect_object("clicked", 
"destroy_window", $window);


?>

El método connect_after* permite a las funciones ser "ejecutadas luego" de la señal por defecto para esa señal. Esto puede ser muy bueno en algunas situaciones; por ejemplo, donde uno quiere destruir solamente una de tantas ventanas en una cirscunstancia dada. De todas formas, los métodos connect_after* solo funcionarán cuando una señal ha sido creada en el codigo GTK con un flag GTK_RUN_LAST. La señal "destroy" y todas sus señales 'event' tienen este flag; mas alla de esto, la única manera de saberlo es testeando la señal dentro de PHP-GTK o leyendo el codigo GTK.

Ejemplo 2.7. Usando elmétodo connect_after()

<?php

function quit_routine($window) 
{
    print("Shutting down...\n");
    gtk::main_quit();
}

$window1 = &new GtkWindow();
$window1->set_title("Quit the main loop");
$window1->connect("destroy", "quit_routine");

$window2 = &new GtkWindow();
$window2->set_title("Destroy this window");
$window2->connect_after("destroy", "quit_routine");

$window1->show();
$window2->show();

gtk::main();

?>

Ver también: GtkObject, connect_after() connect_object() y connect_object_after() .