From 03001ff5cc0579788c72d0125e2599d73ad60ae9 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 14 Jan 2009 19:24:47 +0000 Subject: Add python bindings for libevince --- 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 ],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 +#include "pygobject.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +%% +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 + +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"); + } +} -- cgit v0.9.1