about summary refs log tree commit diff stats
path: root/xxxterm.c
diff options
context:
space:
mode:
Diffstat (limited to 'xxxterm.c')
-rw-r--r--xxxterm.c92
1 files changed, 75 insertions, 17 deletions
diff --git a/xxxterm.c b/xxxterm.c
index a5605ea..ca2bd68 100644
--- a/xxxterm.c
+++ b/xxxterm.c
@@ -190,7 +190,7 @@ struct tab {
 	/* flags */
 	int			focus_wv;
 	int			ctrl_click;
-	gchar			*hover;
+	gchar			*cmd_store;
 	int			xtp_meaning; /* identifies dls/favorites */
 
 	/* hints */
@@ -390,6 +390,11 @@ struct karg {
 #define XT_CMD_TABNEW		(2)
 #define XT_CMD_TABNEW_CURRENT	(3)
 
+#define XT_SETCMD_NOSTORE	(0)
+#define XT_SETCMD_LINK		(1)
+#define XT_SETCMD_CMD		(2)
+#define XT_SETCMD_URI		(3)
+
 #define XT_SES_DONOTHING	(0)
 #define XT_SES_CLOSETABS	(1)
 
@@ -634,6 +639,43 @@ load_webkit_string(struct tab *t, const char *str)
 }
 
 void
+set_cmd(struct tab *t, gchar *s, int store)
+{
+	gchar *type = NULL;
+
+	if (s == NULL)
+		return;
+
+	switch (store) {
+	case XT_SETCMD_LINK:
+		type = g_strdup_printf("Link: <%s>", s);
+		if (!t->cmd_store)
+			t->cmd_store = strdup(gtk_entry_get_text(GTK_ENTRY(t->cmd)));
+		s = type;
+		break;
+	case XT_SETCMD_URI:
+		type = g_strdup_printf("URI: <%s>", s);
+		if (!t->cmd_store) {
+			t->cmd_store = g_strdup(type);
+		}
+		s = type;
+		/* fallthrough */
+	case XT_SETCMD_CMD:
+		if (!t->cmd_store)
+			t->cmd_store = strdup(s);
+		break;
+	case XT_SETCMD_NOSTORE:
+		/* fallthrough */
+	default:
+		break;
+	}
+	gtk_entry_set_text(GTK_ENTRY(t->cmd), s);
+	gtk_widget_show(t->cmd);
+	if (type)
+		g_free(type);
+}
+
+void
 hide_oops(struct tab *t)
 {
 	gtk_widget_hide(t->oops);
@@ -642,7 +684,9 @@ hide_oops(struct tab *t)
 void
 hide_cmd(struct tab *t)
 {
-	gtk_widget_hide(t->cmd);
+	set_cmd(t, (char *)t->cmd_store, 0);
+	gtk_widget_grab_focus(GTK_WIDGET(t->wv));
+	/* gtk_widget_hide(t->cmd); */
 }
 
 void
@@ -3325,7 +3369,7 @@ command(struct tab *t, struct karg *args)
 
 	DNPRINTF(XT_D_CMD, "command: type %s\n", s);
 
-	gtk_entry_set_text(GTK_ENTRY(t->cmd), s);
+	set_cmd(t, s, XT_SETCMD_CMD);
 	gdk_color_parse("white", &color);
 	gtk_widget_modify_base(t->cmd, GTK_STATE_NORMAL, &color);
 	show_cmd(t);
@@ -4692,6 +4736,8 @@ abort_favicon_download(struct tab *t)
 
 	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->uri_entry),
 	    GTK_ENTRY_ICON_PRIMARY, "text-html");
+	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->cmd),
+	    GTK_ENTRY_ICON_PRIMARY, "text-html");
 }
 
 void
@@ -4727,6 +4773,8 @@ set_favicon_from_file(struct tab *t, char *file)
 	if (pixbuf == NULL) {
 		gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->uri_entry),
 		    GTK_ENTRY_ICON_PRIMARY, "text-html");
+		gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->cmd),
+		    GTK_ENTRY_ICON_PRIMARY, "text-html");
 		return;
 	}
 
@@ -4751,6 +4799,8 @@ set_favicon_from_file(struct tab *t, char *file)
 	t->icon_pixbuf = scaled;
 	gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(t->uri_entry),
 	    GTK_ENTRY_ICON_PRIMARY, t->icon_pixbuf);
