term* normalize_fuel_lambda(context *Sigma, typing_context* Delta, term* t, int fuel) { term* b = NULL; term* A = normalize_fuel(Sigma, Delta, t->left, fuel-1); context* extend = context_add(variable_dup(t->var), NULL, Sigma); b = normalize_fuel(extend, Delta, t->right, fuel-1); context_pop(extend); if (!b) goto error; return make_lambda(variable_dup(t->var), A, b); error: free_term(A); free_term(b); return NULL; }
term* normalize_fuel_pi(context *Sigma, typing_context* Delta, term* t, int fuel) { term* B = NULL; term* A = normalize_fuel(Sigma, Delta, t->left, fuel-1); if (!A) goto error; context* extend = context_add(variable_dup(t->var), NULL, Sigma); B = normalize_fuel(extend, Delta, t->right, fuel-1); context_pop(extend); if (!B) goto error; return make_pi(variable_dup(t->var), A, B); error: free_term(A); free_term(B); return NULL; }
GtkWidget *tracksearch_window( void ) { GtkWidget *win; GtkWidget *winbox; GtkWidget *search_box; GtkWidget *search_label; GtkWidget *search_button; GtkWidget *scroll; GtkTreeSelection *sel; search_widgets *wg; GtkActionGroup *ag_always, *ag_track_one, *ag_track_any; GtkAction *close; GtkUIManager *ui; GtkWidget *context; /* TODO: use g_object_set_data() */ wg = g_malloc(sizeof(search_widgets)); memset(wg, 0, sizeof(search_widgets)); /* top box */ winbox = gtk_vbox_new( FALSE, 0 ); /* input */ search_box = gtk_hbox_new( FALSE, 0 ); gtk_box_pack_start( GTK_BOX(winbox), search_box, FALSE, FALSE, 1 ); gtk_widget_show( search_box ); search_label = gtk_label_new("filter:"); gtk_box_pack_start( GTK_BOX(search_box), search_label, FALSE, FALSE, 1 ); gtk_widget_show( search_label ); /* TODO: give some hint about filter syntax */ /* TODO: input history for filter */ /* TODO: auto complete for filter */ wg->input = gtk_entry_new(); g_object_set( wg->input, "activates-default", TRUE, NULL ); gtk_box_pack_start( GTK_BOX(search_box), wg->input, TRUE, TRUE, 1 ); gtk_widget_show( wg->input ); search_button = gtk_button_new_with_label("search"); gtk_signal_connect( GTK_OBJECT(search_button), "clicked", G_CALLBACK(search_button_on_click), wg ); gtk_box_pack_start( GTK_BOX(search_box), search_button, FALSE, FALSE, 1 ); GTK_WIDGET_SET_FLAGS( search_button, GTK_CAN_DEFAULT); gtk_widget_show( search_button ); /* scrolled result list */ scroll = gtk_scrolled_window_new( GTK_ADJUSTMENT(NULL), GTK_ADJUSTMENT(NULL) ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); wg->list = track_list_new_with_list( TRUE, NULL ); sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(wg->list) ); gtk_tree_selection_set_mode( GTK_TREE_SELECTION(sel), GTK_SELECTION_MULTIPLE ); g_signal_connect( G_OBJECT(sel), "changed", G_CALLBACK(selection_on_change), NULL ); gtk_container_add( GTK_CONTAINER(scroll), wg->list ); gtk_widget_show( wg->list ); gtk_box_pack_start( GTK_BOX( winbox ), scroll, TRUE, TRUE, 0 ); gtk_widget_show( scroll ); /* status bar */ wg->status = gtk_statusbar_new(); gtk_box_pack_start( GTK_BOX(winbox), wg->status, FALSE, FALSE, 0 ); gtk_widget_show( wg->status ); /* actions + uimanager for menu, toolbar + hotkeys */ ag_always = gtk_action_group_new("TracksearchAlways"); gtk_action_group_add_actions(ag_always, action_always, G_N_ELEMENTS(action_always), NULL ); close = gtk_action_group_get_action( ag_always, "Close" ); ag_track_one = gtk_action_group_new("TracksearchOne"); g_object_set_data( G_OBJECT(sel), "agroup-one", ag_track_one); gtk_action_group_set_sensitive(ag_track_one, FALSE ); gtk_action_group_add_actions(ag_track_one, action_track_one, G_N_ELEMENTS(action_track_one), wg->list ); ag_track_any = gtk_action_group_new("TracksearchAny"); g_object_set_data( G_OBJECT(sel), "agroup-any", ag_track_any); gtk_action_group_set_sensitive(ag_track_any, FALSE ); gtk_action_group_add_actions(ag_track_any, action_track_any, G_N_ELEMENTS(action_track_any), wg->list ); ui = gtk_ui_manager_new(); gtk_ui_manager_insert_action_group(ui, ag_always, 0); gtk_ui_manager_insert_action_group(ui, ag_track_one, 1); gtk_ui_manager_insert_action_group(ui, ag_track_any, 2); /* top window */ win = childwindow_new( "search tracks", winbox, ui, uidesc ); gtk_window_set_default_size(GTK_WINDOW(win), 600, 300); g_object_set_data( G_OBJECT(close), "topwindow", win ); gtk_window_set_default( GTK_WINDOW(win), search_button ); gtk_signal_connect( GTK_OBJECT(win), "destroy", G_CALLBACK(tracksearch_on_destroy), wg); /* context menu */ context = gtk_ui_manager_get_widget( ui, "/TrackPopup" ); context_add( GTK_TREE_VIEW(wg->list), GTK_MENU(context) ); /* free ui_manager */ g_object_unref( G_OBJECT(ui) ); return win; }