diff -Nru evince-3.1.2/debian/changelog evince-3.1.2/debian/changelog --- evince-3.1.2/debian/changelog 2011-07-15 05:03:48.000000000 -0700 +++ evince-3.1.2/debian/changelog 2011-08-10 09:59:50.000000000 -0700 @@ -1,3 +1,12 @@ +evince (3.1.2-0ubuntu4) oneiric; urgency=low + + * Add uTouch gesture support (LP: #823970) + - Supports pinch to zoom, rotate, and drag + - Added debian/patches/11_grip_gestures.patch + - Added build depends on libgrip-dev + + -- Chase Douglas Wed, 10 Aug 2011 09:57:37 -0700 + evince (3.1.2-0ubuntu3) oneiric; urgency=low * debian/evince.apport: use new apport MAC function instead of parsing diff -Nru evince-3.1.2/debian/control evince-3.1.2/debian/control --- evince-3.1.2/debian/control 2011-07-15 05:07:55.000000000 -0700 +++ evince-3.1.2/debian/control 2011-08-10 10:00:32.000000000 -0700 @@ -42,7 +42,8 @@ libgirepository1.0-dev (>= 0.9.12), gir1.2-glib-2.0, gir1.2-gtk-3.0, - gsettings-desktop-schemas-dev + gsettings-desktop-schemas-dev, + libgrip-dev (>=0.3.1) Standards-Version: 3.9.1 Homepage: http://www.gnome.org/projects/evince/ diff -Nru evince-3.1.2/debian/control.in evince-3.1.2/debian/control.in --- evince-3.1.2/debian/control.in 2011-06-28 09:05:11.000000000 -0700 +++ evince-3.1.2/debian/control.in 2011-08-10 06:44:18.000000000 -0700 @@ -37,7 +37,8 @@ libgirepository1.0-dev (>= 0.9.12), gir1.2-glib-2.0, gir1.2-gtk-3.0, - gsettings-desktop-schemas-dev + gsettings-desktop-schemas-dev, + libgrip-dev (>= 0.3.1) Standards-Version: 3.9.1 Homepage: http://www.gnome.org/projects/evince/ diff -Nru evince-3.1.2/debian/patches/11_grip_gestures.patch evince-3.1.2/debian/patches/11_grip_gestures.patch --- evince-3.1.2/debian/patches/11_grip_gestures.patch 1969-12-31 16:00:00.000000000 -0800 +++ evince-3.1.2/debian/patches/11_grip_gestures.patch 2011-08-10 09:26:02.000000000 -0700 @@ -0,0 +1,580 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -293,6 +293,17 @@ if test x$has_desktop_schemas = xyes; th + AC_DEFINE([HAVE_DESKTOP_SCHEMAS], [1], [Whether GSettings Desktop Schemas are available]) + fi + ++# **************** ++# uTouch (optional) ++# **************** ++GRIP_REQUIRED=0.3.0 ++ ++AC_ARG_WITH([libgrip], AC_HELP_STRING([--with-libgrip], [enable libgrip support]), [], [with_libgrip=no]) ++AS_IF([test "x$with_libgrip" = "xyes"],[ ++ PKG_CHECK_MODULES([LIBGRIP], [libgrip >= $GRIP_REQUIRED], ++ [AC_DEFINE(HAVE_LIBGRIP, 1, [libgrip support])]) ++]) ++ + dnl Debug mode + + AC_ARG_ENABLE([debug], +@@ -317,8 +328,8 @@ LIBDOCUMENT_LIBS="$LIBDOCUMENT_LIBS" + AC_SUBST(LIBDOCUMENT_CFLAGS) + AC_SUBST(LIBDOCUMENT_LIBS) + +-LIBVIEW_CFLAGS="$LIBVIEW_CFLAGS $GTKUNIXPRINT_CFLAGS $DEBUG_FLAGS" +-LIBVIEW_LIBS="$LIBVIEW_LIBS $GTKUNIXPRINT_LIBS -lm" ++LIBVIEW_CFLAGS="$LIBVIEW_CFLAGS $GTKUNIXPRINT_CFLAGS $LIBGRIP_CFLAGS $DEBUG_FLAGS" ++LIBVIEW_LIBS="$LIBVIEW_LIBS $GTKUNIXPRINT_LIBS $LIBGRIP_LIBS -lm" + AC_SUBST(LIBVIEW_CFLAGS) + AC_SUBST(LIBVIEW_LIBS) + +@@ -812,6 +823,7 @@ Configure summary: + Debug mode.........: $enable_debug + GObj. Introspection: $enable_introspection + Tests..............: $enable_tests ++ Libgrip gestures...: $with_libgrip + + PDF Backend........: $enable_pdf + PostScript Backend.: $enable_ps +--- a/libview/ev-view-private.h ++++ b/libview/ev-view-private.h +@@ -200,6 +200,18 @@ struct _EvView { + + /* Accessibility */ + gboolean a11y_enabled; ++ ++#ifdef HAVE_LIBGRIP ++ /* Gesture state */ ++ gboolean enable_gestures; ++ gdouble drag_start_x; ++ gdouble drag_start_y; ++ gdouble pinch_start_x; ++ gdouble pinch_start_y; ++ gdouble pinch_start_radius; ++ gdouble pinch_start_scale; ++ gdouble rotate_start; ++#endif + }; + + struct _EvViewClass { +--- a/libview/ev-view.c ++++ b/libview/ev-view.c +@@ -28,6 +28,10 @@ + #include + #include + ++#ifdef HAVE_LIBGRIP ++#include ++#endif ++ + #include "ev-mapping-list.h" + #include "ev-document-forms.h" + #include "ev-document-images.h" +@@ -73,6 +77,9 @@ enum { + PROP_VADJUSTMENT, + PROP_HSCROLL_POLICY, + PROP_VSCROLL_POLICY ++#ifdef HAVE_LIBGRIP ++ ,PROP_ENABLE_GESTURES ++#endif + }; + + static guint signals[N_SIGNALS]; +@@ -97,6 +104,11 @@ typedef struct { + #define ZOOM_IN_FACTOR 1.2 + #define ZOOM_OUT_FACTOR (1.0/ZOOM_IN_FACTOR) + ++#ifdef HAVE_LIBGRIP ++#define GESTURE_DRAG_VELOCITY 1.0 ++#define GESTURE_ROTATE_ANGLE 1.0 ++#endif ++ + #define SCROLL_TIME 150 + + /*** Scrolling ***/ +@@ -156,6 +168,16 @@ static void show_annotation_win + static void hide_annotation_windows (EvView *view, + gint page); + /*** GtkWidget implementation ***/ ++#ifdef HAVE_LIBGRIP ++static void ev_view_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *param_spec); ++static void ev_view_set_property (GObject *object, ++ guint prop_id, ++ const GValue *value, ++ GParamSpec *param_spec); ++#endif + static void ev_view_size_request_continuous_dual_page (EvView *view, + GtkRequisition *requisition); + static void ev_view_size_request_continuous (EvView *view, +@@ -294,6 +316,14 @@ static void ev_view_primary_clear_ + gpointer data); + static void ev_view_update_primary_selection (EvView *ev_view); + ++/*** Gestures ***/ ++#ifdef HAVE_LIBGRIP ++static void _utouch_ev_gesture_callback (GtkWidget *widget, ++ GripTimeType time_type, ++ GripGestureEvent *event, ++ gpointer user_data); ++#endif ++ + G_DEFINE_TYPE_WITH_CODE (EvView, ev_view, GTK_TYPE_CONTAINER, + G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL)) + +@@ -3035,6 +3065,123 @@ ev_view_synctex_backward_search (EvView + return FALSE; + } + ++#ifdef HAVE_LIBGRIP ++ ++static void ++_utouch_ev_gesture_callback (GtkWidget *widget, ++ GripTimeType time_type, ++ GripGestureEvent *event, ++ gpointer user_data) ++ { ++ EvView *view = EV_VIEW (widget); ++ ++ if (time_type == GRIP_TIME_START) { ++ switch (event->type) { ++ case GRIP_GESTURE_DRAG: { ++ GripEventGestureDrag *drag = (GripEventGestureDrag *)event; ++ ++ view->drag_start_x = drag->position_x; ++ view->drag_start_y = drag->position_y; ++ ++ break; ++ } ++ ++ case GRIP_GESTURE_PINCH: { ++ GripEventGesturePinch *pinch = (GripEventGesturePinch *)event; ++ ++ view->pinch_start_x = pinch->focus_x; ++ view->pinch_start_y = pinch->focus_y; ++ view->pinch_start_radius = pinch->radius; ++ view->pinch_start_scale = ev_document_model_get_scale(view->model); ++ break; ++ } ++ ++ case GRIP_GESTURE_ROTATE: { ++ GripEventGestureRotate *rotate = (GripEventGestureRotate *)event; ++ view->rotate_start = rotate->angle; ++ break; ++ } ++ ++ default: ++ break; ++ } ++ } else if (time_type == GRIP_TIME_END) { ++ switch (event->type) { ++ case GRIP_GESTURE_DRAG: { ++ GripEventGestureDrag *drag = (GripEventGestureDrag *)event; ++ ++ if (abs(drag->velocity_y) > abs(drag->velocity_x)) { ++ if (drag->velocity_y >= GESTURE_DRAG_VELOCITY && ++ drag->position_y > view->drag_start_y) { ++ ev_view_previous_page (view); ++ } else if (drag->velocity_y <= -GESTURE_DRAG_VELOCITY && ++ drag->position_y < view->drag_start_y) { ++ ev_view_next_page (view); ++ } ++ } else { ++ if (drag->velocity_x >= GESTURE_DRAG_VELOCITY && ++ drag->position_x > view->drag_start_x) { ++ ev_view_previous_page (view); ++ } else if (drag->velocity_x <= -GESTURE_DRAG_VELOCITY && ++ drag->position_x < view->drag_start_x) { ++ ev_view_next_page (view); ++ } ++ } ++ ++ break; ++ } ++ ++ default: ++ break; ++ } ++ } else { ++ switch (event->type) { ++ case GRIP_GESTURE_PINCH: { ++ GripEventGesturePinch *pinch = (GripEventGesturePinch *)event; ++ gdouble zoom_factor = pinch->radius / view->pinch_start_radius; ++ ++ view->pending_scroll = SCROLL_TO_KEEP_POSITION; ++ ev_document_model_set_scale(view->model, ++ view->pinch_start_scale * zoom_factor); ++ break; ++ ++ } ++ ++ case GRIP_GESTURE_DRAG: { ++ GripEventGestureDrag *drag = (GripEventGestureDrag *)event; ++ ++ gdouble delta_x = -drag->delta_x; ++ gdouble delta_y = -drag->delta_y; ++ ev_view_drag (view, delta_x, delta_y); ++ break; ++ } ++ ++ case GRIP_GESTURE_ROTATE: { ++ GripEventGestureRotate *rotate = (GripEventGestureRotate *)event; ++ gint rotation = ev_document_model_get_rotation (view->model); ++ gdouble cumulative_rotate = rotate->angle - view->rotate_start; ++ ++ if (cumulative_rotate >= GESTURE_ROTATE_ANGLE) { ++ ev_document_model_set_rotation (view->model, ++ rotation + 90); ++ view->rotate_start = rotate->angle; ++ } else if (cumulative_rotate <= -GESTURE_ROTATE_ANGLE) { ++ ev_document_model_set_rotation (view->model, ++ rotation - 90); ++ view->rotate_start = rotate->angle; ++ } ++ ++ break; ++ } ++ ++ default: ++ break; ++ } ++ } ++} ++ ++#endif ++ + /*** GtkWidget implementation ***/ + + static void +@@ -4660,6 +4807,11 @@ ev_view_get_property (GObject *objec + case PROP_VSCROLL_POLICY: + g_value_set_enum (value, view->vscroll_policy); + break; ++#ifdef HAVE_LIBGRIP ++ case PROP_ENABLE_GESTURES: ++ g_value_set_boolean (value, view->enable_gestures); ++ break; ++#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -4691,6 +4843,36 @@ ev_view_set_property (GObject *obje + view->vscroll_policy = g_value_get_enum (value); + gtk_widget_queue_resize (GTK_WIDGET (view)); + break; ++#ifdef HAVE_LIBGRIP ++ case PROP_ENABLE_GESTURES: ++ view->enable_gestures = g_value_get_boolean (value); ++ ++ grip_gesture_manager_register_window (grip_gesture_manager_get(), ++ GTK_WIDGET (view), ++ GRIP_GESTURE_PINCH, ++ GRIP_DEVICE_ALL, ++ 2, ++ _utouch_ev_gesture_callback, ++ NULL, NULL); ++ ++ grip_gesture_manager_register_window (grip_gesture_manager_get(), ++ GTK_WIDGET (view), ++ GRIP_GESTURE_DRAG, ++ GRIP_DEVICE_TOUCHSCREEN, ++ 2, ++ _utouch_ev_gesture_callback, ++ NULL, NULL); ++ ++ grip_gesture_manager_register_window (grip_gesture_manager_get(), ++ GTK_WIDGET (view), ++ GRIP_GESTURE_ROTATE, ++ GRIP_DEVICE_ALL, ++ 2, ++ _utouch_ev_gesture_callback, ++ NULL, NULL); ++ ++ break; ++#endif + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -4899,6 +5081,17 @@ ev_view_class_init (EvViewClass *class) + G_TYPE_NONE, 0, + G_TYPE_NONE); + ++#ifdef HAVE_LIBGRIP ++ g_object_class_install_property (object_class, ++ PROP_ENABLE_GESTURES, ++ g_param_spec_boolean ("enable-gestures", ++ "Enable gestures", ++ "Whether to enable gestures", ++ TRUE, ++ G_PARAM_WRITABLE | ++ G_PARAM_CONSTRUCT_ONLY)); ++#endif ++ + binding_set = gtk_binding_set_by_class (class); + + add_scroll_binding_keypad (binding_set, GDK_KEY_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE); +@@ -5069,8 +5262,21 @@ on_adjustment_value_changed (GtkAdjustme + view_update_range_and_current_page (view); + } + ++#ifdef HAVE_LIBGRIP + GtkWidget* +-ev_view_new (void) ++ev_view_new (gboolean enable_gestures) ++{ ++ GtkWidget *view; ++ ++ view = g_object_new (EV_TYPE_VIEW, ++ "enable-gestures", enable_gestures, ++ NULL); ++ ++ return view; ++} ++#else ++GtkWidget* ++ev_view_new () + { + GtkWidget *view; + +@@ -5078,6 +5284,7 @@ ev_view_new (void) + + return view; + } ++#endif + + static void + setup_caches (EvView *view) +@@ -5224,6 +5431,26 @@ ev_view_autoscroll_stop (EvView *view) + ev_view_handle_cursor_over_xy (view, x, y); + } + ++#ifdef HAVE_LIBGRIP ++void ++ev_view_drag (EvView *view, ++ gdouble x, ++ gdouble y) ++{ ++ gdouble value; ++ ++ value = gtk_adjustment_get_value (view->vadjustment); ++ value = CLAMP (value + y, 0, ++ gtk_adjustment_get_upper (view->vadjustment) - gtk_adjustment_get_page_size (view->vadjustment)); ++ gtk_adjustment_set_value (view->vadjustment, value); ++ ++ value = gtk_adjustment_get_value (view->hadjustment); ++ value = CLAMP (value + x, 0, ++ gtk_adjustment_get_upper (view->hadjustment) - gtk_adjustment_get_page_size (view->hadjustment)); ++ gtk_adjustment_set_value (view->hadjustment, value); ++} ++#endif ++ + static void + ev_view_document_changed_cb (EvDocumentModel *model, + GParamSpec *pspec, +@@ -5456,6 +5683,43 @@ ev_view_can_zoom_out (EvView *view) + return view->scale * ZOOM_OUT_FACTOR >= ev_document_model_get_min_scale (view->model); + } + ++#ifdef HAVE_LIBGRIP ++void ++ev_view_zoom_in_smooth (EvView *view, float factor) ++{ ++ gdouble scale; ++ ++ g_return_if_fail (view->sizing_mode == EV_SIZING_FREE); ++ ++ view->pending_scroll = SCROLL_TO_CENTER; ++ scale = ev_document_model_get_scale (view->model) * factor; ++ ev_document_model_set_scale (view->model, scale); ++} ++ ++void ++ev_view_zoom_in (EvView *view) ++{ ++ ev_view_zoom_in_smooth (view, ZOOM_IN_FACTOR); ++} ++ ++void ++ev_view_zoom_out_smooth (EvView *view, float factor) ++{ ++ gdouble scale; ++ ++ g_return_if_fail (view->sizing_mode == EV_SIZING_FREE); ++ ++ view->pending_scroll = SCROLL_TO_CENTER; ++ scale = ev_document_model_get_scale (view->model) * factor; ++ ev_document_model_set_scale (view->model, scale); ++} ++ ++void ++ev_view_zoom_out (EvView *view) ++{ ++ ev_view_zoom_out_smooth (view, ZOOM_OUT_FACTOR); ++} ++#else + void + ev_view_zoom_in (EvView *view) + { +@@ -5479,6 +5743,7 @@ ev_view_zoom_out (EvView *view) + scale = ev_document_model_get_scale (view->model) * ZOOM_OUT_FACTOR; + ev_document_model_set_scale (view->model, scale); + } ++#endif + + static double + zoom_for_size_fit_width (gdouble doc_width, +--- a/libview/ev-view.h ++++ b/libview/ev-view.h +@@ -46,7 +46,11 @@ typedef enum { + + GType ev_view_get_type (void) G_GNUC_CONST; + ++#ifdef HAVE_LIBGRIP ++GtkWidget* ev_view_new (gboolean enable_gestures); ++#else + GtkWidget* ev_view_new (void); ++#endif + void ev_view_set_model (EvView *view, + EvDocumentModel *model); + void ev_view_set_loading (EvView *view, +@@ -65,8 +69,16 @@ gboolean ev_view_get_has_selectio + /* Page size */ + gboolean ev_view_can_zoom_in (EvView *view); + void ev_view_zoom_in (EvView *view); ++#ifdef HAVE_LIBGRIP ++void ev_view_zoom_in_smooth (EvView *view, ++ float factor); ++#endif + gboolean ev_view_can_zoom_out (EvView *view); + void ev_view_zoom_out (EvView *view); ++#ifdef HAVE_LIBGRIP ++void ev_view_zoom_out_smooth (EvView *view, ++ float factor); ++#endif + + /* Find */ + void ev_view_find_next (EvView *view); +@@ -103,6 +115,13 @@ gboolean ev_view_get_page_extents + gint page, + GdkRectangle *page_area, + GtkBorder *border); ++ ++#ifdef HAVE_LIBGRIP ++void ev_view_drag (EvView *view, ++ gdouble x, ++ gdouble y); ++#endif ++ + /* Annotations */ + void ev_view_focus_annotation (EvView *view, + EvMapping *annot_mapping); +--- a/previewer/ev-previewer-window.c ++++ b/previewer/ev-previewer-window.c +@@ -607,7 +607,11 @@ ev_previewer_window_constructor (GType + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + ++#ifdef HAVE_LIBGRIP ++ window->view = EV_VIEW (ev_view_new (FALSE)); ++#else + window->view = EV_VIEW (ev_view_new ()); ++#endif + g_signal_connect_object (window->view, "focus_in_event", + G_CALLBACK (view_focus_changed), + window, 0); +--- a/shell/ev-application.c ++++ b/shell/ev-application.c +@@ -72,6 +72,10 @@ struct _EvApplication { + + gchar *filechooser_open_uri; + gchar *filechooser_save_uri; ++ ++#ifdef HAVE_LIBGRIP ++ gboolean gestures_enabled; ++#endif + }; + + struct _EvApplicationClass { +@@ -124,6 +128,20 @@ ev_application_get_instance (void) + return instance; + } + ++#ifdef HAVE_LIBGRIP ++gboolean ++ev_application_get_gestures_enabled (EvApplication *application) ++{ ++ return application->gestures_enabled; ++} ++ ++void ++ev_application_set_gestures_enabled (EvApplication *application, gboolean enabled) ++{ ++ application->gestures_enabled = enabled; ++} ++#endif ++ + /* Session */ + gboolean + ev_application_load_session (EvApplication *application) +--- a/shell/ev-application.h ++++ b/shell/ev-application.h +@@ -81,6 +81,10 @@ void ev_application_screensaver_disab + const gchar *ev_application_get_dot_dir (EvApplication *application, + gboolean create); + const gchar *ev_application_get_data_dir (EvApplication *application); ++#ifdef HAVE_LIBGRIP ++gboolean ev_application_get_gestures_enabled (EvApplication *application); ++void ev_application_set_gestures_enabled (EvApplication *application, gboolean enabled); ++#endif + + G_END_DECLS + +--- a/shell/ev-window.c ++++ b/shell/ev-window.c +@@ -7272,7 +7272,11 @@ ev_window_init (EvWindow *ev_window) + ev_window->priv->view_box); + gtk_widget_show (ev_window->priv->view_box); + ++#ifdef HAVE_LIBGRIP ++ ev_window->priv->view = ev_view_new (ev_application_get_gestures_enabled (EV_APP)); ++#else + ev_window->priv->view = ev_view_new (); ++#endif + ev_view_set_page_cache_size (EV_VIEW (ev_window->priv->view), PAGE_CACHE_SIZE); + ev_view_set_model (EV_VIEW (ev_window->priv->view), ev_window->priv->model); + +--- a/shell/main.c ++++ b/shell/main.c +@@ -58,6 +58,9 @@ static gboolean presentation_mode = FALS + static gboolean unlink_temp_file = FALSE; + static gchar *print_settings; + static const char **file_arguments = NULL; ++#ifdef HAVE_LIBGRIP ++static gboolean disable_gestures = FALSE; ++#endif + + + static gboolean +@@ -82,6 +85,9 @@ static const GOptionEntry goption_option + { "find", 'l', 0, G_OPTION_ARG_STRING, &ev_find_string, N_("The word or phrase to find in the document"), N_("STRING")}, + { "unlink-tempfile", 'u', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &unlink_temp_file, NULL, NULL }, + { "print-settings", 't', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, &print_settings, NULL, NULL }, ++#ifdef HAVE_LIBGRIP ++ { "disable-gestures", 'g', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &disable_gestures, NULL, NULL }, ++#endif + { "version", 0, G_OPTION_FLAG_NO_ARG | G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, option_version_cb, NULL, NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, N_("[FILEā€¦]") }, + { NULL } +@@ -312,6 +318,9 @@ main (int argc, char *argv[]) + #endif /* WITH_SMCLIENT && GDK_WINDOWING_X11 */ + + ev_application_load_session (EV_APP); ++#ifdef HAVE_LIBGRIP ++ ev_application_set_gestures_enabled (EV_APP, !disable_gestures); ++#endif + load_files (file_arguments); + + /* Change directory so we don't prevent unmounting in case the initial cwd diff -Nru evince-3.1.2/debian/patches/series evince-3.1.2/debian/patches/series --- evince-3.1.2/debian/patches/series 2011-06-28 09:05:11.000000000 -0700 +++ evince-3.1.2/debian/patches/series 2011-08-10 09:28:12.000000000 -0700 @@ -3,3 +3,4 @@ 04_gold.patch 05_library-path.patch 10_remove_nodisplay.patch +11_grip_gestures.patch diff -Nru evince-3.1.2/debian/rules evince-3.1.2/debian/rules --- evince-3.1.2/debian/rules 2011-06-28 09:05:11.000000000 -0700 +++ evince-3.1.2/debian/rules 2011-08-10 06:44:18.000000000 -0700 @@ -23,7 +23,8 @@ --enable-dvi \ --enable-t1lib \ --enable-comics \ - --enable-introspection=yes + --enable-introspection=yes \ + --with-libgrip=yes DEB_DH_MAKESHLIBS_ARGS += --exclude=libevince-properties-page.so \ -V'libevince3-3 (>= 3.0.0)'