6 #include <webkit/webkit.h>
9 #define DOWNLOAD_DIR "/tmp/tmp"
12 static void zea_destroy_client(GtkWidget *, gpointer);
13 static gboolean zea_do_download(WebKitWebView *, WebKitDownload *, gpointer);
14 static gboolean zea_download_request(WebKitWebView *, WebKitWebFrame *,
15 WebKitNetworkRequest *, gchar *,
16 WebKitWebPolicyDecision *, gpointer);
17 static void zea_new_client(const gchar *uri);
18 static gboolean zea_new_client_request(WebKitWebView *, WebKitWebFrame *,
19 WebKitNetworkRequest *,
20 WebKitWebNavigationAction *,
21 WebKitWebPolicyDecision *, gpointer);
22 static void zea_title_changed(GObject *, GParamSpec *, gpointer);
25 static Window embed = 0;
26 static int clients = 0;
27 static double global_zoom = 1.0;
39 zea_destroy_client(GtkWidget *obj, gpointer data)
41 struct Client *c = (struct Client *)data;
45 webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(c->web_view));
46 gtk_widget_destroy(c->web_view);
47 gtk_widget_destroy(c->scroll);
48 gtk_widget_destroy(c->win);
57 zea_do_download(WebKitWebView *web_view, WebKitDownload *download, gpointer data)
66 uri = webkit_download_get_uri(download);
71 ret = execlp("xterm", "xterm", "-hold", "-e", "wget", uri, NULL);
74 if (snprintf(id, 16, "%ld", embed) >= 16)
76 fprintf(stderr, "zea: id for xterm embed truncated!\n");
79 ret = execlp("xterm", "xterm", "-hold", "-into", id, "-e", "wget",
85 fprintf(stderr, "zea: exec'ing xterm for download");
95 zea_download_request(WebKitWebView *web_view, WebKitWebFrame *frame,
96 WebKitNetworkRequest *request, gchar *mime_type,
97 WebKitWebPolicyDecision *policy_decision,
104 if (!webkit_web_view_can_show_mime_type(web_view, mime_type))
106 webkit_web_policy_decision_download(policy_decision);
113 zea_new_client(const gchar *uri)
115 struct Client *c = malloc(sizeof(struct Client));
118 fprintf(stderr, "zea: fatal: malloc failed\n");
124 c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
128 c->win = gtk_plug_new(embed);
131 /* When using Gtk2, zea only shows a white area when run in
132 * suckless' tabbed. It appears we need to set a default window size
133 * for this to work. This is not needed when using Gtk3. */
134 gtk_window_set_default_size(GTK_WINDOW(c->win), 1024, 768);
136 g_signal_connect(G_OBJECT(c->win), "destroy",
137 G_CALLBACK(zea_destroy_client), c);
138 gtk_window_set_title(GTK_WINDOW(c->win), "zea");
140 c->web_view = webkit_web_view_new();
141 webkit_web_view_set_full_content_zoom(WEBKIT_WEB_VIEW(c->web_view), TRUE);
142 webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view), global_zoom);
143 g_signal_connect(G_OBJECT(c->web_view), "notify::title",
144 G_CALLBACK(zea_title_changed), c->win);
145 g_signal_connect(G_OBJECT(c->web_view),
146 "new-window-policy-decision-requested",
147 G_CALLBACK(zea_new_client_request), NULL);
148 g_signal_connect(G_OBJECT(c->web_view),
149 "mime-type-policy-decision-requested",
150 G_CALLBACK(zea_download_request), NULL);
151 g_signal_connect(G_OBJECT(c->web_view), "download-requested",
152 G_CALLBACK(zea_do_download), NULL);
154 c->scroll = gtk_scrolled_window_new(NULL, NULL);
156 gtk_container_add(GTK_CONTAINER(c->scroll), c->web_view);
157 gtk_container_add(GTK_CONTAINER(c->win), c->scroll);
159 gtk_widget_show_all(c->win);
161 webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), uri);
167 zea_new_client_request(WebKitWebView *web_view, WebKitWebFrame *frame,
168 WebKitNetworkRequest *request,
169 WebKitWebNavigationAction *navigation_action,
170 WebKitWebPolicyDecision *policy_decision,
175 (void)navigation_action;
178 webkit_web_policy_decision_ignore(policy_decision);
179 zea_new_client(webkit_network_request_get_uri(request));
185 zea_title_changed(GObject *obj, GParamSpec *pspec, gpointer data)
188 WebKitWebView *view = WEBKIT_WEB_VIEW(obj);
189 GtkWindow *win = GTK_WINDOW(data);
193 t = webkit_web_view_get_title(view);
194 gtk_window_set_title(win, (t == NULL ? "zea" : t));
198 main(int argc, char **argv)
202 gtk_init(&argc, &argv);
204 while ((opt = getopt(argc, argv, "z:e:")) != -1)
209 global_zoom = atof(optarg);
212 embed = atol(optarg);
219 fprintf(stderr, "Usage: zea [OPTIONS] <URI>\n");
223 zea_new_client(argv[optind]);