/* -*- c-basic-offset: 4; -*- */
-/* Original code taken from the example webkit-gtk+ application. see notice below. */
-/* Modified code is licensed under the GPL 3. See LICENSE file. */
+// Original code taken from the example webkit-gtk+ application. see notice below.
+// Modified code is licensed under the GPL 3. See LICENSE file.
/*
#define LENGTH(x) (sizeof x / sizeof x[0])
#define MAX_BINDINGS 256
+#define _POSIX_SOURCE
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/gdkkeysyms.h>
-
-#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/un.h>
#include <sys/utsname.h>
#include <sys/time.h>
-#include <sys/un.h>
-
#include <webkit/webkit.h>
#include <libsoup/soup.h>
"Name of the current instance (defaults to Xorg window id)", "NAME" },
{ "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
"Config file (this is pretty much equivalent to uzbl < FILE )", "FILE" },
+ { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
+ "Socket ID", "SOCKET" },
{ NULL, 0, 0, 0, NULL, NULL, NULL }
};
} var_name_to_ptr[] = {
/* variable name pointer to variable in code type dump callback function */
/* --------------------------------------------------------------------------------------- */
- { "uri", PTR(uzbl.state.uri, STR, cmd_load_uri)},
- { "mode", PTR(uzbl.behave.mode, INT, NULL)},
- { "inject_html", PTR(uzbl.behave.inject_html, STR, cmd_inject_html)},
- { "base_url", PTR(uzbl.behave.base_url, STR, NULL)},
- { "html_endmarker", PTR(uzbl.behave.html_endmarker, STR, NULL)},
- { "html_mode_timeout", PTR(uzbl.behave.html_timeout, INT, NULL)},
- { "status_message", PTR(uzbl.gui.sbar.msg, STR, update_title)},
- { "show_status", PTR(uzbl.behave.show_status, INT, cmd_set_status)},
- { "status_top", PTR(uzbl.behave.status_top, INT, move_statusbar)},
- { "status_format", PTR(uzbl.behave.status_format, STR, update_title)},
- { "status_pbar_done", PTR(uzbl.gui.sbar.progress_s, STR, update_title)},
- { "status_pbar_pending", PTR(uzbl.gui.sbar.progress_u, STR, update_title)},
- { "status_pbar_width", PTR(uzbl.gui.sbar.progress_w, INT, update_title)},
- { "status_background", PTR(uzbl.behave.status_background, STR, update_title)},
- { "title_format_long", PTR(uzbl.behave.title_format_long, STR, update_title)},
- { "title_format_short", PTR(uzbl.behave.title_format_short, STR, update_title)},
- { "insert_mode", PTR(uzbl.behave.insert_mode, INT, NULL)},
- { "always_insert_mode", PTR(uzbl.behave.always_insert_mode, INT, cmd_always_insert_mode)},
- { "reset_command_mode", PTR(uzbl.behave.reset_command_mode, INT, NULL)},
- { "modkey", PTR(uzbl.behave.modkey, STR, cmd_modkey)},
- { "load_finish_handler", PTR(uzbl.behave.load_finish_handler, STR, NULL)},
- { "load_start_handler", PTR(uzbl.behave.load_start_handler, STR, NULL)},
- { "load_commit_handler", PTR(uzbl.behave.load_commit_handler, STR, NULL)},
- { "history_handler", PTR(uzbl.behave.history_handler, STR, NULL)},
- { "download_handler", PTR(uzbl.behave.download_handler, STR, NULL)},
- { "cookie_handler", PTR(uzbl.behave.cookie_handler, STR, cmd_cookie_handler)},
- { "fifo_dir", PTR(uzbl.behave.fifo_dir, STR, cmd_fifo_dir)},
- { "socket_dir", PTR(uzbl.behave.socket_dir, STR, cmd_socket_dir)},
- { "http_debug", PTR(uzbl.behave.http_debug, INT, cmd_http_debug)},
- { "shell_cmd", PTR(uzbl.behave.shell_cmd, STR, NULL)},
- { "proxy_url", PTR(uzbl.net.proxy_url, STR, set_proxy_url)},
- { "max_conns", PTR(uzbl.net.max_conns, INT, cmd_max_conns)},
- { "max_conns_host", PTR(uzbl.net.max_conns_host, INT, cmd_max_conns_host)},
- { "useragent", PTR(uzbl.net.useragent, STR, cmd_useragent)},
+ { "uri", PTR(uzbl.state.uri, STR, 1, cmd_load_uri)},
+ { "verbose", PTR(uzbl.state.verbose, INT, 1, NULL)},
+ { "mode", PTR(uzbl.behave.mode, INT, 0, NULL)},
+ { "inject_html", PTR(uzbl.behave.inject_html, STR, 0, cmd_inject_html)},
+ { "base_url", PTR(uzbl.behave.base_url, STR, 1, NULL)},
+ { "html_endmarker", PTR(uzbl.behave.html_endmarker, STR, 1, NULL)},
+ { "html_mode_timeout", PTR(uzbl.behave.html_timeout, INT, 1, NULL)},
+ { "status_message", PTR(uzbl.gui.sbar.msg, STR, 1, update_title)},
+ { "show_status", PTR(uzbl.behave.show_status, INT, 1, cmd_set_status)},
+ { "status_top", PTR(uzbl.behave.status_top, INT, 1, move_statusbar)},
+ { "status_format", PTR(uzbl.behave.status_format, STR, 1, update_title)},
+ { "status_pbar_done", PTR(uzbl.gui.sbar.progress_s, STR, 1, update_title)},
+ { "status_pbar_pending", PTR(uzbl.gui.sbar.progress_u, STR, 1, update_title)},
+ { "status_pbar_width", PTR(uzbl.gui.sbar.progress_w, INT, 1, update_title)},
+ { "status_background", PTR(uzbl.behave.status_background, STR, 1, update_title)},
+ { "insert_indicator", PTR(uzbl.behave.insert_indicator, STR, 1, update_title)},
+ { "command_indicator", PTR(uzbl.behave.cmd_indicator, STR, 1, update_title)},
+ { "title_format_long", PTR(uzbl.behave.title_format_long, STR, 1, update_title)},
+ { "title_format_short", PTR(uzbl.behave.title_format_short, STR, 1, update_title)},
+ { "icon", PTR(uzbl.gui.icon, STR, 1, set_icon)},
+ { "insert_mode", PTR(uzbl.behave.insert_mode, INT, 1, NULL)},
+ { "always_insert_mode", PTR(uzbl.behave.always_insert_mode, INT, 1, cmd_always_insert_mode)},
+ { "reset_command_mode", PTR(uzbl.behave.reset_command_mode, INT, 1, NULL)},
+ { "modkey", PTR(uzbl.behave.modkey, STR, 1, cmd_modkey)},
+ { "load_finish_handler", PTR(uzbl.behave.load_finish_handler, STR, 1, NULL)},
+ { "load_start_handler", PTR(uzbl.behave.load_start_handler, STR, 1, NULL)},
+ { "load_commit_handler", PTR(uzbl.behave.load_commit_handler, STR, 1, NULL)},
+ { "history_handler", PTR(uzbl.behave.history_handler, STR, 1, NULL)},
+ { "download_handler", PTR(uzbl.behave.download_handler, STR, 1, NULL)},
+ { "cookie_handler", PTR(uzbl.behave.cookie_handler, STR, 1, cmd_cookie_handler)},
+ { "fifo_dir", PTR(uzbl.behave.fifo_dir, STR, 1, cmd_fifo_dir)},
+ { "socket_dir", PTR(uzbl.behave.socket_dir, STR, 1, cmd_socket_dir)},
+ { "http_debug", PTR(uzbl.behave.http_debug, INT, 1, cmd_http_debug)},
+ { "shell_cmd", PTR(uzbl.behave.shell_cmd, STR, 1, NULL)},
+ { "proxy_url", PTR(uzbl.net.proxy_url, STR, 1, set_proxy_url)},
+ { "max_conns", PTR(uzbl.net.max_conns, INT, 1, cmd_max_conns)},
+ { "max_conns_host", PTR(uzbl.net.max_conns_host, INT, 1, cmd_max_conns_host)},
+ { "useragent", PTR(uzbl.net.useragent, STR, 1, cmd_useragent)},
/* exported WebKitWebSettings properties */
- { "font_size", PTR(uzbl.behave.font_size, INT, cmd_font_size)},
- { "monospace_size", PTR(uzbl.behave.monospace_size, INT, cmd_font_size)},
- { "minimum_font_size", PTR(uzbl.behave.minimum_font_size, INT, cmd_minimum_font_size)},
- { "zoom_level", PTR(uzbl.behave.zoom_level, FLOAT, cmd_zoom_level)},
- { "disable_plugins", PTR(uzbl.behave.disable_plugins, INT, cmd_disable_plugins)},
- { "disable_scripts", PTR(uzbl.behave.disable_scripts, INT, cmd_disable_scripts)},
- { "autoload_images", PTR(uzbl.behave.autoload_img, INT, cmd_autoload_img)},
- { "autoshrink_images", PTR(uzbl.behave.autoshrink_img, INT, cmd_autoshrink_img)},
- { "enable_spellcheck", PTR(uzbl.behave.enable_spellcheck, INT, cmd_enable_spellcheck)},
- { "enable_private", PTR(uzbl.behave.enable_private, INT, cmd_enable_private)},
- { "print_backgrounds", PTR(uzbl.behave.print_bg, INT, cmd_print_bg)},
- { "stylesheet_uri", PTR(uzbl.behave.style_uri, STR, cmd_style_uri)},
- { "resizable_text_areas",PTR(uzbl.behave.resizable_txt, INT, cmd_resizable_txt)},
- { "default_encoding", PTR(uzbl.behave.default_encoding, STR, cmd_default_encoding)},
- { "enforce_96_dpi", PTR(uzbl.behave.enforce_96dpi, INT, cmd_enforce_96dpi)},
- { "caret_browsing", PTR(uzbl.behave.caret_browsing, INT, cmd_caret_browsing)},
-
- { NULL, {.ptr = NULL, .type = TYPE_INT, .func = NULL}}
+ { "zoom_level", PTR(uzbl.behave.zoom_level, FLOAT,1, cmd_zoom_level)},
+ { "font_size", PTR(uzbl.behave.font_size, INT, 1, cmd_font_size)},
+ { "monospace_size", PTR(uzbl.behave.monospace_size, INT, 1, cmd_font_size)},
+ { "minimum_font_size", PTR(uzbl.behave.minimum_font_size, INT, 1, cmd_minimum_font_size)},
+ { "disable_plugins", PTR(uzbl.behave.disable_plugins, INT, 1, cmd_disable_plugins)},
+ { "disable_scripts", PTR(uzbl.behave.disable_scripts, INT, 1, cmd_disable_scripts)},
+ { "autoload_images", PTR(uzbl.behave.autoload_img, INT, 1, cmd_autoload_img)},
+ { "autoshrink_images", PTR(uzbl.behave.autoshrink_img, INT, 1, cmd_autoshrink_img)},
+ { "enable_spellcheck", PTR(uzbl.behave.enable_spellcheck, INT, 1, cmd_enable_spellcheck)},
+ { "enable_private", PTR(uzbl.behave.enable_private, INT, 1, cmd_enable_private)},
+ { "print_backgrounds", PTR(uzbl.behave.print_bg, INT, 1, cmd_print_bg)},
+ { "stylesheet_uri", PTR(uzbl.behave.style_uri, STR, 1, cmd_style_uri)},
+ { "resizable_text_areas",PTR(uzbl.behave.resizable_txt, INT, 1, cmd_resizable_txt)},
+ { "default_encoding", PTR(uzbl.behave.default_encoding, STR, 1, cmd_default_encoding)},
+ { "enforce_96_dpi", PTR(uzbl.behave.enforce_96dpi, INT, 1, cmd_enforce_96dpi)},
+ { "caret_browsing", PTR(uzbl.behave.caret_browsing, INT, 1, cmd_caret_browsing)},
+
+ { NULL, {.ptr = NULL, .type = TYPE_INT, .dump = 0, .func = NULL}}
}, *n2v_p = var_name_to_ptr;
const struct {
return (FALSE);
}
+static gboolean
+mime_policy_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, gchar *mime_type, WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
+ (void) frame;
+ (void) request;
+ (void) user_data;
+
+ /* If we can display it, let's display it... */
+ if (webkit_web_view_can_show_mime_type (web_view, mime_type)) {
+ webkit_web_policy_decision_use (policy_decision);
+ return TRUE;
+ }
+
+ /* ...everything we can't displayed is downloaded */
+ webkit_web_policy_decision_download (policy_decision);
+ return TRUE;
+}
+
WebKitWebView*
create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer user_data) {
(void) web_view;
(void) page;
(void) frame;
(void) data;
+ uzbl.gui.sbar.load_progress = 0;
g_string_truncate(uzbl.state.keycmd, 0); // don't need old commands to remain on new page?
if (uzbl.behave.load_start_handler)
run_handler(uzbl.behave.load_start_handler, "");
load_uri (WebKitWebView *web_view, GArray *argv) {
if (argv_idx(argv, 0)) {
GString* newuri = g_string_new (argv_idx(argv, 0));
- if (g_strrstr (argv_idx(argv, 0), "://") == NULL)
+ if (g_strstr_len (argv_idx(argv, 0), 11, "javascript:") != NULL) {
+ run_js(web_view, argv);
+ return;
+ }
+ if (g_strrstr (argv_idx(argv, 0), "://") == NULL && g_strstr_len (argv_idx(argv, 0), 5, "data:") == NULL)
g_string_prepend (newuri, "http://");
/* if we do handle cookies, ask our handler for them */
webkit_web_view_load_uri (web_view, newuri->str);
token = g_scanner_get_next_token(uzbl.scan);
if(token == G_TOKEN_SYMBOL) {
- sym = (int)g_scanner_cur_value(uzbl.scan).v_symbol;
+ sym = GPOINTER_TO_INT(g_scanner_cur_value(uzbl.scan).v_symbol);
switch(sym) {
case SYM_URI:
if(escape_markup) {
// make sure that the args string you pass can properly be interpreted (eg properly escaped against whitespace, quotes etc)
static gboolean
run_command (const gchar *command, const guint npre, const gchar **args,
- const gboolean sync, char **stdout) {
+ const gboolean sync, char **output_stdout) {
//command <uzbl conf> <uzbl pid> <uzbl win id> <uzbl fifo file> <uzbl socket file> [args]
GError *err = NULL;
gboolean result;
if (sync) {
- if (*stdout) *stdout = strfree(*stdout);
+ if (*output_stdout) *output_stdout = strfree(*output_stdout);
result = g_spawn_sync(NULL, (gchar **)a->data, NULL, G_SPAWN_SEARCH_PATH,
- NULL, NULL, stdout, NULL, NULL, &err);
+ NULL, NULL, output_stdout, NULL, NULL, &err);
} else result = g_spawn_async(NULL, (gchar **)a->data, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, &err);
g_string_append_printf(s, " -- result: %s", (result ? "true" : "false"));
printf("%s\n", s->str);
g_string_free(s, TRUE);
- if(stdout) {
- printf("Stdout: %s\n", *stdout);
+ if(output_stdout) {
+ printf("Stdout: %s\n", *output_stdout);
}
}
if (err) {
}
static void
+set_icon() {
+ if(file_exists(uzbl.gui.icon)) {
+ gtk_window_set_icon_from_file (GTK_WINDOW (uzbl.gui.main_window), uzbl.gui.icon, NULL);
+ } else {
+ g_printerr ("Icon \"%s\" not found. ignoring.\n", uzbl.gui.icon);
+ }
+ g_free (uzbl.gui.icon);
+}
+
+static void
cmd_load_uri() {
GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
g_array_append_val (a, uzbl.state.uri);
if (c->type == TYPE_STR) {
buf = expand_vars(val);
g_free(*c->ptr);
- *c->ptr = g_strdup(val);
- } else if (c->type == TYPE_INT) {
+ *c->ptr = buf;
+ } else if(c->type == TYPE_INT) {
int *ip = (int *)c->ptr;
- *ip = (int)strtoul(val, &endp, 10);
+ buf = expand_vars(val);
+ *ip = (int)strtoul(buf, &endp, 10);
+ g_free(buf);
} else if (c->type == TYPE_FLOAT) {
float *fp = (float *)c->ptr;
- *fp = strtof(val, &endp);
+ buf = expand_vars(val);
+ *fp = strtod(buf, &endp);
+ g_free(buf);
}
/* invoke a command specific function */
if (b->show_status) {
if (b->title_format_short) {
parsed = expand_template(b->title_format_short, FALSE);
- gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
+ if (uzbl.gui.main_window)
+ gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
g_free(parsed);
}
if (b->status_format) {
GdkColor color;
gdk_color_parse (b->status_background, &color);
//labels and hboxes do not draw their own background. applying this on the window is ok as we the statusbar is the only affected widget. (if not, we could also use GtkEventBox)
- gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
+ if (uzbl.gui.main_window)
+ gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
}
} else {
if (b->title_format_long) {
parsed = expand_template(b->title_format_long, FALSE);
- gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
+ if (uzbl.gui.main_window)
+ gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
g_free(parsed);
}
}
g_signal_connect (G_OBJECT (g->web_view), "new-window-policy-decision-requested", G_CALLBACK (new_window_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "download-requested", G_CALLBACK (download_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "create-web-view", G_CALLBACK (create_web_view_cb), g->web_view);
+ g_signal_connect (G_OBJECT (g->web_view), "mime-type-policy-decision-requested", G_CALLBACK (mime_policy_cb), g->web_view);
return scrolled_window;
}
gtk_misc_set_alignment (GTK_MISC(g->mainbar_label), 0, 0);
gtk_misc_set_padding (GTK_MISC(g->mainbar_label), 2, 2);
gtk_box_pack_start (GTK_BOX (g->mainbar), g->mainbar_label, TRUE, TRUE, 0);
+ g_signal_connect (G_OBJECT (g->mainbar), "key-press-event", G_CALLBACK (key_press_cb), NULL);
return g->mainbar;
}
return window;
}
+static
+GtkPlug* create_plug () {
+ GtkPlug* plug = GTK_PLUG (gtk_plug_new (uzbl.state.socket_id));
+ g_signal_connect (G_OBJECT (plug), "destroy", G_CALLBACK (destroy_cb), NULL);
+ g_signal_connect (G_OBJECT (plug), "key-press-event", G_CALLBACK (key_press_cb), NULL);
+
+ return plug;
+}
+
+
static gchar**
inject_handler_args(const gchar *actname, const gchar *origargs, const gchar *newargs) {
/*
printf ("Binding %-10s : %s\n", key, act);
action = new_action(parts[0], parts[1]);
+ if (g_hash_table_remove (uzbl.bindings, key))
+ g_warning ("Overwriting existing binding for \"%s\"", key);
g_hash_table_replace(uzbl.bindings, g_strdup(key), action);
g_strfreev(parts);
}
get_xdg_var (XDG_Var xdg) {
const gchar* actual_value = getenv (xdg.environmental);
const gchar* home = getenv ("HOME");
-
- gchar* return_value = str_replace ("~", home, actual_value);
+ gchar* return_value;
if (! actual_value || strcmp (actual_value, "") == 0) {
if (xdg.default_value) {
} else {
return_value = NULL;
}
+ } else {
+ return_value = str_replace("~", home, actual_value);
}
+
return return_value;
}
printf ("No configuration file loaded.\n");
}
- g_signal_connect(n->soup_session, "request-queued", G_CALLBACK(handle_cookies), NULL);
+ g_signal_connect_after(n->soup_session, "request-started", G_CALLBACK(handle_cookies), NULL);
}
static void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data){
}
static gboolean
-inspector_dettach_window_cb (WebKitWebInspector* inspector){
+inspector_detach_window_cb (WebKitWebInspector* inspector){
(void) inspector;
return FALSE;
}
g_signal_connect (G_OBJECT (g->inspector), "show-window", G_CALLBACK (inspector_show_window_cb), NULL);
g_signal_connect (G_OBJECT (g->inspector), "close-window", G_CALLBACK (inspector_close_window_cb), NULL);
g_signal_connect (G_OBJECT (g->inspector), "attach-window", G_CALLBACK (inspector_attach_window_cb), NULL);
- g_signal_connect (G_OBJECT (g->inspector), "dettach-window", G_CALLBACK (inspector_dettach_window_cb), NULL);
- g_signal_connect (G_OBJECT (g->inspector), "destroy", G_CALLBACK (inspector_inspector_destroyed_cb), NULL);
+ g_signal_connect (G_OBJECT (g->inspector), "detach-window", G_CALLBACK (inspector_detach_window_cb), NULL);
+ g_signal_connect (G_OBJECT (g->inspector), "finished", G_CALLBACK (inspector_inspector_destroyed_cb), NULL);
g_signal_connect (G_OBJECT (g->inspector), "notify::inspected-uri", G_CALLBACK (inspector_uri_changed_cb), NULL);
}
gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
- uzbl.gui.main_window = create_window ();
- gtk_container_add (GTK_CONTAINER (uzbl.gui.main_window), uzbl.gui.vbox);
-
+ if (uzbl.state.socket_id) {
+ uzbl.gui.plug = create_plug ();
+ gtk_container_add (GTK_CONTAINER (uzbl.gui.plug), uzbl.gui.vbox);
+ gtk_widget_show_all (GTK_WIDGET (uzbl.gui.plug));
+ } else {
+ uzbl.gui.main_window = create_window ();
+ gtk_container_add (GTK_CONTAINER (uzbl.gui.main_window), uzbl.gui.vbox);
+ gtk_widget_show_all (uzbl.gui.main_window);
+ uzbl.xwin = GDK_WINDOW_XID (GTK_WIDGET (uzbl.gui.main_window)->window);
+ }
gtk_widget_grab_focus (GTK_WIDGET (uzbl.gui.web_view));
- gtk_widget_show_all (uzbl.gui.main_window);
- uzbl.xwin = GDK_WINDOW_XID (GTK_WIDGET (uzbl.gui.main_window)->window);
if (uzbl.state.verbose) {
printf("Uzbl start location: %s\n", argv[0]);
- printf("window_id %i\n",(int) uzbl.xwin);
+ if (uzbl.state.socket_id)
+ printf("plug_id %i\n", gtk_plug_get_id(uzbl.gui.plug));
+ else
+ printf("window_id %i\n",(int) uzbl.xwin);
printf("pid %i\n", getpid ());
printf("name: %s\n", uzbl.state.instance_name);
}