Evince魔改记
本文部分来自于博主在CSDN上的文章 Evince魔改记 。
注意下文的补丁可能并不是按顺序打的,因此大概率需要照着补丁手动修改。
日志
- 2026年6月12日。惊喜发现Evince居然更新了,48.1到48.4。
文件
添加Save功能
相对于Save as命令,Save命令是一个更加方便,但缺乏安全性的命令,而这或许也是Evince一直不支持它的原因。
接下来的修改完全基于 https://github.com/fabian-thomas/evince-patches 。具体来说,是文件 https://github.com/fabian-thomas/evince-patches/blob/main/patches/add-save-action-and-make-default.patch 。
补丁如下:
diff --git a/shell/ev-application.c b/shell/ev-application.c
index e35a5ef..2eef4ef 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -822,7 +822,8 @@ ev_application_startup (GApplication *gapplication)
const gchar *action_accels[] = {
"win.open", "<Ctrl>O", NULL,
"win.open-copy", "<Ctrl>N", NULL,
- "win.save-as", "<Ctrl>S", NULL,
+ "win.save", "<Ctrl>S", NULL,
+ "win.save-as", "<Ctrl><Shift>S", NULL,
"win.print", "<Ctrl>P", NULL,
"win.show-properties", "<alt>Return", NULL,
"win.copy", "<Ctrl>C", "<Ctrl>Insert", NULL,
diff --git a/shell/ev-window.c b/shell/ev-window.c
index be3b575..9dda6d4 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -3254,6 +3254,33 @@ ev_window_cmd_save_as (GSimpleAction *action,
ev_window_save_as (window);
}
+
+static void
+ev_window_save (EvWindow *ev_window)
+{
+ EvWindowPrivate *priv = GET_PRIVATE (ev_window);
+
+ ev_window_clear_save_job (ev_window);
+ priv->save_job = ev_job_save_new (priv->document,
+ priv->uri, priv->uri);
+ g_signal_connect (priv->save_job, "finished",
+ G_CALLBACK (ev_window_save_job_cb),
+ ev_window);
+ /* The priority doesn't matter for this job */
+ ev_job_scheduler_push_job (priv->save_job, EV_JOB_PRIORITY_NONE);
+}
+
+static void
+ev_window_cmd_save (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ EvWindow *window = user_data;
+
+ ev_window_save (window);
+}
+
+
static void
ev_window_cmd_send_to (GSimpleAction *action,
GVariant *parameter,
@@ -6316,6 +6343,7 @@ static const GActionEntry actions[] = {
{ "new", ev_window_cmd_new_window },
{ "open", ev_window_cmd_file_open },
{ "open-copy", ev_window_cmd_file_open_copy },
+ { "save", ev_window_cmd_save },
{ "save-as", ev_window_cmd_save_as },
{ "send-to", ev_window_cmd_send_to },
{ "open-containing-folder", ev_window_cmd_open_containing_folder },
注释
添加高亮文本的快捷键
动机:博主喜欢单个键完成操作
为高亮操作添加快捷键m,作为原先ctrl+h的补充。这里,我选择m,是因为h已经被占用了,而我现在还没找到强行占用h的方法。
补丁如下:
diff --git a/shell/ev-application.c b/shell/ev-application.c
index 2eef4ef..fe079e4 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -861,7 +861,7 @@ ev_application_startup (GApplication *gapplication)
"win.inverted-colors", "<Ctrl>I", NULL,
"win.reload", "<Ctrl>R", NULL,
"win.add-annotation", "s", NULL,
- "win.highlight-annotation", "<Ctrl>H", NULL,
+ "win.highlight-annotation", "m", "<Ctrl>H", NULL,
"win.help", "F1", NULL,
"win.about", NULL, NULL,
NULL
更新2026-06-14:libview中已经将GDK_KEY_H注册,因此注释掉它们,即可。
使用
git diff libview/ev-view-presentation.c libview/ev-view.c shell/ev-application.c > add-shortcut-h.patch
补丁如下:
diff --git a/libview/ev-view-presentation.c b/libview/ev-view-presentation.c
index 1da45c0..5688ea7 100644
--- a/libview/ev-view-presentation.c
+++ b/libview/ev-view-presentation.c
@@ -1587,9 +1587,9 @@ ev_view_presentation_class_init (EvViewPresentationClass *klass)
gtk_binding_entry_add_signal (binding_set, GDK_KEY_J, 0,
"change_page", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD);
- gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0,
- "change_page", 1,
- GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD);
+ // gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0,
+ // "change_page", 1,
+ // GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_L, 0,
"change_page", 1,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_FORWARD);
diff --git a/libview/ev-view.c b/libview/ev-view.c
index dd29fe6..4ccec60 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -8526,9 +8526,9 @@ ev_view_class_init (EvViewClass *class)
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, GDK_SHIFT_MASK, "scroll", 2,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_BACKWARD,
GTK_TYPE_ORIENTATION, GTK_ORIENTATION_VERTICAL);
- gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0, "scroll", 2,
- GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD,
- GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL);
+ // gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0, "scroll", 2,
+ // GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD,
+ // GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_J, 0, "scroll", 2,
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD,
GTK_TYPE_ORIENTATION, GTK_ORIENTATION_VERTICAL);
diff --git a/shell/ev-application.c b/shell/ev-application.c
index fe079e4..a39095b 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -861,7 +861,7 @@ ev_application_startup (GApplication *gapplication)
"win.inverted-colors", "<Ctrl>I", NULL,
"win.reload", "<Ctrl>R", NULL,
"win.add-annotation", "s", NULL,
- "win.highlight-annotation", "m", "<Ctrl>H", NULL,
+ "win.highlight-annotation", "h", "<Ctrl>H", NULL,
"win.help", "F1", NULL,
"win.about", NULL, NULL,
NULL
侧边栏
调整侧边栏宽度
动机:侧边栏初始宽度太窄。我希望完整看到注释。
补丁如下:
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 9dda6d4..4db3c84 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1287,7 +1287,7 @@ setup_sidebar_from_metadata (EvWindow *window)
return;
if (ev_metadata_get_int (priv->metadata, "sidebar_size", &sidebar_size))
- gtk_paned_set_position (GTK_PANED (priv->hpaned), sidebar_size);
+ gtk_paned_set_position (GTK_PANED (priv->hpaned), 320);
if (ev_metadata_get_string (priv->metadata, "sidebar_page", &page_id))
ev_window_sidebar_set_current_page (window, page_id);
修改侧边栏样式
动机:我感觉侧边栏样式不高效,遂使用不同颜色表示不同类型的注释,且去掉了左边的大量留白。
补丁如下:
diff --git a/shell/ev-sidebar-annotations.c b/shell/ev-sidebar-annotations.c
index 05133a7..c611968 100644
--- a/shell/ev-sidebar-annotations.c
+++ b/shell/ev-sidebar-annotations.c
@@ -368,8 +368,7 @@ job_finished_callback (EvJobAnnots *job,
gboolean found = FALSE;
mapping_list = (EvMappingList *)l->data;
- page_label = g_strdup_printf (_("Page %d"),
- ev_mapping_list_get_page (mapping_list) + 1);
+ page_label = g_strdup_printf (_("<span background='lightgray'>PAGE %d</span>"), ev_mapping_list_get_page (mapping_list) + 1);
gtk_tree_store_append (model, &iter, NULL);
gtk_tree_store_set (model, &iter,
COLUMN_MARKUP, page_label,
@@ -399,10 +398,17 @@ job_finished_callback (EvJobAnnots *job,
else
tooltip = g_strdup_printf ("<span weight=\"bold\">%s</span>", label);
+ GdkRGBA rgba;
+ gchar *color_str = NULL;
+ ev_annotation_get_rgba (annot, &rgba);
+ color_str = g_strdup_printf ("#%02X%02X%02X", (int)(rgba.red * 255), (int)(rgba.green * 255), (int)(rgba.blue * 255));
+
if (contents && *contents != '\0')
- markup = g_strdup_printf ("%s", contents);
+ markup = g_strdup_printf ("<span><span background='%s'> </span> </span>%s", color_str, contents);
else
- markup = g_strdup_printf ("<i>%s</i>", _("No Comment"));
+ markup = g_strdup_printf ("<span><span background='%s'> </span></span>", color_str);
+
+ g_free (color_str);
if (EV_IS_ANNOTATION_TEXT (annot)) {
icon_name = EV_STOCK_ANNOT_TEXT;
@@ -425,7 +431,7 @@ job_finished_callback (EvJobAnnots *job,
}
}
- gtk_tree_store_append (model, &child_iter, &iter);
+ gtk_tree_store_append (model, &child_iter, NULL);
gtk_tree_store_set (model, &child_iter,
COLUMN_MARKUP, markup,
COLUMN_ICON, icon_name,
@@ -442,8 +448,8 @@ job_finished_callback (EvJobAnnots *job,
}
gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->tree_view));
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view),
- GTK_TREE_MODEL (model));
+ gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), GTK_TREE_MODEL (model));
+ gtk_tree_view_set_show_expanders(GTK_TREE_VIEW(priv->tree_view), FALSE);
g_clear_object (&priv->job);
}
diff --git a/shell/evince-sidebar-annotations.ui b/shell/evince-sidebar-annotations.ui
index 93b6302..8c3c661 100644
--- a/shell/evince-sidebar-annotations.ui
+++ b/shell/evince-sidebar-annotations.ui
@@ -15,17 +15,6 @@
<property name="headers-visible">False</property>
<property name="tooltip-column">3</property>
<property name="visible">True</property>
- <child>
- <object class="GtkTreeViewColumn">
- <child>
- <object class="GtkCellRendererPixbuf">
- </object>
- <attributes>
- <attribute name="icon-name">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
<child>
<object class="GtkTreeViewColumn">
<child>

浙公网安备 33010602011771号