]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-document.h
Install ev-backends-manager.h and ev-document-type-builtins.h. Fixes bug
[evince.git] / libdocument / ev-document.h
index 833491e25a0816279b908ada6f9075f6d86abe3c..367d6e6af39a518ab304fc98954c3ef05aeb8e9b 100644 (file)
@@ -28,6 +28,7 @@
 #include <cairo.h>
 
 #include "ev-document-info.h"
+#include "ev-page.h"
 #include "ev-render-context.h"
 
 G_BEGIN_DECLS
@@ -78,16 +79,14 @@ struct _EvDocumentIface
                                                const char      *uri,
                                                GError         **error);
         int               (* get_n_pages)     (EvDocument      *document);
+       EvPage          * (* get_page)        (EvDocument      *document,
+                                              gint             index);
         void              (* get_page_size)   (EvDocument      *document,
-                                               int              page,
+                                               EvPage          *page,
                                                double          *width,
                                                double          *height);
         char            * (* get_page_label)  (EvDocument      *document,
-                                               int              page);
-        gboolean          (* can_get_text)    (EvDocument      *document);
-        char            * (* get_text)        (EvDocument      *document,
-                                               int              page,
-                                               EvRectangle     *rect);
+                                               EvPage          *page);
         gboolean          (* has_attachments) (EvDocument      *document);
         GList           * (* get_attachments) (EvDocument      *document);
         cairo_surface_t * (* render)          (EvDocument      *document,
@@ -102,11 +101,13 @@ GQuark           ev_document_error_quark      (void);
 GMutex          *ev_document_get_doc_mutex    (void);
 void             ev_document_doc_mutex_lock   (void);
 void             ev_document_doc_mutex_unlock (void);
+gboolean         ev_document_doc_mutex_trylock(void);
 
 /* FontConfig mutex */
 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,
@@ -116,23 +117,105 @@ 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,
-                                               int              page,
+                                               EvPage          *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);
+                                               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);
+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;                                                \
+}
+
+/*
+ * Utility macro used to register backend
+ *
+ * use: EV_BACKEND_REGISTER(BackendName, backend_name)
+ */
+#define EV_BACKEND_REGISTER(BackendName, backend_name)                 \
+       EV_BACKEND_REGISTER_WITH_CODE(BackendName, backend_name, ;)
+
 G_END_DECLS
 
 #endif /* EV_DOCUMENT_H */