about summary refs log tree commit diff stats
path: root/inspector.c
diff options
context:
space:
mode:
Diffstat (limited to 'inspector.c')
-rw-r--r--inspector.c90
1 files changed, 75 insertions, 15 deletions
diff --git a/inspector.c b/inspector.c
index 25e155d..6b8f114 100644
--- a/inspector.c
+++ b/inspector.c
@@ -30,6 +30,11 @@ inspector_close_window(WebKitWebInspector *inspector, struct tab *t)
 {
 	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
 
+	if (t->inspector_window) {
+		gtk_widget_hide(t->inspector_window);
+		return (TRUE); /* handled */
+	}
+
 	return (FALSE); /* NOT handled */
 }
 
@@ -41,27 +46,31 @@ inspector_detach_window(WebKitWebInspector *inspector, struct tab *t)
 	return (FALSE); /* NOT handled */
 }
 
-void
-inspector_finished(WebKitWebInspector *inspector, struct tab *t)
+gboolean
+inspector_delete(GtkWidget *inspector_window, GdkEvent *e, struct tab *t)
 {
-	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
+	inspector_close_window(t->inspector, t);
+
+	return (TRUE); /* handled */
 }
 
 WebKitWebView*
 inspector_inspect_web_view_cb(WebKitWebInspector *inspector, WebKitWebView* wv,
     struct tab *t)
 {
-	GtkWidget	*inspector_window;
-	GtkWidget	*inspector_view;
-
 	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
 
-	inspector_window = create_window("inspector");
-	inspector_view = webkit_web_view_new();
-	gtk_container_add(GTK_CONTAINER(inspector_window), inspector_view);
-	gtk_widget_show_all(inspector_window);
+	if (t->inspector_window)
+		goto done;
 
-	return WEBKIT_WEB_VIEW(inspector_view);
+	t->inspector_window = create_window("inspector");
+	t->inspector_view = webkit_web_view_new();
+	gtk_container_add(GTK_CONTAINER(t->inspector_window), t->inspector_view);
+
+	g_signal_connect(t->inspector_window,
+	    "delete-event", G_CALLBACK(inspector_delete), t);
+done:
+	return WEBKIT_WEB_VIEW(t->inspector_view);
 }
 
 gboolean
@@ -69,19 +78,51 @@ inspector_show_window(WebKitWebInspector *inspector, struct tab *t)
 {
 	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
 
+	if (t->inspector_window) {
+		g_signal_emit_by_name(inspector, "attach-window", t);
+		gtk_widget_show_all(t->inspector_window);
+		gtk_window_present(GTK_WINDOW(t->inspector_window));
+		return (TRUE); /* handled */
+	}
+
 	return (FALSE); /* NOT handled */
 }
 
 void
+inspector_finished(WebKitWebInspector *inspector, struct tab *t)
+{
+	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
+
+	if (t->inspector_window) {
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_attach_window, t);
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_close_window, t);
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_detach_window, t);
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_finished, t);
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_inspect_web_view_cb, t);
+		g_signal_handlers_disconnect_by_func(
+		    t->inspector, inspector_show_window, t);
+
+		gtk_widget_hide(t->inspector_window);
+
+		/* XXX it seems that the window is disposed automatically */
+		t->inspector_window = NULL;
+		t->inspector_view = NULL;
+	}
+}
+
+void
 setup_inspector(struct tab *t)
 {
-	WebKitWebInspector	*inspector;
 
 	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
 
-	inspector = webkit_web_view_get_inspector(WEBKIT_WEB_VIEW(t->wv));
-
-	g_object_connect(G_OBJECT(inspector),
+	t->inspector = webkit_web_view_get_inspector(WEBKIT_WEB_VIEW(t->wv));
+	g_object_connect(G_OBJECT(t->inspector),
 	    "signal::attach-window", G_CALLBACK(inspector_attach_window), t,
 	    "signal::close-window", G_CALLBACK(inspector_close_window), t,
 	    "signal::detach-window", G_CALLBACK(inspector_detach_window), t,
@@ -89,4 +130,23 @@ setup_inspector(struct tab *t)
 	    "signal::inspect-web-view", G_CALLBACK(inspector_inspect_web_view_cb), t,
 	    "signal::show-window", G_CALLBACK(inspector_show_window), t,
 	    (char *)NULL);
+
+}
+
+int
+inspector_cmd(struct tab *t, struct karg *args)
+{
+	DNPRINTF(XT_D_INSPECTOR, "%s: tab %d\n", __func__, t->tab_id);
+
+	if (t == NULL)
+		return (1);
+
+	if (args->i & XT_INS_SHOW)
+		webkit_web_inspector_show(t->inspector);
+	else if (args->i & XT_INS_HIDE)
+		webkit_web_inspector_close(t->inspector);
+	else if (args->i & XT_INS_CLOSE)
+		inspector_finished(t->inspector, t);
+
+	return (XT_CB_PASSTHROUGH);
 }