Updated patch for document type handling
- From: David Malcolm <dmalcolm redhat com>
- To: "evince-list gnome org" <evince-list gnome org>
- Subject: Updated patch for document type handling
- Date: Mon, 11 Apr 2005 16:38:14 -0400
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]