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>
posted @ 2026-06-12 20:39  粉皮  阅读(2)  评论(0)    收藏  举报