[evince/abderrahim/dual-rtl] Add right to left mode in dual mode



commit cc00ea42fc50923503268862b388a813aa31f06f
Author: Tomo Kazahaya <tomonacci gmail com>
Date:   Tue Aug 15 09:46:10 2017 -0400

    Add right to left mode in dual mode

 data/org.gnome.Evince.gschema.xml |  3 ++
 libview/ev-document-model.c       | 40 ++++++++++++++++++++
 libview/ev-document-model.h       |  3 ++
 libview/ev-view-private.h         |  2 +
 libview/ev-view.c                 | 79 ++++++++++++++++++++++++++-------------
 shell/ev-window.c                 | 47 +++++++++++++++++++++++
 shell/evince-menus.ui             |  4 ++
 7 files changed, 152 insertions(+), 26 deletions(-)
---
diff --git a/data/org.gnome.Evince.gschema.xml b/data/org.gnome.Evince.gschema.xml
index 604eb48b..c3c42e5d 100644
--- a/data/org.gnome.Evince.gschema.xml
+++ b/data/org.gnome.Evince.gschema.xml
@@ -74,6 +74,9 @@
     <key name="dual-page-odd-left" type="b">
       <default>false</default>
     </key>
+    <key name="dual-page-rtl" type="b">
+      <default>false</default>
+    </key>
     <key name="fullscreen" type="b">
       <default>false</default>
     </key>
diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c
index 0576f6f5..78f6c2f2 100644
--- a/libview/ev-document-model.c
+++ b/libview/ev-document-model.c
@@ -39,6 +39,7 @@ struct _EvDocumentModel
        guint continuous : 1;
        guint dual_page  : 1;
        guint dual_page_odd_left : 1;
+       guint dual_page_rtl : 1;
        guint fullscreen : 1;
        guint inverted_colors : 1;
 