+	gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(t->cmd),
+	    GTK_ENTRY_ICON_PRIMARY, t->icon_pixbuf);
 }
 
 void
@@ -4891,8 +4941,14 @@ notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, struct tab *t)
 	case WEBKIT_LOAD_COMMITTED:
 		frame = webkit_web_view_get_main_frame(wview);
 		uri = webkit_web_frame_get_uri(frame);
-		if (uri)
+		if (uri) {
 			gtk_entry_set_text(GTK_ENTRY(t->uri_entry), uri);
+			if (t->cmd_store) {
+				g_free(t->cmd_store);
+				t->cmd_store = NULL;
+			}
+			set_cmd(t, (char *)uri, XT_SETCMD_URI);
+		}
 
 		/* check if js white listing is enabled */
 		if (enable_js_whitelist) {
@@ -4985,6 +5041,8 @@ webview_progress_changed_cb(WebKitWebView *wv, int progress, struct tab *t)
 {
 	gtk_entry_set_progress_fraction(GTK_ENTRY(t->uri_entry),
 	    progress == 100 ? 0 : (double)progress / 100);
+	gtk_entry_set_progress_fraction(GTK_ENTRY(t->cmd),
+	    progress == 100 ? 0 : (double)progress / 100);
 }
 
 int
@@ -5173,7 +5231,6 @@ webview_download_cb(WebKitWebView *wv, WebKitDownload *wk_download, struct tab *
 	return (ret); /* start download */
 }
 
-/* XXX currently unused */
 void
 webview_hover_cb(WebKitWebView *wv, gchar *title, gchar *uri, struct tab *t)
 {
@@ -5183,14 +5240,13 @@ webview_hover_cb(WebKitWebView *wv, gchar *title, gchar *uri, struct tab *t)
 		errx(1, "webview_hover_cb");
 
 	if (uri) {
-		if (t->hover) {
-			g_free(t->hover);
-			t->hover = NULL;
+		set_cmd(t, uri, XT_SETCMD_LINK);
+	} else {
+		if (t->cmd_store) {
+			set_cmd(t, t->cmd_store, XT_SETCMD_NOSTORE);
+		} else {
+			hide_cmd(t);
 		}
-		t->hover = g_strdup(uri);
-	} else if (t->hover) {
-		g_free(t->hover);
-		t->hover = NULL;
 	}
 }
 
@@ -5735,10 +5791,6 @@ create_toolbar(struct tab *t)
 	gtk_box_pack_start(GTK_BOX(eb1), t->uri_entry, TRUE, TRUE, 0);
 	gtk_box_pack_start(GTK_BOX(b), eb1, TRUE, TRUE, 0);
 
-	/* set empty favicon */
-	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->uri_entry),
-	    GTK_ENTRY_ICON_PRIMARY, "text-html");
-
 	/* search entry */
 	if (fancy_bar && search_string) {
 		GtkWidget *eb2;
@@ -5968,6 +6020,12 @@ create_new_tab(char *title, struct undo *u, int focus)
 	/* xtp meaning is normal by default */
 	t->xtp_meaning = XT_XTP_TAB_MEANING_NORMAL;
 
+	/* set empty favicon */
+	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->uri_entry),
+	    GTK_ENTRY_ICON_PRIMARY, "text-html");
+	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(t->cmd),
+	    GTK_ENTRY_ICON_PRIMARY, "text-html");
+
 	/* and show it all */
 	gtk_widget_show_all(b);
 	gtk_widget_show_all(t->vbox);
@@ -6016,7 +6074,7 @@ create_new_tab(char *title, struct undo *u, int focus)
 	g_object_connect(G_OBJECT(t->wv),
 	    "signal::key-press-event", (GCallback)wv_keypress_cb, t,
 	    "signal-after::key-press-event", (GCallback)wv_keypress_after_cb, t,
-	    /* "signal::hovering-over-link", (GCallback)webview_hover_cb, t, */
+	    "signal::hovering-over-link", (GCallback)webview_hover_cb, t,
 	    "signal::download-requested", (GCallback)webview_download_cb, t,
 	    "signal::mime-type-policy-decision-requested", (GCallback)webview_mimetype_cb, t,
 	    "signal::navigation-policy-decision-requested", (GCallback)webview_npd_cb, t,