Updated patch for document type handling



Attached is version 2 of my proposed patch to document type handling.

I removed the unnecessary changes, and added a ChangeLog entry.

This has a convenience library libevbackendfactory.la, containing new
code to map from mimetypes to backends; all of the backend code
libraries get linked to this rather than to the shell and thumbnailer;
the shell and thumbnailer link to this.

I used to "objdump -T shell/evince" verify that the dynamic parts of the
backend libraries are still dynamic once evince and the thumbnailer are
linked.

I've briefly tested my changes to the thumbnailer, and successfully had
it generate a thumbnail of a DVI file (this was manually, though;
someone will need to write the schema files if Nautilus is to do this
automatically).

OK to commit?

The problem I had earlier with the recent-files code turned out to be a
discrepancy between my main system's gnome-vfs and my jhbuild's
gnome-vfs: the former was writing URIs into ~/.recently-used that the
latter couldn't handle (specifically the "ftp" method in my local
jhbuild was broken, and I had an ftp site from activity on my main
system's gnome-vfs)

Dave
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evince/ChangeLog,v
retrieving revision 1.284
diff -u -p -r1.284 ChangeLog
--- ChangeLog	9 Apr 2005 19:30:47 -0000	1.284
+++ ChangeLog	11 Apr 2005 20:24:54 -0000
@@ -1,3 +1,21 @@
+2005-04-11  David Malcolm  <dmalcolm redhat com>
+
+	* shell/ev-document-types.h: 
+	* shell/ev-document-types.c: 
+	New files, handling the mapping from mimetypes to backends
+	
+	* shell/ev-window.c: 
+	* thumbnailer/evince-thumbnailer.c:	
+	Use the ev-document-types code
+	
+	* shell/Makefile.am: 
+	Added new convenience library libevbackendfactory_la, containing
+	the new mimetype->backend logic; moved the backends into it.
+
+	* thumbnailer/Makefile.am:
+	Make the thumbnailer link with the libevbackend.la convenience
+	library, rather than having a duplicate of the backend logic here.
+
 2005-04-09  Nickolay V. Shmyrev  <nshmyrev yandex ru>
 
 	
Index: shell/Makefile.am
===================================================================
RCS file: /cvs/gnome/evince/shell/Makefile.am,v
retrieving revision 1.28
diff -u -p -r1.28 Makefile.am
--- shell/Makefile.am	7 Apr 2005 15:28:06 -0000	1.28
+++ shell/Makefile.am	11 Apr 2005 20:24:54 -0000
@@ -18,6 +18,36 @@ INCLUDES=						\
 	$(NULL)
 
 bin_PROGRAMS=evince
+noinst_LTLIBRARIES = libevbackendfactory.la
+
+libevbackendfactory_la_SOURCES=         		\
+	ev-document-types.c				\
+	ev-document-types.h
+
+libevbackendfactory_la_LIBADD = 			\
+	$(top_builddir)/pdf/libpdfdocument.la	 	\
+	$(top_builddir)/pixbuf/libpixbufdocument.la	\
+	$(top_builddir)/ps/libgtkgs.la			\
+	$(top_builddir)/backend/libevbackend.la		\
+	$(NULL)
+
+if ENABLE_DJVU
+libevbackendfactory_la_LIBADD += 		\
+	-ldjvulibre 				\
+	-lpthread   				\
+	$(top_builddir)/djvu/libgtkdjvu.la	\
+	$(NULL)
+endif
+
+if ENABLE_DVI
+libevbackendfactory_la_LIBADD += 		\
+	$(top_builddir)/dvi/libgtkdvi.la	\
+	$(NULL)
+endif
+
+if WITH_TYPE1_FONTS
+libevbackendfactory_la_LIBADD += -lt1lib
+endif
 
 evince_SOURCES=				\
 	dummy.cc			\
@@ -58,29 +88,8 @@ 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	\
+	libevbackendfactory.la					\
 	$(NULL)
-endif
-
-if WITH_TYPE1_FONTS
-evince_LDADD += -lt1lib
-endif
 
 BUILT_SOURCES = ev-marshal.h ev-marshal.c
 
Index: shell/ev-window.c
===================================================================
RCS file: /cvs/gnome/evince/shell/ev-window.c,v
retrieving revision 1.94
diff -u -p -r1.94 ev-window.c
--- shell/ev-window.c	8 Apr 2005 10:37:32 -0000	1.94
+++ shell/ev-window.c	11 Apr 2005 20:24:54 -0000
@@ -39,6 +39,7 @@
 #include "ev-print-job.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-links.h"
+#include "ev-document-types.h"
 #include "ev-document-find.h"
 #include "ev-document-security.h"
 #include "ev-job-queue.h"
