+
+ if ( cleanup_function )
+ cleanup_function ( source_interface );
+}
+
+/**
+ * a_acquire:
+ * @vw: The #VikWindow to work with
+ * @vlp: The #VikLayersPanel in which a #VikTrwLayer layer may be created/appended
+ * @vvp: The #VikViewport defining the current view
+ * @mode: How layers should be managed
+ * @source_interface: The #VikDataSourceInterface determining how and what actions to take
+ * @userdata: External data to be passed into the #VikDataSourceInterface
+ * @cleanup_function: The function to dispose the #VikDataSourceInterface if necessary
+ *
+ * Process the given VikDataSourceInterface for sources with no input data.
+ */
+void a_acquire ( VikWindow *vw,
+ VikLayersPanel *vlp,
+ VikViewport *vvp,
+ vik_datasource_mode_t mode,
+ VikDataSourceInterface *source_interface,
+ gpointer userdata,
+ VikDataSourceCleanupFunc cleanup_function )
+{
+ acquire ( vw, vlp, vvp, mode, source_interface, NULL, NULL, userdata, cleanup_function );
+}
+
+static void acquire_trwlayer_callback ( GObject *menuitem, gpointer *pass_along )
+{
+ VikDataSourceInterface *iface = g_object_get_data ( menuitem, "vik_acq_iface" );
+ VikWindow *vw = pass_along[0];
+ VikLayersPanel *vlp = pass_along[1];
+ VikViewport *vvp = pass_along[2];
+ VikTrwLayer *vtl = pass_along[3];
+ VikTrack *tr = pass_along[4];
+
+ acquire ( vw, vlp, vvp, iface->mode, iface, vtl, tr, NULL, NULL );
+}
+
+static GtkWidget *acquire_build_menu ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp,
+ VikTrwLayer *vtl, VikTrack *track, /* both passed to acquire, although for many filters only one ness */
+ const gchar *menu_title, vik_datasource_inputtype_t inputtype )
+{
+ static gpointer pass_along[5];
+ GtkWidget *menu_item=NULL, *menu=NULL;
+ GtkWidget *item=NULL;
+ int i;
+
+ pass_along[0] = vw;
+ pass_along[1] = vlp;
+ pass_along[2] = vvp;
+ pass_along[3] = vtl;
+ pass_along[4] = track;
+
+ for ( i = 0; i < N_FILTERS; i++ ) {
+ if ( filters[i]->inputtype == inputtype ) {
+ if ( ! menu_item ) { /* do this just once, but return NULL if no filters */
+ menu = gtk_menu_new();
+ menu_item = gtk_menu_item_new_with_mnemonic ( menu_title );
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu );
+ }
+
+ item = gtk_menu_item_new_with_label ( filters[i]->window_title );
+ g_object_set_data ( G_OBJECT(item), "vik_acq_iface", (gpointer) filters[i] );
+ g_signal_connect ( G_OBJECT(item), "activate", G_CALLBACK(acquire_trwlayer_callback), pass_along );
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show ( item );
+ }
+ }
+
+ return menu_item;
+}
+
+/**
+ * a_acquire_trwlayer_menu:
+ *
+ * Create a sub menu intended for rightclicking on a TRWLayer's menu called "Filter".
+ *
+ * Returns: %NULL if no filters.
+ */
+GtkWidget *a_acquire_trwlayer_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl)
+{
+ return acquire_build_menu ( vw, vlp, vvp, vtl, NULL, _("_Filter"), VIK_DATASOURCE_INPUTTYPE_TRWLAYER );
+}
+
+/**
+ * a_acquire_trwlayer_track_menu:
+ *
+ * Create a sub menu intended for rightclicking on a TRWLayer's menu called "Filter with Track "TRACKNAME"...".
+ *
+ * Returns: %NULL if no filters or no filter track has been set.
+ */
+GtkWidget *a_acquire_trwlayer_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl)
+{
+ if ( filter_track == NULL )
+ return NULL;
+ else {
+ gchar *menu_title = g_strdup_printf ( _("Filter with %s"), filter_track->name );
+ GtkWidget *rv = acquire_build_menu ( vw, vlp, vvp, vtl, filter_track,
+ menu_title, VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK );
+ g_free ( menu_title );
+ return rv;
+ }