[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk: [69] trunk/extractor/extractor.c
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2008-03-05 20:28:58
|
Revision: 69 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=69&view=rev Author: someone-guy Date: 2008-03-05 12:28:53 -0800 (Wed, 05 Mar 2008) Log Message: ----------- Add (slightly ugly) image preview code. Modified Paths: -------------- trunk/extractor/extractor.c Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-03-05 20:28:46 UTC (rev 68) +++ trunk/extractor/extractor.c 2008-03-05 20:28:53 UTC (rev 69) @@ -191,9 +191,54 @@ return FALSE; } +#define MAX_IMG_SZ (100*1024*1024) + +/** + * Called when user double-clicks on a archive content + */ +static void row_activate(GtkTreeView *treeview, GtkTreePath *path, + GtkTreeViewColumn *col, gpointer data) { + GtkTreeModel *model = gtk_tree_view_get_model(treeview); + GtkTreeIter iter; + GtkWidget *preview_win = data; + file_t *file; + FILE *tmpf; + int size; + uint8_t *tmpdata; + GdkPixbufLoader *pbl; + GdkPixbuf *pb; + GtkWidget *img = gtk_bin_get_child(GTK_BIN(preview_win)); + if (img) + gtk_container_remove(GTK_CONTAINER(preview_win), img); + + if (!gtk_tree_model_get_iter(model, &iter, path)) + return; + gtk_tree_model_get(model, &iter, PTR_COL, &file, -1); + tmpf = tmpfile(); + cur_fmt->extract_file(input_file, file, tmpf); + fseek(tmpf, 0, SEEK_END); + size = ftell(tmpf); + if (size > MAX_IMG_SZ) size = MAX_IMG_SZ; + rewind(tmpf); + tmpdata = malloc(size); + fread(tmpdata, 1, size, tmpf); + fclose(tmpf); + pbl = gdk_pixbuf_loader_new(); + gdk_pixbuf_loader_write(pbl, tmpdata, size, NULL); + free(tmpdata); + gdk_pixbuf_loader_close(pbl, NULL); + pb = gdk_pixbuf_loader_get_pixbuf(pbl); + img = gtk_image_new_from_pixbuf(pb); + g_object_unref(pbl); + gtk_container_add(GTK_CONTAINER(preview_win), img); + gtk_widget_show(img); + gtk_window_present(GTK_WINDOW(preview_win)); +} + int main(int argc, char *argv[]) { int i; GtkWidget *window; + GtkWidget *preview_win; GtkWidget *table; GtkWidget *file_button; GtkWidget *button; @@ -208,6 +253,11 @@ gtk_disable_setlocale(); gtk_init(&argc, &argv); + preview_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_resizable(GTK_WINDOW(preview_win), FALSE); + g_signal_connect(G_OBJECT(preview_win), "delete_event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), _("extractor")); g_signal_connect(G_OBJECT(window), "delete_event", @@ -242,6 +292,8 @@ gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + g_signal_connect(G_OBJECT(treeview), "row-activated", + G_CALLBACK(row_activate), preview_win); gtk_container_add(GTK_CONTAINER(scrollwin), treeview); row++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |