aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Brendan Taylor <whateley@gmail.com>2011-06-05 14:03:42 -0600
committerGravatar Brendan Taylor <whateley@gmail.com>2011-06-05 14:03:42 -0600
commitb9cb02d42b1e9b33b973efa98772a3559bf630f9 (patch)
tree398731a564dd358d037595c59b1e1da4cc33aeff /src
parent4b890ec08c066be56f79c53e420f20d179d595e9 (diff)
parent1110023039fa7d13e2ddab29d6a7db50ab61f2ae (diff)
Merge remote-tracking branch 'keis/split-core' into experimental
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c349
-rw-r--r--src/callbacks.h142
-rw-r--r--src/commands.c456
-rw-r--r--src/commands.h68
-rw-r--r--src/cookie-jar.c1
-rw-r--r--src/events.c3
-rw-r--r--src/inspector.c2
-rw-r--r--src/io.c1
-rw-r--r--src/menu.h8
-rw-r--r--src/type.h7
-rw-r--r--src/uzbl-core.c711
-rw-r--r--src/uzbl-core.h100
-rw-r--r--src/variables.c585
-rw-r--r--src/variables.h65
14 files changed, 1231 insertions, 1267 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 548cf95..ef2005d 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -6,344 +6,8 @@
#include "uzbl-core.h"
#include "callbacks.h"
#include "events.h"
-#include "util.h"
-#include "io.h"
-
-
-void
-set_proxy_url() {
- const gchar *url = uzbl.net.proxy_url;
- SoupSession *session = uzbl.net.soup_session;
- SoupURI *soup_uri = NULL;
-
- if (url != NULL || *url != 0 || *url != ' ')
- soup_uri = soup_uri_new(url);
-
- g_object_set(G_OBJECT(session), SOUP_SESSION_PROXY_URI, soup_uri, NULL);
-
- if(soup_uri)
- soup_uri_free(soup_uri);
-}
-
-
-void
-set_authentication_handler() {
- /* Check if WEBKIT_TYPE_SOUP_AUTH_DIALOG feature is set */
- GSList *flist = soup_session_get_features (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
- guint feature_is_set = g_slist_length(flist);
- g_slist_free(flist);
-
- if (uzbl.behave.authentication_handler == NULL || *uzbl.behave.authentication_handler == 0) {
- if (!feature_is_set)
- soup_session_add_feature_by_type
- (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
- } else {
- if (feature_is_set)
- soup_session_remove_feature_by_type
- (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
- }
- return;
-}
-
-
-void
-set_status_background() {
- /* labels and hboxes do not draw their own background. applying this
- * on the vbox/main_window is ok as the statusbar is the only affected
- * widget. (if not, we could also use GtkEventBox) */
- GtkWidget* widget = uzbl.gui.main_window ? uzbl.gui.main_window : GTK_WIDGET (uzbl.gui.plug);
-
-#if GTK_CHECK_VERSION(2,91,0)
- GdkRGBA color;
- gdk_rgba_parse (&color, uzbl.behave.status_background);
- gtk_widget_override_background_color (widget, GTK_STATE_NORMAL, &color);
-#else
- GdkColor color;
- gdk_color_parse (uzbl.behave.status_background, &color);
- gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &color);
-#endif
-}
-
-
-void
-set_icon() {
- if(file_exists(uzbl.gui.icon)) {
- if (uzbl.gui.main_window)
- 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);
- }
-}
-
-void
-cmd_set_geometry() {
- int ret=0, x=0, y=0;
- unsigned int w=0, h=0;
- if(uzbl.gui.geometry) {
- if(uzbl.gui.geometry[0] == 'm') { /* m/maximize/maximized */
- gtk_window_maximize((GtkWindow *)(uzbl.gui.main_window));
- } else {
- /* we used to use gtk_window_parse_geometry() but that didn't work how it was supposed to */
- ret = XParseGeometry(uzbl.gui.geometry, &x, &y, &w, &h);
- if(ret & XValue)
- gtk_window_move((GtkWindow *)uzbl.gui.main_window, x, y);
- if(ret & WidthValue)
- gtk_window_resize((GtkWindow *)uzbl.gui.main_window, w, h);
- }
- }
-
- /* update geometry var with the actual geometry
- this is necessary as some WMs don't seem to honour
- the above setting and we don't want to end up with
- wrong geometry information
- */
- retrieve_geometry();
-}
-
-void
-cmd_set_status() {
- if (!uzbl.behave.show_status) {
- gtk_widget_hide(uzbl.gui.mainbar);
- } else {
- gtk_widget_show(uzbl.gui.mainbar);
- }
- update_title();
-}
-
-/* is the given string made up entirely of decimal digits? */
-gboolean
-string_is_integer(const char *s) {
- return (strspn(s, "0123456789") == strlen(s));
-}
-
-void
-cmd_load_uri() {
- const gchar *uri = uzbl.state.uri;
-
- gchar *newuri;
- SoupURI *soup_uri;
-
- /* Strip leading whitespaces */
- while (*uri && isspace(*uri))
- uri++;
-
- /* evaluate javascript: URIs */
- if (!strncmp (uri, "javascript:", 11)) {
- eval_js(uzbl.gui.web_view, uri, NULL, "javascript:");
- return;
- }
-
- /* attempt to parse the URI */
- soup_uri = soup_uri_new(uri);
-
- if (!soup_uri) {
- /* it's not a valid URI, maybe it's a path on the filesystem. */
- const gchar *fullpath;
- if (g_path_is_absolute (uri))
- fullpath = uri;
- else {
- gchar *wd = g_get_current_dir ();
- fullpath = g_build_filename (wd, uri, NULL);
- g_free(wd);
- }
-
- struct stat stat_result;
- if (! g_stat(fullpath, &stat_result))
- newuri = g_strconcat("file://", fullpath, NULL);
- else
- newuri = g_strconcat("http://", uri, NULL);
- } else {
- if(soup_uri->host == NULL && string_is_integer(soup_uri->path))
- /* the user probably typed in a host:port without a scheme */
- newuri = g_strconcat("http://", uri, NULL);
- else
- newuri = g_strdup(uri);
-
- soup_uri_free(soup_uri);
- }
-
- webkit_web_view_load_uri (uzbl.gui.web_view, newuri);
- g_free (newuri);
-}
-
-void
-cmd_max_conns() {
- g_object_set(G_OBJECT(uzbl.net.soup_session),
- SOUP_SESSION_MAX_CONNS, uzbl.net.max_conns, NULL);
-}
-
-void
-cmd_max_conns_host() {
- g_object_set(G_OBJECT(uzbl.net.soup_session),
- SOUP_SESSION_MAX_CONNS_PER_HOST, uzbl.net.max_conns_host, NULL);
-}
-
-void
-cmd_http_debug() {
- soup_session_remove_feature
- (uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
- /* do we leak if this doesn't get freed? why does it occasionally crash if freed? */
- /*g_free(uzbl.net.soup_logger);*/
-
- uzbl.net.soup_logger = soup_logger_new(uzbl.behave.http_debug, -1);
- soup_session_add_feature(uzbl.net.soup_session,
- SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
-}
-
-GObject*
-view_settings() {
- return G_OBJECT(webkit_web_view_get_settings(uzbl.gui.web_view));
-}
-
-void
-cmd_font_size() {
- GObject *ws = view_settings();
- if (uzbl.behave.font_size > 0) {
- g_object_set (ws, "default-font-size", uzbl.behave.font_size, NULL);
- }
-
- if (uzbl.behave.monospace_size > 0) {
- g_object_set (ws, "default-monospace-font-size",
- uzbl.behave.monospace_size, NULL);
- } else {
- g_object_set (ws, "default-monospace-font-size",
- uzbl.behave.font_size, NULL);
- }
-}
-
-void
-cmd_zoom_level() {
- webkit_web_view_set_zoom_level (uzbl.gui.web_view, uzbl.behave.zoom_level);
-}
-
-#define EXPOSE_WEBKIT_VIEW_SETTINGS(SYM, STORAGE, PROPERTY) void cmd_##SYM() { \
- g_object_set(view_settings(), (PROPERTY), (STORAGE), NULL); \
-}
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(default_font_family, uzbl.behave.default_font_family, "default-font-family")
-EXPOSE_WEBKIT_VIEW_SETTINGS(monospace_font_family, uzbl.behave.monospace_font_family, "monospace-font-family")
-EXPOSE_WEBKIT_VIEW_SETTINGS(sans_serif_font_family, uzbl.behave.sans_serif_font_family, "sans_serif-font-family")
-EXPOSE_WEBKIT_VIEW_SETTINGS(serif_font_family, uzbl.behave.serif_font_family, "serif-font-family")
-EXPOSE_WEBKIT_VIEW_SETTINGS(cursive_font_family, uzbl.behave.cursive_font_family, "cursive-font-family")
-EXPOSE_WEBKIT_VIEW_SETTINGS(fantasy_font_family, uzbl.behave.fantasy_font_family, "fantasy-font-family")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(minimum_font_size, uzbl.behave.minimum_font_size, "minimum_font_size")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(disable_plugins, !uzbl.behave.disable_plugins, "enable-plugins")
-EXPOSE_WEBKIT_VIEW_SETTINGS(disable_scripts, !uzbl.behave.disable_scripts, "enable-scripts")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(javascript_windows, uzbl.behave.javascript_windows, "javascript-can-open-windows-automatically")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(autoload_img, uzbl.behave.autoload_img, "auto-load-images")
-EXPOSE_WEBKIT_VIEW_SETTINGS(autoshrink_img, uzbl.behave.autoshrink_img, "auto-shrink-images")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(enable_pagecache, uzbl.behave.enable_pagecache, "enable-page-cache")
-EXPOSE_WEBKIT_VIEW_SETTINGS(enable_private, uzbl.behave.enable_private, "enable-private-browsing")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(enable_spellcheck, uzbl.behave.enable_spellcheck, "enable-spell-checking")
-EXPOSE_WEBKIT_VIEW_SETTINGS(resizable_txt, uzbl.behave.resizable_txt, "resizable-text-areas")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(style_uri, uzbl.behave.style_uri, "user-stylesheet-uri")
-EXPOSE_WEBKIT_VIEW_SETTINGS(print_bg, uzbl.behave.print_bg, "print-backgrounds")
-EXPOSE_WEBKIT_VIEW_SETTINGS(enforce_96dpi, uzbl.behave.enforce_96dpi, "enforce-96-dpi")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(caret_browsing, uzbl.behave.caret_browsing, "enable-caret-browsing")
-
-EXPOSE_WEBKIT_VIEW_SETTINGS(default_encoding, uzbl.behave.default_encoding, "default-encoding")
-
-void
-set_current_encoding() {
- gchar *encoding = uzbl.behave.current_encoding;
- if(strlen(encoding) == 0)
- encoding = NULL;
-
- webkit_web_view_set_custom_encoding(uzbl.gui.web_view, encoding);
-}
-
-void
-cmd_fifo_dir() {
- uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir);
-}
-
-void
-cmd_socket_dir() {
- uzbl.behave.socket_dir = init_socket(uzbl.behave.socket_dir);
-}
-
-void
-cmd_inject_html() {
- if(uzbl.behave.inject_html) {
- webkit_web_view_load_html_string (uzbl.gui.web_view,
- uzbl.behave.inject_html, NULL);
- }
-}
-
-void
-cmd_useragent() {
- if (*uzbl.net.useragent == ' ') {
- g_free (uzbl.net.useragent);
- uzbl.net.useragent = NULL;
- } else {
- g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_USER_AGENT,
- uzbl.net.useragent, NULL);
- }
-}
-
-void
-set_accept_languages() {
- if (*uzbl.net.accept_languages == ' ') {
- g_free (uzbl.net.accept_languages);
- uzbl.net.accept_languages = NULL;
- } else {
- g_object_set(G_OBJECT(uzbl.net.soup_session),
- SOUP_SESSION_ACCEPT_LANGUAGE, uzbl.net.accept_languages, NULL);
- }
-}
-
-void
-cmd_scrollbars_visibility() {
- GtkPolicyType policy = uzbl.gui.scrollbars_visible ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER;
-
- gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win), policy, policy );
-}
-
-/* requires webkit >=1.1.14 */
-void
-cmd_view_source() {
- webkit_web_view_set_view_source_mode(uzbl.gui.web_view,
- (gboolean) uzbl.behave.view_source);
-}
-
-void
-cmd_set_zoom_type () {
- if(uzbl.behave.zoom_type)
- webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, TRUE);
- else
- webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, FALSE);
-}
-
-void
-toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result) {
- (void)argv;
- (void)result;
-
- webkit_web_view_set_full_content_zoom (page, !webkit_web_view_get_full_content_zoom (page));
-}
-
-void
-toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result) {
- (void)page;
- (void)argv;
- (void)result;
-
- if (uzbl.behave.show_status) {
- gtk_widget_hide(uzbl.gui.mainbar);
- } else {
- gtk_widget_show(uzbl.gui.mainbar);
- }
- uzbl.behave.show_status = !uzbl.behave.show_status;
- update_title();
-}
+#include "menu.h"
+#include "type.h"
void
link_hover_cb (WebKitWebView *page, const gchar *title, const gchar *link, gpointer data) {
@@ -430,15 +94,6 @@ load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer
}
void
-uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec) {
- (void) param_spec;
-
- g_free (uzbl.state.uri);
- g_object_get (web_view, "uri", &uzbl.state.uri, NULL);
- g_setenv("UZBL_URI", uzbl.state.uri, TRUE);
-}
-
-void
selection_changed_cb(WebKitWebView *webkitwebview, gpointer ud) {
(void)ud;
gchar *tmp;
diff --git a/src/callbacks.h b/src/callbacks.h
index 87f9785..176cb40 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -4,145 +4,6 @@
*/
void
-cmd_load_uri();
-
-void
-cmd_set_status();
-
-void
-set_proxy_url();
-
-void
-set_authentication_handler();
-
-void
-set_status_background();
-
-void
-set_icon();
-
-void
-move_statusbar();
-
-void
-cmd_http_debug();
-
-void
-cmd_max_conns();
-
-void
-cmd_max_conns_host();
-
-/* exported WebKitWebSettings properties */
-void
-cmd_font_size();
-
-void
-cmd_default_font_family();
-
-void
-cmd_monospace_font_family();
-
-void
-cmd_sans_serif_font_family();
-
-void
-cmd_serif_font_family();
-
-void
-cmd_cursive_font_family();
-
-void
-cmd_fantasy_font_family();
-
-void
-cmd_zoom_level();
-
-void
-cmd_set_zoom_type();
-
-void
-cmd_enable_pagecache();
-
-void
-cmd_disable_plugins();
-
-void
-cmd_disable_scripts();
-
-void
-cmd_minimum_font_size();
-
-void
-cmd_fifo_dir();
-
-void
-cmd_socket_dir();
-
-void
-cmd_useragent() ;
-
-void
-set_accept_languages();
-
-void
-cmd_autoload_img();
-
-void
-cmd_autoshrink_img();
-
-void
-cmd_enable_spellcheck();
-
-void
-cmd_enable_private();
-
-void
-cmd_print_bg();
-
-void
-cmd_style_uri();
-
-void
-cmd_resizable_txt();
-
-void
-cmd_default_encoding();
-
-void
-set_current_encoding();
-
-void
-cmd_enforce_96dpi();
-
-void
-cmd_inject_html();
-
-void
-cmd_caret_browsing();
-
-void
-cmd_javascript_windows();
-
-void
-cmd_set_geometry();
-
-void
-cmd_view_source();
-
-void
-cmd_scrollbars_visibility();
-
-void
-cmd_load_start();
-
-void
-toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result);
-
-void
-toggle_status_cb (WebKitWebView* page, GArray *argv, GString *result);
-
-void
link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data);
void
@@ -158,9 +19,6 @@ gboolean
load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer web_err, gpointer ud);
void
-uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec);
-
-void
selection_changed_cb(WebKitWebView *webkitwebview, gpointer ud);
void
diff --git a/src/commands.c b/src/commands.c
new file mode 100644
index 0000000..c4f63af
--- /dev/null
+++ b/src/commands.c
@@ -0,0 +1,456 @@
+#include "commands.h"
+#include "uzbl-core.h"
+#include "events.h"
+#include "util.h"
+#include "menu.h"
+#include "callbacks.h"
+#include "variables.h"
+#include "type.h"
+
+/* -- command to callback/function map for things we cannot attach to any signals */
+CommandInfo cmdlist[] =
+{ /* key function no_split */
+ { "back", view_go_back, 0 },
+ { "forward", view_go_forward, 0 },
+ { "scroll", scroll_cmd, 0 },
+ { "reload", view_reload, 0 },
+ { "reload_ign_cache", view_reload_bypass_cache, 0 },
+ { "stop", view_stop_loading, 0 },
+ { "zoom_in", view_zoom_in, 0 }, //Can crash (when max zoom reached?).
+ { "zoom_out", view_zoom_out, 0 },
+ { "toggle_zoom_type", toggle_zoom_type, 0 },
+ { "uri", load_uri, TRUE },
+ { "js", run_js, TRUE },
+ { "script", run_external_js, 0 },
+ { "toggle_status", toggle_status, 0 },
+ { "spawn", spawn_async, 0 },
+ { "sync_spawn", spawn_sync, 0 },
+ { "sync_spawn_exec", spawn_sync_exec, 0 }, // needed for load_cookies.sh :(
+ { "sh", spawn_sh_async, 0 },
+ { "sync_sh", spawn_sh_sync, 0 },
+ { "exit", close_uzbl, 0 },
+ { "search", search_forward_text, TRUE },
+ { "search_reverse", search_reverse_text, TRUE },
+ { "search_clear", search_clear, TRUE },
+ { "dehilight", dehilight, 0 },
+ { "set", set_var, TRUE },
+ { "dump_config", act_dump_config, 0 },
+ { "dump_config_as_events", act_dump_config_as_events, 0 },
+ { "chain", chain, 0 },
+ { "print", print, TRUE },
+ { "event", event, TRUE },
+ { "request", event, TRUE },
+ { "menu_add", menu_add, TRUE },
+ { "menu_link_add", menu_add_link, TRUE },
+ { "menu_image_add", menu_add_image, TRUE },
+ { "menu_editable_add", menu_add_edit, TRUE },
+ { "menu_separator", menu_add_separator, TRUE },
+ { "menu_link_separator", menu_add_separator_link, TRUE },
+ { "menu_image_separator", menu_add_separator_image, TRUE },
+ { "menu_editable_separator", menu_add_separator_edit, TRUE },
+ { "menu_remove", menu_remove, TRUE },
+ { "menu_link_remove", menu_remove_link, TRUE },
+ { "menu_image_remove", menu_remove_image, TRUE },
+ { "menu_editable_remove", menu_remove_edit, TRUE },
+ { "hardcopy", hardcopy, TRUE },
+ { "include", include, TRUE },
+ { "show_inspector", show_inspector, 0 },
+ { "add_cookie", add_cookie, 0 },
+ { "delete_cookie", delete_cookie, 0 },
+ { "clear_cookies", clear_cookies, 0 },
+ { "download", download, 0 }
+};
+
+void
+commands_hash() {
+ unsigned int i;
+ uzbl.behave.commands = g_hash_table_new(g_str_hash, g_str_equal);
+
+ for (i = 0; i < LENGTH(cmdlist); i++)
+ g_hash_table_insert(uzbl.behave.commands, (gpointer) cmdlist[i].key, &cmdlist[i]);
+}
+
+void
+builtins() {
+ unsigned int i;
+ unsigned int len = LENGTH(cmdlist);
+ GString* command_list = g_string_new("");
+
+ for (i = 0; i < len; i++) {
+ g_string_append(command_list, cmdlist[i].key);
+ g_string_append_c(command_list, ' ');
+ }
+
+ send_event(BUILTINS, NULL, TYPE_STR, command_list->str, NULL);
+ g_string_free(command_list, TRUE);
+}
+
+/* VIEW funcs (little webkit wrappers) */
+#define VIEWFUNC(name) void view_##name(WebKitWebView *page, GArray *argv, GString *result){(void)argv; (void)result; webkit_web_view_##name(page);}
+VIEWFUNC(reload)
+VIEWFUNC(reload_bypass_cache)
+VIEWFUNC(stop_loading)
+VIEWFUNC(zoom_in)
+VIEWFUNC(zoom_out)
+VIEWFUNC(go_back)
+VIEWFUNC(go_forward)
+#undef VIEWFUNC
+
+void
+toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result) {
+ (void)argv; (void)result;
+ webkit_web_view_set_full_content_zoom (page, !webkit_web_view_get_full_content_zoom (page));
+}
+
+void
+toggle_status (WebKitWebView* page, GArray *argv, GString *result) {
+ (void)page; (void)argv; (void)result;
+
+ if (uzbl.behave.show_status) {
+ gtk_widget_hide(uzbl.gui.mainbar);
+ } else {
+ gtk_widget_show(uzbl.gui.mainbar);
+ }
+ uzbl.behave.show_status = !uzbl.behave.show_status;
+ update_title();
+}
+
+/*
+ * scroll vertical 20
+ * scroll vertical 20%
+ * scroll vertical -40
+ * scroll vertical begin
+ * scroll vertical end
+ * scroll horizontal 10
+ * scroll horizontal -500
+ * scroll horizontal begin
+ * scroll horizontal end
+ */
+void
+scroll_cmd(WebKitWebView* page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+ gchar *direction = g_array_index(argv, gchar*, 0);
+ gchar *argv1 = g_array_index(argv, gchar*, 1);
+ GtkAdjustment *bar = NULL;
+
+ if (g_strcmp0(direction, "horizontal") == 0)
+ bar = uzbl.gui.bar_h;
+ else if (g_strcmp0(direction, "vertical") == 0)
+ bar = uzbl.gui.bar_v;
+ else {
+ if(uzbl.state.verbose)
+ puts("Unrecognized scroll format");
+ return;
+ }
+
+ if (g_strcmp0(argv1, "begin") == 0)
+ gtk_adjustment_set_value(bar, gtk_adjustment_get_lower(bar));
+ else if (g_strcmp0(argv1, "end") == 0)
+ gtk_adjustment_set_value (bar, gtk_adjustment_get_upper(bar) -
+ gtk_adjustment_get_page_size(bar));
+ else
+ scroll(bar, argv1);
+}
+
+void
+set_var(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+
+ if(!argv_idx(argv, 0))
+ return;
+
+ gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2);
+ if (split[0] != NULL) {
+ gchar *value = split[1] ? g_strchug(split[1]) : " ";
+ set_var_value(g_strstrip(split[0]), value);
+ }
+ g_strfreev(split);
+}
+
+
+void
+event(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+ GString *event_name;
+ gchar **split = NULL;
+
+ if(!argv_idx(argv, 0))
+ return;
+
+ split = g_strsplit(argv_idx(argv, 0), " ", 2);
+ if(split[0])
+ event_name = g_string_ascii_up(g_string_new(split[0]));
+ else
+ return;
+
+ send_event(0, event_name->str, TYPE_FORMATTEDSTR, split[1] ? split[1] : "", NULL);
+
+ g_string_free(event_name, TRUE);
+ g_strfreev(split);
+}
+
+void
+print(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+ gchar* buf;
+
+ if(!result)
+ return;
+
+ buf = expand(argv_idx(argv, 0), 0);
+ g_string_assign(result, buf);
+ g_free(buf);
+}
+
+void
+hardcopy(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) argv; (void) result;
+ webkit_web_frame_print(webkit_web_view_get_main_frame(page));
+}
+
+void
+include(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+ gchar *path = argv_idx(argv, 0);
+
+ if(!path)
+ return;
+
+ if((path = find_existing_file(path))) {
+ run_command_file(path);
+ send_event(FILE_INCLUDED, NULL, TYPE_STR, path, NULL);
+ g_free(path);
+ }
+}
+
+void
+show_inspector(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) argv; (void) result;
+
+ webkit_web_inspector_show(uzbl.gui.inspector);
+}
+
+void
+add_cookie(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+ gchar *host, *path, *name, *value;
+ gboolean secure = 0;
+ SoupDate *expires = NULL;
+
+ if(argv->len != 6)
+ return;
+
+ // Parse with same syntax as ADD_COOKIE event
+ host = argv_idx (argv, 0);
+ path = argv_idx (argv, 1);
+ name = argv_idx (argv, 2);
+ value = argv_idx (argv, 3);
+ secure = strcmp (argv_idx (argv, 4), "https") == 0;
+ if (strlen (argv_idx (argv, 5)) != 0)
+ expires = soup_date_new_from_time_t (
+ strtoul (argv_idx (argv, 5), NULL, 10));
+
+ // Create new cookie
+ SoupCookie * cookie = soup_cookie_new (name, value, host, path, -1);
+ soup_cookie_set_secure (cookie, secure);
+ if (expires)
+ soup_cookie_set_expires (cookie, expires);
+
+ // Add cookie to jar
+ uzbl.net.soup_cookie_jar->in_manual_add = 1;
+ soup_cookie_jar_add_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie);
+ uzbl.net.soup_cookie_jar->in_manual_add = 0;
+}
+
+void
+delete_cookie(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) result;
+
+ if(argv->len < 4)
+ return;
+
+ SoupCookie * cookie = soup_cookie_new (
+ argv_idx (argv, 2),
+ argv_idx (argv, 3),
+ argv_idx (argv, 0),
+ argv_idx (argv, 1),
+ 0);
+
+ uzbl.net.soup_cookie_jar->in_manual_add = 1;
+ soup_cookie_jar_delete_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie);
+ uzbl.net.soup_cookie_jar->in_manual_add = 0;
+}
+
+void
+clear_cookies(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) argv; (void) result;
+
+ // Replace the current cookie jar with a new empty jar
+ soup_session_remove_feature (uzbl.net.soup_session,
+ SOUP_SESSION_FEATURE (uzbl.net.soup_cookie_jar));
+ g_object_unref (G_OBJECT (uzbl.net.soup_cookie_jar));
+ uzbl.net.soup_cookie_jar = uzbl_cookie_jar_new ();
+ soup_session_add_feature(uzbl.net.soup_session,
+ SOUP_SESSION_FEATURE (uzbl.net.soup_cookie_jar));
+}
+
+void
+download(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void) result;
+
+ const gchar *uri = argv_idx(argv, 0);
+ const gchar *destination = NULL;
+ if(argv->len > 1)
+ destination = argv_idx(argv, 1);
+
+ WebKitNetworkRequest *req = webkit_network_request_new(uri);
+ WebKitDownload *download = webkit_download_new(req);
+
+ download_cb(web_view, download, (gpointer)destination);
+
+ if(webkit_download_get_destination_uri(download))
+ webkit_download_start(download);
+ else
+ g_object_unref(download);
+
+ g_object_unref(req);
+}
+
+void
+load_uri(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void) web_view; (void) result;
+ gchar * uri = argv_idx(argv, 0);
+ set_var_value("uri", uri ? uri : "");
+}
+
+void
+run_js (WebKitWebView * web_view, GArray *argv, GString *result) {
+ if (argv_idx(argv, 0))
+ eval_js(web_view, argv_idx(argv, 0), result, "(command)");
+}
+
+void
+run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) {
+ (void) result;
+ gchar *path = NULL;
+
+ if (argv_idx(argv, 0) &&
+ ((path = find_existing_file(argv_idx(argv, 0)))) ) {
+ gchar *file_contents = NULL;
+
+ GIOChannel *chan = g_io_channel_new_file(path, "r", NULL);
+ if (chan) {
+ gsize len;
+ g_io_channel_read_to_end(chan, &file_contents, &len, NULL);
+ g_io_channel_unref (chan);
+ }
+
+ if (uzbl.state.verbose)
+ printf ("External JavaScript file %s loaded\n", argv_idx(argv, 0));
+
+ gchar *js = str_replace("%s", argv_idx (argv, 1) ? argv_idx (argv, 1) : "", file_contents);
+ g_free (file_contents);
+
+ eval_js (web_view, js, result, path);
+ g_free (js);
+ g_free(path);
+ }
+}
+
+void
+search_clear(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) argv; (void) result;
+ webkit_web_view_unmark_text_matches (page);
+ g_free(uzbl.state.searchtx);
+ uzbl.state.searchtx = NULL;
+}
+
+void
+search_forward_text (WebKitWebView *page, GArray *argv, GString *result) {
+ (void) result;
+ search_text(page, argv_idx(argv, 0), TRUE);
+}
+
+void
+search_reverse_text(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) result;
+ search_text(page, argv_idx(argv, 0), FALSE);
+}
+
+void
+dehilight(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) argv; (void) result;
+ webkit_web_view_set_highlight_text_matches (page, FALSE);
+}
+
+void
+chain(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ guint i = 0;
+ const gchar *cmd;
+ GString *r = g_string_new ("");
+ while ((cmd = argv_idx(argv, i++))) {
+ GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
+ const CommandInfo *c = parse_command_parts(cmd, a);
+ if (c)
+ run_parsed_command(c, a, r);
+ g_array_free (a, TRUE);
+ }
+ if(result)
+ g_string_assign (result, r->str);
+
+ g_string_free(r, TRUE);
+}
+
+void
+close_uzbl (WebKitWebView *page, GArray *argv, GString *result) {
+ (void)page; (void)argv; (void)result;
+ gtk_main_quit ();
+}
+
+void
+spawn_async(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view; (void)result;
+ spawn(argv, NULL, FALSE);
+}
+
+void
+spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view;
+ spawn(argv, result, FALSE);
+}
+
+void
+spawn_sync_exec(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view;
+ if(!result) {
+ GString *force_result = g_string_new("");
+ spawn(argv, force_result, TRUE);
+ g_string_free (force_result, TRUE);
+ } else
+ spawn(argv, result, TRUE);
+}
+
+void
+spawn_sh_async(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view; (void)result;
+ spawn_sh(argv, NULL);
+}
+
+void
+spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view; (void)result;
+ spawn_sh(argv, result);
+}
+
+void
+act_dump_config(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view; (void) argv; (void)result;
+ dump_config();
+}
+
+void
+act_dump_config_as_events(WebKitWebView *web_view, GArray *argv, GString *result) {
+ (void)web_view; (void) argv; (void)result;
+ dump_config_as_events();
+}
diff --git a/src/commands.h b/src/commands.h
new file mode 100644
index 0000000..b8cf095
--- /dev/null
+++ b/src/commands.h
@@ -0,0 +1,68 @@
+/*
+ * Uzbl Commands
+ */
+#ifndef __COMMANDS__
+#define __COMMANDS__
+
+#include <webkit/webkit.h>
+
+typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);
+
+typedef struct {
+ const gchar *key;
+ Command function;
+ gboolean no_split;
+} CommandInfo;
+
+/**
+ * Initialises the hash table uzbl.behave.commands with the available commands.
+ */
+void
+commands_hash();
+
+/**
+ * Sends the BUILTINS events with the available commands.
+ */
+void
+builtins();
+
+
+void view_reload(WebKitWebView *page, GArray *argv, GString *result);
+void view_reload_bypass_cache(WebKitWebView *page, GArray *argv, GString *result);
+void view_stop_loading(WebKitWebView *page, GArray *argv, GString *result);
+void view_zoom_in(WebKitWebView *page, GArray *argv, GString *result);
+void view_zoom_out(WebKitWebView *page, GArray *argv, GString *result);
+void view_go_back(WebKitWebView *page, GArray *argv, GString *result);
+void view_go_forward(WebKitWebView *page, GArray *argv, GString *result);
+void toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result);
+void scroll_cmd(WebKitWebView* page, GArray *argv, GString *result);
+void print(WebKitWebView *page, GArray *argv, GString *result);
+void event(WebKitWebView *page, GArray *argv, GString *result);
+void load_uri(WebKitWebView * web_view, GArray *argv, GString *result);
+void chain(WebKitWebView *page, GArray *argv, GString *result);
+void close_uzbl(WebKitWebView *page, GArray *argv, GString *result);
+void spawn_async(WebKitWebView *web_view, GArray *argv, GString *result);
+void spawn_sh_async(WebKitWebView *web_view, GArray *argv, GString *result);
+void spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result);
+void spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result);
+void spawn_sync_exec(WebKitWebView *web_view, GArray *argv, GString *result);
+void search_forward_text (WebKitWebView *page, GArray *argv, GString *result);
+void search_reverse_text (WebKitWebView *page, GArray *argv, GString *result);
+void search_clear(WebKitWebView *page, GArray *argv, GString *result);
+void dehilight (WebKitWebView *page, GArray *argv, GString *result);
+void hardcopy(WebKitWebView *page, GArray *argv, GString *result);
+void include(WebKitWebView *page, GArray *argv, GString *result);
+void show_inspector(WebKitWebView *page, GArray *argv, GString *result);
+void add_cookie(WebKitWebView *page, GArray *argv, GString *result);
+void delete_cookie(WebKitWebView *page, GArray *argv, GString *result);
+void clear_cookies(WebKitWebView *pag, GArray *argv, GString *result);
+void download(WebKitWebView *pag, GArray *argv, GString *result);
+void set_var(WebKitWebView *page, GArray *argv, GString *result);
+void run_js (WebKitWebView * web_view, GArray *argv, GString *result);
+void run_external_js (WebKitWebView * web_view, GArray *argv, GString *result);
+void toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result);
+void toggle_status (WebKitWebView* page, GArray *argv, GString *result);
+void act_dump_config(WebKitWebView* page, GArray *argv, GString *result);
+void act_dump_config_as_events(WebKitWebView* page, GArray *argv, GString *result);
+
+#endif
diff --git a/src/cookie-jar.c b/src/cookie-jar.c
index c2ccd62..dd9585b 100644
--- a/src/cookie-jar.c
+++ b/src/cookie-jar.c
@@ -3,6 +3,7 @@
#include "cookie-jar.h"
#include "uzbl-core.h"
#include "events.h"
+#include "type.h"
G_DEFINE_TYPE (UzblCookieJar, soup_cookie_jar_socket, SOUP_TYPE_COOKIE_JAR)
diff --git a/src/events.c b/src/events.c
index a79a62a..d3da82b 100644
--- a/src/events.c
+++ b/src/events.c
@@ -6,8 +6,7 @@
#include "uzbl-core.h"
#include "events.h"
#include "util.h"
-
-UzblCore uzbl;
+#include "type.h"
/* Event id to name mapping
* Event names must be in the same
diff --git a/src/inspector.c b/src/inspector.c
index 7665621..d0d86b9 100644
--- a/src/inspector.c
+++ b/src/inspector.c
@@ -6,7 +6,7 @@
#include "uzbl-core.h"
#include "events.h"
#include "callbacks.h"
-
+#include "type.h"
void
hide_window_cb(GtkWidget *widget, gpointer data) {
diff --git a/src/io.c b/src/io.c
index 3f8fa2f..062a853 100644
--- a/src/io.c
+++ b/src/io.c
@@ -6,6 +6,7 @@
#include "io.h"
#include "util.h"
#include "uzbl-core.h"
+#include "type.h"
/*@null@*/ gchar*
build_stream_name(int type, const gchar* dir) {
diff --git a/src/menu.h b/src/menu.h
index 8b89f2f..03055e5 100644
--- a/src/menu.h
+++ b/src/menu.h
@@ -3,6 +3,14 @@
#include <webkit/webkit.h>
+typedef struct {
+ gchar* name;
+ gchar* cmd;
+ gboolean issep;
+ guint context;
+ WebKitHitTestResult* hittest;
+} MenuItem;
+
void menu_add(WebKitWebView *page, GArray *argv, GString *result);
void menu_add_link(WebKitWebView *page, GArray *argv, GString *result);
void menu_add_image(WebKitWebView *page, GArray *argv, GString *result);
diff --git a/src/type.h b/src/type.h
new file mode 100644
index 0000000..1709128
--- /dev/null
+++ b/src/type.h
@@ -0,0 +1,7 @@
+/*
+ * Uzbl Types
+ */
+
+enum ptr_type {TYPE_INT = 1, TYPE_STR, TYPE_FLOAT,
+ TYPE_NAME, TYPE_FORMATTEDSTR // used by send_event
+};
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index 6dd7a30..3cf2407 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -37,6 +37,8 @@
#include "util.h"
#include "menu.h"
#include "io.h"
+#include "variables.h"
+#include "type.h"
UzblCore uzbl;
@@ -67,110 +69,6 @@ GOptionEntry entries[] = {
{ NULL, 0, 0, 0, NULL, NULL, NULL }
};
-/* abbreviations to help keep the table's width humane */
-#define PTR_V_STR(var, d, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = d, .writeable = 1, .func = fun }
-#define PTR_V_INT(var, d, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = d, .writeable = 1, .func = fun }
-#define PTR_V_FLOAT(var, d, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = d, .writeable = 1, .func = fun }
-#define PTR_C_STR(var, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = 0, .writeable = 0, .func = fun }
-#define PTR_C_INT(var, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = 0, .writeable = 0, .func = fun }
-#define PTR_C_FLOAT(var, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = 0, .writeable = 0, .func = fun }
-
-const struct var_name_to_ptr_t {
- const char *name;
- uzbl_cmdprop cp;
-} var_name_to_ptr[] = {
-/* variable name pointer to variable in code dump callback function */
-/* ---------------------------------------------------------------------------------------------- */
- { "uri", PTR_V_STR(uzbl.state.uri, 1, cmd_load_uri)},
- { "verbose", PTR_V_INT(uzbl.state.verbose, 1, NULL)},
- { "print_events", PTR_V_INT(uzbl.state.events_stdout, 1, NULL)},
- { "inject_html", PTR_V_STR(uzbl.behave.inject_html, 0, cmd_inject_html)},
- { "geometry", PTR_V_STR(uzbl.gui.geometry, 1, cmd_set_geometry)},
- { "show_status", PTR_V_INT(uzbl.behave.show_status, 1, cmd_set_status)},
- { "status_top", PTR_V_INT(uzbl.behave.status_top, 1, move_statusbar)},
- { "status_format", PTR_V_STR(uzbl.behave.status_format, 1, NULL)},
- { "status_format_right", PTR_V_STR(uzbl.behave.status_format_right, 1, NULL)},
- { "status_background", PTR_V_STR(uzbl.behave.status_background, 1, set_status_background)},
- { "title_format_long", PTR_V_STR(uzbl.behave.title_format_long, 1, NULL)},
- { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)},
- { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)},
- { "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)},
- { "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)},
- { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)},
- { "download_handler", PTR_V_STR(uzbl.behave.download_handler, 1, NULL)},
- { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, cmd_fifo_dir)},
- { "socket_dir", PTR_V_STR(uzbl.behave.socket_dir, 1, cmd_socket_dir)},
- { "http_debug", PTR_V_INT(uzbl.behave.http_debug, 1, cmd_http_debug)},
- { "shell_cmd", PTR_V_STR(uzbl.behave.shell_cmd, 1, NULL)},
- { "proxy_url", PTR_V_STR(uzbl.net.proxy_url, 1, set_proxy_url)},
- { "max_conns", PTR_V_INT(uzbl.net.max_conns, 1, cmd_max_conns)},
- { "max_conns_host", PTR_V_INT(uzbl.net.max_conns_host, 1, cmd_max_conns_host)},
- { "useragent", PTR_V_STR(uzbl.net.useragent, 1, cmd_useragent)},
- { "accept_languages", PTR_V_STR(uzbl.net.accept_languages, 1, set_accept_languages)},
- { "javascript_windows", PTR_V_INT(uzbl.behave.javascript_windows, 1, cmd_javascript_windows)},
- /* requires webkit >=1.1.14 */
- { "view_source", PTR_V_INT(uzbl.behave.view_source, 0, cmd_view_source)},
-
- /* exported WebKitWebSettings properties */
- { "zoom_level", PTR_V_FLOAT(uzbl.behave.zoom_level, 1, cmd_zoom_level)},
- { "zoom_type", PTR_V_INT(uzbl.behave.zoom_type, 1, cmd_set_zoom_type)},
- { "font_size", PTR_V_INT(uzbl.behave.font_size, 1, cmd_font_size)},
- { "default_font_family", PTR_V_STR(uzbl.behave.default_font_family, 1, cmd_default_font_family)},
- { "monospace_font_family", PTR_V_STR(uzbl.behave.monospace_font_family, 1, cmd_monospace_font_family)},
- { "cursive_font_family", PTR_V_STR(uzbl.behave.cursive_font_family, 1, cmd_cursive_font_family)},
- { "sans_serif_font_family", PTR_V_STR(uzbl.behave.sans_serif_font_family, 1, cmd_sans_serif_font_family)},
- { "serif_font_family", PTR_V_STR(uzbl.behave.serif_font_family, 1, cmd_serif_font_family)},
- { "fantasy_font_family", PTR_V_STR(uzbl.behave.fantasy_font_family, 1, cmd_fantasy_font_family)},
- { "monospace_size", PTR_V_INT(uzbl.behave.monospace_size, 1, cmd_font_size)},
- { "minimum_font_size", PTR_V_INT(uzbl.behave.minimum_font_size, 1, cmd_minimum_font_size)},
- { "enable_pagecache", PTR_V_INT(uzbl.behave.enable_pagecache, 1, cmd_enable_pagecache)},
- { "disable_plugins", PTR_V_INT(uzbl.behave.disable_plugins, 1, cmd_disable_plugins)},
- { "disable_scripts", PTR_V_INT(uzbl.behave.disable_scripts, 1, cmd_disable_scripts)},
- { "autoload_images", PTR_V_INT(uzbl.behave.autoload_img, 1, cmd_autoload_img)},
- { "autoshrink_images", PTR_V_INT(uzbl.behave.autoshrink_img, 1, cmd_autoshrink_img)},
- { "enable_spellcheck", PTR_V_INT(uzbl.behave.enable_spellcheck, 1, cmd_enable_spellcheck)},
- { "enable_private", PTR_V_INT(uzbl.behave.enable_private, 1, cmd_enable_private)},
- { "print_backgrounds", PTR_V_INT(uzbl.behave.print_bg, 1, cmd_print_bg)},
- { "stylesheet_uri", PTR_V_STR(uzbl.behave.style_uri, 1, cmd_style_uri)},
- { "resizable_text_areas", PTR_V_INT(uzbl.behave.resizable_txt, 1, cmd_resizable_txt)},
- { "default_encoding", PTR_V_STR(uzbl.behave.default_encoding, 1, cmd_default_encoding)},
- { "current_encoding", PTR_V_STR(uzbl.behave.current_encoding, 1, set_current_encoding)},
- { "enforce_96_dpi", PTR_V_INT(uzbl.behave.enforce_96dpi, 1, cmd_enforce_96dpi)},
- { "caret_browsing", PTR_V_INT(uzbl.behave.caret_browsing, 1, cmd_caret_browsing)},
-
-#if !GTK_CHECK_VERSION(3,0,0)
- { "scrollbars_visible", PTR_V_INT(uzbl.gui.scrollbars_visible, 1, cmd_scrollbars_visibility)},
-#endif
-
- /* constants (not dumpable or writeable) */
- { "WEBKIT_MAJOR", PTR_C_INT(uzbl.info.webkit_major, NULL)},
- { "WEBKIT_MINOR", PTR_C_INT(uzbl.info.webkit_minor, NULL)},
- { "WEBKIT_MICRO", PTR_C_INT(uzbl.info.webkit_micro, NULL)},
- { "ARCH_UZBL", PTR_C_STR(uzbl.info.arch, NULL)},
- { "COMMIT", PTR_C_STR(uzbl.info.commit, NULL)},
- { "TITLE", PTR_C_STR(uzbl.gui.main_title, NULL)},
- { "SELECTED_URI", PTR_C_STR(uzbl.state.selected_url, NULL)},
- { "NAME", PTR_C_STR(uzbl.state.instance_name, NULL)},
- { "PID", PTR_C_STR(uzbl.info.pid_str, NULL)},
- { "_", PTR_C_STR(uzbl.state.last_result, NULL)},
-
- { NULL, {.ptr.s = NULL, .type = TYPE_INT, .dump = 0, .writeable = 0, .func = NULL}}
-};
-
-/* construct a hash from the var_name_to_ptr array for quick access */
-void
-create_var_to_name_hash() {
- const struct var_name_to_ptr_t *n2v_p = var_name_to_ptr;
- uzbl.comm.proto_var = g_hash_table_new(g_str_hash, g_str_equal);
- while(n2v_p->name) {
- g_hash_table_insert(uzbl.comm.proto_var,
- (gpointer) n2v_p->name,
- (gpointer) &n2v_p->cp);
- n2v_p++;
- }
-}
-
-
/* --- UTILITY FUNCTIONS --- */
enum exp_type {
EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE
@@ -193,7 +91,6 @@ get_exp_type(const gchar *s) {
*/
gchar*
expand(const char* s, guint recurse) {
- uzbl_cmdprop* c;
enum exp_type etype;
char* end_simple_var = "\t^°!\"§$%&/()=?'`'+~*'#-:,;@<>| \\{}[]¹²³¼½";
char* ret = NULL;
@@ -250,17 +147,8 @@ expand(const char* s, guint recurse) {
if(etype == EXP_SIMPLE_VAR ||
etype == EXP_BRACED_VAR) {
- if( (c = g_hash_table_lookup(uzbl.comm.proto_var, ret)) ) {
- if(c->type == TYPE_STR && *c->ptr.s != NULL) {
- g_string_append(buf, (gchar *)*c->ptr.s);
- }
- else if(c->type == TYPE_INT) {
- g_string_append_printf(buf, "%d", *c->ptr.i);
- }
- else if(c->type == TYPE_FLOAT) {
- g_string_append_printf(buf, "%f", *c->ptr.f);
- }
- }
+
+ expand_variable(buf, ret);
if(etype == EXP_SIMPLE_VAR)
s = vend;
@@ -454,194 +342,8 @@ scroll(GtkAdjustment* bar, gchar *amount_str) {
gtk_adjustment_set_value (bar, value);
}
-/*
- * scroll vertical 20
- * scroll vertical 20%
- * scroll vertical -40
- * scroll vertical begin
- * scroll vertical end
- * scroll horizontal 10
- * scroll horizontal -500
- * scroll horizontal begin
- * scroll horizontal end
- */
-void
-scroll_cmd(WebKitWebView* page, GArray *argv, GString *result) {
- (void) page; (void) result;
- gchar *direction = g_array_index(argv, gchar*, 0);
- gchar *argv1 = g_array_index(argv, gchar*, 1);
- GtkAdjustment *bar = NULL;
-
- if (g_strcmp0(direction, "horizontal") == 0)
- bar = uzbl.gui.bar_h;
- else if (g_strcmp0(direction, "vertical") == 0)
- bar = uzbl.gui.bar_v;
- else {
- if(uzbl.state.verbose)
- puts("Unrecognized scroll format");
- return;
- }
-
- if (g_strcmp0(argv1, "begin") == 0)
- gtk_adjustment_set_value(bar, gtk_adjustment_get_lower(bar));
- else if (g_strcmp0(argv1, "end") == 0)
- gtk_adjustment_set_value (bar, gtk_adjustment_get_upper(bar) -
- gtk_adjustment_get_page_size(bar));
- else
- scroll(bar, argv1);
-}
-
-
-/* VIEW funcs (little webkit wrappers) */
-#define VIEWFUNC(name) void view_##name(WebKitWebView *page, GArray *argv, GString *result){(void)argv; (void)result; webkit_web_view_##name(page);}
-VIEWFUNC(reload)
-VIEWFUNC(reload_bypass_cache)
-VIEWFUNC(stop_loading)
-VIEWFUNC(zoom_in)
-VIEWFUNC(zoom_out)
-VIEWFUNC(go_back)
-VIEWFUNC(go_forward)
-#undef VIEWFUNC
-
-/* -- command to callback/function map for things we cannot attach to any signals */
-CommandInfo cmdlist[] =
-{ /* key function no_split */
- { "back", view_go_back, 0 },
- { "forward", view_go_forward, 0 },
- { "scroll", scroll_cmd, 0 },
- { "reload", view_reload, 0 },
- { "reload_ign_cache", view_reload_bypass_cache, 0 },
- { "stop", view_stop_loading, 0 },
- { "zoom_in", view_zoom_in, 0 }, //Can crash (when max zoom reached?).
- { "zoom_out", view_zoom_out, 0 },
- { "toggle_zoom_type", toggle_zoom_type, 0 },
- { "uri", load_uri, TRUE },
- { "js", run_js, TRUE },
- { "script", run_external_js, 0 },
- { "toggle_status", toggle_status_cb, 0 },
- { "spawn", spawn_async, 0 },
- { "sync_spawn", spawn_sync, 0 },
- { "sync_spawn_exec", spawn_sync_exec, 0 }, // needed for load_cookies.sh :(
- { "sh", spawn_sh_async, 0 },
- { "sync_sh", spawn_sh_sync, 0 },
- { "exit", close_uzbl, 0 },
- { "search", search_forward_text, TRUE },
- { "search_reverse", search_reverse_text, TRUE },
- { "search_clear", search_clear, TRUE },
- { "dehilight", dehilight, 0 },
- { "set", set_var, TRUE },
- { "dump_config", act_dump_config, 0 },
- { "dump_config_as_events", act_dump_config_as_events, 0 },
- { "chain", chain, 0 },
- { "print", print, TRUE },
- { "event", event, TRUE },
- { "request", event, TRUE },
- { "menu_add", menu_add, TRUE },
- { "menu_link_add", menu_add_link, TRUE },
- { "menu_image_add", menu_add_image, TRUE },
- { "menu_editable_add", menu_add_edit, TRUE },
- { "menu_separator", menu_add_separator, TRUE },
- { "menu_link_separator", menu_add_separator_link, TRUE },
- { "menu_image_separator", menu_add_separator_image, TRUE },
- { "menu_editable_separator", menu_add_separator_edit, TRUE },
- { "menu_remove", menu_remove, TRUE },
- { "menu_link_remove", menu_remove_link, TRUE },
- { "menu_image_remove", menu_remove_image, TRUE },
- { "menu_editable_remove", menu_remove_edit, TRUE },
- { "hardcopy", hardcopy, TRUE },
- { "include", include, TRUE },
- { "show_inspector", show_inspector, 0 },
- { "add_cookie", add_cookie, 0 },
- { "delete_cookie", delete_cookie, 0 },
- { "clear_cookies", clear_cookies, 0 },
- { "download", download, 0 }
-};
-
-void
-commands_hash(void) {
- unsigned int i;
- uzbl.behave.commands = g_hash_table_new(g_str_hash, g_str_equal);
-
- for (i = 0; i < LENGTH(cmdlist); i++)
- g_hash_table_insert(uzbl.behave.commands, (gpointer) cmdlist[i].key, &cmdlist[i]);
-}
-
-
-void
-builtins() {
- unsigned int i;
- unsigned int len = LENGTH(cmdlist);
- GString* command_list = g_string_new("");
-
- for (i = 0; i < len; i++) {
- g_string_append(command_list, cmdlist[i].key);
- g_string_append_c(command_list, ' ');
- }
-
- send_event(BUILTINS, NULL, TYPE_STR, command_list->str, NULL);
- g_string_free(command_list, TRUE);
-}
-
/* -- CORE FUNCTIONS -- */
-void
-set_var(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) result;
-
- if(!argv_idx(argv, 0))
- return;
-
- gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2);
- if (split[0] != NULL) {
- gchar *value = split[1] ? g_strchug(split[1]) : " ";
- set_var_value(g_strstrip(split[0]), value);
- }
- g_strfreev(split);
-}
-
-
-void
-event(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) result;
- GString *event_name;
- gchar **split = NULL;
-
- if(!argv_idx(argv, 0))
- return;
-
- split = g_strsplit(argv_idx(argv, 0), " ", 2);
- if(split[0])
- event_name = g_string_ascii_up(g_string_new(split[0]));
- else
- return;
-
- send_event(0, event_name->str, TYPE_FORMATTEDSTR, split[1] ? split[1] : "", NULL);
-
- g_string_free(event_name, TRUE);
- g_strfreev(split);
-}
-
-void
-print(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) result;
- gchar* buf;
-
- if(!result)
- return;
-
- buf = expand(argv_idx(argv, 0), 0);
- g_string_assign(result, buf);
- g_free(buf);
-}
-
-void
-hardcopy(WebKitWebView *page, GArray *argv, GString *result) {
- (void) argv;
- (void) result;
-
- webkit_web_frame_print(webkit_web_view_get_main_frame(page));
-}
-
/* just a wrapper so parse_cmd_line can be used with for_each_line_in_file */
static void
parse_cmd_line_cb(const char *line, void *user_data) {
@@ -650,135 +352,12 @@ parse_cmd_line_cb(const char *line, void *user_data) {
}
void
-include(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
- gchar *path = argv_idx(argv, 0);
-
- if(!path)
- return;
-
- if((path = find_existing_file(path))) {
- if(!for_each_line_in_file(path, parse_cmd_line_cb, NULL)) {
- gchar *tmp = g_strdup_printf("File %s can not be read.", path);
- send_event(COMMAND_ERROR, NULL, TYPE_STR, tmp, NULL);
- g_free(tmp);
- }
-
- send_event(FILE_INCLUDED, NULL, TYPE_STR, path, NULL);
- g_free(path);
- }
-}
-
-void
-show_inspector(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) argv; (void) result;
-
- webkit_web_inspector_show(uzbl.gui.inspector);
-}
-
-void
-add_cookie(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) result;
- gchar *host, *path, *name, *value;
- gboolean secure = 0;
- SoupDate *expires = NULL;
-
- if(argv->len != 6)
- return;
-
- // Parse with same syntax as ADD_COOKIE event
- host = argv_idx (argv, 0);
- path = argv_idx (argv, 1);
- name = argv_idx (argv, 2);
- value = argv_idx (argv, 3);
- secure = strcmp (argv_idx (argv, 4), "https") == 0;
- if (strlen (argv_idx (argv, 5)) != 0)
- expires = soup_date_new_from_time_t (
- strtoul (argv_idx (argv, 5), NULL, 10));
-
- // Create new cookie
- SoupCookie * cookie = soup_cookie_new (name, value, host, path, -1);
- soup_cookie_set_secure (cookie, secure);
- if (expires)
- soup_cookie_set_expires (cookie, expires);
-
- // Add cookie to jar
- uzbl.net.soup_cookie_jar->in_manual_add = 1;
- soup_cookie_jar_add_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie);
- uzbl.net.soup_cookie_jar->in_manual_add = 0;
-}
-
-void
-delete_cookie(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) result;
-
- if(argv->len < 4)
- return;
-
- SoupCookie * cookie = soup_cookie_new (
- argv_idx (argv, 2),
- argv_idx (argv, 3),
- argv_idx (argv, 0),
- argv_idx (argv, 1),
- 0);
-
- uzbl.net.soup_cookie_jar->in_manual_add = 1;
- soup_cookie_jar_delete_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie);
- uzbl.net.soup_cookie_jar->in_manual_add = 0;
-}
-
-
-void
-clear_cookies(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page; (void) argv; (void) result;
-
- // Replace the current cookie jar with a new empty jar
- soup_session_remove_feature (uzbl.net.soup_session,
- SOUP_SESSION_FEATURE (uzbl.net.soup_cookie_jar));
- g_object_unref (G_OBJECT (uzbl.net.soup_cookie_jar));
- uzbl.net.soup_cookie_jar = uzbl_cookie_jar_new ();
- soup_session_add_feature(uzbl.net.soup_session,
- SOUP_SESSION_FEATURE (uzbl.net.soup_cookie_jar));
-}
-
-void
-download(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void) result;
-
- const gchar *uri = argv_idx(argv, 0);
- const gchar *destination = NULL;
- if(argv->len > 1)
- destination = argv_idx(argv, 1);
-
- WebKitNetworkRequest *req = webkit_network_request_new(uri);
- WebKitDownload *download = webkit_download_new(req);
-
- download_cb(web_view, download, (gpointer)destination);
-
- if(webkit_download_get_destination_uri(download))
- webkit_download_start(download);
- else
- g_object_unref(download);
-
- g_object_unref(req);
-}
-
-void
-act_dump_config() {
- dump_config();
-}
-
-void
-act_dump_config_as_events() {
- dump_config_as_events();
-}
-
-void
-load_uri(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void) web_view; (void) result;
- gchar * uri = argv_idx(argv, 0);
- set_var_value("uri", uri ? uri : "");
+run_command_file(const gchar *path) {
+ if(!for_each_line_in_file(path, parse_cmd_line_cb, NULL)) {
+ gchar *tmp = g_strdup_printf("File %s can not be read.", path);
+ send_event(COMMAND_ERROR, NULL, TYPE_STR, tmp, NULL);
+ g_free(tmp);
+ }
}
/* Javascript*/
@@ -862,51 +441,16 @@ eval_js(WebKitWebView * web_view, const gchar *script, GString *result, const ch
}
void
-run_js (WebKitWebView * web_view, GArray *argv, GString *result) {
- if (argv_idx(argv, 0))
- eval_js(web_view, argv_idx(argv, 0), result, "(command)");
-}
-
-void
-run_external_js (WebKitWebView * web_view, GArray *argv, GString *result) {
- (void) result;
- gchar *path = NULL;
-
- if (argv_idx(argv, 0) &&
- ((path = find_existing_file(argv_idx(argv, 0)))) ) {
- gchar *file_contents = NULL;
-
- GIOChannel *chan = g_io_channel_new_file(path, "r", NULL);
- if (chan) {
- gsize len;
- g_io_channel_read_to_end(chan, &file_contents, &len, NULL);
- g_io_channel_unref (chan);
- }
-
- if (uzbl.state.verbose)
- printf ("External JavaScript file %s loaded\n", argv_idx(argv, 0));
-
- gchar *js = str_replace("%s", argv_idx (argv, 1) ? argv_idx (argv, 1) : "", file_contents);
- g_free (file_contents);
-
- eval_js (web_view, js, result, path);
- g_free (js);
- g_free(path);
- }
-}
-
-void
-search_text (WebKitWebView *page, GArray *argv, const gboolean forward) {
- if (argv_idx(argv, 0) && (*argv_idx(argv, 0) != '\0')) {
- if (g_strcmp0 (uzbl.state.searchtx, argv_idx(argv, 0)) != 0) {
+search_text (WebKitWebView *page, const gchar *key, const gboolean forward) {
+ if (key && (*key != '\0')) {
+ if (g_strcmp0 (uzbl.state.searchtx, key) != 0) {
webkit_web_view_unmark_text_matches (page);
- webkit_web_view_mark_text_matches (page, argv_idx(argv, 0), FALSE, 0);
+ webkit_web_view_mark_text_matches (page, key, FALSE, 0);
g_free (uzbl.state.searchtx);
- uzbl.state.searchtx = g_strdup(argv_idx(argv, 0));
+ uzbl.state.searchtx = g_strdup (key);
}
}
-
if (uzbl.state.searchtx) {
if (uzbl.state.verbose)
printf ("Searching: %s\n", uzbl.state.searchtx);
@@ -916,61 +460,6 @@ search_text (WebKitWebView *page, GArray *argv, const gboolean forward) {
}
void
-search_clear(WebKitWebView *page, GArray *argv, GString *result) {
- (void) argv;
- (void) result;
-
- webkit_web_view_unmark_text_matches (page);
- g_free(uzbl.state.searchtx);
- uzbl.state.searchtx = NULL;
-}
-
-void
-search_forward_text (WebKitWebView *page, GArray *argv, GString *result) {
- (void) result;
- search_text(page, argv, TRUE);
-}
-
-void
-search_reverse_text(WebKitWebView *page, GArray *argv, GString *result) {
- (void) result;
- search_text(page, argv, FALSE);
-}
-
-void
-dehilight(WebKitWebView *page, GArray *argv, GString *result) {
- (void) argv; (void) result;
- webkit_web_view_set_highlight_text_matches (page, FALSE);
-}
-
-void
-chain(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- guint i = 0;
- const gchar *cmd;
- GString *r = g_string_new ("");
- while ((cmd = argv_idx(argv, i++))) {
- GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*));
- const CommandInfo *c = parse_command_parts(cmd, a);
- if (c)
- run_parsed_command(c, a, r);
- g_array_free (a, TRUE);
- }
- if(result)
- g_string_assign (result, r->str);
-
- g_string_free(r, TRUE);
-}
-
-void
-close_uzbl (WebKitWebView *page, GArray *argv, GString *result) {
- (void)page;
- (void)argv;
- (void)result;
- gtk_main_quit ();
-}
-
-void
sharg_append(GArray *a, const gchar *str) {
const gchar *s = (str ? str : "");
g_array_append_val(a, s);
@@ -1089,29 +578,6 @@ spawn(GArray *argv, GString *result, gboolean exec) {
}
void
-spawn_async(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void)web_view; (void)result;
- spawn(argv, NULL, FALSE);
-}
-
-void
-spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void)web_view;
- spawn(argv, result, FALSE);
-}
-
-void
-spawn_sync_exec(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void)web_view;
- if(!result) {
- GString *force_result = g_string_new("");
- spawn(argv, force_result, TRUE);
- g_string_free (force_result, TRUE);
- } else
- spawn(argv, result, TRUE);
-}
-
-void
spawn_sh(GArray *argv, GString *result) {
if (!uzbl.behave.shell_cmd) {
g_printerr ("spawn_sh: shell_cmd is not set!\n");
@@ -1142,18 +608,6 @@ spawn_sh(GArray *argv, GString *result) {
}
void
-spawn_sh_async(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void)web_view; (void)result;
- spawn_sh(argv, NULL);
-}
-
-void
-spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result) {
- (void)web_view; (void)result;
- spawn_sh(argv, result);
-}
-
-void
run_parsed_command(const CommandInfo *c, GArray *a, GString *result) {
/* send the COMMAND_EXECUTED event, except for set and event/request commands */
if(strcmp("set", c->key) &&
@@ -1254,7 +708,6 @@ parse_command(const char *cmd, const char *params, GString *result) {
}
}
-
void
move_statusbar() {
if (!uzbl.gui.scrolled_win && !uzbl.gui.mainbar)
@@ -1287,97 +740,6 @@ valid_name(const gchar* name) {
}
void
-send_set_var_event(const char *name, const uzbl_cmdprop *c) {
- /* check for the variable type */
- switch(c->type) {
- case TYPE_STR:
- send_event (VARIABLE_SET, NULL,
- TYPE_NAME, name,
- TYPE_NAME, "str",
- TYPE_STR, *c->ptr.s ? *c->ptr.s : " ",
- NULL);
- break;
- case TYPE_INT:
- send_event (VARIABLE_SET, NULL,
- TYPE_NAME, name,
- TYPE_NAME, "int",
- TYPE_INT, *c->ptr.i,
- NULL);
- break;
- case TYPE_FLOAT:
- send_event (VARIABLE_SET, NULL,
- TYPE_NAME, name,
- TYPE_NAME, "float",
- TYPE_FLOAT, *c->ptr.f,
- NULL);
- break;
- default:
- g_assert_not_reached();
- }
-}
-
-gboolean
-set_var_value(const gchar *name, gchar *val) {
- uzbl_cmdprop *c = NULL;
- char *endp = NULL;
- char *buf = NULL;
-
- g_assert(val != NULL);
-
- if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) {
- if(!c->writeable) return FALSE;
-
- switch(c->type) {
- case TYPE_STR:
- buf = g_strdup(val);
- g_free(*c->ptr.s);
- *c->ptr.s = buf;
- break;
- case TYPE_INT:
- *c->ptr.i = (int)strtoul(val, &endp, 10);
- break;
- case TYPE_FLOAT:
- *c->ptr.f = strtod(val, &endp);
- break;
- default:
- g_assert_not_reached();
- }
-
- send_set_var_event(name, c);
-
- /* invoke a command specific function */
- if(c->func) c->func();
- } else {
- /* check wether name violates our naming scheme */
- if(!valid_name(name)) {
- if (uzbl.state.verbose)
- printf("Invalid variable name: %s\n", name);
- return FALSE;
- }
-
- /* custom vars */
- c = g_malloc(sizeof(uzbl_cmdprop));
- c->type = TYPE_STR;
- c->dump = 0;
- c->func = NULL;
- c->writeable = 1;
- buf = g_strdup(val);
- c->ptr.s = g_malloc(sizeof(char *));
- *c->ptr.s = buf;
- g_hash_table_insert(uzbl.comm.proto_var,
- g_strdup(name), (gpointer) c);
-
- send_event (VARIABLE_SET, NULL,
- TYPE_NAME, name,
- TYPE_NAME, "str",
- TYPE_STR, buf,
- NULL);
- }
- update_title();
- return TRUE;
-}
-
-void
parse_cmd_line(const char *ctl_line, GString *result) {
gchar *work_string = g_strdup(ctl_line);
@@ -1584,11 +946,7 @@ settings_init () {
/* Load config file, if any */
if (s->config_file) {
- if (!for_each_line_in_file(s->config_file, parse_cmd_line_cb, NULL)) {
- gchar *tmp = g_strdup_printf("File %s can not be read.", s->config_file);
- send_event(COMMAND_ERROR, NULL, TYPE_STR, tmp, NULL);
- g_free(tmp);
- }
+ run_command_file(s->config_file);
g_setenv("UZBL_CONFIG", s->config_file, TRUE);
} else if (uzbl.state.verbose)
printf ("No configuration file loaded.\n");
@@ -1655,41 +1013,6 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au
}
void
-dump_var_hash(gpointer k, gpointer v, gpointer ud) {
- (void) ud;
- uzbl_cmdprop *c = v;
-
- if(!c->dump)
- return;
-
- if(c->type == TYPE_STR)
- printf("set %s = %s\n", (char *)k, *c->ptr.s ? *c->ptr.s : " ");
- else if(c->type == TYPE_INT)
- printf("set %s = %d\n", (char *)k, *c->ptr.i);
- else if(c->type == TYPE_FLOAT)
- printf("set %s = %f\n", (char *)k, *c->ptr.f);
-}
-
-void
-dump_config() {
- g_hash_table_foreach(uzbl.comm.proto_var, dump_var_hash, NULL);
-}
-
-void
-dump_var_hash_as_event(gpointer k, gpointer v, gpointer ud) {
- (void) ud;
- uzbl_cmdprop *c = v;
-
- if(c->dump)
- send_set_var_event(k, c);
-}
-
-void
-dump_config_as_events() {
- g_hash_table_foreach(uzbl.comm.proto_var, dump_var_hash_as_event, NULL);
-}
-
-void
retrieve_geometry() {
int w, h, x, y;
GString *buf = g_string_new("");
@@ -1760,7 +1083,7 @@ initialize(int argc, char** argv) {
commands_hash();
- create_var_to_name_hash();
+ variables_hash();
/* GUI */
gtk_init(&argc, &argv);
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index ce42408..892c779 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -48,6 +48,7 @@
#endif
#include "cookie-jar.h"
+#include "commands.h"
#define LENGTH(x) (sizeof x / sizeof x[0])
@@ -90,7 +91,6 @@ enum { FIFO, SOCKET};
typedef struct {
gchar *fifo_path;
gchar *socket_path;
- GHashTable *proto_var; /* stores (key)"variable name" -> (value)"pointer to var */
GPtrArray *connect_chan;
GPtrArray *client_chan;
@@ -194,9 +194,8 @@ typedef struct {
/* command list: (key)name -> (value)Command */
GHashTable* commands;
-
- /* event lookup: (key)event_id -> (value)event_name */
- GHashTable *event_lookup;
+ /* variables: (key)name -> (value)uzbl_cmdprop */
+ GHashTable *proto_var;
} Behaviour;
@@ -228,22 +227,6 @@ extern UzblCore uzbl; /* Main Uzbl object */
typedef void sigfunc(int);
-/* Uzbl variables */
-enum ptr_type {TYPE_INT = 1, TYPE_STR, TYPE_FLOAT,
- TYPE_NAME, TYPE_FORMATTEDSTR // used by send_event
-};
-typedef struct {
- enum ptr_type type;
- union {
- int *i;
- float *f;
- gchar **s;
- } ptr;
- int dump;
- int writeable;
- /*@null@*/ void (*func)(void);
-} uzbl_cmdprop;
-
/* Functions */
void clean_up(void);
void update_title(void);
@@ -252,23 +235,24 @@ void update_title(void);
void catch_sigterm(int s);
sigfunc* setup_signal(int signe, sigfunc *shandler);
-gboolean set_var_value(const gchar *name, gchar *val);
-void print(WebKitWebView *page, GArray *argv, GString *result);
-void commands_hash(void);
-void load_uri(WebKitWebView * web_view, GArray *argv, GString *result);
-void chain(WebKitWebView *page, GArray *argv, GString *result);
-void close_uzbl(WebKitWebView *page, GArray *argv, GString *result);
+/* Subprocess spawning */
+void spawn(GArray *argv, GString *result, gboolean exec);
+void spawn_sh(GArray *argv, GString *result);
+
+/* Configuration variables */
+gboolean valid_name(const gchar* name);
/* Running commands */
+gchar* expand(const char* s, guint recurse);
gboolean run_command(const gchar *command, const gchar **args, const gboolean sync,
char **output_stdout);
-void spawn_async(WebKitWebView *web_view, GArray *argv, GString *result);
-void spawn_sh_async(WebKitWebView *web_view, GArray *argv, GString *result);
-void spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result);
-void spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result);
-void spawn_sync_exec(WebKitWebView *web_view, GArray *argv, GString *result);
+void run_command_file(const gchar *path);
void parse_command(const char *cmd, const char *param, GString *result);
void parse_cmd_line(const char *ctl_line, GString *result);
+const CommandInfo *
+ parse_command_parts(const gchar *line, GArray *a);
+void parse_command_arguments(const gchar *p, GArray *a, gboolean no_split);
+void run_parsed_command(const CommandInfo *c, GArray *a, GString *result);
/* Keyboard events functions */
gboolean key_press_cb(GtkWidget* window, GdkEventKey* event);
@@ -280,19 +264,12 @@ void create_scrolled_win();
GtkWidget* create_mainbar();
GtkWidget* create_window();
GtkPlug* create_plug();
-void run_handler(const gchar *act, const gchar *args);
void settings_init();
/* Search functions */
-void search_text (WebKitWebView *page, GArray *argv, const gboolean forward);
-void search_forward_text (WebKitWebView *page, GArray *argv, GString *result);
-void search_reverse_text (WebKitWebView *page, GArray *argv, GString *result);
-void search_clear(WebKitWebView *page, GArray *argv, GString *result);
-void dehilight (WebKitWebView *page, GArray *argv, GString *result);
+void search_text (WebKitWebView *page, const gchar *key, const gboolean forward);
/* Javascript functions */
-void run_js (WebKitWebView * web_view, GArray *argv, GString *result);
-void run_external_js (WebKitWebView * web_view, GArray *argv, GString *result);
void eval_js(WebKitWebView *web_view, const gchar *script, GString *result, const gchar *script_file);
/* Network functions */
@@ -301,54 +278,15 @@ void handle_authentication (SoupSession *session,
SoupAuth *auth,
gboolean retrying,
gpointer user_data);
-gboolean valid_name(const gchar* name);
-void set_var(WebKitWebView *page, GArray *argv, GString *result);
-void act_dump_config();
-void act_dump_config_as_events();
-void dump_var_hash(gpointer k, gpointer v, gpointer ud);
-void dump_key_hash(gpointer k, gpointer v, gpointer ud);
-void dump_config();
-void dump_config_as_events();
-void retrieve_geometry();
-void event(WebKitWebView *page, GArray *argv, GString *result);
void init_connect_socket();
gboolean remove_socket_from_array(GIOChannel *chan);
+/* Window */
+void retrieve_geometry();
+void scroll(GtkAdjustment* bar, gchar *amount_str);
gint get_click_context();
-void hardcopy(WebKitWebView *page, GArray *argv, GString *result);
-void include(WebKitWebView *page, GArray *argv, GString *result);
-void show_inspector(WebKitWebView *page, GArray *argv, GString *result);
-void add_cookie(WebKitWebView *page, GArray *argv, GString *result);
-void delete_cookie(WebKitWebView *page, GArray *argv, GString *result);
-void clear_cookies(WebKitWebView *pag, GArray *argv, GString *result);
-void download(WebKitWebView *pag, GArray *argv, GString *result);
-void builtins();
-typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);
-
-typedef struct {
- const gchar *key;
- Command function;
- gboolean no_split;
-} CommandInfo;
-
-const CommandInfo *
-parse_command_parts(const gchar *line, GArray *a);
-
-void
-parse_command_arguments(const gchar *p, GArray *a, gboolean no_split);
-
-void
-run_parsed_command(const CommandInfo *c, GArray *a, GString *result);
-
-typedef struct {
- gchar* name;
- gchar* cmd;
- gboolean issep;
- guint context;
- WebKitHitTestResult* hittest;
-} MenuItem;
#endif
/* vi: set et ts=4: */
diff --git a/src/variables.c b/src/variables.c
new file mode 100644
index 0000000..a3621dd
--- /dev/null
+++ b/src/variables.c
@@ -0,0 +1,585 @@
+#include "variables.h"
+#include "uzbl-core.h"
+#include "callbacks.h"
+#include "events.h"
+#include "io.h"
+#include "util.h"
+#include "type.h"
+
+/* abbreviations to help keep the table's width humane */
+#define PTR_V_STR(var, d, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = d, .writeable = 1, .func = fun }
+#define PTR_V_INT(var, d, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = d, .writeable = 1, .func = fun }
+#define PTR_V_FLOAT(var, d, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = d, .writeable = 1, .func = fun }
+#define PTR_C_STR(var, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = 0, .writeable = 0, .func = fun }
+#define PTR_C_INT(var, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = 0, .writeable = 0, .func = fun }
+#define PTR_C_FLOAT(var, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = 0, .writeable = 0, .func = fun }
+
+typedef struct {
+ enum ptr_type type;
+ union {
+ int *i;
+ float *f;
+ gchar **s;
+ } ptr;
+ int dump;
+ int writeable;
+ /*@null@*/ void (*func)(void);
+} uzbl_cmdprop;
+
+const struct var_name_to_ptr_t {
+ const char *name;
+ uzbl_cmdprop cp;
+} var_name_to_ptr[] = {
+/* variable name pointer to variable in code dump callback function */
+/* ---------------------------------------------------------------------------------------------- */
+ { "uri", PTR_V_STR(uzbl.state.uri, 1, cmd_load_uri)},
+ { "verbose", PTR_V_INT(uzbl.state.verbose, 1, NULL)},
+ { "print_events", PTR_V_INT(uzbl.state.events_stdout, 1, NULL)},
+ { "inject_html", PTR_V_STR(uzbl.behave.inject_html, 0, cmd_inject_html)},
+ { "geometry", PTR_V_STR(uzbl.gui.geometry, 1, cmd_set_geometry)},
+ { "show_status", PTR_V_INT(uzbl.behave.show_status, 1, cmd_set_status)},
+ { "status_top", PTR_V_INT(uzbl.behave.status_top, 1, move_statusbar)},
+ { "status_format", PTR_V_STR(uzbl.behave.status_format, 1, NULL)},
+ { "status_format_right", PTR_V_STR(uzbl.behave.status_format_right, 1, NULL)},
+ { "status_background", PTR_V_STR(uzbl.behave.status_background, 1, set_status_background)},
+ { "title_format_long", PTR_V_STR(uzbl.behave.title_format_long, 1, NULL)},
+ { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)},
+ { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)},
+ { "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)},
+ { "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)},
+ { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)},
+ { "download_handler", PTR_V_STR(uzbl.behave.download_handler, 1, NULL)},
+ { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, cmd_fifo_dir)},
+ { "socket_dir", PTR_V_STR(uzbl.behave.socket_dir, 1, cmd_socket_dir)},
+ { "http_debug", PTR_V_INT(uzbl.behave.http_debug, 1, cmd_http_debug)},
+ { "shell_cmd", PTR_V_STR(uzbl.behave.shell_cmd, 1, NULL)},
+ { "proxy_url", PTR_V_STR(uzbl.net.proxy_url, 1, set_proxy_url)},
+ { "max_conns", PTR_V_INT(uzbl.net.max_conns, 1, cmd_max_conns)},
+ { "max_conns_host", PTR_V_INT(uzbl.net.max_conns_host, 1, cmd_max_conns_host)},
+ { "useragent", PTR_V_STR(uzbl.net.useragent, 1, cmd_useragent)},
+ { "accept_languages", PTR_V_STR(uzbl.net.accept_languages, 1, set_accept_languages)},
+ { "javascript_windows", PTR_V_INT(uzbl.behave.javascript_windows, 1, cmd_javascript_windows)},
+ /* requires webkit >=1.1.14 */
+ { "view_source", PTR_V_INT(uzbl.behave.view_source, 0, cmd_view_source)},
+
+ /* exported WebKitWebSettings properties */
+ { "zoom_level", PTR_V_FLOAT(uzbl.behave.zoom_level, 1, cmd_zoom_level)},
+ { "zoom_type", PTR_V_INT(uzbl.behave.zoom_type, 1, cmd_set_zoom_type)},
+ { "font_size", PTR_V_INT(uzbl.behave.font_size, 1, cmd_font_size)},
+ { "default_font_family", PTR_V_STR(uzbl.behave.default_font_family, 1, cmd_default_font_family)},
+ { "monospace_font_family", PTR_V_STR(uzbl.behave.monospace_font_family, 1, cmd_monospace_font_family)},
+ { "cursive_font_family", PTR_V_STR(uzbl.behave.cursive_font_family, 1, cmd_cursive_font_family)},
+ { "sans_serif_font_family", PTR_V_STR(uzbl.behave.sans_serif_font_family, 1, cmd_sans_serif_font_family)},
+ { "serif_font_family", PTR_V_STR(uzbl.behave.serif_font_family, 1, cmd_serif_font_family)},
+ { "fantasy_font_family", PTR_V_STR(uzbl.behave.fantasy_font_family, 1, cmd_fantasy_font_family)},
+ { "monospace_size", PTR_V_INT(uzbl.behave.monospace_size, 1, cmd_font_size)},
+ { "minimum_font_size", PTR_V_INT(uzbl.behave.minimum_font_size, 1, cmd_minimum_font_size)},
+ { "enable_pagecache", PTR_V_INT(uzbl.behave.enable_pagecache, 1, cmd_enable_pagecache)},
+ { "disable_plugins", PTR_V_INT(uzbl.behave.disable_plugins, 1, cmd_disable_plugins)},
+ { "disable_scripts", PTR_V_INT(uzbl.behave.disable_scripts, 1, cmd_disable_scripts)},
+ { "autoload_images", PTR_V_INT(uzbl.behave.autoload_img, 1, cmd_autoload_img)},
+ { "autoshrink_images", PTR_V_INT(uzbl.behave.autoshrink_img, 1, cmd_autoshrink_img)},
+ { "enable_spellcheck", PTR_V_INT(uzbl.behave.enable_spellcheck, 1, cmd_enable_spellcheck)},
+ { "enable_private", PTR_V_INT(uzbl.behave.enable_private, 1, cmd_enable_private)},
+ { "print_backgrounds", PTR_V_INT(uzbl.behave.print_bg, 1, cmd_print_bg)},
+ { "stylesheet_uri", PTR_V_STR(uzbl.behave.style_uri, 1, cmd_style_uri)},
+ { "resizable_text_areas", PTR_V_INT(uzbl.behave.resizable_txt, 1, cmd_resizable_txt)},
+ { "default_encoding", PTR_V_STR(uzbl.behave.default_encoding, 1, cmd_default_encoding)},
+ { "current_encoding", PTR_V_STR(uzbl.behave.current_encoding, 1, set_current_encoding)},
+ { "enforce_96_dpi", PTR_V_INT(uzbl.behave.enforce_96dpi, 1, cmd_enforce_96dpi)},
+ { "caret_browsing", PTR_V_INT(uzbl.behave.caret_browsing, 1, cmd_caret_browsing)},
+
+#if !GTK_CHECK_VERSION(3,0,0)
+ { "scrollbars_visible", PTR_V_INT(uzbl.gui.scrollbars_visible, 1, cmd_scrollbars_visibility)},
+#endif
+
+ /* constants (not dumpable or writeable) */
+ { "WEBKIT_MAJOR", PTR_C_INT(uzbl.info.webkit_major, NULL)},
+ { "WEBKIT_MINOR", PTR_C_INT(uzbl.info.webkit_minor, NULL)},
+ { "WEBKIT_MICRO", PTR_C_INT(uzbl.info.webkit_micro, NULL)},
+ { "ARCH_UZBL", PTR_C_STR(uzbl.info.arch, NULL)},
+ { "COMMIT", PTR_C_STR(uzbl.info.commit, NULL)},
+ { "TITLE", PTR_C_STR(uzbl.gui.main_title, NULL)},
+ { "SELECTED_URI", PTR_C_STR(uzbl.state.selected_url, NULL)},
+ { "NAME", PTR_C_STR(uzbl.state.instance_name, NULL)},
+ { "PID", PTR_C_STR(uzbl.info.pid_str, NULL)},
+ { "_", PTR_C_STR(uzbl.state.last_result, NULL)},
+
+ { NULL, {.ptr.s = NULL, .type = TYPE_INT, .dump = 0, .writeable = 0, .func = NULL}}
+};
+
+/* construct a hash from the var_name_to_ptr array for quick access */
+void
+variables_hash() {
+ const struct var_name_to_ptr_t *n2v_p = var_name_to_ptr;
+ uzbl.behave.proto_var = g_hash_table_new(g_str_hash, g_str_equal);
+ while(n2v_p->name) {
+ g_hash_table_insert(uzbl.behave.proto_var,
+ (gpointer) n2v_p->name,
+ (gpointer) &n2v_p->cp);
+ n2v_p++;
+ }
+}
+
+void
+send_set_var_event(const char *name, const uzbl_cmdprop *c) {
+ /* check for the variable type */
+ switch(c->type) {
+ case TYPE_STR:
+ send_event (VARIABLE_SET, NULL,
+ TYPE_NAME, name,
+ TYPE_NAME, "str",
+ TYPE_STR, *c->ptr.s ? *c->ptr.s : " ",
+ NULL);
+ break;
+ case TYPE_INT:
+ send_event (VARIABLE_SET, NULL,
+ TYPE_NAME, name,
+ TYPE_NAME, "int",
+ TYPE_INT, *c->ptr.i,
+ NULL);
+ break;
+ case TYPE_FLOAT:
+ send_event (VARIABLE_SET, NULL,
+ TYPE_NAME, name,
+ TYPE_NAME, "float",
+ TYPE_FLOAT, *c->ptr.f,
+ NULL);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+}
+
+void
+expand_variable(GString *buf, const gchar *name) {
+ uzbl_cmdprop* c;
+ if((c = g_hash_table_lookup(uzbl.behave.proto_var, name))) {
+ if(c->type == TYPE_STR && *c->ptr.s != NULL) {
+ g_string_append(buf, (gchar *)*c->ptr.s);
+ }
+ else if(c->type == TYPE_INT) {
+ g_string_append_printf(buf, "%d", *c->ptr.i);
+ }
+ else if(c->type == TYPE_FLOAT) {
+ g_string_append_printf(buf, "%f", *c->ptr.f);
+ }
+ }
+}
+
+gboolean
+set_var_value(const gchar *name, gchar *val) {
+ uzbl_cmdprop *c = NULL;
+ char *endp = NULL;
+ char *buf = NULL;
+
+ g_assert(val != NULL);
+
+ if( (c = g_hash_table_lookup(uzbl.behave.proto_var, name)) ) {
+ if(!c->writeable) return FALSE;
+
+ switch(c->type) {
+ case TYPE_STR:
+ buf = g_strdup(val);
+ g_free(*c->ptr.s);
+ *c->ptr.s = buf;
+ break;
+ case TYPE_INT:
+ *c->ptr.i = (int)strtoul(val, &endp, 10);
+ break;
+ case TYPE_FLOAT:
+ *c->ptr.f = strtod(val, &endp);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+
+ send_set_var_event(name, c);
+
+ /* invoke a command specific function */
+ if(c->func) c->func();
+ } else {
+ /* check wether name violates our naming scheme */
+ if(!valid_name(name)) {
+ if (uzbl.state.verbose)
+ printf("Invalid variable name: %s\n", name);
+ return FALSE;
+ }
+
+ /* custom vars */
+ c = g_malloc(sizeof(uzbl_cmdprop));
+ c->type = TYPE_STR;
+ c->dump = 0;
+ c->func = NULL;
+ c->writeable = 1;
+ buf = g_strdup(val);
+ c->ptr.s = g_malloc(sizeof(char *));
+ *c->ptr.s = buf;
+ g_hash_table_insert(uzbl.behave.proto_var,
+ g_strdup(name), (gpointer) c);
+
+ send_event (VARIABLE_SET, NULL,
+ TYPE_NAME, name,
+ TYPE_NAME, "str",
+ TYPE_STR, buf,
+ NULL);
+ }
+ update_title();
+ return TRUE;
+}
+
+void
+dump_var_hash(gpointer k, gpointer v, gpointer ud) {
+ (void) ud;
+ uzbl_cmdprop *c = v;
+
+ if(!c->dump)
+ return;
+
+ if(c->type == TYPE_STR)
+ printf("set %s = %s\n", (char *)k, *c->ptr.s ? *c->ptr.s : " ");
+ else if(c->type == TYPE_INT)
+ printf("set %s = %d\n", (char *)k, *c->ptr.i);
+ else if(c->type == TYPE_FLOAT)
+ printf("set %s = %f\n", (char *)k, *c->ptr.f);
+}
+
+void
+dump_config() {
+ g_hash_table_foreach(uzbl.behave.proto_var, dump_var_hash, NULL);
+}
+
+void
+dump_var_hash_as_event(gpointer k, gpointer v, gpointer ud) {
+ (void) ud;
+ uzbl_cmdprop *c = v;
+
+ if(c->dump)
+ send_set_var_event(k, c);
+}
+
+void
+dump_config_as_events() {
+ g_hash_table_foreach(uzbl.behave.proto_var, dump_var_hash_as_event, NULL);
+}
+
+/* is the given string made up entirely of decimal digits? */
+gboolean
+string_is_integer(const char *s) {
+ return (strspn(s, "0123456789") == strlen(s));
+}
+
+
+GObject*
+view_settings() {
+ return G_OBJECT(webkit_web_view_get_settings(uzbl.gui.web_view));
+}
+
+void
+uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec) {
+ (void) param_spec;
+
+ g_free (uzbl.state.uri);
+ g_object_get (web_view, "uri", &uzbl.state.uri, NULL);
+ g_setenv("UZBL_URI", uzbl.state.uri, TRUE);
+}
+
+void
+cmd_load_uri() {
+ const gchar *uri = uzbl.state.uri;
+
+ gchar *newuri;
+ SoupURI *soup_uri;
+
+ /* Strip leading whitespaces */
+ while (*uri && isspace(*uri))
+ uri++;
+
+ /* evaluate javascript: URIs */
+ if (!strncmp (uri, "javascript:", 11)) {
+ eval_js(uzbl.gui.web_view, uri, NULL, "javascript:");
+ return;
+ }
+
+ /* attempt to parse the URI */
+ soup_uri = soup_uri_new(uri);
+
+ if (!soup_uri) {
+ /* it's not a valid URI, maybe it's a path on the filesystem. */
+ const gchar *fullpath;
+ if (g_path_is_absolute (uri))
+ fullpath = uri;
+ else {
+ gchar *wd = g_get_current_dir ();
+ fullpath = g_build_filename (wd, uri, NULL);
+ g_free(wd);
+ }
+
+ struct stat stat_result;
+ if (! g_stat(fullpath, &stat_result))
+ newuri = g_strconcat("file://", fullpath, NULL);
+ else
+ newuri = g_strconcat("http://", uri, NULL);
+ } else {
+ if(soup_uri->host == NULL && string_is_integer(soup_uri->path))
+ /* the user probably typed in a host:port without a scheme */
+ newuri = g_strconcat("http://", uri, NULL);
+ else
+ newuri = g_strdup(uri);
+
+ soup_uri_free(soup_uri);
+ }
+
+ webkit_web_view_load_uri (uzbl.gui.web_view, newuri);
+ g_free (newuri);
+}
+
+void
+cmd_max_conns() {
+ g_object_set(G_OBJECT(uzbl.net.soup_session),
+ SOUP_SESSION_MAX_CONNS, uzbl.net.max_conns, NULL);
+}
+
+void
+cmd_max_conns_host() {
+ g_object_set(G_OBJECT(uzbl.net.soup_session),
+ SOUP_SESSION_MAX_CONNS_PER_HOST, uzbl.net.max_conns_host, NULL);
+}
+
+void
+cmd_http_debug() {
+ if(uzbl.net.soup_logger) {
+ soup_session_remove_feature
+ (uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
+ g_object_unref (uzbl.net.soup_logger);
+ }
+
+ uzbl.net.soup_logger = soup_logger_new(uzbl.behave.http_debug, -1);
+ soup_session_add_feature(uzbl.net.soup_session,
+ SOUP_SESSION_FEATURE(uzbl.net.soup_logger));
+}
+
+void
+cmd_font_size() {
+ GObject *ws = view_settings();
+ if (uzbl.behave.font_size > 0) {
+ g_object_set (ws, "default-font-size", uzbl.behave.font_size, NULL);
+ }
+
+ if (uzbl.behave.monospace_size > 0) {
+ g_object_set (ws, "default-monospace-font-size",
+ uzbl.behave.monospace_size, NULL);
+ } else {
+ g_object_set (ws, "default-monospace-font-size",
+ uzbl.behave.font_size, NULL);
+ }
+}
+
+void
+cmd_zoom_level() {
+ webkit_web_view_set_zoom_level (uzbl.gui.web_view, uzbl.behave.zoom_level);
+}
+
+#define EXPOSE_WEBKIT_VIEW_SETTINGS(SYM, STORAGE, PROPERTY) void cmd_##SYM() { \
+ g_object_set(view_settings(), (PROPERTY), (STORAGE), NULL); \
+}
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(default_font_family, uzbl.behave.default_font_family, "default-font-family")
+EXPOSE_WEBKIT_VIEW_SETTINGS(monospace_font_family, uzbl.behave.monospace_font_family, "monospace-font-family")
+EXPOSE_WEBKIT_VIEW_SETTINGS(sans_serif_font_family, uzbl.behave.sans_serif_font_family, "sans_serif-font-family")
+EXPOSE_WEBKIT_VIEW_SETTINGS(serif_font_family, uzbl.behave.serif_font_family, "serif-font-family")
+EXPOSE_WEBKIT_VIEW_SETTINGS(cursive_font_family, uzbl.behave.cursive_font_family, "cursive-font-family")
+EXPOSE_WEBKIT_VIEW_SETTINGS(fantasy_font_family, uzbl.behave.fantasy_font_family, "fantasy-font-family")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(minimum_font_size, uzbl.behave.minimum_font_size, "minimum_font_size")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(disable_plugins, !uzbl.behave.disable_plugins, "enable-plugins")
+EXPOSE_WEBKIT_VIEW_SETTINGS(disable_scripts, !uzbl.behave.disable_scripts, "enable-scripts")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(javascript_windows, uzbl.behave.javascript_windows, "javascript-can-open-windows-automatically")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(autoload_img, uzbl.behave.autoload_img, "auto-load-images")
+EXPOSE_WEBKIT_VIEW_SETTINGS(autoshrink_img, uzbl.behave.autoshrink_img, "auto-shrink-images")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(enable_pagecache, uzbl.behave.enable_pagecache, "enable-page-cache")
+EXPOSE_WEBKIT_VIEW_SETTINGS(enable_private, uzbl.behave.enable_private, "enable-private-browsing")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(enable_spellcheck, uzbl.behave.enable_spellcheck, "enable-spell-checking")
+EXPOSE_WEBKIT_VIEW_SETTINGS(resizable_txt, uzbl.behave.resizable_txt, "resizable-text-areas")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(style_uri, uzbl.behave.style_uri, "user-stylesheet-uri")
+EXPOSE_WEBKIT_VIEW_SETTINGS(print_bg, uzbl.behave.print_bg, "print-backgrounds")
+EXPOSE_WEBKIT_VIEW_SETTINGS(enforce_96dpi, uzbl.behave.enforce_96dpi, "enforce-96-dpi")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(caret_browsing, uzbl.behave.caret_browsing, "enable-caret-browsing")
+
+EXPOSE_WEBKIT_VIEW_SETTINGS(default_encoding, uzbl.behave.default_encoding, "default-encoding")
+
+void
+set_proxy_url() {
+ const gchar *url = uzbl.net.proxy_url;
+ SoupSession *session = uzbl.net.soup_session;
+ SoupURI *soup_uri = NULL;
+
+ if (url != NULL || *url != 0 || *url != ' ')
+ soup_uri = soup_uri_new(url);
+
+ g_object_set(G_OBJECT(session), SOUP_SESSION_PROXY_URI, soup_uri, NULL);
+
+ if(soup_uri)
+ soup_uri_free(soup_uri);
+}
+
+
+void
+set_authentication_handler() {
+ /* Check if WEBKIT_TYPE_SOUP_AUTH_DIALOG feature is set */
+ GSList *flist = soup_session_get_features (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
+ guint feature_is_set = g_slist_length(flist);
+ g_slist_free(flist);
+
+ if (uzbl.behave.authentication_handler == NULL || *uzbl.behave.authentication_handler == 0) {
+ if (!feature_is_set)
+ soup_session_add_feature_by_type
+ (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
+ } else {
+ if (feature_is_set)
+ soup_session_remove_feature_by_type
+ (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG);
+ }
+ return;
+}
+
+void
+set_status_background() {
+ /* labels and hboxes do not draw their own background. applying this
+ * on the vbox/main_window is ok as the statusbar is the only affected
+ * widget. (if not, we could also use GtkEventBox) */
+ GtkWidget* widget = uzbl.gui.main_window ? uzbl.gui.main_window : GTK_WIDGET (uzbl.gui.plug);
+
+#if GTK_CHECK_VERSION(2,91,0)
+ GdkRGBA color;
+ gdk_rgba_parse (&color, uzbl.behave.status_background);
+ gtk_widget_override_background_color (widget, GTK_STATE_NORMAL, &color);
+#else
+ GdkColor color;
+ gdk_color_parse (uzbl.behave.status_background, &color);
+ gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &color);
+#endif
+}
+
+void
+set_icon() {
+ if(file_exists(uzbl.gui.icon)) {
+ if (uzbl.gui.main_window)
+ 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);
+ }
+}
+
+void
+cmd_set_geometry() {
+ int ret=0, x=0, y=0;
+ unsigned int w=0, h=0;
+ if(uzbl.gui.geometry) {
+ if(uzbl.gui.geometry[0] == 'm') { /* m/maximize/maximized */
+ gtk_window_maximize((GtkWindow *)(uzbl.gui.main_window));
+ } else {
+ /* we used to use gtk_window_parse_geometry() but that didn't work how it was supposed to */
+ ret = XParseGeometry(uzbl.gui.geometry, &x, &y, &w, &h);
+ if(ret & XValue)
+ gtk_window_move((GtkWindow *)uzbl.gui.main_window, x, y);
+ if(ret & WidthValue)
+ gtk_window_resize((GtkWindow *)uzbl.gui.main_window, w, h);
+ }
+ }
+
+ /* update geometry var with the actual geometry
+ this is necessary as some WMs don't seem to honour
+ the above setting and we don't want to end up with
+ wrong geometry information
+ */
+ retrieve_geometry();
+}
+
+void
+cmd_set_status() {
+ if (!uzbl.behave.show_status) {
+ gtk_widget_hide(uzbl.gui.mainbar);
+ } else {
+ gtk_widget_show(uzbl.gui.mainbar);
+ }
+ update_title();
+}
+
+void
+set_current_encoding() {
+ gchar *encoding = uzbl.behave.current_encoding;
+ if(strlen(encoding) == 0)
+ encoding = NULL;
+
+ webkit_web_view_set_custom_encoding(uzbl.gui.web_view, encoding);
+}
+
+void
+cmd_fifo_dir() {
+ uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir);
+}
+
+void
+cmd_socket_dir() {
+ uzbl.behave.socket_dir = init_socket(uzbl.behave.socket_dir);
+}
+
+void
+cmd_inject_html() {
+ if(uzbl.behave.inject_html) {
+ webkit_web_view_load_html_string (uzbl.gui.web_view,
+ uzbl.behave.inject_html, NULL);
+ }
+}
+
+void
+cmd_useragent() {
+ if (*uzbl.net.useragent == ' ') {
+ g_free (uzbl.net.useragent);
+ uzbl.net.useragent = NULL;
+ } else {
+ g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_USER_AGENT,
+ uzbl.net.useragent, NULL);
+ }
+}
+
+void
+set_accept_languages() {
+ if (*uzbl.net.accept_languages == ' ') {
+ g_free (uzbl.net.accept_languages);
+ uzbl.net.accept_languages = NULL;
+ } else {
+ g_object_set(G_OBJECT(uzbl.net.soup_session),
+ SOUP_SESSION_ACCEPT_LANGUAGE, uzbl.net.accept_languages, NULL);
+ }
+}
+
+void
+cmd_scrollbars_visibility() {
+ GtkPolicyType policy = uzbl.gui.scrollbars_visible ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER;
+
+ gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win), policy, policy );
+}
+
+/* requires webkit >=1.1.14 */
+void
+cmd_view_source() {
+ webkit_web_view_set_view_source_mode(uzbl.gui.web_view,
+ (gboolean) uzbl.behave.view_source);
+}
+
+void
+cmd_set_zoom_type () {
+ if(uzbl.behave.zoom_type)
+ webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, TRUE);
+ else
+ webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, FALSE);
+}
diff --git a/src/variables.h b/src/variables.h
new file mode 100644
index 0000000..035c500
--- /dev/null
+++ b/src/variables.h
@@ -0,0 +1,65 @@
+/*
+ * Uzbl Variables
+ */
+
+#ifndef __VARIABLES__
+#define __VARIABLES__
+
+#include <glib.h>
+#include <webkit/webkit.h>
+
+gboolean set_var_value(const gchar *name, gchar *val);
+void expand_variable(GString *buf, const gchar *name);
+void variables_hash();
+void dump_config();
+void dump_config_as_events();
+
+void uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec);
+
+void cmd_load_uri();
+void cmd_set_status();
+void set_proxy_url();
+void set_authentication_handler();
+void set_status_background();
+void set_icon();
+void move_statusbar();
+void cmd_http_debug();
+void cmd_max_conns();
+void cmd_max_conns_host();
+
+/* exported WebKitWebSettings properties */
+void cmd_font_size();
+void cmd_default_font_family();
+void cmd_monospace_font_family();
+void cmd_sans_serif_font_family();
+void cmd_serif_font_family();
+void cmd_cursive_font_family();
+void cmd_fantasy_font_family();
+void cmd_zoom_level();
+void cmd_set_zoom_type();
+void cmd_enable_pagecache();
+void cmd_disable_plugins();
+void cmd_disable_scripts();
+void cmd_minimum_font_size();
+void cmd_fifo_dir();
+void cmd_socket_dir();
+void cmd_useragent() ;
+void set_accept_languages();
+void cmd_autoload_img();
+void cmd_autoshrink_img();
+void cmd_enable_spellcheck();
+void cmd_enable_private();
+void cmd_print_bg();
+void cmd_style_uri();
+void cmd_resizable_txt();
+void cmd_default_encoding();
+void set_current_encoding();
+void cmd_enforce_96dpi();
+void cmd_inject_html();
+void cmd_caret_browsing();
+void cmd_javascript_windows();
+void cmd_set_geometry();
+void cmd_view_source();
+void cmd_scrollbars_visibility();
+
+#endif