Notificaciones

Como comentábamos en la introducción, una de las características extra que GConf ofrece es la de la notificación de cambios, que permite que una aplicación sea notificada por el demonio gconfd cada vez que se produzca un cambio en determinada(s) entrada(s) de la base de datos de configuración.

El sistema de notificación de GConf actúa bajo demanda. Es decir, sólo notifica a los clientes que piden ser notificados, y además, sólo notifica de cambios en las entradas en las que estén interesados esos clientes. Para registrar nuestra aplicación en el sistema de notificación, usamos la función gconf_engine_notify_add, que tiene el siguiente formato:

	guint gconf_engine_notify_add (GConfEngine *engine,
	                               const gchar *section,
	                               GConfNotifyFunc func,
	                               gpointer user_data,
	                               GError **error);
      

Esta función recibe como parámetros, aparte de los típicos GConfEngine y GError que aparecen en muchas de las funciones que hemos visto anteriormente, una cadena que especifica la sección de la configuración que estamos interesados en monitorizar, y un puntero a una función (GConfNotifyFunc), que será la que será llamada cada vez que hay algo que notificar.

La función de respuesta a la notificación, de tipo GConfNotifyFunc, debe tener la siguiente forma:

	void notify_func (GConfEngine *engine, guint cnx_id, GConfEntry *entry, gpointer user_data);
      

donde cnx_id es el identificador devuelto por la llamada a gconf_engine_notify_add, entry es un puntero a una estructura de tipo GConfEntry que contiene toda la información asociada a la entrada de la base de datos que especificamos en la llamada a gconf_engine_notify_add, y user_data es el mismo parámetro que especificamos al registrar la función de notificación, y que nos permite pasar datos propios de un sitio a otro del programa.

El identificador devuelto por gconf_engine_notify_add es especialmente útil cuando queremos dejar de recibir notificaciones de cambios. Para ello, usamos la función gconf_engine_notify_remove, que hace lo propio, y que recibe, como parámetro, dicho identificador. Una vez que hayamos llamado a esta función con éxito, no recibiremos más notificaciones de cambios en esa entrada.

	guint cnx_id;
	GError *error = NULL;

	cnx_id = gconf_engine_notify_add(engine, "/apps/gnome/gnumeric", func, NULL, &error);
	...
	gconf_engine_notify_remove(engine, cnx_id);