-GMutex *ev_document_get_fc_mutex (void);
-void ev_document_fc_mutex_lock (void);
-void ev_document_fc_mutex_unlock (void);
-
-EvDocumentInfo *ev_document_get_info (EvDocument *document);
-gboolean ev_document_load (EvDocument *document,
- const char *uri,
- GError **error);
-gboolean ev_document_save (EvDocument *document,
- const char *uri,
- GError **error);
-int ev_document_get_n_pages (EvDocument *document);
-void ev_document_get_page_size (EvDocument *document,
- int page,
- double *width,
- double *height);
-char *ev_document_get_page_label (EvDocument *document,
- int page);
-gboolean ev_document_can_get_text (EvDocument *document);
-char *ev_document_get_text (EvDocument *document,
- int page,
- EvRectangle *rect);
-gboolean ev_document_has_attachments (EvDocument *document);
-GList *ev_document_get_attachments (EvDocument *document);
-GdkPixbuf *ev_document_render_pixbuf (EvDocument *document,
- EvRenderContext *rc);
-
-gint ev_rect_cmp (EvRectangle *a,
- EvRectangle *b);
+GMutex *ev_document_get_fc_mutex (void);
+void ev_document_fc_mutex_lock (void);
+void ev_document_fc_mutex_unlock (void);
+gboolean ev_document_fc_mutex_trylock (void);
+
+EvDocumentInfo *ev_document_get_info (EvDocument *document);
+gboolean ev_document_load (EvDocument *document,
+ const char *uri,
+ GError **error);
+gboolean ev_document_save (EvDocument *document,
+ const char *uri,
+ GError **error);
+int ev_document_get_n_pages (EvDocument *document);
+EvPage *ev_document_get_page (EvDocument *document,
+ gint index);
+void ev_document_get_page_size (EvDocument *document,
+ EvPage *page,
+ double *width,
+ double *height);
+char *ev_document_get_page_label (EvDocument *document,
+ EvPage *page);
+gboolean ev_document_has_attachments (EvDocument *document);
+GList *ev_document_get_attachments (EvDocument *document);
+cairo_surface_t *ev_document_render (EvDocument *document,
+ EvRenderContext *rc);
+
+gint ev_rect_cmp (EvRectangle *a,
+ EvRectangle *b);
+
+/* convenience macro to ease interface addition in the CODE
+ * section of EV_BACKEND_REGISTER_WITH_CODE (this macro relies on
+ * the g_define_type_id present within EV_BACKEND_REGISTER_WITH_CODE()).
+ * usage example:
+ * EV_BACKEND_REGISTER_WITH_CODE (PdfDocument, pdf_document,
+ * EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS,
+ * pdf_document_document_thumbnails_iface_init));
+ */
+#define EV_BACKEND_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \
+ const GInterfaceInfo g_implement_interface_info = { \
+ (GInterfaceInitFunc) iface_init, NULL, NULL \
+ }; \
+ g_type_module_add_interface (module, \
+ g_define_type_id, \
+ TYPE_IFACE, \
+ &g_implement_interface_info); \
+}
+
+/*
+ * Utility macro used to register backends
+ *
+ * use: EV_BACKEND_REGISTER_WITH_CODE(BackendName, backend_name, CODE)
+ */
+#define EV_BACKEND_REGISTER_WITH_CODE(BackendName, backend_name, CODE) \
+ \
+static GType g_define_type_id = 0; \
+ \
+GType \
+backend_name##_get_type (void) \
+{ \
+ return g_define_type_id; \
+} \
+ \
+static void backend_name##_init (BackendName *self); \
+static void backend_name##_class_init (BackendName##Class *klass); \
+static gpointer backend_name##_parent_class = NULL; \
+static void backend_name##_class_intern_init (gpointer klass) \
+{ \
+ backend_name##_parent_class = g_type_class_peek_parent (klass); \
+ backend_name##_class_init ((BackendName##Class *) klass); \
+} \
+ \
+G_MODULE_EXPORT GType \
+register_evince_backend (GTypeModule *module) \
+{ \
+ static const GTypeInfo our_info = { \
+ sizeof (BackendName##Class), \
+ NULL, /* base_init */ \
+ NULL, /* base_finalize */ \
+ (GClassInitFunc) backend_name##_class_intern_init, \
+ NULL, \
+ NULL, /* class_data */ \
+ sizeof (BackendName), \
+ 0, /* n_preallocs */ \
+ (GInstanceInitFunc) backend_name##_init \
+ }; \
+ \
+ /* Initialise the i18n stuff */ \
+ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); \
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); \
+ \
+ g_define_type_id = g_type_module_register_type (module, \
+ G_TYPE_OBJECT, \
+ #BackendName, \
+ &our_info, \
+ (GTypeFlags)0); \
+ \
+ EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, \
+ backend_name##_document_iface_init); \
+ \
+ CODE \
+ \
+ return g_define_type_id; \
+}