@@ -57,6 +58,7 @@ enum {
        PROP_CONTINUOUS,
        PROP_DUAL_PAGE,
        PROP_DUAL_PAGE_ODD_LEFT,
+       PROP_DUAL_PAGE_RTL,
        PROP_FULLSCREEN,
        PROP_MIN_SCALE,
        PROP_MAX_SCALE,
@@ -134,6 +136,9 @@ ev_document_model_set_property (GObject      *object,
        case PROP_DUAL_PAGE_ODD_LEFT:
                ev_document_model_set_dual_page_odd_pages_left (model, g_value_get_boolean (value));
                break;
+       case PROP_DUAL_PAGE_RTL:
+               ev_document_model_set_dual_page_rtl (model, g_value_get_boolean (value));
+               break;
        case PROP_FULLSCREEN:
                ev_document_model_set_fullscreen (model, g_value_get_boolean (value));
                break;
@@ -187,6 +192,9 @@ ev_document_model_get_property (GObject    *object,
        case PROP_DUAL_PAGE_ODD_LEFT:
                g_value_set_boolean (value, ev_document_model_get_dual_page_odd_pages_left (model));
                break;
+       case PROP_DUAL_PAGE_RTL:
+               g_value_set_boolean (value, ev_document_model_get_dual_page_rtl (model));
+               break;
        case PROP_FULLSCREEN:
                g_value_set_boolean (value, ev_document_model_get_fullscreen (model));
                break;
@@ -303,6 +311,14 @@ ev_document_model_class_init (EvDocumentModelClass *klass)
                                                               FALSE,
                                                               G_PARAM_READWRITE |
                                                                G_PARAM_STATIC_STRINGS));
+       g_object_class_install_property (g_object_class,
+                                        PROP_DUAL_PAGE_RTL,
+                                        g_param_spec_boolean ("dual-rtl",
+                                                              "Right to Left",
+                                                              "Whether pages are displayed from right to 
left in dual mode",
+                                                              FALSE,
+                                                              G_PARAM_READWRITE |
+                                                               G_PARAM_STATIC_STRINGS));
        g_object_class_install_property (g_object_class,
                                         PROP_FULLSCREEN,
                                         g_param_spec_boolean ("fullscreen",
@@ -720,6 +736,30 @@ ev_document_model_get_dual_page_odd_pages_left (EvDocumentModel *model)
        return model->dual_page_odd_left;
 }
 
+void
+ev_document_model_set_dual_page_rtl (EvDocumentModel *model,
+                                    gboolean         rtl)
+{
+       g_return_if_fail (EV_IS_DOCUMENT_MODEL (model));
+
+       rtl = rtl != FALSE;
+
+       if (rtl == model->dual_page_rtl)
+               return;
+
+       model->dual_page_rtl = rtl;
+
+       g_object_notify (G_OBJECT (model), "dual-rtl");
+}
+
+gboolean
+ev_document_model_get_dual_page_rtl (EvDocumentModel *model)
+{
+       g_return_val_if_fail (EV_IS_DOCUMENT_MODEL (model), FALSE);
+
+       return model->dual_page_rtl;
+}
+
 void
 ev_document_model_set_fullscreen (EvDocumentModel *model,
                                  gboolean         fullscreen)
diff --git a/libview/ev-document-model.h b/libview/ev-document-model.h
index 6a99e43a..3de06598 100644
--- a/libview/ev-document-model.h
+++ b/libview/ev-document-model.h
@@ -92,6 +92,9 @@ gboolean         ev_document_model_get_continuous    (EvDocumentModel *model);
 void             ev_document_model_set_dual_page_odd_pages_left (EvDocumentModel *model,
                                                                 gboolean         odd_left);
 gboolean         ev_document_model_get_dual_page_odd_pages_left (EvDocumentModel *model);
+void             ev_document_model_set_dual_page_rtl (EvDocumentModel *model,
+                                                     gboolean         rtl);
+gboolean         ev_document_model_get_dual_page_rtl (EvDocumentModel *model);
 void             ev_document_model_set_fullscreen    (EvDocumentModel *model,
                                                      gboolean         fullscreen);
 gboolean         ev_document_model_get_fullscreen    (EvDocumentModel *model);
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index ba56c0cc..92985998 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -110,6 +110,7 @@ typedef enum {
 typedef struct _EvHeightToPageCache {
        gint rotation;
        gboolean dual_even_left;
+       gboolean dual_rtl;
        gdouble *height_to_page;
        gdouble *dual_height_to_page;
 } EvHeightToPageCache;
@@ -192,6 +193,7 @@ struct _EvView {
        gboolean can_zoom_out;
        gboolean continuous;
        gboolean dual_even_left;
+       gboolean dual_rtl;
        gboolean fullscreen;
        EvSizingMode sizing_mode;
        EvPageLayout page_layout;
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 61394882..9460c1ad 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -342,6 +342,7 @@ ev_view_build_height_to_page_cache (EvView          *view,
 
        cache->rotation = view->rotation;
        cache->dual_even_left = view->dual_even_left;
+       cache->dual_rtl = view->dual_rtl;
        cache->height_to_page = g_new0 (gdouble, n_pages + 1);
        cache->dual_height_to_page = g_new0 (gdouble, n_pages + 2);
 
@@ -367,7 +368,7 @@ ev_view_build_height_to_page_cache (EvView          *view,
                }
        }
 
-       if (cache->dual_even_left && !uniform) {
+       if ((cache->dual_even_left ^ cache->dual_rtl) && !uniform) {
                gdouble w, h;
 
                ev_document_get_page_size (document, 0, &w, &h);
@@ -376,7 +377,7 @@ ev_view_build_height_to_page_cache (EvView          *view,
                saved_height = 0;
        }
 
-       for (i = cache->dual_even_left; i < n_pages + 2; i += 2) {
+       for (i = cache->dual_even_left ^ cache->dual_rtl; i < n_pages + 2; i += 2) {
                if (uniform) {
                        uniform_height = swap ? u_width : u_height;
                        cache->dual_height_to_page[i] = ((i + cache->dual_even_left) / 2) * uniform_height;
@@ -462,7 +463,8 @@ ev_view_get_height_to_page (EvView *view,
 
        cache = view->height_to_page_cache;
        if (cache->rotation != view->rotation ||
-           cache->dual_even_left != view->dual_even_left) {
+           cache->dual_even_left != view->dual_even_left ||
+           cache->dual_rtl != view->dual_rtl) {
                ev_view_build_height_to_page_cache (view, cache);
        }
 
@@ -511,12 +513,15 @@ ev_view_get_scrollbar_size (EvView        *view,
        return (orientation == GTK_ORIENTATION_VERTICAL ? req.width : req.height) + spacing;
 }
 
+/* In general, if (page % 2 ^ odd_left == 1) the page is on the left (regardless of rtl). */
 static gboolean
 is_dual_page (EvView   *view,
-             gboolean *odd_left_out)
+             gboolean *odd_left_out,
+             gboolean *rtl_out)
 {
        gboolean dual = FALSE;
        gboolean odd_left = FALSE;
+       gboolean rtl = FALSE;
 
        switch (view->page_layout) {
        case EV_PAGE_LAYOUT_AUTOMATIC: {
@@ -538,12 +543,14 @@ is_dual_page (EvView   *view,
                    allocation.width > (2 * doc_width * scale) &&
                    allocation.height > (doc_height * scale * 0.9)) {
                        odd_left = !view->dual_even_left;
+                       rtl = view->dual_rtl;
                        dual = TRUE;
                }
        }
                break;
        case EV_PAGE_LAYOUT_DUAL:
                odd_left = !view->dual_even_left;
+               rtl = view->dual_rtl;
                dual = TRUE;
                break;
        case EV_PAGE_LAYOUT_SINGLE:
@@ -554,6 +561,8 @@ is_dual_page (EvView   *view,
 
        if (odd_left_out)
                *odd_left_out = odd_left;
+       if (rtl_out)
+               *rtl_out = rtl;
 
        return dual;
 }
@@ -584,7 +593,7 @@ scroll_to_point (EvView        *view,
                upper = gtk_adjustment_get_upper (view->hadjustment);
                lower = gtk_adjustment_get_lower (view->hadjustment);
 
-               if (is_dual_page (view, NULL)) {
+               if (is_dual_page (view, NULL, NULL)) {
                        gtk_adjustment_clamp_page (view->hadjustment, x,
                                                   x + page_size);
                } else {
@@ -715,7 +724,7 @@ view_update_range_and_current_page (EvView *view)
 {
        gint start = view->start_page;
        gint end = view->end_page;
-       gboolean odd_left;
+       gboolean odd_left, rtl;
 
        if (ev_document_get_n_pages (view->document) <= 0 ||
            !ev_document_check_dimensions (view->document))
@@ -758,7 +767,7 @@ view_update_range_and_current_page (EvView *view)
                                view->end_page = i;
                                j = 0;
                        } else if (found && view->current_page <= view->end_page) {
-                               if (is_dual_page (view, NULL) && j < 1) {
+                               if (is_dual_page (view, NULL, NULL) && j < 1) {
                                        /* In dual mode  we stop searching
                                         * after two consecutive non-visible pages.
                                         */
@@ -779,8 +788,8 @@ view_update_range_and_current_page (EvView *view)
                                ev_document_model_set_page (view->model, best_current_page);
                        }
                }
-       } else if (is_dual_page (view, &odd_left)) {
-               if (view->current_page % 2 == !odd_left) {
+       } else if (is_dual_page (view, &odd_left, &rtl)) {
+               if (view->current_page % 2 ^ odd_left ^ rtl) {
                        view->start_page = view->current_page;
                        if (view->current_page + 1 < ev_document_get_n_pages (view->document))
                                view->end_page = view->start_page + 1;
@@ -1236,16 +1245,16 @@ get_page_y_offset (EvView *view, int page, int *y_offset)
 {
        int offset = 0;
        GtkBorder border;
-       gboolean odd_left;
+       gboolean odd_left, rtl;
 
        g_return_if_fail (y_offset != NULL);
 
        compute_border (view, &border);
 
-       if (is_dual_page (view, &odd_left)) {
+       if (is_dual_page (view, &odd_left, &rtl)) {
                ev_view_get_height_to_page (view, page, NULL, &offset);
-               offset += ((page + !odd_left) / 2 + 1) * view->spacing +
-                       ((page + !odd_left) / 2 ) * (border.top + border.bottom);
+               offset += ((page + (!odd_left ^ rtl)) / 2 + 1) * view->spacing +
+                       ((page + (!odd_left ^ rtl)) / 2) * (border.top + border.bottom);
        } else {
                ev_view_get_height_to_page (view, page, &offset, NULL);
                offset += (page + 1) * view->spacing + page * (border.top + border.bottom);
@@ -1277,16 +1286,18 @@ ev_view_get_page_extents (EvView       *view,
        if (view->continuous) {
                gint max_width;
                gint x, y;
-               gboolean odd_left;
+               gboolean odd_left, rtl;
 
                ev_view_get_max_page_size (view, &max_width, NULL);
                max_width = max_width + border->left + border->right;
                /* Get the location of the bounding box */
-               if (is_dual_page (view, &odd_left)) {
-                       x = view->spacing + ((page % 2 == !odd_left) ? 0 : 1) * (max_width + view->spacing);
+               if (is_dual_page (view, &odd_left, &rtl)) {
+                       x = view->spacing;
                        x = x + MAX (0, allocation.width - (max_width * 2 + view->spacing * 3)) / 2;
-                       if (page % 2 == !odd_left)
+                       if (page % 2 ^ odd_left)
                                x = x + (max_width - width - border->left - border->right);
+                       else
+                               x = x + max_width + view->spacing;
                } else {
                        x = view->spacing;
                        x = x + MAX (0, allocation.width - (width + border->left + border->right + 
view->spacing * 2)) / 2;
@@ -1298,16 +1309,16 @@ ev_view_get_page_extents (EvView       *view,
                page_area->y = y;
        } else {
                gint x, y;
-               gboolean odd_left;
+               gboolean odd_left, rtl;
 
-               if (is_dual_page (view, &odd_left)) {
+               if (is_dual_page (view, &odd_left, &rtl)) {
                        gint width_2, height_2;
                        gint max_width = width;
                        gint max_height = height;
                        GtkBorder overall_border;
                        gint other_page;
 
-                       other_page = (page % 2 == !odd_left) ? page + 1: page - 1;
+                       other_page = page + (rtl ^ page % 2 ^ odd_left) ? 1 : -1;
 
                        /* First, we get the bounding box of the two pages */
                        if (other_page < ev_document_get_n_pages (view->document)
@@ -1326,7 +1337,7 @@ ev_view_get_page_extents (EvView       *view,
                        y = view->spacing;
 
                        /* Adjust for being the left or right page */
-                       if (page % 2 == !odd_left)
+                       if (page % 2 ^ odd_left)
                                x = x + max_width - width;
                        else
                                x = x + (max_width + overall_border.left + overall_border.right) + 
view->spacing;
@@ -4087,7 +4098,7 @@ ev_view_size_request (GtkWidget      *widget,
                                       allocation.height);
        }
 
-       dual_page = is_dual_page (view, NULL);
+       dual_page = is_dual_page (view, NULL, NULL);
        if (view->continuous && dual_page)
                ev_view_size_request_continuous_dual_page (view, &view->requisition);
        else if (view->continuous)
@@ -6064,7 +6075,7 @@ go_to_next_page (EvView *view,
 
        n_pages = ev_document_get_n_pages (view->document);
 
-       dual_page = is_dual_page (view, NULL);
+       dual_page = is_dual_page (view, NULL, NULL);
        page += dual_page ? 2 : 1;
 
        if (page < n_pages)
@@ -6085,7 +6096,7 @@ go_to_previous_page (EvView *view,
        if (!view->document)
                return -1;
 
-       dual_page = is_dual_page (view, NULL);
+       dual_page = is_dual_page (view, NULL, NULL);
        page -= dual_page ? 2 : 1;
 
        if (page >= 0)
@@ -7959,6 +7970,7 @@ ev_view_init (EvView *view)
        view->selection_info.in_drag = FALSE;
        view->continuous = TRUE;
        view->dual_even_left = TRUE;
+       view->dual_rtl = FALSE;
        view->fullscreen = FALSE;
        view->sizing_mode = EV_SIZING_FIT_WIDTH;
        view->page_layout = EV_PAGE_LAYOUT_SINGLE;
@@ -8483,6 +8495,16 @@ ev_view_dual_odd_left_changed_cb (EvDocumentModel *model,
                gtk_widget_queue_resize (GTK_WIDGET (view));
 }
 
+static void
+ev_view_dual_rtl_changed_cb (EvDocumentModel *model,
+                                 GParamSpec      *pspec,
+                                 EvView          *view)
+{
+       view->dual_rtl = ev_document_model_get_dual_page_rtl (model);
+       view->pending_scroll = SCROLL_TO_PAGE_POSITION;
+       gtk_widget_queue_resize (GTK_WIDGET (view));
+}
+
 static void
 ev_view_fullscreen_changed_cb (EvDocumentModel *model,
                               GParamSpec      *pspec,
@@ -8516,6 +8538,8 @@ ev_view_set_model (EvView          *view,
        view->scale = ev_document_model_get_scale (view->model);
        view->continuous = ev_document_model_get_continuous (view->model);
        view->page_layout = ev_document_model_get_page_layout (view->model);
+       view->dual_even_left = !ev_document_model_get_dual_page_odd_pages_left (view->model);
+       view->dual_rtl = ev_document_model_get_dual_page_rtl (view->model);
        view->fullscreen = ev_document_model_get_fullscreen (view->model);
        ev_view_document_changed_cb (view->model, NULL, view);
 
@@ -8549,6 +8573,9 @@ ev_view_set_model (EvView          *view,
        g_signal_connect (view->model, "notify::dual-odd-left",
                          G_CALLBACK (ev_view_dual_odd_left_changed_cb),
                          view);
+       g_signal_connect (view->model, "notify::dual-rtl",
+                         G_CALLBACK (ev_view_dual_rtl_changed_cb),
+                         view);
        g_signal_connect (view->model, "notify::fullscreen",
                          G_CALLBACK (ev_view_fullscreen_changed_cb),
                          view);
@@ -8885,7 +8912,7 @@ ev_view_zoom_for_size (EvView *view,
        if (view->document == NULL)
                return;
 
-       dual_page = is_dual_page (view, NULL);
+       dual_page = is_dual_page (view, NULL, NULL);
        if (view->continuous && dual_page)
                ev_view_zoom_for_size_continuous_and_dual_page (view, width, height);
        else if (view->continuous)
@@ -9241,7 +9268,7 @@ get_selection_page_range (EvView          *view,
        } else if (view->continuous) {
                start_page = 0;
                end_page = n_pages - 1;
-       } else if (is_dual_page (view, NULL)) {
+       } else if (is_dual_page (view, NULL, NULL)) {
                start_page = view->start_page;
                end_page = view->end_page;
        } else {
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 21bb599b..a374b1f8 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -536,6 +536,8 @@ ev_window_update_actions_sensitivity (EvWindow *ev_window)
                                      !recent_view_mode);
        ev_window_set_action_enabled (ev_window, "dual-page", has_pages &&
                                      !recent_view_mode);
+       ev_window_set_action_enabled (ev_window, "dual-rtl", has_pages &&
+                                     !recent_view_mode);
        ev_window_set_action_enabled (ev_window, "reload", has_pages &&
                                      !recent_view_mode);
        ev_window_set_action_enabled (ev_window, "auto-scroll", has_pages &&
@@ -604,6 +606,8 @@ ev_window_update_actions_sensitivity (EvWindow *ev_window)
                                      ev_view_can_zoom_out (view) &&
                                      !presentation_mode &&
                                      !recent_view_mode);
+       ev_window_set_action_enabled (ev_window, "dual-rtl", dual_mode &&
+                                     !recent_view_mode);
 
         /* Go menu */
        if (has_pages) {
@@ -1138,6 +1142,10 @@ ev_window_init_metadata_with_default_values (EvWindow *window)
                ev_metadata_set_boolean (metadata, "dual-page-odd-left",
                                         g_settings_get_boolean (settings, "dual-page-odd-left"));
        }
+       if (!ev_metadata_has_key (metadata, "dual-page-rtl")) {
+               ev_metadata_set_boolean (metadata, "dual-page-rtl",
+                                        g_settings_get_boolean (settings, "dual-page-rtl"));
+       }
        if (!ev_metadata_has_key (metadata, "inverted-colors")) {
                ev_metadata_set_boolean (metadata, "inverted-colors",
                                         g_settings_get_boolean (settings, "inverted-colors"));
@@ -1205,6 +1213,7 @@ setup_model_from_metadata (EvWindow *window)
        gboolean continuous = FALSE;
        gboolean dual_page = FALSE;
        gboolean dual_page_odd_left = FALSE;
+       gboolean dual_page_rtl = FALSE;
        gboolean fullscreen = FALSE;
        EvWindowPrivate *priv = GET_PRIVATE (window);
 
@@ -1273,6 +1282,11 @@ setup_model_from_metadata (EvWindow *window)
                ev_document_model_set_dual_page_odd_pages_left (priv->model, dual_page_odd_left);
        }
 
+       /* Dual page right to left */
+       if (ev_metadata_get_boolean (priv->metadata, "dual-page-rtl", &dual_page_rtl)) {
+               ev_document_model_set_dual_page_rtl (priv->model, dual_page_rtl);
+       }
+
        /* Fullscreen */
        if (ev_metadata_get_boolean (priv->metadata, "fullscreen", &fullscreen)) {
                if (fullscreen)
@@ -1487,6 +1501,7 @@ ev_window_setup_default (EvWindow *ev_window)
        ev_document_model_set_continuous (model, g_settings_get_boolean (settings, "continuous"));
        ev_document_model_set_dual_page (model, g_settings_get_boolean (settings, "dual-page"));
        ev_document_model_set_dual_page_odd_pages_left (model, g_settings_get_boolean (settings, 
"dual-page-odd-left"));
+       ev_document_model_set_dual_page_rtl (model, g_settings_get_boolean (settings, "dual-page-rtl"));
        ev_document_model_set_inverted_colors (model, g_settings_get_boolean (settings, "inverted-colors"));
        ev_document_model_set_sizing_mode (model, g_settings_get_enum (settings, "sizing-mode"));
        if (ev_document_model_get_sizing_mode (model) == EV_SIZING_FREE)
@@ -4138,6 +4153,19 @@ ev_window_cmd_dual_odd_pages_left (GSimpleAction *action,
        g_simple_action_set_state (action, state);
 }
 
+static void
+ev_window_cmd_dual_rtl (GSimpleAction *action,
+                       GVariant      *state,
+                       gpointer       user_data)
+{
+       EvWindow *window = user_data;
+    EvWindowPrivate *priv = GET_PRIVATE (window);
+
+       ev_document_model_set_dual_page_rtl (priv->model,
+                            g_variant_get_boolean (state));
+       g_simple_action_set_state (action, state);
+}
+
 static void
 ev_window_change_sizing_mode_action_state (GSimpleAction *action,
                                           GVariant      *state,
@@ -4895,6 +4923,8 @@ ev_window_cmd_edit_save_settings (GSimpleAction *action,
                                ev_document_model_get_dual_page (model));
        g_settings_set_boolean (settings, "dual-page-odd-left",
                                ev_document_model_get_dual_page_odd_pages_left (model));
+       g_settings_set_boolean (settings, "dual-page-rtl",
+                               ev_document_model_get_dual_page_rtl (model));
        g_settings_set_boolean (settings, "fullscreen",
                                ev_document_model_get_fullscreen (model));
        g_settings_set_boolean (settings, "inverted-colors",
@@ -5316,6 +5346,18 @@ ev_window_dual_mode_odd_pages_left_changed_cb (EvDocumentModel *model,
                                         odd_left);
 }
 
+static void
+ev_window_dual_mode_rtl_changed_cb (EvDocumentModel *model,
+                                   GParamSpec      *pspec,
+                                   EvWindow        *ev_window)
+{
+       EvWindowPrivate *priv = GET_PRIVATE (ev_window);
+
+       if (priv->metadata && !ev_window_is_empty (ev_window))
+               ev_metadata_set_boolean (priv->metadata, "dual-page-rtl",
+                                        ev_document_model_get_dual_page_rtl (model));
+}
+
 static void
 ev_window_cmd_action_menu (GSimpleAction *action,
                           GVariant      *parameter,
@@ -6247,6 +6289,7 @@ static const GActionEntry actions[] = {
        { "continuous", NULL, NULL, "true", ev_window_cmd_continuous },
        { "dual-page", NULL, NULL, "false", ev_window_cmd_dual },
        { "dual-odd-left", NULL, NULL, "false", ev_window_cmd_dual_odd_pages_left },
+       { "dual-rtl", NULL, NULL, "false", ev_window_cmd_dual_rtl },
        { "show-side-pane", NULL, NULL, "false", ev_window_view_cmd_toggle_sidebar },
        { "inverted-colors", NULL, NULL, "false", ev_window_cmd_view_inverted_colors },
        { "enable-spellchecking", NULL, NULL, "false", ev_window_cmd_view_enable_spellchecking },
@@ -7669,6 +7712,10 @@ ev_window_init (EvWindow *ev_window)
                          "notify::dual-odd-left",
                          G_CALLBACK (ev_window_dual_mode_odd_pages_left_changed_cb),
                          ev_window);
+       g_signal_connect (priv->model,
+                         "notify::dual-rtl",
+                         G_CALLBACK (ev_window_dual_mode_rtl_changed_cb),
+                         ev_window);
        g_signal_connect (priv->model,
                          "notify::inverted-colors",
                          G_CALLBACK (ev_window_inverted_colors_changed_cb),
diff --git a/shell/evince-menus.ui b/shell/evince-menus.ui
index 68081006..a6dba092 100644
--- a/shell/evince-menus.ui
+++ b/shell/evince-menus.ui
@@ -78,6 +78,10 @@
         <attribute name="label" translatable="yes">_Odd Pages Left</attribute>
         <attribute name="action">win.dual-odd-left</attribute>
       </item>
+      <item>
+        <attribute name="label" translatable="yes">Rtl Text</attribute>
+        <attribute name="action">win.dual-rtl</attribute>
+      </item>
     </section>
     <section>
       <item>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]