]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-document.h
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / libdocument / ev-document.h
index bc040d14fa93913d8004d31576405c2b7e1f396e..d28289254df20796c7709d9aed0a6e3b42469e22 100644 (file)
@@ -1,5 +1,6 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
 /*
+ *  Copyright (C) 2009 Carlos Garcia Campos
  *  Copyright (C) 2000-2003 Marco Pesenti Gritti
  *
  *  This program is free software; you can redistribute it and/or modify
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  *  $Id$
  */
 
+#if !defined (__EV_EVINCE_DOCUMENT_H_INSIDE__) && !defined (EVINCE_COMPILATION)
+#error "Only <evince-document.h> can be included directly."
+#endif
+
 #ifndef EV_DOCUMENT_H
 #define EV_DOCUMENT_H
 
 #include <cairo.h>
 
 #include "ev-document-info.h"
+#include "ev-page.h"
 #include "ev-render-context.h"
 
 G_BEGIN_DECLS
 
 #define EV_TYPE_DOCUMENT            (ev_document_get_type ())
 #define EV_DOCUMENT(o)              (G_TYPE_CHECK_INSTANCE_CAST ((o), EV_TYPE_DOCUMENT, EvDocument))
-#define EV_DOCUMENT_IFACE(k)        (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_DOCUMENT, EvDocumentIface))
+#define EV_DOCUMENT_CLASS(k)        (G_TYPE_CHECK_CLASS_CAST((k), EV_TYPE_DOCUMENT, EvDocumentClass))
 #define EV_IS_DOCUMENT(o)           (G_TYPE_CHECK_INSTANCE_TYPE ((o), EV_TYPE_DOCUMENT))
-#define EV_IS_DOCUMENT_IFACE(k)     (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_DOCUMENT))
-#define EV_DOCUMENT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), EV_TYPE_DOCUMENT, EvDocumentIface))
+#define EV_IS_DOCUMENT_CLASS(k)     (G_TYPE_CHECK_CLASS_TYPE ((k), EV_TYPE_DOCUMENT))
+#define EV_DOCUMENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), EV_TYPE_DOCUMENT, EvDocumentClass))
 
 typedef struct _EvDocument        EvDocument;
-typedef struct _EvDocumentIface   EvDocumentIface;
-typedef struct _EvPageCache       EvPageCache;
-typedef struct _EvPageCacheClass  EvPageCacheClass;
+typedef struct _EvDocumentClass   EvDocumentClass;
+typedef struct _EvDocumentPrivate EvDocumentPrivate;
 
 #define EV_DOCUMENT_ERROR ev_document_error_quark ()
 #define EV_DOC_MUTEX_LOCK (ev_document_doc_mutex_lock ())
@@ -59,72 +64,144 @@ typedef struct {
         double y;
 } EvPoint;
 
+typedef struct _EvRectangle EvRectangle;
+typedef struct _EvMapping EvMapping;
+
+typedef struct _EvDocumentBackendInfo EvDocumentBackendInfo;
+struct _EvDocumentBackendInfo
+{
+       const gchar *name;
+       const gchar *version;
+};
+
 typedef struct {
-        double x1;
-        double y1;
-        double x2;
-        double y2;
-} EvRectangle;
+       const gchar *filename;
+       gint         line;
+       gint         col;
+} EvSourceLink;
 
-struct _EvDocumentIface
+struct _EvDocument
 {
-        GTypeInterface base_iface;
+       GObject base;
+
+       EvDocumentPrivate *priv;
+};
 
