[evince/abderrahim/dual-rtl] Add right to left mode in dual mode
- From: Abderrahim Kitouni <akitouni src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince/abderrahim/dual-rtl] Add right to left mode in dual mode
- Date: Mon, 4 Feb 2019 10:37:41 +0000 (UTC)
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]