Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@sugarlabs.org>2009-01-14 19:24:47 (GMT)
committer Tomeu Vizoso <tomeu@sugarlabs.org>2009-01-14 19:24:47 (GMT)
commit03001ff5cc0579788c72d0125e2599d73ad60ae9 (patch)
treeecbccc0c36bf962964628c45e5ce88cfc17bd04f
parent9c7bad43011ee2f9a8e0837bd2372dea3b710244 (diff)
Add python bindings for libevinceHEADmaster
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac20
-rw-r--r--m4/python.m462
-rw-r--r--python/Makefile.am38
-rw-r--r--python/__init__.py1
-rw-r--r--python/evince.defs711
-rw-r--r--python/evince.override77
-rw-r--r--python/evincemodule.c28
8 files changed, 941 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index 9badb96..ff7f3cc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,6 +13,10 @@ if ENABLE_THUMBNAILER
SUBDIRS += thumbnailer
endif
+if BUILD_EMBED_LIB
+SUBDIRS += python
+endif
+
# Applications
intltool_extra = intltool-extract.in intltool-merge.in intltool-update.in
diff --git a/configure.ac b/configure.ac
index 4eb5e26..a26dece 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,6 +4,9 @@ AC_PREREQ(2.57)
AC_INIT([Evince],[2.25.4],[http://bugzilla.gnome.org/enter_bug.cgi?product=evince],[evince])
AM_INIT_AUTOMAKE([1.9 dist-bzip2 no-dist-gzip])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_SRCDIR([configure.ac])
+
EV_API_VERSION=2.20
AC_SUBST(EV_API_VERSION)
@@ -203,6 +206,22 @@ AC_ARG_ENABLE(embed,
if test "x${enableval}" = "xyes"; then
AC_DEFINE([BUILD_EMBED],[1],[Build embed lib.])
+
+ AM_PATH_PYTHON
+ AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
+
+ dnl Check for pygtk
+ AC_MSG_CHECKING(for pygtk-2.0)
+ PKG_CHECK_MODULES([PYGTK], [pygtk-2.0], [], [AC_MSG_ERROR([Pygtk-2.0 needed])])
+
+ dnl Find pygtk codegen
+ AC_MSG_CHECKING(for pygtk codegen)
+ PYGTK_CODEGEN="$PYTHON `$PKG_CONFIG --variable=codegendir pygtk-2.0`/codegen.py"
+ AC_SUBST(PYGTK_CODEGEN)
+ AC_MSG_RESULT($PYGTK_CODEGEN)
+
+ PYGTK_DEFSDIR=`$PKG_CONFIG --variable=defsdir pygtk-2.0`
+ AC_SUBST(PYGTK_DEFSDIR)
fi
AM_CONDITIONAL(BUILD_EMBED_LIB, test x$BUILD_EMBED_LIB = "xyes")
@@ -483,6 +502,7 @@ libdocument/Makefile
Makefile
po/Makefile.in
properties/Makefile
+python/Makefile
shell/Makefile
test/Makefile
thumbnailer/Makefile
diff --git a/m4/python.m4 b/m4/python.m4
new file mode 100644
index 0000000..e1c5266
--- /dev/null
+++ b/m4/python.m4
@@ -0,0 +1,62 @@
+## this one is commonly used with AM_PATH_PYTHONDIR ...
+dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
+dnl Check if a module containing a given symbol is visible to python.
+AC_DEFUN([AM_CHECK_PYMOD],
+[AC_REQUIRE([AM_PATH_PYTHON])
+py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'`
+AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1)
+AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
+ifelse([$2],[], [prog="
+import sys
+try:
+ import $1
+except ImportError:
+ sys.exit(1)
+except:
+ sys.exit(0)
+sys.exit(0)"], [prog="
+import $1
+$1.$2"])
+if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
+ then
+ eval "py_cv_mod_$py_mod_var=yes"
+ else
+ eval "py_cv_mod_$py_mod_var=no"
+ fi
+])
+py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
+if test "x$py_val" != xno; then
+ AC_MSG_RESULT(yes)
+ ifelse([$3], [],, [$3
+])dnl
+else
+ AC_MSG_RESULT(no)
+ ifelse([$4], [],, [$4
+])dnl
+fi
+])
+
+dnl a macro to check for ability to create python extensions
+dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
+dnl function also defines PYTHON_INCLUDES
+AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
+[AC_REQUIRE([AM_PATH_PYTHON])
+AC_MSG_CHECKING(for headers required to compile python extensions)
+dnl deduce PYTHON_INCLUDES
+py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+if test "$py_prefix" != "$py_exec_prefix"; then
+ PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+fi
+AC_SUBST(PYTHON_INCLUDES)
+dnl check if the headers exist:
+save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+AC_TRY_CPP([#include <Python.h>],dnl
+[AC_MSG_RESULT(found)
+$1],dnl
+[AC_MSG_RESULT(not found)
+$2])
+CPPFLAGS="$save_CPPFLAGS"
+])
diff --git a/python/Makefile.am b/python/Makefile.am
new file mode 100644
index 0000000..64d5743
--- /dev/null
+++ b/python/Makefile.am
@@ -0,0 +1,38 @@
+INCLUDES = \
+ $(PYTHON_INCLUDES) \
+ $(PYTHON_CFLAGS) \
+ $(PYGTK_CFLAGS) \
+ $(FRONTEND_CFLAGS) \
+ -I$(top_srcdir)/shell \
+ -I$(top_srcdir)/backend \
+ -I$(top_srcdir)/libdocument
+
+defsdir = $(datadir)/pygtk/2.0/defs
+defs_DATA = evince.defs
+
+pkgpythondir = $(pyexecdir)/evince
+pkgpyexecdir = $(pyexecdir)/evince
+
+evincedir = $(pkgpythondir)
+evince_PYTHON = __init__.py
+
+# evince module
+pkgpyexec_LTLIBRARIES = evince.la
+evince_la_LDFLAGS = -module -avoid-version
+evince_la_LIBADD = $(PYGTK_LIBS) $(top_builddir)/shell/libevince-@EV_API_VERSION@.la
+evince_la_SOURCES = evincemodule.c
+nodist_evince_la_SOURCES = evince.c
+evince.c: evince.defs evince.override
+CLEANFILES = evince.c
+EXTRA_DIST = evince.override evince.defs
+
+.defs.c:
+ (cd $(srcdir)\
+ && $(PYGTK_CODEGEN) \
+ --register $(PYGTK_DEFSDIR)/gdk-types.defs \
+ --register $(PYGTK_DEFSDIR)/gtk-types.defs \
+ --override $*.override \
+ --prefix py$* $*.defs) > gen-$*.c \
+ && cp gen-$*.c $*.c \
+ && rm -f gen-$*.c
+
diff --git a/python/__init__.py b/python/__init__.py
new file mode 100644
index 0000000..947d2de
--- /dev/null
+++ b/python/__init__.py
@@ -0,0 +1 @@
+from evince import *
diff --git a/python/evince.defs b/python/evince.defs
new file mode 100644
index 0000000..3329431
--- /dev/null
+++ b/python/evince.defs
@@ -0,0 +1,711 @@
+;; -*- scheme -*-
+; object definitions ...
+;; Enumerations and flags ...
+
+(define-enum SizingMode
+ (in-module "Ev")
+ (c-name "EvSizingMode")
+ (gtype-id "EV_TYPE_SIZING_MODE")
+ (values
+ '("best-fit" "EV_SIZING_BEST_FIT")
+ '("fit-width" "EV_SIZING_FIT_WIDTH")
+ '("free" "EV_SIZING_FREE")
+ )
+)
+
+
+;; From ev-view.h
+
+(define-object View
+ (in-module "Ev")
+ (c-name "EvView")
+ (parent "GtkWidget")
+ (gtype-id "EV_TYPE_VIEW")
+)
+
+(define-function ev_view_get_type
+ (c-name "ev_view_get_type")
+ (return-type "GType")
+)
+
+(define-function ev_sizing_mode_get_type
+ (c-name "ev_sizing_mode_get_type")
+ (return-type "GType")
+)
+
+(define-function ev_view_new
+ (c-name "ev_view_new")
+ (is-constructor-of "EvView")
+ (return-type "GtkWidget*")
+)
+
+(define-method set_document
+ (of-object "EvView")
+ (c-name "ev_view_set_document")
+ (return-type "none")
+ (parameters
+ '("EvDocument*" "document")
+ )
+)
+
+(define-method set_loading
+ (of-object "EvView")
+ (c-name "ev_view_set_loading")
+ (return-type "none")
+ (parameters
+ '("gboolean" "loading")
+ )
+)
+
+(define-method copy
+ (of-object "EvView")
+ (c-name "ev_view_copy")
+ (return-type "none")
+)
+
+;; XXX copy_link_address needs EvLinkAction
+
+(define-method select_all
+ (of-object "EvView")
+ (c-name "ev_view_select_all")
+ (return-type "none")
+)
+
+(define-method get_has_selection
+ (of-object "EvView")
+ (c-name "ev_view_get_has_selection")
+ (return-type "gboolean")
+)
+
+(define-method get_continuous
+ (of-object "EvView")
+ (c-name "ev_view_get_continuous")
+ (return-type "gboolean")
+)
+
+(define-method set_continuous
+ (of-object "EvView")
+ (c-name "ev_view_set_continuous")
+ (return-type "none")
+ (parameters
+ '("gboolean" "continuous")
+ )
+)
+
+(define-method get_dual_page
+ (of-object "EvView")
+ (c-name "ev_view_get_dual_page")
+ (return-type "gboolean")
+)
+
+(define-method set_dual_page
+ (of-object "EvView")
+ (c-name "ev_view_set_dual_page")
+ (return-type "none")
+ (parameters
+ '("gboolean" "dual_page")
+ )
+)
+
+(define-method set_fullscreen
+ (of-object "EvView")
+ (c-name "ev_view_set_fullscreen")
+ (return-type "none")
+ (parameters
+ '("gboolean" "fullscreen")
+ )
+)
+
+(define-method get_fullscreen
+ (of-object "EvView")
+ (c-name "ev_view_get_fullscreen")
+ (return-type "gboolean")
+)
+
+(define-method set_presentation
+ (of-object "EvView")
+ (c-name "ev_view_set_presentation")
+ (return-type "none")
+ (parameters
+ '("gboolean" "presentation")
+ )
+)
+
+(define-method get_presentation
+ (of-object "EvView")
+ (c-name "ev_view_get_presentation")
+ (return-type "gboolean")
+)
+
+(define-method set_sizing_mode
+ (of-object "EvView")
+ (c-name "ev_view_set_sizing_mode")
+ (return-type "none")
+ (parameters
+ '("EvSizingMode" "mode")
+ )
+)
+
+(define-method get_sizing_mode
+ (of-object "EvView")
+ (c-name "ev_view_get_sizing_mode")
+ (return-type "EvSizingMode")
+)
+
+(define-method can_zoom_in
+ (of-object "EvView")
+ (c-name "ev_view_can_zoom_in")
+ (return-type "gboolean")
+)
+
+(define-method zoom_in
+ (of-object "EvView")
+ (c-name "ev_view_zoom_in")
+ (return-type "none")
+)
+
+(define-method can_zoom_out
+ (of-object "EvView")
+ (c-name "ev_view_can_zoom_out")
+ (return-type "gboolean")
+)
+
+(define-method zoom_out
+ (of-object "EvView")
+ (c-name "ev_view_zoom_out")
+ (return-type "none")
+)
+
+(define-method set_zoom
+ (of-object "EvView")
+ (c-name "ev_view_set_zoom")
+ (return-type "none")
+ (parameters
+ '("double" "factor")
+ '("gboolean" "relative")
+ )
+)
+
+(define-method get_zoom
+ (of-object "EvView")
+ (c-name "ev_view_get_zoom")
+ (return-type "double")
+)
+
+(define-method set_screen_dpi
+ (of-object "EvView")
+ (c-name "ev_view_set_screen_dpi")
+ (return-type "none")
+ (parameters
+ '("double" "dpi")
+ )
+)
+
+(define-method set_zoom_for_size
+ (of-object "EvView")
+ (c-name "ev_view_set_zoom_for_size")
+ (return-type "none")
+ (parameters
+ '("int" "width")
+ '("int" "height")
+ '("int" "vsb_width")
+ '("int" "hsb_height")
+ )
+)
+
+(define-method rotate_left
+ (of-object "EvView")
+ (c-name "ev_view_rotate_left")
+ (return-type "none")
+)
+
+(define-method rotate_right
+ (of-object "EvView")
+ (c-name "ev_view_rotate_right")
+ (return-type "none")
+)
+
+(define-method set_rotation
+ (of-object "EvView")
+ (c-name "ev_view_set_rotation")
+ (return-type "none")
+ (parameters
+ '("int" "rotation")
+ )
+)
+
+(define-method get_rotation
+ (of-object "EvView")
+ (c-name "ev_view_get_rotation")
+ (return-type "int")
+)
+
+(define-method find_next
+ (of-object "EvView")
+ (c-name "ev_view_find_next")
+ (return-type "none")
+)
+
+(define-method find_previous
+ (of-object "EvView")
+ (c-name "ev_view_find_previous")
+ (return-type "none")
+)
+
+(define-method find_search_changed
+ (of-object "EvView")
+ (c-name "ev_view_find_search_changed")
+ (return-type "none")
+)
+
+(define-method find_set_highlight_search
+ (of-object "EvView")
+ (c-name "ev_view_find_set_highlight_search")
+ (return-type "none")
+ (parameters
+ '("gboolean" "value")
+ )
+)
+
+(define-method find_changed
+ (of-object "EvView")
+ (c-name "ev_view_find_changed")
+ (return-type "none")
+ (parameters
+ '("GList**" "results")
+ '("gint" "page")
+ )
+)
+
+(define-method find_cancel
+ (of-object "EvView")
+ (c-name "ev_view_find_cancel")
+ (return-type "none")
+)
+
+(define-method hide_cursor
+ (of-object "EvView")
+ (c-name "ev_view_hide_cursor")
+ (return-type "none")
+)
+
+(define-method show_cursor
+ (of-object "EvView")
+ (c-name "ev_view_show_cursor")
+ (return-type "none")
+)
+
+(define-method scroll
+ (of-object "EvView")
+ (c-name "ev_view_scroll")
+ (return-type "none")
+ (parameters
+ '("GtkScrollType" "scroll")
+ '("gboolean" "horizontal")
+ )
+)
+
+;; XXX handle_link needs EvLink
+
+(define-method next_page
+ (of-object "EvView")
+ (c-name "ev_view_next_page")
+ (return-type "gboolean")
+)
+
+(define-method previous_page
+ (of-object "EvView")
+ (c-name "ev_view_previous_page")
+ (return-type "gboolean")
+)
+
+;; XXX page_label_from_dest needs EvLinkDest
+
+(define-method update_view_size
+ (of-object "EvView")
+ (c-name "ev_view_update_view_size")
+ (return-type "none")
+ (parameters
+ '("GtkScrolledWindow*" "scrolled_window")
+ )
+)
+
+(define-method autoscroll_start
+ (of-object "EvView")
+ (c-name "ev_view_autoscroll_start")
+ (return-type "none")
+)
+
+(define-method autoscroll_stop
+ (of-object "EvView")
+ (c-name "ev_view_autoscroll_stop")
+ (return-type "none")
+)
+
+;; From ev-document.h
+
+(define-interface Document
+ (in-module "Ev")
+ (c-name "EvDocument")
+ (gtype-id "EV_TYPE_DOCUMENT")
+ (prerequisite "GObject")
+)
+
+(define-function ev_document_get_type
+ (c-name "ev_document_get_type")
+ (return-type "GType")
+)
+
+;; XXX missing mutex functions
+
+(define-method get_info
+ (of-object "EvDocument")
+ (c-name "ev_document_get_info")
+ (return-type "EvDocumentInfo*")
+)
+
+(define-method load
+ (of-object "EvDocument")
+ (c-name "ev_document_load")
+ (return-type "gboolean")
+ (parameters
+ '("const-char*" "uri")
+ '("GError**" "error")
+ )
+)
+
+;; XXX missing ev_document_save
+
+(define-method get_n_pages
+ (of-object "EvDocument")
+ (c-name "ev_document_get_n_pages")
+ (return-type "int")
+)
+
+;; XXX missing get_page, get_page_size, get_page_label,
+;; has_attachments, get_attachments, render
+
+;; From ev-document-factory.h
+
+(define-function factory_get_document
+ (c-name "ev_document_factory_get_document")
+ (return-type "EvDocument*")
+ (parameters
+ '("const-char*" "uri")
+ '("GError**" "error")
+ )
+)
+
+;; From ev-document-find.h
+
+(define-interface DocumentFind
+ (in-module "Ev")
+ (c-name "EvDocumentFind")
+ (gtype-id "EV_TYPE_DOCUMENT_FIND")
+ (prerequisite "GObject")
+)
+
+(define-function ev_document_find_get_type
+ (c-name "ev_document_find_get_type")
+ (return-type "GType")
+)
+
+(define-method find_text
+ (of-object "EvDocumentFind")
+ (c-name "ev_document_find_find_text")
+ (return-type "none")
+ (parameters
+ '("EvPage*" "page")
+ '("const-char*" "search_string")
+ '("gboolean" "case_sensitive")
+ )
+)
+
+;; From ev-page.h
+
+(define-interface Page
+ (in-module "Ev")
+ (c-name "EvPage")
+ (gtype-id "EV_TYPE_PAGE")
+ (prerequisite "GObject")
+)
+
+(define-function ev_page_get_type
+ (c-name "ev_page_get_type")
+ (return-type "GType")
+)
+
+;; XXX missing ev_page_new
+
+;; From ev-page-cache.h
+;; XXX missing lots of methods on PageCache
+
+(define-object PageCache
+ (in-module "Ev")
+ (c-name "EvPageCache")
+ (parent "GObject")
+ (gtype-id "EV_TYPE_PAGE_CACHE")
+)
+
+(define-method get_current_page
+ (of-object "EvPageCache")
+ (c-name "ev_page_cache_get_current_page")
+ (return-type "int")
+)
+
+(define-method set_current_page
+ (of-object "EvPageCache")
+ (c-name "ev_page_cache_set_current_page")
+ (return-type "none")
+ (parameters
+ '("int" "page")
+ )
+)
+
+;; XXX we stick this inside EvDocument??
+(define-method get_page_cache
+ (of-object "EvDocument")
+ (c-name "ev_page_cache_get")
+ (return-type "EvPageCache*")
+)
+
+;; From ev-document-info.c
+
+(define-enum DocumentLayout
+ (in-module "Ev")
+ (c-name "EvDocumentLayout")
+ (gtype-id "EV_TYPE_DOCUMENT_LAYOUT")
+ (values
+ '("single-page" "EV_DOCUMENT_LAYOUT_SINGLE_PAGE")
+ '("one-column" "EV_DOCUMENT_LAYOUT_ONE_COLUMN")
+ '("two-column-left" "EV_DOCUMENT_LAYOUT_TWO_COLUMN_LEFT")
+ '("two-column-right" "EV_DOCUMENT_LAYOUT_TWO_COLUMN_RIGHT")
+ '("two-page-left" "EV_DOCUMENT_LAYOUT_TWO_PAGE_LEFT")
+ '("two-page-right" "EV_DOCUMENT_LAYOUT_TWO_PAGE_RIGHT")
+ )
+)
+
+(define-enum DocumentMode
+ (in-module "Ev")
+ (c-name "EvDocumentMode")
+ (gtype-id "EV_TYPE_DOCUMENT_MODE")
+ (values
+ '("none" "EV_DOCUMENT_MODE_NONE")
+ '("use-oc" "EV_DOCUMENT_MODE_USE_OC")
+ '("use-thumbs" "EV_DOCUMENT_MODE_USE_THUMBS")
+ '("full-screen" "EV_DOCUMENT_MODE_FULL_SCREEN")
+ '("use-attachments" "EV_DOCUMENT_MODE_USE_ATTACHMENTS")
+ '("presentation" "EV_DOCUMENT_MODE_PRESENTATION")
+ )
+)
+
+(define-enum DocumentUIHints
+ (in-module "Ev")
+ (c-name "EvDocumentUIHints")
+ (gtype-id "EV_TYPE_DOCUMENT_UI_HINTS")
+ (values
+ '("hide-toolbar" "EV_DOCUMENT_UI_HINT_HIDE_TOOLBAR")
+ '("hide-menubar" "EV_DOCUMENT_UI_HINT_HIDE_MENUBAR")
+ '("hide-windowui" "EV_DOCUMENT_UI_HINT_HIDE_WINDOWUI")
+ '("fit-window" "EV_DOCUMENT_UI_HINT_FIT_WINDOW")
+ '("center-window" "EV_DOCUMENT_UI_HINT_CENTER_WINDOW")
+ '("display-doc-title" "EV_DOCUMENT_UI_HINT_DISPLAY_DOC_TITLE")
+ '("direction-rtl" "EV_DOCUMENT_UI_HINT_DIRECTION_RTL")
+ )
+)
+
+(define-enum DocumentPermissions
+ (in-module "Ev")
+ (c-name "EvDocumentPermissions")
+ (gtype-id "EV_TYPE_DOCUMENT_PERMISSIONS")
+ (values
+ '("ok-to-print" "EV_DOCUMENT_PERMISSIONS_OK_TO_PRINT")
+ '("ok-to-modify" "EV_DOCUMENT_PERMISSIONS_OK_TO_MODIFY")
+ '("ok-to-copy" "EV_DOCUMENT_PERMISSIONS_OK_TO_COPY")
+ '("ok-to-add-notes" "EV_DOCUMENT_PERMISSIONS_OK_TO_ADD_NOTES")
+ '("full" "EV_DOCUMENT_PERMISSIONS_FULL")
+ )
+)
+
+(define-enum DocumentInfoFields
+ (in-module "Ev")
+ (c-name "EvDocumentInfoFields")
+ (gtype-id "EV_TYPE_DOCUMENT_INFO_FIELDS")
+ (values
+ '("title" "EV_DOCUMENT_INFO_TITLE")
+ '("format" "EV_DOCUMENT_INFO_FORMAT")
+ '("author" "EV_DOCUMENT_INFO_AUTHOR")
+ '("subject" "EV_DOCUMENT_INFO_SUBJECT")
+ '("keywords" "EV_DOCUMENT_INFO_KEYWORDS")
+ '("layout" "EV_DOCUMENT_INFO_LAYOUT")
+ '("creator" "EV_DOCUMENT_INFO_CREATOR")
+ '("producer" "EV_DOCUMENT_INFO_PRODUCER")
+ '("creation-date" "EV_DOCUMENT_INFO_CREATION_DATE")
+ '("mod-date" "EV_DOCUMENT_INFO_MOD_DATE")
+ '("linearized" "EV_DOCUMENT_INFO_LINEARIZED")
+ '("start-mode" "EV_DOCUMENT_INFO_START_MODE")
+ '("ui-hints" "EV_DOCUMENT_INFO_UI_HINTS")
+ '("permissions" "EV_DOCUMENT_INFO_PERMISSIONS")
+ '("n-pages" "EV_DOCUMENT_INFO_N_PAGES")
+ '("security" "EV_DOCUMENT_INFO_SECURITY")
+ )
+)
+
+
+;; From ev-document-info.h
+
+(define-boxed DocumentInfo
+ (in-module "Ev")
+ (c-name "EvDocumentInfo")
+ (gtype-id "EV_TYPE_DOCUMENT_INFO")
+ (copy-func "ev_document_info_copy")
+ (release-func "ev_document_info_free")
+ (fields
+ '("char*" "title")
+ '("char*" "format")
+ '("char*" "author")
+ '("char*" "subject")
+ '("char*" "keywords")
+ '("char*" "creator")
+ '("char*" "producer")
+ '("char*" "linearized")
+ '("char*" "security")
+ '("GTime" "creation_date")
+ '("GTime" "modified_date")
+ '("EvDocumentLayout" "layout")
+ '("EvDocumentMode" "mode")
+ '("guint" "ui_hints")
+ '("guint" "permissions")
+ '("int" "n_pages")
+ '("double" "paper_height")
+ '("double" "paper_width")
+ '("guint" "fields_mask")
+ )
+)
+
+;; XXX missing get_type, _copy, _free
+
+;; From ev-jobs.h
+
+(define-object Job
+ (in-module "Ev")
+ (c-name "EvJob")
+ (gtype-id "EV_TYPE_JOB")
+ (parent "GObject")
+)
+
+(define-function ev_job_get_type
+ (c-name "ev_job_get_type")
+ (return-type "GType")
+)
+
+(define-method run
+ (of-object "EvJob")
+ (c-name "ev_job_run")
+ (return-type "gboolean")
+)
+
+(define-method cancel
+ (of-object "EvJob")
+ (c-name "ev_job_cancel")
+ (return-type "none")
+)
+
+(define-method succeeded
+ (of-object "EvJob")
+ (c-name "ev_job_succeeded")
+ (return-type "none")
+)
+
+(define-method is_finished
+ (of-object "EvJob")
+ (c-name "ev_job_is_finished")
+ (return-type "gboolean")
+)
+
+(define-method is_failed
+ (of-object "EvJob")
+ (c-name "ev_job_is_failed")
+ (return-type "gboolean")
+)
+
+(define-object JobFind
+ (in-module "Ev")
+ (c-name "EvJobFind")
+ (gtype-id "EV_TYPE_JOB_FIND")
+ (parent "EvJob")
+)
+
+(define-function ev_job_find_get_type
+ (c-name "ev_job_find_get_type")
+ (return-type "GType")
+)
+
+(define-function ev_job_find_new
+ (c-name "ev_job_find_new")
+ (is-constructor-of "EvJobFind")
+ (return-type "EvJob*")
+)
+
+(define-method get_n_results
+ (of-object "EvJobFind")
+ (c-name "ev_job_find_get_n_results")
+ (return-type "gint")
+ (parameters
+ '("gint" "pages")
+ )
+)
+
+(define-method get_progress
+ (of-object "EvJobFind")
+ (c-name "ev_job_find_get_progress")
+ (return-type "gdouble")
+)
+
+(define-method has_results
+ (of-object "EvJobFind")
+ (c-name "ev_job_find_has_results")
+ (return-type "gboolean")
+)
+
+;; XXX many missing methods
+
+;; From ev-job-scheduler.h
+
+(define-enum JobPriority
+ (in-module "Ev")
+ (c-name "EvJobPriority")
+ (gtype-id "EV_TYPE_JOB_PRIORITY")
+ (values
+ '("urgent" "EV_JOB_PRIORITY_URGENT")
+ '("high" "EV_JOB_PRIORITY_HIGH")
+ '("low" "EV_JOB_PRIORITY_LOW")
+ '("none" "EV_JOB_PRIORITY_NONE")
+ '("n_priorities" "EV_JOB_N_PRIORITIES")
+ )
+)
+
+(define-function job_scheduler_push_job
+ (c-name "ev_job_scheduler_push_job")
+ (return-type "none")
+ (parameters
+ '("EvJob*" "job")
+ '("EvJobPriority" "priority")
+ )
+)
+
+(define-function job_scheduler_update_job
+ (c-name "ev_job_scheduler_update_job")
+ (return-type "none")
+ (parameters
+ '("EvJob*" "job")
+ '("EvJobPriority" "priority")
+ )
+)
+
+;; From embed.c
+
+(define-function evince_embed_init
+ (c-name "evince_embed_init")
+ (return-type "none")
+)
diff --git a/python/evince.override b/python/evince.override
new file mode 100644
index 0000000..26eae34
--- /dev/null
+++ b/python/evince.override
@@ -0,0 +1,77 @@
+/* -*- Mode: C; c-basic-offset: 4 -*- */
+%%
+headers
+#include <Python.h>
+#include "pygobject.h"
+#include <pygtk/pygtk.h>
+
+#include <ev-view.h>
+#include <ev-document-find.h>
+#include <ev-document-factory.h>
+#include <ev-document.h>
+#include <ev-page-cache.h>
+#include <ev-jobs.h>
+#include <ev-job-scheduler.h>
+
+%%
+modulename ev
+%%
+import gobject.GObject as PyGObject_Type
+import gtk.Widget as PyGtkWidget_Type
+import gtk.ScrolledWindow as PyGtkScrolledWindow_Type
+%%
+override ev_view_find_changed kwargs
+/* This function usually takes a GList of search results and hence must be
+ * wrapped manually. In our override, we modify it to take the corresponding
+ * job to avoid having to unpack/repack lists.
+ */
+static PyObject *
+_wrap_ev_view_find_changed(PyGObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = { "job", "page", NULL };
+ PyGObject *job;
+ int page;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!i:EvView.find_changed",
+ kwlist, &PyEvJobFind_Type, &job, &page))
+ return NULL;
+
+ ev_view_find_changed(EV_VIEW(self->obj),
+ ev_job_find_get_results(EV_JOB_FIND(job->obj)),
+ page);
+
+ Py_RETURN_NONE;
+}
+%%
+override ev_job_find_new kwargs
+/*
+ * We wrap this here because the object takes an EvDocument gpointer as a
+ * construction property, and you can't do gpointers from python.
+ * We can't make the property be a GObject parameter because EV_DOCUMENT_TYPE
+ * is an interface and not a G_OBJECT type.
+ */
+static int
+_wrap_ev_job_find_new(PyGObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = { "document", "start_page", "n_pages", "text",
+ "case_sensitive", NULL };
+ PyGObject *document;
+ gint start_page, n_pages;
+ const gchar *text;
+ gboolean case_sensitive;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!iizi:EvJobFind.__init__",
+ kwlist, &PyEvDocument_Type, &document, &start_page, &n_pages,
+ &text, &case_sensitive))
+ return -1;
+
+ pygobject_construct(self, "document", EV_DOCUMENT(document->obj),
+ "start_page", start_page, "n_pages", n_pages, "text", text,
+ "case_sensitive", case_sensitive, NULL);
+ if (!self->obj) {
+ PyErr_SetString(PyExc_RuntimeError, "could not create JobFind object");
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/python/evincemodule.c b/python/evincemodule.c
new file mode 100644
index 0000000..758d396
--- /dev/null
+++ b/python/evincemodule.c
@@ -0,0 +1,28 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* include this first, before NO_IMPORT_PYGOBJECT is defined */
+#include <pygobject.h>
+
+void pyevince_register_classes (PyObject *d);
+
+extern PyMethodDef pyevince_functions[];
+
+DL_EXPORT(void)
+initevince(void)
+{
+ PyObject *m, *d;
+
+ init_pygobject ();
+
+ m = Py_InitModule ("evince", pyevince_functions);
+ d = PyModule_GetDict (m);
+
+ pyevince_register_classes (d);
+ pyevince_add_constants(m, "EV_");
+
+ if (PyErr_Occurred ()) {
+ Py_FatalError ("can't initialise module evince");
+ }
+}