[Extractor-gtk-cvslog] SF.net SVN: extractor-gtk:[93] trunk/extractor
Extract files from unusual archive formats
Brought to you by:
someone-guy
From: <som...@us...> - 2008-08-22 16:07:18
|
Revision: 93 http://extractor-gtk.svn.sourceforge.net/extractor-gtk/?rev=93&view=rev Author: someone-guy Date: 2008-08-22 16:07:14 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Split gtk stuff out into a separate file. Modified Paths: -------------- trunk/extractor/Makefile trunk/extractor/extractor.c Added Paths: ----------- trunk/extractor/extractor.h trunk/extractor/gtkstuff.c trunk/extractor/gtkstuff.h Modified: trunk/extractor/Makefile =================================================================== --- trunk/extractor/Makefile 2008-08-22 16:06:35 UTC (rev 92) +++ trunk/extractor/Makefile 2008-08-22 16:07:14 UTC (rev 93) @@ -1,5 +1,6 @@ CC=gcc CFLAGS=-Wall -Wdeclaration-after-statement -Wpointer-arith -Wredundant-decls -Wcast-qual -Wwrite-strings -g -O2 +CFLAGS+=-std=c99 -D_XOPEN_SOURCE=500 GTKFLAGS=`pkg-config --cflags --libs gtk+-2.0` #GTKFLAGS=-DWITHOUT_GTK #GTKFLAGS=-mms-bitfields -Iinclude libglib-2.0-0.dll libgobject-2.0-0.dll libgdk-win32-2.0-0.dll libgdk_pixbuf-2.0-0.dll libgtk-win32-2.0-0.dll intl.dll @@ -14,10 +15,19 @@ wad.c \ xtre.c \ +MAIN= \ + extractor.c \ + helpers.c \ + gtkstuff.c \ + +HEADERS= \ + helpers.h \ + formats.h \ + all: extractor -extractor: extractor.c helpers.c helpers.h formats.h $(MODULES) - $(CC) $(CFLAGS) -o extractor extractor.c helpers.c $(MODULES) $(GTKFLAGS) +extractor: $(MAIN) $(MODULES) + $(CC) $(CFLAGS) $(GTKFLAGS) $^ -o $@ clean: rm -f extractor *.o Modified: trunk/extractor/extractor.c =================================================================== --- trunk/extractor/extractor.c 2008-08-22 16:06:35 UTC (rev 92) +++ trunk/extractor/extractor.c 2008-08-22 16:07:14 UTC (rev 93) @@ -8,18 +8,16 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <errno.h> #include <unistd.h> #include <inttypes.h> +#include "formats.h" +#include "extractor.h" #ifndef WITHOUT_GTK -#include <gtk/gtk.h> +#include "gtkstuff.h" #endif -#include <libintl.h> -#define _(String) gettext(String) -#include "formats.h" //! brief NULL-terminated array of supported formats -static const fmt_desc_t * const fmts[] = { +const fmt_desc_t * const fmts[] = { &bloodrayne_fmt, &generic_fmt, &homeworld2_fmt, @@ -31,117 +29,19 @@ NULL }; -#ifndef WITHOUT_GTK -#define SHOW_MSG(t, s, a...) \ -{\ - GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,\ - t, GTK_BUTTONS_CLOSE, s, ##a);\ - gtk_dialog_run(GTK_DIALOG(dialog));\ - gtk_widget_destroy(dialog);\ -} - -//! columns in file list table -enum { - FNAME_COL, - SIZE_COL, - OFFSET_COL, - COMPR_COL, - PTR_COL, - N_COLS -}; - -//! types of columns in the file list table -static const GType coltypes[N_COLS] = { - [FNAME_COL] = G_TYPE_STRING, - [SIZE_COL] = G_TYPE_UINT64, - [OFFSET_COL] = G_TYPE_UINT64, - [COMPR_COL] = G_TYPE_BOOLEAN, - [PTR_COL] = G_TYPE_POINTER, -}; - -static GtkWidget *dir_button; -static GtkListStore *gflist; -static GtkWidget *treeview; -#endif static FILE *input_file = NULL; static file_t *flist = NULL; static const fmt_desc_t *cur_fmt = NULL; -#ifndef WITHOUT_GTK -/** - * \brief extracts the file specified by iter - * \param data path to extract the file into - * - * to be used with e.g. gtk_tree_selection_selected_foreach - */ -static void extract_foreach(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) { - char *fname; - char *good_slash, *slash; - file_t *file; - FILE *out; - gtk_tree_model_get(model, iter, PTR_COL, &file, -1); - fname = malloc(strlen(data) + strlen(file->name) + 2); - strcpy(fname, data); - strcat(fname, "/"); - strcat(fname, file->name); - good_slash = fname + strlen(data); - while ((slash = strrchr(fname, '/')) > good_slash) - *slash = '_'; - out = fopen(fname, "wb"); - if (out) - cur_fmt->extract_file(input_file, file, out); - fclose(out); - free(fname); +int extract_file(const file_t *file, FILE *out) { + return cur_fmt->extract_file(input_file, file, out); } -/** - * \brief extracts all the files selected in the tree view to the selected path - */ -static void extract_selected(GtkWidget *widget, gpointer data) { - gchar *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dir_button)); - GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - gtk_tree_selection_selected_foreach(selection, extract_foreach, path); - g_free(path); +int extract_mem(const file_t *file, uint8_t *out, int out_size) { + return cur_fmt->extract_mem(input_file, file, out, out_size); } -static void set_treeview_model(GtkTreeView *view, GtkTreeModel *model) { - GtkTreeModel *sort = gtk_tree_model_sort_new_with_model(model); - gtk_tree_view_set_model(view, sort); - g_object_unref(sort); -} - -static void clear_treeview() { - gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), NULL); - gtk_list_store_clear(gflist); - set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); -} - -/** - * \brief modifies the treeview to display the contents of the given - * file_t array - * \param list array describing the files in the archive. - * Must be NULL-terminated. - */ -static void set_treeview(file_t *list) { - GtkTreeIter iter; - if (!list) { - clear_treeview(); - return; - } - gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), NULL); - gtk_list_store_clear(gflist); - while (list->name) { - gtk_list_store_append(gflist, &iter); - gtk_list_store_set(gflist, &iter, FNAME_COL, list->name, - SIZE_COL, list->len, OFFSET_COL, list->start, COMPR_COL, list->compressed, PTR_COL, list, -1); - list++; - } - set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); -} -#endif - -static int open_file(const char *fname, const fmt_desc_t *fmt) { +file_t *open_file(const char *fname, const fmt_desc_t *fmt) { // close previous file and free its data if (cur_fmt && flist) cur_fmt->free_list(flist); @@ -153,7 +53,7 @@ // open new file input_file = fopen(fname, "rb"); if (!input_file) - return 0; + return NULL; if (!fmt) { int i; for (i = 0; fmts[i]; i++) { @@ -167,92 +67,9 @@ fmt = &generic_fmt; cur_fmt = fmt; flist = cur_fmt->get_list(input_file); - return 1; + return flist; } -#ifndef WITHOUT_GTK -/** - * \brief called when a new archive is selected - */ -static void file_select(GtkWidget *widget, gpointer data) { - const char *filter = - gtk_file_filter_get_name(gtk_file_chooser_get_filter( - GTK_FILE_CHOOSER(widget))); - const fmt_desc_t * const *fmt = fmts; - gchar *fname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); - while ((*fmt)->desc && strcmp(filter, _((*fmt)->desc)) != 0) fmt++; - if (!(*fmt)->desc) { - SHOW_MSG(GTK_MESSAGE_ERROR, _("Invalid file type selected")); - goto err_out; - } - - if (!open_file(fname, *fmt)) { - SHOW_MSG(GTK_MESSAGE_ERROR, _("Error opening file '%s': %s"), - fname, g_strerror(errno)); - goto err_out; - } - g_free(fname); - set_treeview(flist); - return; - -err_out: - // error opening new file, clean everything up - if (fname) - g_free(fname); - if (input_file) - fclose(input_file); - input_file = NULL; - if (cur_fmt && flist) - cur_fmt->free_list(flist); - flist = NULL; - cur_fmt = NULL; - clear_treeview(); -} - -static gboolean delete_event(GtkWidget *widget, GdkEvent *event, - gpointer data) { - gtk_main_quit(); - 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; - 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); - tmpdata = malloc(MAX_IMG_SZ); - size = cur_fmt->extract_mem(input_file, file, tmpdata, MAX_IMG_SZ); - if (size > MAX_IMG_SZ || size < 0) size = MAX_IMG_SZ; - 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)); -} -#endif - static void print_help(void) { int i; fprintf(stderr, _("Usage: extractor [-h|[-l|--] filename [format]]\n")); @@ -262,21 +79,7 @@ } int main(int argc, char *argv[]) { - int i; int fmt_idx = -1; -#ifndef WITHOUT_GTK - GtkWidget *window; - GtkWidget *preview_win; - GtkWidget *table; - GtkWidget *file_button; - GtkWidget *button; - GtkWidget *scrollwin; - GtkWidget *lbl; - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkTreeSelection *selection; - int row = 0, col = 0; -#endif int list_files = 0; if (argc > 1) { @@ -330,116 +133,10 @@ } } -#ifndef WITHOUT_GTK - 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", - G_CALLBACK(delete_event), NULL); - - table = gtk_table_new(3, 3, FALSE); - gtk_container_add(GTK_CONTAINER(window), table); - - scrollwin = gtk_scrolled_window_new(NULL, NULL); - gtk_table_attach(GTK_TABLE(table), scrollwin, col, col + 3, row, row + 1, - (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), - (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0); - gflist = gtk_list_store_new(N_COLS, coltypes[0], coltypes[1], coltypes[2], - coltypes[3], coltypes[4]); - treeview = gtk_tree_view_new(); - set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); - gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Filename"), renderer, - "text", FNAME_COL, NULL); - gtk_tree_view_column_set_sort_column_id(column, FNAME_COL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer, - "text", SIZE_COL, NULL); - gtk_tree_view_column_set_sort_column_id(column, SIZE_COL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Offset"), renderer, - "text", OFFSET_COL, NULL); - gtk_tree_view_column_set_sort_column_id(column, OFFSET_COL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_toggle_new(); - column = gtk_tree_view_column_new_with_attributes(_("Compressed"), renderer, - "active", COMPR_COL, NULL); - gtk_tree_view_column_set_sort_column_id(column, COMPR_COL); - 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++; - col = 0; - lbl = gtk_label_new(_("Archive Filename")); - gtk_table_attach(GTK_TABLE(table), lbl, col, col + 1, row, row + 1, - (GtkAttachOptions)(GTK_FILL), - (GtkAttachOptions)(0), 5, 0); - col++; - lbl = gtk_label_new(_("Output Directory")); - gtk_table_attach(GTK_TABLE(table), lbl, col, col + 1, row, row + 1, - (GtkAttachOptions)(GTK_FILL), - (GtkAttachOptions)(0), 5, 0); - - row++; - col = 0; - file_button = gtk_file_chooser_button_new(_("open"), - GTK_FILE_CHOOSER_ACTION_OPEN); - for (i = 0; fmts[i]; i++) { - GtkFileFilter *filter = gtk_file_filter_new(); - char *patterns = strdup(fmts[i]->pattern); - char *pattern = strtok(patterns, ";"); - while (pattern && pattern[0]) { - gtk_file_filter_add_pattern(filter, pattern); - pattern = strtok(NULL, ";"); - } - free(patterns); - gtk_file_filter_set_name(filter, _(fmts[i]->desc)); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_button), filter); - } - g_signal_connect(G_OBJECT(file_button), "selection-changed", - G_CALLBACK(file_select), NULL); - gtk_table_attach(GTK_TABLE(table), file_button, col, col + 1, row, row + 1, - (GtkAttachOptions)(GTK_FILL), - (GtkAttachOptions)(0), 5, 0); - - col++; - dir_button = gtk_file_chooser_button_new(_("select"), - GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); - gtk_table_attach(GTK_TABLE(table), dir_button, col, col + 1, row, row + 1, - (GtkAttachOptions)(GTK_FILL), - (GtkAttachOptions)(0), 5, 0); - - col++; - button = gtk_button_new_with_mnemonic(_("extract selected")); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(extract_selected), NULL); - gtk_table_attach(GTK_TABLE(table), button, col, col + 1, row, row + 1, - (GtkAttachOptions)(GTK_FILL), - (GtkAttachOptions)(0), 5, 0); - - gtk_window_set_default_size(GTK_WINDOW(window), -1, 400); - gtk_widget_show_all(window); - set_treeview(flist); - gtk_main(); +#ifdef WITHOUT_GTK + print_help(); + return 1; +#else + return start_gtk_gui(argc, argv, flist); #endif - return 0; } Added: trunk/extractor/extractor.h =================================================================== --- trunk/extractor/extractor.h (rev 0) +++ trunk/extractor/extractor.h 2008-08-22 16:07:14 UTC (rev 93) @@ -0,0 +1,6 @@ +#include <libintl.h> +#define _(String) gettext(String) +file_t *open_file(const char *fname, const fmt_desc_t *fmt); +int extract_file(const file_t *file, FILE *out); +int extract_mem(const file_t *file, uint8_t *out, int out_size); +extern const fmt_desc_t * const fmts[]; Copied: trunk/extractor/gtkstuff.c (from rev 92, trunk/extractor/extractor.c) =================================================================== --- trunk/extractor/gtkstuff.c (rev 0) +++ trunk/extractor/gtkstuff.c 2008-08-22 16:07:14 UTC (rev 93) @@ -0,0 +1,313 @@ +#include <gtk/gtk.h> +#include <inttypes.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include "formats.h" +#include "extractor.h" +#include "gtkstuff.h" + +#define SHOW_MSG(t, s, a...) \ +{\ + GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,\ + t, GTK_BUTTONS_CLOSE, s, ##a);\ + gtk_dialog_run(GTK_DIALOG(dialog));\ + gtk_widget_destroy(dialog);\ +} + +//! columns in file list table +enum { + FNAME_COL, + SIZE_COL, + OFFSET_COL, + COMPR_COL, + PTR_COL, + N_COLS +}; + +//! types of columns in the file list table +static const GType coltypes[N_COLS] = { + [FNAME_COL] = G_TYPE_STRING, + [SIZE_COL] = G_TYPE_UINT64, + [OFFSET_COL] = G_TYPE_UINT64, + [COMPR_COL] = G_TYPE_BOOLEAN, + [PTR_COL] = G_TYPE_POINTER, +}; + +static GtkWidget *dir_button; +static GtkListStore *gflist; +static GtkWidget *treeview; + +/** + * \brief extracts the file specified by iter + * \param data path to extract the file into + * + * to be used with e.g. gtk_tree_selection_selected_foreach + */ +static void extract_foreach(GtkTreeModel *model, GtkTreePath *path, + GtkTreeIter *iter, gpointer data) { + char *fname; + char *good_slash, *slash; + file_t *file; + FILE *out; + gtk_tree_model_get(model, iter, PTR_COL, &file, -1); + fname = malloc(strlen(data) + strlen(file->name) + 2); + strcpy(fname, data); + strcat(fname, "/"); + strcat(fname, file->name); + good_slash = fname + strlen(data); + while ((slash = strrchr(fname, '/')) > good_slash) + *slash = '_'; + out = fopen(fname, "wb"); + if (out) + extract_file(file, out); + fclose(out); + free(fname); +} + +/** + * \brief extracts all the files selected in the tree view to the selected path + */ +static void extract_selected(GtkWidget *widget, gpointer data) { + gchar *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dir_button)); + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + gtk_tree_selection_selected_foreach(selection, extract_foreach, path); + g_free(path); +} + +static void set_treeview_model(GtkTreeView *view, GtkTreeModel *model) { + GtkTreeModel *sort = gtk_tree_model_sort_new_with_model(model); + gtk_tree_view_set_model(view, sort); + g_object_unref(sort); +} + +static void clear_treeview() { + gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), NULL); + gtk_list_store_clear(gflist); + set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); +} + +/** + * \brief modifies the treeview to display the contents of the given + * file_t array + * \param list array describing the files in the archive. + * Must be NULL-terminated. + */ +static void set_treeview(file_t *list) { + GtkTreeIter iter; + if (!list) { + clear_treeview(); + return; + } + gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), NULL); + gtk_list_store_clear(gflist); + while (list->name) { + gtk_list_store_append(gflist, &iter); + gtk_list_store_set(gflist, &iter, FNAME_COL, list->name, + SIZE_COL, list->len, OFFSET_COL, list->start, COMPR_COL, list->compressed, PTR_COL, list, -1); + list++; + } + set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); +} + +/** + * \brief called when a new archive is selected + */ +static void file_select(GtkWidget *widget, gpointer data) { + file_t *flist; + const char *filter = + gtk_file_filter_get_name(gtk_file_chooser_get_filter( + GTK_FILE_CHOOSER(widget))); + const fmt_desc_t * const *fmt = fmts; + gchar *fname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + while ((*fmt)->desc && strcmp(filter, _((*fmt)->desc)) != 0) fmt++; + if (!(*fmt)->desc) { + SHOW_MSG(GTK_MESSAGE_ERROR, _("Invalid file type selected")); + goto err_out; + } + + flist = open_file(fname, *fmt); + if (!flist) { + SHOW_MSG(GTK_MESSAGE_ERROR, _("Error opening file '%s': %s"), + fname, g_strerror(errno)); + goto err_out; + } + g_free(fname); + set_treeview(flist); + return; + +err_out: + // error opening new file, clean everything up + if (fname) + g_free(fname); + clear_treeview(); +} + +static gboolean delete_event(GtkWidget *widget, GdkEvent *event, + gpointer data) { + gtk_main_quit(); + 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; + 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); + tmpdata = malloc(MAX_IMG_SZ); + size = extract_mem(file, tmpdata, MAX_IMG_SZ); + if (size > MAX_IMG_SZ || size < 0) size = MAX_IMG_SZ; + 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 start_gtk_gui(int argc, char *argv[], file_t *flist) { + int i; + GtkWidget *window; + GtkWidget *preview_win; + GtkWidget *table; + GtkWidget *file_button; + GtkWidget *button; + GtkWidget *scrollwin; + GtkWidget *lbl; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSelection *selection; + int row = 0, col = 0; + + 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", + G_CALLBACK(delete_event), NULL); + + table = gtk_table_new(3, 3, FALSE); + gtk_container_add(GTK_CONTAINER(window), table); + + scrollwin = gtk_scrolled_window_new(NULL, NULL); + gtk_table_attach(GTK_TABLE(table), scrollwin, col, col + 3, row, row + 1, + (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), + (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0); + gflist = gtk_list_store_new(N_COLS, coltypes[0], coltypes[1], coltypes[2], + coltypes[3], coltypes[4]); + treeview = gtk_tree_view_new(); + set_treeview_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(gflist)); + gtk_tree_view_set_enable_search(GTK_TREE_VIEW(treeview), TRUE); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Filename"), renderer, + "text", FNAME_COL, NULL); + gtk_tree_view_column_set_sort_column_id(column, FNAME_COL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer, + "text", SIZE_COL, NULL); + gtk_tree_view_column_set_sort_column_id(column, SIZE_COL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Offset"), renderer, + "text", OFFSET_COL, NULL); + gtk_tree_view_column_set_sort_column_id(column, OFFSET_COL); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_toggle_new(); + column = gtk_tree_view_column_new_with_attributes(_("Compressed"), renderer, + "active", COMPR_COL, NULL); + gtk_tree_view_column_set_sort_column_id(column, COMPR_COL); + 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++; + col = 0; + lbl = gtk_label_new(_("Archive Filename")); + gtk_table_attach(GTK_TABLE(table), lbl, col, col + 1, row, row + 1, + (GtkAttachOptions)(GTK_FILL), + (GtkAttachOptions)(0), 5, 0); + col++; + lbl = gtk_label_new(_("Output Directory")); + gtk_table_attach(GTK_TABLE(table), lbl, col, col + 1, row, row + 1, + (GtkAttachOptions)(GTK_FILL), + (GtkAttachOptions)(0), 5, 0); + + row++; + col = 0; + file_button = gtk_file_chooser_button_new(_("open"), + GTK_FILE_CHOOSER_ACTION_OPEN); + for (i = 0; fmts[i]; i++) { + GtkFileFilter *filter = gtk_file_filter_new(); + char *patterns = strdup(fmts[i]->pattern); + char *pattern = strtok(patterns, ";"); + while (pattern && pattern[0]) { + gtk_file_filter_add_pattern(filter, pattern); + pattern = strtok(NULL, ";"); + } + free(patterns); + gtk_file_filter_set_name(filter, _(fmts[i]->desc)); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_button), filter); + } + g_signal_connect(G_OBJECT(file_button), "selection-changed", + G_CALLBACK(file_select), NULL); + gtk_table_attach(GTK_TABLE(table), file_button, col, col + 1, row, row + 1, + (GtkAttachOptions)(GTK_FILL), + (GtkAttachOptions)(0), 5, 0); + + col++; + dir_button = gtk_file_chooser_button_new(_("select"), + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + gtk_table_attach(GTK_TABLE(table), dir_button, col, col + 1, row, row + 1, + (GtkAttachOptions)(GTK_FILL), + (GtkAttachOptions)(0), 5, 0); + + col++; + button = gtk_button_new_with_mnemonic(_("extract selected")); + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(extract_selected), NULL); + gtk_table_attach(GTK_TABLE(table), button, col, col + 1, row, row + 1, + (GtkAttachOptions)(GTK_FILL), + (GtkAttachOptions)(0), 5, 0); + + gtk_window_set_default_size(GTK_WINDOW(window), -1, 400); + gtk_widget_show_all(window); + set_treeview(flist); + gtk_main(); + return 0; +} Added: trunk/extractor/gtkstuff.h =================================================================== --- trunk/extractor/gtkstuff.h (rev 0) +++ trunk/extractor/gtkstuff.h 2008-08-22 16:07:14 UTC (rev 93) @@ -0,0 +1 @@ +int start_gtk_gui(int argc, char *argv[], file_t *flist); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |