diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/Makefile.am | 59 | ||||
-rw-r--r-- | shell/ev-application.c | 59 | ||||
-rw-r--r-- | shell/ev-application.h | 1 | ||||
-rw-r--r-- | shell/ev-window.c | 103 | ||||
-rw-r--r-- | shell/main.c | 2 |
5 files changed, 191 insertions, 33 deletions
diff --git a/shell/Makefile.am b/shell/Makefile.am index a14f2a0..b03eed4 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -1,16 +1,20 @@ NULL= -INCLUDES= \ - -DDATADIR=\"$(pkgdatadir)\" \ - -I$(top_srcdir)/lib \ - -I$(top_srcdir)/backend \ - -I$(top_srcdir)/pdf \ - -I$(top_srcdir)/pixbuf \ - -I$(top_srcdir)/ps \ - -DGNOMELOCALEDIR=\"$(datadir)/locale\" \ - -DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \ - $(SHELL_CFLAGS) \ - $(EVINCE_DISABLE_DEPRECATED) \ +INCLUDES= \ + -DDATADIR=\"$(pkgdatadir)\" \ + -DGNOMEDATADIR=\"$(datadir)\" \ + -I$(top_srcdir)/lib \ + -I$(top_srcdir)/cut-n-paste/recent-files/ \ + -I$(top_srcdir)/backend \ + -I$(top_srcdir)/pdf \ + -I$(top_srcdir)/pixbuf \ + -I$(top_srcdir)/ps \ + -I$(top_srcdir)/djvu \ + -I$(top_srcdir)/dvi \ + -DGNOMELOCALEDIR=\"$(datadir)/locale\" \ + -DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \ + $(SHELL_CFLAGS) \ + $(EVINCE_DISABLE_DEPRECATED) \ $(NULL) bin_PROGRAMS=evince @@ -50,15 +54,34 @@ evince_SOURCES= \ main.c \ $(NULL) -evince_LDADD= \ - $(SHELL_LIBS) \ - $(top_builddir)/lib/libev.la \ - $(top_builddir)/pdf/libpdfdocument.la \ - $(top_builddir)/pixbuf/libpixbufdocument.la \ - $(top_builddir)/ps/libgtkgs.la \ - $(top_builddir)/backend/libevbackend.la \ +evince_LDADD= \ + $(SHELL_LIBS) \ + $(top_builddir)/cut-n-paste/recent-files/librecent.la \ + $(top_builddir)/lib/libev.la \ + $(top_builddir)/pdf/libpdfdocument.la \ + $(top_builddir)/pixbuf/libpixbufdocument.la \ + $(top_builddir)/ps/libgtkgs.la \ + $(top_builddir)/backend/libevbackend.la \ $(NULL) +if ENABLE_DJVU +evince_LDADD += \ + -ldjvulibre \ + -lpthread \ + $(top_builddir)/djvu/libgtkdjvu.la \ + $(NULL) +endif + +if ENABLE_DVI +evince_LDADD += \ + $(top_builddir)/dvi/libgtkdvi.la \ + $(NULL) +endif + +if WITH_TYPE1_FONTS +evince_LDADD += -lt1lib +endif + BUILT_SOURCES = ev-marshal.h ev-marshal.c EXTRA_DIST = ev-marshal.list diff --git a/shell/ev-application.c b/shell/ev-application.c index a1dec92..e24e823 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -20,6 +20,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "ev-application.h" #include <glib.h> @@ -95,7 +99,7 @@ is_window_empty (const EvWindow *ev_window, gconstpointer dummy) : -1; } -static EvWindow * +EvWindow * ev_application_get_empty_window (EvApplication *application) { GList *node; @@ -113,7 +117,17 @@ ev_application_open (EvApplication *application, GError *err) { EvWindow *ev_window; GtkWidget *chooser; - GtkFileFilter *both_filter, *pdf_filter, *ps_filter, *pixbuf_filter, *all_filter; + GtkFileFilter *documents_filter; + GtkFileFilter *pdf_filter; + GtkFileFilter *ps_filter; + GtkFileFilter *pixbuf_filter; + GtkFileFilter *all_filter; +#ifdef ENABLE_DJVU + GtkFileFilter *djvu_filter; +#endif +#ifdef ENABLE_DVI + GtkFileFilter *dvi_filter; +#endif ev_window = ev_application_get_empty_window (application); @@ -125,19 +139,26 @@ ev_application_open (EvApplication *application, GError *err) GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); - both_filter = gtk_file_filter_new (); - gtk_file_filter_set_name (both_filter, - _("PostScript and PDF Documents")); - gtk_file_filter_add_mime_type (both_filter, "application/postscript"); - gtk_file_filter_add_mime_type (both_filter, "application/x-gzpostscript"); - gtk_file_filter_add_mime_type (both_filter, "image/x-eps"); - gtk_file_filter_add_mime_type (both_filter, "application/pdf"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), both_filter); + documents_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (documents_filter, + _("All Documents")); + gtk_file_filter_add_mime_type (documents_filter, "application/postscript"); + gtk_file_filter_add_mime_type (documents_filter, "application/x-gzpostscript"); + gtk_file_filter_add_mime_type (documents_filter, "image/x-eps"); + gtk_file_filter_add_mime_type (documents_filter, "application/pdf"); +#ifdef ENABLE_DVI + gtk_file_filter_add_mime_type (documents_filter, "application/x-dvi"); +#endif + gtk_file_filter_add_pixbuf_formats (documents_filter); +#ifdef ENABLE_DJVU + gtk_file_filter_add_mime_type (documents_filter, "image/vnd.djvu"); +#endif + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), documents_filter); ps_filter = gtk_file_filter_new (); gtk_file_filter_set_name (ps_filter, _("PostScript Documents")); gtk_file_filter_add_mime_type (ps_filter, "application/postscript"); - gtk_file_filter_add_mime_type (both_filter, "application/x-gzpostscript"); + gtk_file_filter_add_mime_type (ps_filter, "application/x-gzpostscript"); gtk_file_filter_add_mime_type (ps_filter, "image/x-eps"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ps_filter); @@ -146,17 +167,31 @@ ev_application_open (EvApplication *application, GError *err) gtk_file_filter_add_mime_type (pdf_filter, "application/pdf"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter); +#ifdef ENABLE_DVI + dvi_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (dvi_filter, _("DVI Documents")); + gtk_file_filter_add_mime_type (dvi_filter, "application/x-dvi"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), dvi_filter); +#endif + pixbuf_filter = gtk_file_filter_new (); gtk_file_filter_set_name (pixbuf_filter, _("Images")); gtk_file_filter_add_pixbuf_formats (pixbuf_filter); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter); + +#ifdef ENABLE_DJVU + djvu_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (djvu_filter, _("Djvu Documents")); + gtk_file_filter_add_mime_type (djvu_filter, "image/vnd.djvu"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), djvu_filter); +#endif all_filter = gtk_file_filter_new (); gtk_file_filter_set_name (all_filter, _("All Files")); gtk_file_filter_add_pattern (all_filter, "*"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter); - gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), both_filter); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), documents_filter); if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) { char *uri; diff --git a/shell/ev-application.h b/shell/ev-application.h index 7f30a92..e6a3cf5 100644 --- a/shell/ev-application.h +++ b/shell/ev-application.h @@ -57,6 +57,7 @@ EvApplication *ev_application_get_instance (void); void ev_application_open (EvApplication *application, GError *err); EvWindow *ev_application_new_window (EvApplication *application); +EvWindow * ev_application_get_empty_window (EvApplication *application); G_END_DECLS diff --git a/shell/ev-window.c b/shell/ev-window.c index b3ab9ff..c351502 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -43,13 +43,23 @@ #include "ev-document-security.h" #include "ev-job-queue.h" #include "eggfindbar.h" +#include "egg-recent-view-gtk.h" +#include "egg-recent-view.h" +#include "egg-recent-model.h" #include "ev-poppler.h" #include "pixbuf-document.h" #include "ps-document.h" +#ifdef ENABLE_DVI +#include "dvi-document.h" +#endif +#ifdef ENABLE_DJVU +#include "djvu-document.h" +#endif #include <glib/gi18n.h> #include <gtk/gtk.h> +#include <gnome.h> #include <libgnomevfs/gnome-vfs-mime-utils.h> #include <libgnomevfs/gnome-vfs-uri.h> @@ -119,6 +129,10 @@ struct _EvWindowPrivate { gboolean fullscreen_mode; EvSizingMode sizing_mode; GSource *fullscreen_timeout_source; + + /* recent file stuff */ + EggRecentModel *recent_model; + EggRecentViewGtk *recent_view; }; static GtkTargetEntry ev_drop_types[] = { @@ -149,6 +163,8 @@ static gboolean start_loading_document (EvWindow *ev_window, static void ev_window_set_sizing_mode (EvWindow *ev_window, EvSizingMode sizing_mode); +static void ev_window_add_recent (EvWindow *window, const char *filename); + G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) static void @@ -484,7 +500,7 @@ update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_windo static gboolean document_supports_sidebar (EvDocument *document) { - return (EV_IS_DOCUMENT_THUMBNAILS (document) && (EV_IS_DOCUMENT_LINKS (document))); + return (EV_IS_DOCUMENT_THUMBNAILS (document) || (EV_IS_DOCUMENT_LINKS (document))); } static void @@ -654,6 +670,8 @@ start_loading_document (EvWindow *ev_window, g_object_unref (ev_window->priv->document); ev_window->priv->document = g_object_ref (document); ev_window_setup_document (ev_window); + + ev_window_add_recent (ev_window, uri); return TRUE; } @@ -689,6 +707,8 @@ is_file_supported (const gchar *mime_type) static char *supported_types [] = { "application/pdf", "application/postscript", + "application/x-dvi", + "image/vnd.djvu", "application/x-gzpostscript", "image/x-eps", NULL @@ -727,8 +747,16 @@ ev_window_open (EvWindow *ev_window, const char *uri) !strcmp (mime_type, "application/x-gzpostscript") || !strcmp (mime_type, "image/x-eps")) document = g_object_new (PS_TYPE_DOCUMENT, NULL); +#ifdef ENABLE_DJVU + else if (!strcmp (mime_type, "image/vnd.djvu")) + document = g_object_new (DJVU_TYPE_DOCUMENT, NULL); +#endif else if (mime_type_supported_by_gdk_pixbuf (mime_type)) document = g_object_new (PIXBUF_TYPE_DOCUMENT, NULL); +#ifdef ENABLE_DVI + else if (!strcmp (mime_type, "application/x-dvi")) + document = g_object_new (DVI_TYPE_DOCUMENT, NULL); +#endif if (document) { start_loading_document (ev_window, document, uri); @@ -789,6 +817,69 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *ev_window) ev_application_open (EV_APP, NULL); } +static void +ev_window_cmd_recent_file_activate (EggRecentViewGtk *view, EggRecentItem *item, + EvWindow *ev_window) +{ + char *uri; + GtkWidget *window; + + uri = egg_recent_item_get_uri (item); + + window = GTK_WIDGET (ev_application_get_empty_window (EV_APP)); + gtk_widget_show (window); + ev_window_open (EV_WINDOW (window), uri); + + g_free (uri); +} + +static void +ev_window_add_recent (EvWindow *window, const char *filename) +{ + EggRecentItem *item; + + if (strstr (filename, "file:///") == NULL) + return; + + item = egg_recent_item_new_from_uri (filename); + egg_recent_item_add_group (item, "Evince"); + egg_recent_model_add_full (window->priv->recent_model, item); +} + +static void +ev_window_setup_recent (EvWindow *ev_window) +{ + GtkWidget *menu_item; + GtkWidget *menu; + + menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu"); + menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item)); + menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu/RecentFilesMenu"); + + g_return_if_fail (menu != NULL); + g_return_if_fail (menu_item != NULL); + + /* it would be better if we just filtered by mime-type, but there + * doesn't seem to be an easy way to figure out which mime-types we + * can handle */ + ev_window->priv->recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU); + + ev_window->priv->recent_view = egg_recent_view_gtk_new (menu, menu_item); + egg_recent_view_gtk_show_icons (EGG_RECENT_VIEW_GTK (ev_window->priv->recent_view), FALSE); + egg_recent_model_set_limit (ev_window->priv->recent_model, 5); + + egg_recent_view_set_model (EGG_RECENT_VIEW (ev_window->priv->recent_view), + ev_window->priv->recent_model); + + egg_recent_model_set_filter_groups (ev_window->priv->recent_model, + "Evince", NULL); + + egg_recent_view_gtk_set_trailing_sep (ev_window->priv->recent_view, TRUE); + + g_signal_connect (ev_window->priv->recent_view, "activate", + G_CALLBACK (ev_window_cmd_recent_file_activate), ev_window); +} + /* FIXME static gboolean overwrite_existing_file (GtkWindow *window, const gchar *file_name) @@ -1530,9 +1621,16 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) { + GError *error = NULL; + g_return_if_fail (EV_IS_WINDOW (ev_window)); - /* FIXME */ + gnome_help_display ("evince.xml", NULL, &error); + + if(error != NULL) { + g_warning (error->message); + g_error_free (error); + } } static void @@ -2369,6 +2467,7 @@ ev_window_init (EvWindow *ev_window) ev_window->priv->find_bar, FALSE, TRUE, 0); + ev_window_setup_recent (ev_window); ev_window->priv->chrome = load_chrome (); set_chrome_actions (ev_window); update_chrome_visibility (ev_window); diff --git a/shell/main.c b/shell/main.c index 6cd14e8..5ed8f76 100644 --- a/shell/main.c +++ b/shell/main.c @@ -80,7 +80,7 @@ main (int argc, char *argv[]) LIBGNOMEUI_MODULE, argc, argv, GNOME_PARAM_POPT_TABLE, popt_options, GNOME_PARAM_HUMAN_READABLE_NAME, _("Evince"), - GNOME_PARAM_APP_DATADIR, DATADIR, + GNOME_PARAM_APP_DATADIR, GNOMEDATADIR, NULL); ev_job_queue_init (); |