aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/callbacks.c')
-rw-r--r--src/callbacks.c151
1 files changed, 110 insertions, 41 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 360b0c4..15dbca7 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -12,21 +12,17 @@
void
set_proxy_url() {
- SoupURI *suri;
+ const gchar *url = uzbl.net.proxy_url;
+ SoupSession *session = uzbl.net.soup_session;
+ SoupURI *soup_uri = NULL;
- if (uzbl.net.proxy_url == NULL || *uzbl.net.proxy_url == ' ') {
- soup_session_remove_feature_by_type(uzbl.net.soup_session,
- (GType) SOUP_SESSION_PROXY_URI);
- }
- else {
- suri = soup_uri_new(uzbl.net.proxy_url);
- g_object_set(G_OBJECT(uzbl.net.soup_session),
- SOUP_SESSION_PROXY_URI,
- suri, NULL);
- soup_uri_free(suri);
- }
+ if (url != NULL || *url != 0 || *url != ' ')
+ soup_uri = soup_uri_new(url);
- return;
+ g_object_set(G_OBJECT(session), SOUP_SESSION_PROXY_URI, soup_uri, NULL);
+
+ if(soup_uri)
+ soup_uri_free(soup_uri);
}
@@ -116,7 +112,48 @@ cmd_set_status() {
void
cmd_load_uri() {
- load_uri_imp (uzbl.state.uri);
+ const gchar *uri = uzbl.state.uri;
+
+ gchar *newuri;
+ SoupURI* soup_uri;
+
+ /* Strip leading whitespaces */
+ while (*uri) {
+ if (!isspace(*uri)) break;
+ uri++;
+ }
+
+ if (g_strstr_len (uri, 11, "javascript:") != NULL) {
+ eval_js(uzbl.gui.web_view, uri, NULL, "javascript:");
+ return;
+ }
+
+ soup_uri = soup_uri_new(uri);
+
+ if (!soup_uri) {
+ /* maybe this is a path on the filesystem, check. */
+ 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 {
+ newuri = g_strdup(uri);
+ soup_uri_free(soup_uri);
+ }
+
+ /* if we do handle cookies, ask our handler for them */
+ webkit_web_view_load_uri (uzbl.gui.web_view, newuri);
+ g_free (newuri);
}
void
@@ -348,16 +385,9 @@ cmd_javascript_windows() {
void
cmd_scrollbars_visibility() {
- if(uzbl.gui.scrollbars_visible) {
- uzbl.gui.bar_h = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win));
- uzbl.gui.bar_v = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win));
- }
- else {
- uzbl.gui.bar_v = gtk_range_get_adjustment (GTK_RANGE (uzbl.gui.scbar_v));
- uzbl.gui.bar_h = gtk_range_get_adjustment (GTK_RANGE (uzbl.gui.scbar_h));
- }
+ GtkPolicyType policy = uzbl.gui.scrollbars_visible ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER;
- set_webview_scroll_adjustments();
+ gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win), policy, policy );
}
/* requires webkit >=1.1.14 */
@@ -478,7 +508,7 @@ load_status_change_cb (WebKitWebView* web_view, GParamSpec param_spec) {
}
}
-void
+gboolean
load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer web_err, gpointer ud) {
(void) page; (void) frame; (void) ud;
GError *err = web_err;
@@ -488,6 +518,8 @@ load_error_cb (WebKitWebView* page, WebKitWebFrame* frame, gchar *uri, gpointer
TYPE_INT, err->code,
TYPE_STR, err->message,
NULL);
+
+ return FALSE;
}
void
@@ -549,7 +581,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event) {
(void) window;
if(event->type == GDK_KEY_PRESS)
- key_to_event(event->keyval, GDK_KEY_PRESS);
+ key_to_event(event->keyval, event->state, event->is_modifier, GDK_KEY_PRESS);
return uzbl.behave.forward_keys ? FALSE : TRUE;
}
@@ -559,7 +591,7 @@ key_release_cb (GtkWidget* window, GdkEventKey* event) {
(void) window;
if(event->type == GDK_KEY_RELEASE)
- key_to_event(event->keyval, GDK_KEY_RELEASE);
+ key_to_event(event->keyval, event->state, event->is_modifier, GDK_KEY_RELEASE);
return uzbl.behave.forward_keys ? FALSE : TRUE;
}
@@ -750,10 +782,11 @@ request_starting_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitWebRes
}
void
-create_web_view_js2_cb (WebKitWebView* web_view, GParamSpec param_spec) {
+create_web_view_js_cb (WebKitWebView* web_view, GParamSpec param_spec) {
(void) web_view;
(void) param_spec;
+ webkit_web_view_stop_loading(web_view);
const gchar* uri = webkit_web_view_get_uri(web_view);
if (strncmp(uri, "javascript:", strlen("javascript:")) == 0) {
@@ -764,18 +797,6 @@ create_web_view_js2_cb (WebKitWebView* web_view, GParamSpec param_spec) {
send_event(NEW_WINDOW, NULL, TYPE_STR, uri, NULL);
}
-
-gboolean
-create_web_view_js_cb (WebKitWebView* web_view, gpointer user_data) {
- (void) web_view;
- (void) user_data;
-
- g_object_connect (web_view, "signal::notify::uri",
- G_CALLBACK(create_web_view_js2_cb), NULL, NULL);
- return TRUE;
-}
-
-
/*@null@*/ WebKitWebView*
create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer user_data) {
(void) web_view;
@@ -787,8 +808,8 @@ create_web_view_cb (WebKitWebView *web_view, WebKitWebFrame *frame, gpointer us
WebKitWebView* new_view = WEBKIT_WEB_VIEW(webkit_web_view_new());
- g_signal_connect (new_view, "web-view-ready",
- G_CALLBACK(create_web_view_js_cb), NULL);
+ g_object_connect (new_view, "signal::notify::uri",
+ G_CALLBACK(create_web_view_js_cb), NULL, NULL);
return new_view;
}
@@ -837,6 +858,11 @@ download_cb(WebKitWebView *web_view, WebKitDownload *download, gpointer user_dat
/* get the URI being downloaded */
const gchar *uri = webkit_download_get_uri(download);
+ /* get the destination path, if specified.
+ * this is only intended to be set when this function is trigger by an
+ * explicit download using uzbl's 'download' action. */
+ const gchar *destination = user_data;
+
if (uzbl.state.verbose)
printf("Download requested -> %s\n", uri);
@@ -883,6 +909,9 @@ download_cb(WebKitWebView *web_view, WebKitDownload *download, gpointer user_dat
gchar *total_size_s = g_strdup_printf("%d", total_size);
g_array_append_val(a, total_size_s);
+ if(destination)
+ g_array_append_val(a, destination);
+
GString *result = g_string_new ("");
run_parsed_command(c, a, result);
@@ -1054,4 +1083,44 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) {
}
}
+gboolean
+scrollbars_policy_cb(WebKitWebView *view) {
+ (void) view;
+ return TRUE;
+}
+
+void
+window_object_cleared_cb(WebKitWebView *webview, WebKitWebFrame *frame,
+ JSGlobalContextRef *context, JSObjectRef *object) {
+ (void) frame; (void) context; (void) object;
+#if WEBKIT_CHECK_VERSION (1, 3, 13)
+ // Take this opportunity to set some callbacks on the DOM
+ WebKitDOMDocument *document = webkit_web_view_get_dom_document (webview);
+ webkit_dom_event_target_add_event_listener (WEBKIT_DOM_EVENT_TARGET (document),
+ "focus", G_CALLBACK(dom_focus_cb), TRUE, NULL);
+ webkit_dom_event_target_add_event_listener (WEBKIT_DOM_EVENT_TARGET (document),
+ "blur", G_CALLBACK(dom_focus_cb), TRUE, NULL);
+#else
+ (void) webview;
+#endif
+}
+
+#if WEBKIT_CHECK_VERSION (1, 3, 13)
+void
+dom_focus_cb(WebKitDOMEventTarget *target, WebKitDOMEvent *event, gpointer user_data) {
+ (void) target; (void) user_data;
+ WebKitDOMEventTarget *etarget = webkit_dom_event_get_target (event);
+ gchar* name = webkit_dom_node_get_node_name (WEBKIT_DOM_NODE (etarget));
+ send_event (FOCUS_ELEMENT, NULL, TYPE_STR, name, NULL);
+}
+
+void
+dom_blur_cb(WebKitDOMEventTarget *target, WebKitDOMEvent *event, gpointer user_data) {
+ (void) target; (void) user_data;
+ WebKitDOMEventTarget *etarget = webkit_dom_event_get_target (event);
+ gchar* name = webkit_dom_node_get_node_name (WEBKIT_DOM_NODE (etarget));
+ send_event (BLUR_ELEMENT, NULL, TYPE_STR, name, NULL);
+}
+#endif
+
/* vi: set et ts=4: */