From 92fe4ae2f819abb70a0ea9405347e169deea8eac Mon Sep 17 00:00:00 2001
From: Patrick McDermott <pj@pehjota.net>
Date: Tue, 26 Sep 2017 02:21:17 -0400
Subject: MqTabChrome: Save user edits to hovered link URI

Don't overwrite such edited URI bar text on mouse target change.
---
diff --git a/src/tab-chrome.c b/src/tab-chrome.c
index dc91c9e..71f3ae6 100644
--- a/src/tab-chrome.c
+++ b/src/tab-chrome.c
@@ -506,6 +506,8 @@ load_failed_cb(WebKitWebView __attribute__((unused)) *web_view,
 	return FALSE;
 }
 
+/* TODO: <Esc> key in URI bar should reset to URI of current hovered link, if
+ * any, even if different from chrome->hovered_link_uri. */
 static void
 mouse_target_changed_cb(WebKitWebView __attribute__((unused)) *web_view,
 	WebKitHitTestResult *hit_test_result,
@@ -513,11 +515,20 @@ mouse_target_changed_cb(WebKitWebView __attribute__((unused)) *web_view,
 	MqTabChrome *chrome)
 {
 	if (webkit_hit_test_result_context_is_link(hit_test_result)) {
-		if (g_strcmp0(gtk_entry_get_text(GTK_ENTRY(chrome->uri_entry)),
+		if (chrome->hovered_link_uri && g_strcmp0(gtk_entry_get_text(
+					GTK_ENTRY(chrome->uri_entry)),
+				chrome->hovered_link_uri) != 0) {
+			/* The user has edited the hovered link URI in the URI
+			 * bar. */
+		} else if (g_strcmp0(gtk_entry_get_text(
+					GTK_ENTRY(chrome->uri_entry)),
 				webkit_web_view_get_uri(web_view)) == 0) {
-			gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
+			g_free(chrome->hovered_link_uri);
+			chrome->hovered_link_uri = g_strdup(
 				webkit_hit_test_result_get_link_uri(
 					hit_test_result));
+			gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
+				chrome->hovered_link_uri);
 			gtk_entry_set_attributes(GTK_ENTRY(chrome->uri_entry),
 				chrome->hovered_link_style);
 		} else if (gtk_entry_get_attributes(
@@ -526,13 +537,21 @@ mouse_target_changed_cb(WebKitWebView __attribute__((unused)) *web_view,
 			/* The URI bar's text differs from the Web view's URI
 			 * because the mouse was already targeting a different
 			 * link. */
-			gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
+			g_free(chrome->hovered_link_uri);
+			chrome->hovered_link_uri = g_strdup(
 				webkit_hit_test_result_get_link_uri(
 					hit_test_result));
+			gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
+				chrome->hovered_link_uri);
 		}
-	} else {
-		if (gtk_entry_get_attributes(GTK_ENTRY(chrome->uri_entry)) ==
+	} else if (gtk_entry_get_attributes(GTK_ENTRY(chrome->uri_entry)) ==
 				chrome->hovered_link_style) {
+		if (g_strcmp0(gtk_entry_get_text(GTK_ENTRY(chrome->uri_entry)),
+				chrome->hovered_link_uri) == 0) {
+			/* The user hasn't edited the hovered link URI in the
+			 * URI bar. */
+			g_free(chrome->hovered_link_uri);
+			chrome->hovered_link_uri = NULL;
 			gtk_entry_set_text(GTK_ENTRY(chrome->uri_entry),
 				webkit_web_view_get_uri(web_view));
 			gtk_entry_set_attributes(GTK_ENTRY(chrome->uri_entry),
@@ -598,6 +617,8 @@ loading_cb(WebKitWebView *web_view,
 static void
 connect_web_view(MqTabChrome *chrome)
 {
+	chrome->hovered_link_uri = NULL;
+
 	g_signal_connect(chrome->web_view, "load-changed",
 		G_CALLBACK(load_changed_cb), chrome);
 	g_signal_connect(chrome->web_view, "load-failed",
diff --git a/src/tab-chrome.h b/src/tab-chrome.h
index 1275de4..01e75f1 100644
--- a/src/tab-chrome.h
+++ b/src/tab-chrome.h
@@ -37,6 +37,7 @@ struct MqTabChrome {
 	GtkToolItem   *stop_reload_button;
 	GtkWidget     *uri_entry;
 	PangoAttrList *hovered_link_style;
+	gchar         *hovered_link_uri;
 	WebKitWebView *web_view;
 	gboolean       load_failed;
 	GtkWidget     *back_forward_popover;
--
cgit v0.9.1