diff --git a/src/project.conf b/src/project.conf index 2c2b110..1139651 100644 --- a/src/project.conf +++ b/src/project.conf @@ -100,5 +100,5 @@ cppflags=-D PREFIX=\"$(PREFIX)\" type=binary sources=view.c cflags=-fPIE -ldflags=-Wl,-pie +ldflags=-L$(OBJDIR). -Wl,-rpath,$(LIBDIR) -lBrowser -Wl,-pie install=$(BINDIR) diff --git a/src/view.c b/src/view.c index 5107b5f..a962436 100644 --- a/src/view.c +++ b/src/view.c @@ -14,8 +14,6 @@ static char const _license[] = "\n" "You should have received a copy of the GNU General Public License along with\n" "view; if not, see .\n"; -/* TODO: - * - zoom/dezoom images */ @@ -29,7 +27,12 @@ static char const _license[] = #include #include #include +#include #include +#include "../include/Browser/vfs.h" +#define Browser View /* XXX */ +#include "browser.h" +#undef _Browser #include "../config.h" #define _(string) gettext(string) #define N_(string) (string) @@ -37,7 +40,12 @@ static char const _license[] = #include "common.c" /* constants */ -#define PROGNAME "view" +#ifndef PROGNAME +# define PROGNAME "view" +#endif +#ifndef PROGNAME_PROPERTIES +# define PROGNAME_PROPERTIES "properties" +#endif #ifndef PREFIX # define PREFIX "/usr/local" @@ -56,16 +64,19 @@ static char const _license[] = /* view */ /* private */ /* types */ -typedef struct _View +struct _Browser { - char * pathname; + /* internal */ + Mime * mime; + char * filename; + + /* plugins */ + BrowserPluginHelper helper; /* widgets */ GtkWidget * window; - GtkWidget * toolbar; - GtkWidget * view; GtkWidget * ab_window; -} View; +}; /* constants */ @@ -79,68 +90,84 @@ static char const * _view_authors[] = /* prototypes */ -static View * _view_new(char const * path); -static View * _view_new_open(void); +static View * _view_new(Mime * mime, char const * filename); +static View * _view_new_open(Mime * mime); static void _view_delete(View * view); +/* accessors */ +static String const * _view_config_get(View * view, String const * section, + String const * variable); +static int _view_config_set(View * view, String const * section, + String const * variable, String const * value); +static GdkPixbuf * _view_get_icon(View * view, char const * filename, + char const * type, struct stat * lst, struct stat * st, + int size); +static Mime * _view_get_mime(View * view); +static char const * _view_get_type(View * view, char const * filename, + mode_t mode); +static int _view_set_location(View * view, char const * filename); + /* useful */ static int _view_error(View * view, char const * message, int ret); static void _view_open_with(View * view, char const * program); static void _view_open_with_dialog(View * view); +/* helpers */ +static int _view_helper_set_location(View * view, char const * filename); + /* callbacks */ #ifdef EMBEDDED -static void _on_close(gpointer data); +static void _view_on_close(gpointer data); #endif -static gboolean _on_closex(gpointer data); +static gboolean _view_on_closex(gpointer data); #ifndef EMBEDDED -static void _on_file_edit(gpointer data); -static void _on_file_open_with(gpointer data); -static void _on_file_properties(gpointer data); -static void _on_file_close(gpointer data); -static void _on_help_contents(gpointer data); -static void _on_help_about(gpointer data); +static void _view_on_file_edit(gpointer data); +static void _view_on_file_open_with(gpointer data); +static void _view_on_file_properties(gpointer data); +static void _view_on_file_close(gpointer data); +static void _view_on_help_contents(gpointer data); +static void _view_on_help_about(gpointer data); #endif -static void _on_copy(gpointer data); -static void _on_edit(gpointer data); -static void _on_open_with(gpointer data); -static void _on_properties(gpointer data); -static void _on_select_all(gpointer data); +static void _view_on_open_with(gpointer data); +static void _view_on_properties(gpointer data); /* constants */ #ifndef EMBEDDED static DesktopMenu _view_menu_file[] = { - { N_("Open _with..."), G_CALLBACK(_on_file_open_with), NULL, 0, 0 }, + { N_("Open _with..."), G_CALLBACK(_view_on_file_open_with), NULL, 0, + 0 }, { "", NULL, NULL, 0, 0 }, - { N_("_Close"), G_CALLBACK(_on_file_close), GTK_STOCK_CLOSE, + { N_("_Close"), G_CALLBACK(_view_on_file_close), GTK_STOCK_CLOSE, GDK_CONTROL_MASK, GDK_KEY_W }, { NULL, NULL, NULL, 0, 0 } }; static DesktopMenu _view_menu_file_edit[] = { - { N_("_Edit"), G_CALLBACK(_on_file_edit), GTK_STOCK_EDIT, + { N_("_Edit"), G_CALLBACK(_view_on_file_edit), GTK_STOCK_EDIT, GDK_CONTROL_MASK, GDK_KEY_E }, - { N_("Open _with..."), G_CALLBACK(_on_file_open_with), NULL, 0, 0 }, + { N_("Open _with..."), G_CALLBACK(_view_on_file_open_with), NULL, 0, + 0 }, { "", NULL, NULL, 0, 0 }, - { N_("_Properties"), G_CALLBACK(_on_file_properties), + { N_("_Properties"), G_CALLBACK(_view_on_file_properties), GTK_STOCK_PROPERTIES, GDK_MOD1_MASK, GDK_KEY_Return }, { "", NULL, NULL, 0, 0 }, - { N_("_Close"), G_CALLBACK(_on_file_close), GTK_STOCK_CLOSE, + { N_("_Close"), G_CALLBACK(_view_on_file_close), GTK_STOCK_CLOSE, GDK_CONTROL_MASK, GDK_KEY_W }, { NULL, NULL, NULL, 0, 0 } }; static DesktopMenu _view_menu_help[] = { - { N_("Contents"), G_CALLBACK(_on_help_contents), "help-contents", 0, - GDK_KEY_F1 }, + { N_("Contents"), G_CALLBACK(_view_on_help_contents), "help-contents", + 0, GDK_KEY_F1 }, # if GTK_CHECK_VERSION(2, 6, 0) - { N_("_About"), G_CALLBACK(_on_help_about), GTK_STOCK_ABOUT, 0, 0 }, + { N_("_About"), G_CALLBACK(_view_on_help_about), GTK_STOCK_ABOUT, 0, + 0 }, # else - { N_("_About"), G_CALLBACK(_on_help_about), NULL, 0, 0 }, + { N_("_About"), G_CALLBACK(_view_on_help_about), NULL, 0, 0 }, # endif { NULL, NULL, NULL, 0, 0 } }; @@ -161,28 +188,11 @@ static DesktopMenubar _view_menubar_edit[] = #else static DesktopAccel _view_accel[] = { - { G_CALLBACK(_on_close), GDK_CONTROL_MASK, GDK_KEY_W }, + { G_CALLBACK(_view_on_close), GDK_CONTROL_MASK, GDK_KEY_W }, { NULL, 0, 0 } }; #endif /* EMBEDDED */ -static DesktopToolbar _view_toolbar[] = -{ - { N_("Open with..."), G_CALLBACK(_on_open_with), GTK_STOCK_OPEN, - GDK_CONTROL_MASK, GDK_KEY_O, NULL }, - { N_("Edit"), G_CALLBACK(_on_edit), GTK_STOCK_EDIT, GDK_CONTROL_MASK, - GDK_KEY_E, NULL }, - { "", NULL, NULL, 0, 0, NULL }, - { N_("Properties"), G_CALLBACK(_on_properties), GTK_STOCK_PROPERTIES, -#ifndef EMBEDDED - 0, 0, -#else - GDK_MOD1_MASK, GDK_KEY_Return, -#endif - NULL }, - { NULL, NULL, NULL, 0, 0, NULL } -}; - /* variables */ static Mime * _mime = NULL; @@ -191,21 +201,13 @@ static unsigned int _view_cnt = 0; /* functions */ /* view_new */ -static GtkWidget * _new_image(View * view, char const * path); -static GtkWidget * _new_text(View * view, char const * path); +static GtkWidget * _new_load(View * view); -static View * _view_new(char const * pathname) +static View * _view_new(Mime * mime, char const * filename) { View * view; struct stat st; - char const image[] = "image/"; - char const text[] = "text/"; - char const * types[] = { "application/x-perl", - "application/x-shellscript", - "application/xml", - "application/xslt+xml" }; char const * type; - size_t i; char buf[256]; GtkAccelGroup * group; GtkWidget * vbox; @@ -213,19 +215,27 @@ static View * _view_new(char const * pathname) if((view = malloc(sizeof(*view))) == NULL) return NULL; /* FIXME handle error */ + view->mime = mime; + view->filename = NULL; + view->helper.browser = view; + view->helper.config_get = _view_config_get; + view->helper.config_set = _view_config_set; + view->helper.error = _view_error; + view->helper.get_icon = _view_get_icon; + view->helper.get_mime = _view_get_mime; + view->helper.get_type = _view_get_type; + view->helper.set_location = _view_helper_set_location; view->window = NULL; view->ab_window = NULL; _view_cnt++; - if((view->pathname = strdup(pathname)) == NULL - || lstat(pathname, &st) != 0) + if((view->filename = strdup(filename)) == NULL + || lstat(filename, &st) != 0) { _view_error(view, strerror(errno), 1); _view_delete(view); return NULL; } - if(_mime == NULL) - _mime = mime_new(NULL); - if((type = mime_type(_mime, pathname)) == NULL) + if((type = mime_type(mime, filename)) == NULL) { _view_error(view, _("Unknown file type"), 1); return NULL; @@ -234,10 +244,10 @@ static View * _view_new(char const * pathname) view->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_add_accel_group(GTK_WINDOW(view->window), group); g_object_unref(group); - snprintf(buf, sizeof(buf), "%s%s", _("View - "), pathname); + snprintf(buf, sizeof(buf), "%s%s", _("View - "), filename); gtk_window_set_title(GTK_WINDOW(view->window), buf); g_signal_connect_swapped(view->window, "delete-event", G_CALLBACK( - _on_closex), view); + _view_on_closex), view); #if GTK_CHECK_VERSION(3, 0, 0) vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else @@ -245,184 +255,75 @@ static View * _view_new(char const * pathname) #endif #ifndef EMBEDDED widget = desktop_menubar_create( - (mime_get_handler(_mime, type, "edit") != NULL) + (mime_get_handler(mime, type, "edit") != NULL) ? _view_menubar_edit : _view_menubar, view, group); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); #else desktop_accel_create(_view_accel, view, group); #endif - view->toolbar = desktop_toolbar_create(_view_toolbar, view, group); - if(mime_get_handler(_mime, type, "edit") == NULL) - gtk_widget_set_sensitive(GTK_WIDGET(_view_toolbar[1].widget), - FALSE); - gtk_box_pack_start(GTK_BOX(vbox), view->toolbar, FALSE, FALSE, 0); - if(strncmp(type, image, sizeof(image) - 1) == 0) + if((widget = _new_load(view)) == NULL) { - if((widget = _new_image(view, pathname)) == NULL) - return NULL; - } - else if(strncmp(type, text, sizeof(text) - 1) == 0) - { - widget = _new_text(view, pathname); - gtk_window_set_default_size(GTK_WINDOW(view->window), 600, 400); - } - else - { - widget = NULL; - for(i = 0; i < sizeof(types) / sizeof(*types); i++) - if(strcmp(types[i], type) == 0) - { - widget = _new_text(view, pathname); - break; - } - if(widget == NULL) - { - _view_error(view, _("Unable to view file type"), 1); - return NULL; - } - gtk_window_set_default_size(GTK_WINDOW(view->window), 600, 400); + _view_delete(view); + return NULL; } gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(view->window), vbox); + /* XXX fit the window to its content */ + gtk_window_set_default_size(GTK_WINDOW(view->window), 600, 400); gtk_widget_show_all(view->window); return view; } -static GtkWidget * _new_image(View * view, char const * path) +static GtkWidget * _new_load(View * view) { - GtkWidget * window; - GError * error = NULL; - GdkPixbufAnimation * pixbuf; - int width; - int height; - GdkScreen * screen; - gint monitor; - GdkRectangle rect; + Plugin * p; + BrowserPluginDefinition * bpd; + BrowserPlugin * bp; + GList * l; + GtkWidget * widget; - window = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - pixbuf = gdk_pixbuf_animation_new_from_file(path, &error); - if(error != NULL) - { - _view_error((pixbuf != NULL) ? NULL : view, error->message, 1); - g_error_free(error); - } - if(pixbuf == NULL) + if((p = plugin_new(LIBDIR, PACKAGE, "plugins", "preview")) == NULL) return NULL; - view->view = gtk_image_new_from_animation(pixbuf); -#if GTK_CHECK_VERSION(3, 0, 0) - gtk_container_add(GTK_CONTAINER(window), view->view); -#else - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(window), - view->view); -#endif - /* get the current window size */ - gtk_window_get_size(GTK_WINDOW(view->window), &width, &height); - /* add the size of the image */ - width += gdk_pixbuf_animation_get_width(pixbuf); - height += gdk_pixbuf_animation_get_height(pixbuf); - /* get the current monitor size */ - screen = gdk_screen_get_default(); -#if GTK_CHECK_VERSION(2, 14, 0) - gtk_widget_realize(view->window); - monitor = gdk_screen_get_monitor_at_window(screen, - gtk_widget_get_window(view->window)); -#else - monitor = 0; /* XXX hard-coded */ -#endif - gdk_screen_get_monitor_geometry(screen, monitor, &rect); - /* set an upper bound to the size of the window */ - gtk_window_set_default_size(GTK_WINDOW(view->window), - min(width, rect.width), - min(height, rect.height)); - return window; -} - -static GtkWidget * _new_text(View * view, char const * path) -{ - GtkToolItem * toolitem; - GtkWidget * window; - PangoFontDescription * desc; - FILE * fp; - GtkTextBuffer * tbuf; - GtkTextIter iter; - char buf[BUFSIZ]; - size_t len; - - toolitem = gtk_separator_tool_item_new(); - gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 3); - /* copy */ - toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_COPY); - g_signal_connect_swapped(toolitem, "clicked", G_CALLBACK(_on_copy), - view); - gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 3); - /* select all */ -#if GTK_CHECK_VERSION(2, 10, 0) - toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_SELECT_ALL); -#else - toolitem = gtk_tool_button_new(gtk_image_new_from_icon_name( - "edit-select-all", gtk_toolbar_get_icon_size( - GTK_TOOLBAR(view->toolbar))), - _("Select All")); -#endif - g_signal_connect_swapped(toolitem, "clicked", G_CALLBACK( - _on_select_all), view); - gtk_toolbar_insert(GTK_TOOLBAR(view->toolbar), toolitem, 4); - /* view */ - window = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - view->view = gtk_text_view_new(); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view->view), FALSE); - gtk_text_view_set_editable(GTK_TEXT_VIEW(view->view), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view->view), - GTK_WRAP_WORD_CHAR); - desc = pango_font_description_new(); - pango_font_description_set_family(desc, "monospace"); -#if GTK_CHECK_VERSION(3, 0, 0) - gtk_widget_override_font(view->view, desc); -#else - gtk_widget_modify_font(view->view, desc); -#endif - pango_font_description_free(desc); - gtk_container_add(GTK_CONTAINER(window), view->view); - /* FIXME read asynchronously */ - if((fp = fopen(path, "r")) == NULL) + if((bpd = plugin_lookup(p, "plugin")) == NULL) { - _view_error(view, strerror(errno), 0); - return window; + plugin_delete(p); + return NULL; } - tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view)); - while((len = fread(buf, sizeof(char), sizeof(buf), fp)) > 0) + if(bpd->init == NULL + || bpd->destroy == NULL + || bpd->get_widget == NULL + || (bp = bpd->init(&view->helper)) == NULL) { - gtk_text_buffer_get_end_iter(tbuf, &iter); - gtk_text_buffer_insert(tbuf, &iter, buf, len); + plugin_delete(p); + return NULL; } - fclose(fp); - return window; + widget = bpd->get_widget(bp); + l = g_list_append(NULL, view->filename); + bpd->refresh(bp, l); + g_list_free(l); + return widget; } /* view_new_open */ -static View * _view_new_open(void) +static View * _view_new_open(Mime * mime) { View * ret; GtkWidget * dialog; - char * pathname = NULL; + char * filename = NULL; dialog = gtk_file_chooser_dialog_new(_("View file..."), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - pathname = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER( + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER( dialog)); gtk_widget_destroy(dialog); - if(pathname == NULL) + if(filename == NULL) return NULL; - ret = _view_new(pathname); - free(pathname); + ret = _view_new(mime, filename); + free(filename); return ret; } @@ -430,7 +331,7 @@ static View * _view_new_open(void) /* view_delete */ static void _view_delete(View * view) { - free(view->pathname); + free(view->filename); if(view->ab_window != NULL) gtk_widget_destroy(view->ab_window); if(view->window != NULL) @@ -441,6 +342,73 @@ static void _view_delete(View * view) } +/* accessors */ +/* view_config_get */ +static String const * _view_config_get(View * view, String const * section, + String const * variable) +{ + if(section != NULL) + { + if(strcmp(section, "preview") == 0 + && strcmp(variable, "ellipsize") == 0) + return "0"; + if(strcmp(section, "preview") == 0 + && strcmp(variable, "label") == 0) + return "0"; + if(strcmp(section, "preview") == 0 + && strcmp(variable, "size") == 0) + return "-1"; + } + return NULL; +} + + +/* view_config_set */ +static int _view_config_set(View * view, String const * section, + String const * variable, String const * value) +{ + /* FIXME implement */ + return -1; +} + + +/* view_get_icon */ +static GdkPixbuf * _view_get_icon(View * view, char const * filename, + char const * type, struct stat * lst, struct stat * st, + int size) +{ + return browser_vfs_mime_icon(view->mime, filename, type, lst, st, size); +} + + +/* view_get_mime */ +static Mime * _view_get_mime(View * view) +{ + return view->mime; +} + + +/* view_get_type */ +static char const * _view_get_type(View * view, + char const * filename, mode_t mode) +{ + return browser_vfs_mime_type(view->mime, filename, mode); +} + + +/* view_set_location */ +static int _view_set_location(View * view, char const * filename) +{ + char * p; + + if((p = strdup(filename)) == NULL) + return -error_set_code(1, "%s: %s", filename, strerror(errno)); + free(view->filename); + view->filename = p; + return 0; +} + + /* useful */ /* view_error * POST view is deleted if ret != 0 */ @@ -503,7 +471,7 @@ static void _view_open_with(View * view, char const * program) _view_error(view, strerror(errno), 1); return; } - argv[1] = view->pathname; + argv[1] = view->filename; if(g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, &error) != TRUE) { @@ -550,20 +518,32 @@ static void _view_open_with_dialog(View * view) } +/* helpers */ +/* view_helper_set_location */ +static int _view_helper_set_location(View * view, char const * filename) +{ + int res; + + if((res = _view_set_location(view, filename)) != 0) + return -_view_error(view, error_get(), 1); + return 0; +} + + /* callbacks */ #ifdef EMBEDDED -/* on_close */ -static void _on_close(gpointer data) +/* view_on_close */ +static void _view_on_close(gpointer data) { View * view = data; - _on_closex(view); + _view_on_closex(view); } #endif -/* on_closex */ -static gboolean _on_closex(gpointer data) +/* view_on_closex */ +static gboolean _view_on_closex(gpointer data) { View * view = data; @@ -575,54 +555,54 @@ static gboolean _on_closex(gpointer data) #ifndef EMBEDDED -/* on_file_edit */ -static void _on_file_edit(gpointer data) +/* view_on_file_edit */ +static void _view_on_file_edit(gpointer data) { View * view = data; - if(mime_action(_mime, "edit", view->pathname) != 0) + if(mime_action(_mime, "edit", view->filename) != 0) _view_error(view, _("Could not edit file"), 0); } -/* on_file_open_with */ -static void _on_file_open_with(gpointer data) +/* view_on_file_open_with */ +static void _view_on_file_open_with(gpointer data) { View * view = data; - _on_open_with(view); + _view_on_open_with(view); } -/* on_file_properties */ -static void _on_file_properties(gpointer data) +/* view_on_file_properties */ +static void _view_on_file_properties(gpointer data) { View * view = data; - _on_properties(view); + _view_on_properties(view); } -/* on_file_close */ -static void _on_file_close(gpointer data) +/* view_on_file_close */ +static void _view_on_file_close(gpointer data) { View * view = data; - _on_closex(view); + _view_on_closex(view); } -/* on_help_contents */ -static void _on_help_contents(gpointer data) +/* view_on_help_contents */ +static void _view_on_help_contents(gpointer data) { desktop_help_contents(PACKAGE, PROGNAME); } -/* on_help_about */ +/* view_on_help_about */ static gboolean _about_on_closex(gpointer data); -static void _on_help_about(gpointer data) +static void _view_on_help_about(gpointer data) { View * view = data; @@ -656,32 +636,8 @@ static gboolean _about_on_closex(gpointer data) #endif /* EMBEDDED */ -/* on_copy */ -static void _on_copy(gpointer data) -{ - View * view = data; - GtkClipboard * clipboard; - GtkTextBuffer * tbuf; - - clipboard = gtk_widget_get_clipboard(view->view, - GDK_SELECTION_CLIPBOARD); - tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view)); - gtk_text_buffer_copy_clipboard(tbuf, clipboard); -} - - -/* on_edit */ -static void _on_edit(gpointer data) -{ - View * view = data; - - if(mime_action(_mime, "edit", view->pathname) != 0) - _view_error(view, _("Could not edit file"), 0); -} - - -/* on_open_with */ -static void _on_open_with(gpointer data) +/* view_on_open_with */ +static void _view_on_open_with(gpointer data) { View * view = data; @@ -689,27 +645,12 @@ static void _on_open_with(gpointer data) } -/* on_properties */ -static void _on_properties(gpointer data) +/* view_on_properties */ +static void _view_on_properties(gpointer data) { View * view = data; - _view_open_with(view, BINDIR "/properties"); -} - - -/* on_select_all */ -static void _on_select_all(gpointer data) -{ - View * view = data; - GtkTextBuffer * tbuf; - GtkTextIter start; - GtkTextIter end; - - tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view)); - gtk_text_buffer_get_start_iter(tbuf, &start); - gtk_text_buffer_get_end_iter(tbuf, &end); - gtk_text_buffer_select_range(tbuf, &start, &end); + _view_open_with(view, BINDIR "/" PROGNAME_PROPERTIES); } @@ -728,6 +669,7 @@ int main(int argc, char * argv[]) { int o; int i; + Mime * mime; if(setlocale(LC_ALL, "") == NULL) _view_error(NULL, "setlocale", 1); @@ -740,12 +682,15 @@ int main(int argc, char * argv[]) default: return _usage(); } + if((mime = mime_new(NULL)) == NULL) + return _view_error(NULL, error_get(), 2); if(optind == argc) - _view_new_open(); + _view_new_open(mime); else for(i = optind; i < argc; i++) - _view_new(argv[i]); + _view_new(mime, argv[i]); if(_view_cnt) gtk_main(); + mime_delete(mime); return 0; }