-        /* Methods  */
+struct _EvDocumentClass
+{
+        GObjectClass base_class;
+
+        /* Virtual Methods  */
         gboolean          (* load)            (EvDocument      *document,
                                                const char      *uri,
                                                GError         **error);
         gboolean          (* save)            (EvDocument      *document,
                                                const char      *uri,
                                                GError         **error);
-        int               (* get_n_pages)     (EvDocument      *document);
+        gint              (* 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          (* has_attachments) (EvDocument      *document);
-        GList           * (* get_attachments) (EvDocument      *document);
+        gchar           * (* get_page_label)  (EvDocument      *document,
+                                               EvPage          *page);
         cairo_surface_t * (* render)          (EvDocument      *document,
                                                EvRenderContext *rc);
-        EvDocumentInfo *  (* get_info)        (EvDocument      *document);
+       GdkPixbuf       * (* get_thumbnail)   (EvDocument      *document,
+                                              EvRenderContext *rc);
+        EvDocumentInfo  * (* get_info)        (EvDocument      *document);
+        gboolean          (* get_backend_info)(EvDocument      *document,
+                                               EvDocumentBackendInfo *info);
+        gboolean         (* support_synctex) (EvDocument      *document);
 };
 
-GType            ev_document_get_type         (void) G_GNUC_CONST;
-GQuark           ev_document_error_quark      (void);
+GType            ev_document_get_type             (void) G_GNUC_CONST;
+GQuark           ev_document_error_quark          (void);
 
 /* Document mutex */
-GMutex          *ev_document_get_doc_mutex    (void);
-void             ev_document_doc_mutex_lock   (void);
-void             ev_document_doc_mutex_unlock (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);
+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);
-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_has_attachments  (EvDocument      *document);
-GList           *ev_document_get_attachments  (EvDocument      *document);
-cairo_surface_t *ev_document_render           (EvDocument      *document,
-                                               EvRenderContext *rc);
+EvDocumentInfo  *ev_document_get_info             (EvDocument      *document);
+gboolean         ev_document_get_backend_info     (EvDocument      *document,
+                                                  EvDocumentBackendInfo *info);
+gboolean         ev_document_load                 (EvDocument      *document,
+                                                  const char      *uri,
+                                                  GError         **error);
+gboolean         ev_document_save                 (EvDocument      *document,
+                                                  const char      *uri,
+                                                  GError         **error);
+gint             ev_document_get_n_pages          (EvDocument      *document);
+EvPage          *ev_document_get_page             (EvDocument      *document,
+                                                  gint             index);
+void             ev_document_get_page_size        (EvDocument      *document,
+                                                  gint             page_index,
+                                                  double          *width,
+                                                  double          *height);
+gchar           *ev_document_get_page_label       (EvDocument      *document,
+                                                  gint             page_index);
+cairo_surface_t *ev_document_render               (EvDocument      *document,
+                                                  EvRenderContext *rc);
+GdkPixbuf       *ev_document_get_thumbnail        (EvDocument      *document,
+                                                  EvRenderContext *rc);
+const gchar     *ev_document_get_uri              (EvDocument      *document);
+const gchar     *ev_document_get_title            (EvDocument      *document);
+gboolean         ev_document_is_page_size_uniform (EvDocument      *document);
+void             ev_document_get_max_page_size    (EvDocument      *document,
+                                                  gdouble         *width,
+                                                  gdouble         *height);
+void             ev_document_get_min_page_size    (EvDocument      *document,
+                                                  gdouble         *width,
+                                                  gdouble         *height);
+gboolean         ev_document_check_dimensions     (EvDocument      *document);
+gint             ev_document_get_max_label_len    (EvDocument      *document);
+gboolean         ev_document_has_text_page_labels (EvDocument      *document);
+gboolean         ev_document_find_page_by_label   (EvDocument      *document,
+                                                  const gchar     *page_label,
+                                                  gint            *page_index);
+gboolean        ev_document_has_synctex          (EvDocument      *document);
+
+EvSourceLink    *ev_document_synctex_backward_search
+                                                  (EvDocument      *document,
+                                                   gint             page_index,
+                                                   gfloat           x,
+                                                   gfloat           y);
+
+EvMapping       *ev_document_synctex_forward_search
+                                                  (EvDocument      *document,
+                                                  EvSourceLink    *source_link);
+
+gint             ev_rect_cmp                      (EvRectangle     *a,
+                                                  EvRectangle     *b);
+
+#define EV_TYPE_RECTANGLE (ev_rectangle_get_type ())
+struct _EvRectangle
+{
+       gdouble x1;
+       gdouble y1;
+       gdouble x2;
+       gdouble y2;
+};
 
-gint            ev_rect_cmp                   (EvRectangle     *a,
-                                               EvRectangle     *b);
+GType        ev_rectangle_get_type (void) G_GNUC_CONST;
+EvRectangle *ev_rectangle_new      (void);
+EvRectangle *ev_rectangle_copy     (EvRectangle *ev_rect);
+void         ev_rectangle_free     (EvRectangle *ev_rect);
+
+struct _EvMapping {
+       EvRectangle area;
+       gpointer    data;
+};
 
 /* convenience macro to ease interface addition in the CODE
  * section of EV_BACKEND_REGISTER_WITH_CODE (this macro relies on
@@ -171,7 +248,7 @@ static void     backend_name##_class_intern_init (gpointer klass)           \
 G_MODULE_EXPORT GType                                                          \
 register_evince_backend (GTypeModule *module)                                  \
 {                                                                              \
-       static const GTypeInfo our_info = {                                     \
+       const GTypeInfo our_info = {                                            \
                sizeof (BackendName##Class),                                    \
                NULL, /* base_init */                                           \
                NULL, /* base_finalize */                                       \
@@ -188,14 +265,11 @@ register_evince_backend (GTypeModule *module)                                     \
        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_TYPE_DOCUMENT,       \
+                                                       #BackendName,           \
+                                                       &our_info,              \
+                                                       (GTypeFlags)0);         \
                                                                                \
-       EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT,                       \
-                               backend_name##_document_iface_init);             \
-                                                                               \
        CODE                                                                    \
                                                                                \
        return g_define_type_id;                                                \
@@ -209,6 +283,25 @@ register_evince_backend (GTypeModule *module)                                      \
 #define EV_BACKEND_REGISTER(BackendName, backend_name)                 \
        EV_BACKEND_REGISTER_WITH_CODE(BackendName, backend_name, ;)
 
+/*
+ * A convenience macro for boxed type implementations, which defines a
+ * type_name_get_type() function registering the boxed type.
+ */
+#define EV_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func)               \
+GType                                                                                 \
+type_name##_get_type (void)                                                           \
+{                                                                                     \
+        static volatile gsize g_define_type_id__volatile = 0;                         \
+       if (g_once_init_enter (&g_define_type_id__volatile)) {                        \
+               GType g_define_type_id =                                              \
+                   g_boxed_type_register_static (g_intern_static_string (#TypeName), \
+                                                 (GBoxedCopyFunc) copy_func,         \
+                                                 (GBoxedFreeFunc) free_func);        \
+               g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);    \
+       }                                                                             \
+       return g_define_type_id__volatile;                                            \
+}
+
 G_END_DECLS
 
 #endif /* EV_DOCUMENT_H */