@@ -47,16 +48,6 @@
 #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>
@@ -401,44 +392,6 @@ unable_to_load (EvWindow   *ev_window,
 	gtk_widget_destroy (dialog);
 }
 
-/* Would be nice to have this in gdk-pixbuf */
-static gboolean
-mime_type_supported_by_gdk_pixbuf (const gchar *mime_type)
-{
-	GSList *formats, *list;
-	gboolean retval = FALSE;
-
-	formats = gdk_pixbuf_get_formats ();
-
-	list = formats;
-	while (list) {
-		GdkPixbufFormat *format = list->data;
-		int i;
-		gchar **mime_types;
-
-		if (gdk_pixbuf_format_is_disabled (format))
-			continue;
-
-		mime_types = gdk_pixbuf_format_get_mime_types (format);
-
-		for (i = 0; mime_types[i] != NULL; i++) {
-			if (strcmp (mime_types[i], mime_type) == 0) {
-				retval = TRUE;
-				break;
-			}
-		}
-
-		if (retval)
-			break;
-
-		list = list->next;
-	}
-
-	g_slist_free (formats);
-
-	return retval;
-}
-
 static void
 update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_window)
 {
@@ -715,33 +668,6 @@ start_loading_document (EvWindow   *ev_w
 	return FALSE;
 }
 
-static gboolean
-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
-	};
-	gint   i;
-	
-	g_return_val_if_fail (mime_type != NULL, FALSE);
-
-	if (mime_type_supported_by_gdk_pixbuf (mime_type))
-		return TRUE;
-	
-	for (i = 0; supported_types[i] != NULL; i++) {
-		if (g_ascii_strcasecmp (mime_type, supported_types[i]) == 0)
-			return TRUE;
-	}
-	
-	return FALSE;
-}
-
 void
 ev_window_open (EvWindow *ev_window, const char *uri)
 {
@@ -755,22 +681,13 @@ ev_window_open (EvWindow *ev_window, con
 
 	if (mime_type == NULL)
 		document = NULL;
-	else if (!strcmp (mime_type, "application/pdf"))
-		document = g_object_new (PDF_TYPE_DOCUMENT, NULL);
-	else if (!strcmp (mime_type, "application/postscript") ||
-		 !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
+	else {
+		const EvinceDocumentType *document_type = evince_document_type_lookup (mime_type);
+
+		if (document_type) {
+			document = evince_document_type_manufacture_instance (document_type);
+		}
+	}
 
 	if (document) {
 		start_loading_document (ev_window, document, uri);
@@ -803,7 +720,7 @@ ev_window_open_uri_list (EvWindow *ev_wi
 		uri = gnome_vfs_uri_to_string (list->data, GNOME_VFS_URI_HIDE_NONE);
 		mime_type = gnome_vfs_get_mime_type (uri);
 		
-		if (is_file_supported (mime_type)) {
+		if (evince_document_type_lookup (mime_type)!=NULL) {
 			if (ev_window_is_empty (EV_WINDOW (ev_window))) {
 				ev_window_open (ev_window, uri);
 				
Index: thumbnailer/Makefile.am
===================================================================
RCS file: /cvs/gnome/evince/thumbnailer/Makefile.am,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile.am
--- thumbnailer/Makefile.am	3 Apr 2005 00:01:48 -0000	1.2
+++ thumbnailer/Makefile.am	11 Apr 2005 20:24:54 -0000
@@ -7,6 +7,7 @@ INCLUDES=					\
 	-I$(top_srcdir)/lib			\
 	-I$(top_srcdir)/pdf			\
 	-I$(top_srcdir)/backend			\
+	-I$(top_srcdir)/shell			\
 	-DGNOMELOCALEDIR=\"$(datadir)/locale\"	\
 	-DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \
 	$(THUMBNAILER_CFLAGS)			\
@@ -19,11 +20,10 @@ evince_thumbnailer_SOURCES=	\
 	evince-thumbnailer.c
 	$(NULL)
 
-evince_thumbnailer_LDADD=						\
-	$(THUMBNAILER_LIBS)					\
+evince_thumbnailer_LDADD=				\
+	$(THUMBNAILER_LIBS)				\
 	$(top_builddir)/lib/libev.la			\
-	$(top_builddir)/pdf/libpdfdocument.la	 	\
-	$(top_builddir)/backend/libevbackend.la		\
+	$(top_builddir)/shell/libevbackendfactory.la	\
 	$(NULL)
 
 pixmapdir = $(pkgdatadir)
Index: thumbnailer/evince-thumbnailer.c
===================================================================
RCS file: /cvs/gnome/evince/thumbnailer/evince-thumbnailer.c,v
retrieving revision 1.6
diff -u -p -r1.6 evince-thumbnailer.c
--- thumbnailer/evince-thumbnailer.c	6 Apr 2005 09:36:25 -0000	1.6
+++ thumbnailer/evince-thumbnailer.c	11 Apr 2005 20:24:54 -0000
@@ -16,14 +16,13 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
-#include <ev-poppler.h>
-
 #include <libgnomevfs/gnome-vfs-mime-utils.h>
 #include <libgnomevfs/gnome-vfs-uri.h>
 #include <libgnomevfs/gnome-vfs-utils.h>
 #include <libgnomevfs/gnome-vfs-init.h>
 
 #include <ev-document.h>
+#include <ev-document-types.h>
 #include <ev-document-thumbnails.h>
 
 #include <string.h>
@@ -37,16 +36,18 @@ evince_thumbnail_pngenc_get (const char 
 	char *mime_type;
 	GError *error;
 	GdkPixbuf *pixbuf;
+	const EvinceDocumentType* document_type;
 
 	mime_type = gnome_vfs_get_mime_type (uri);
 	if (mime_type == NULL)
 		return FALSE;
 
-	if (!strcmp (mime_type, "application/pdf"))
-		document = g_object_new (PDF_TYPE_DOCUMENT, NULL);
-	else
+	document_type = evince_document_type_lookup (mime_type);
+	if (document_type==NULL)
 		return FALSE;
 
+	document = evince_document_type_manufacture_instance (document_type);
+
 	if (!ev_document_load (document, uri, &error)) {
 		if (error->domain == EV_DOCUMENT_ERROR &&
             	    error->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
@@ -56,30 +57,41 @@ evince_thumbnail_pngenc_get (const char 
 		return FALSE;
 	}
 
+	if (!EV_IS_DOCUMENT_THUMBNAILS (document)) {
+		return FALSE;
+	}
+
 	pixbuf = ev_document_thumbnails_get_thumbnail
 			(EV_DOCUMENT_THUMBNAILS (document), 1, size, FALSE);
 	
 	if (pixbuf != NULL) {
-		GdkPixbuf *pdflogo;
-
-		pdflogo = gdk_pixbuf_new_from_file (DATADIR"/pdf-icon.png", NULL);
-		if (pdflogo != NULL) {
-			int delta_height, delta_width;
-
-			delta_width = gdk_pixbuf_get_width (pixbuf) -
-			              gdk_pixbuf_get_width (pdflogo);
-			delta_height = gdk_pixbuf_get_height (pixbuf) -
-			               gdk_pixbuf_get_height (pdflogo);
-
-			gdk_pixbuf_composite (pdflogo, pixbuf,
-					      delta_width, delta_height,
-					      gdk_pixbuf_get_width (pdflogo),
-					      gdk_pixbuf_get_height (pdflogo),
-					      delta_width, delta_height,
-					      1, 1,
-					      GDK_INTERP_NEAREST, 100);
+		const char *overlaid_icon_name;
 
-			gdk_pixbuf_unref  (pdflogo);
+		overlaid_icon_name = evince_document_type_get_overlaid_thumbnail_icon (document_type);		
+		if (overlaid_icon_name) {
+			GdkPixbuf *overlaid_pixbuf;
+
+			gchar *overlaid_icon_path = g_strdup_printf ("%s/%s", DATADIR, overlaid_icon_name);
+			overlaid_pixbuf = gdk_pixbuf_new_from_file (overlaid_icon_path, NULL);
+			g_free (overlaid_icon_path);
+			if (overlaid_pixbuf != NULL) {
+				int delta_height, delta_width;
+				
+				delta_width = gdk_pixbuf_get_width (pixbuf) -
+					gdk_pixbuf_get_width (overlaid_pixbuf);
+				delta_height = gdk_pixbuf_get_height (pixbuf) -
+					gdk_pixbuf_get_height (overlaid_pixbuf);
+				
+				gdk_pixbuf_composite (overlaid_pixbuf, pixbuf,
+						      delta_width, delta_height,
+						      gdk_pixbuf_get_width (overlaid_pixbuf),
+						      gdk_pixbuf_get_height (overlaid_pixbuf),
+						      delta_width, delta_height,
+						      1, 1,
+						      GDK_INTERP_NEAREST, 100);
+				
+				gdk_pixbuf_unref  (overlaid_pixbuf);
+			}
 		}
 		if (gdk_pixbuf_save (pixbuf, thumbnail, "png", NULL, NULL)) {
 			gdk_pixbuf_unref  (pixbuf);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]