#include /* gcc -Wall -O -g -o $(basename $0 .c) $0 $(gtk12-config --cflags --libs) exit $? */ #include #include static GtkWidget *clist; static char **lines; /* Malloced block of malloced blocks of lines */ static int numlines; /* Number of lines we have read */ static int maxlines = 0; /* Maximum number of lines in our allocation */ static void my_init_filelist(GtkWidget *clist) { char *line; size_t linelen; int i; while ((line = fgetln(stdin, &linelen))) { char *outline = malloc(linelen); /* XXX Check here, and free on failure */ if (!outline) abort(); memcpy(outline, line, linelen-1); outline[linelen-1] = '\0'; if (maxlines < numlines+2) { char **newlines; maxlines++; maxlines *= 2; newlines = realloc(lines, sizeof(char*)*maxlines); /* XXX Check here, and free on failure */ if (!newlines) abort(); lines = newlines; } lines[numlines++] = outline; } if (!lines) return; for (i = 0; i < numlines; i++) gtk_clist_append(GTK_CLIST(clist), &lines[i]); } static void destroy(GtkWidget *widget, gpointer data) { GList *items; for (items = GTK_CLIST(clist)->selection; items; items = items->next) printf("%s\n", lines[(size_t)items->data]); gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *scrolled_window; gtk_init(&argc, &argv); window = gtk_dialog_new(); gtk_widget_set_usize(window, 300, 300); gtk_window_set_title(GTK_WINDOW(window), "listselect"); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), NULL); gtk_container_set_border_width(GTK_CONTAINER(window), 10); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox), scrolled_window, TRUE, TRUE, 0); gtk_widget_show(scrolled_window); clist = gtk_clist_new(1); /* 1 column */ gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_MULTIPLE); my_init_filelist(clist); gtk_container_add(GTK_CONTAINER(scrolled_window), clist); gtk_widget_show(clist); button = gtk_button_new_with_label("Done"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer)window); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_widget_show(window); gtk_main(); return 0; }