aboutsummaryrefslogtreecommitdiffhomepage
path: root/uzbl.c
diff options
context:
space:
mode:
authorGravatar Robert Manea <gotmor@gmail.com>2009-09-04 01:01:46 +0200
committerGravatar Robert Manea <gotmor@gmail.com>2009-09-04 01:01:46 +0200
commitd7c302be4dd7f30785bfa8bbb0f9c2cf4989f868 (patch)
tree46daa64242869af6e0c86c9d15698a584be43cb6 /uzbl.c
parentb235a942fb2cded2f81c07d2e00633aa6dcd3028 (diff)
parent369119525001e17d5e601578b3c61a0a3d5264fa (diff)
Merge branch 'event-messages' of git://github.com/Dieterbe/uzbl into event-messages
Conflicts: uzbl.c
Diffstat (limited to 'uzbl.c')
-rw-r--r--uzbl.c163
1 files changed, 79 insertions, 84 deletions
diff --git a/uzbl.c b/uzbl.c
index c008d5a..5832a12 100644
--- a/uzbl.c
+++ b/uzbl.c
@@ -138,10 +138,10 @@ const struct var_name_to_ptr_t {
{ "load_finish_handler", PTR_V_STR(uzbl.behave.load_finish_handler, 1, NULL)},
{ "load_start_handler", PTR_V_STR(uzbl.behave.load_start_handler, 1, NULL)},
{ "load_commit_handler", PTR_V_STR(uzbl.behave.load_commit_handler, 1, NULL)},
- { "history_handler", PTR_V_STR(uzbl.behave.history_handler, 1, NULL)},
{ "download_handler", PTR_V_STR(uzbl.behave.download_handler, 1, NULL)},
{ "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, cmd_cookie_handler)},
- { "new_window", PTR_V_STR(uzbl.behave.new_window, 1, cmd_new_window)},
+ { "new_window", PTR_V_STR(uzbl.behave.new_window, 1, NULL)},
+ { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, cmd_scheme_handler)},
{ "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)},
@@ -202,7 +202,8 @@ const char *event_table[LAST_EVENT] = {
"LOAD_COMMIT" ,
"LOAD_FINISH" ,
"LOAD_ERROR" ,
- "KEYPRESS" ,
+ "KEY_PRESS" ,
+ "KEY_RELEASE" ,
"DOWNLOAD_REQUEST" ,
"COMMAND_EXECUTED" ,
"LINK_HOVER" ,
@@ -212,6 +213,8 @@ const char *event_table[LAST_EVENT] = {
"COOKIE" ,
"NEW_WINDOW" ,
"SELECTION_CHANGED",
+ "VARIABLE_SET",
+ "FIFO_SET"
};
@@ -412,20 +415,14 @@ expand(const char *s, guint recurse) {
return g_string_free(buf, FALSE);
}
-/* send events as strings over any of our interfaces
- *
- * TODO: - also use an output fifo and the socket
- * - probably we also want a variable/CL option
- * that specifies wether to send events and through
- * which interface to send them
- * - let the user select which event types
- * to report
+/* send events as strings to stdout (do we need to support fifo/socket as output mechanism?)
+ * we send all events to the output. it's the users task to filter out what he cares about.
*/
void
send_event(int type, const gchar *details) {
if(type < LAST_EVENT) {
- printf("%s [%s] %s\n", event_table[type], uzbl.state.instance_name, details);
+ printf("EVENT %s [%s] %s\n", event_table[type], uzbl.state.instance_name, details);
fflush(stdout);
}
}
@@ -553,6 +550,44 @@ catch_sigint(int s) {
/* --- CALLBACKS --- */
gboolean
+navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
+ (void) web_view;
+ (void) frame;
+ (void) navigation_action;
+ (void) user_data;
+
+ const gchar* uri = webkit_network_request_get_uri (request);
+ gboolean decision_made = FALSE;
+
+ if (uzbl.state.verbose)
+ printf("Navigation requested -> %s\n", uri);
+
+ if (uzbl.behave.scheme_handler) {
+ GString *s = g_string_new ("");
+ g_string_printf(s, "'%s'", uri);
+
+ run_handler(uzbl.behave.scheme_handler, s->str);
+
+ if(uzbl.comm.sync_stdout && strcmp (uzbl.comm.sync_stdout, "") != 0) {
+ char *p = strchr(uzbl.comm.sync_stdout, '\n' );
+ if ( p != NULL ) *p = '\0';
+ if (!strcmp(uzbl.comm.sync_stdout, "USED")) {
+ webkit_web_policy_decision_ignore(policy_decision);
+ decision_made = TRUE;
+ }
+ }
+ if (uzbl.comm.sync_stdout)
+ uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout);
+
+ g_string_free(s, TRUE);
+ }
+ if (!decision_made)
+ webkit_web_policy_decision_use(policy_decision);
+
+ return TRUE;
+}
+
+gboolean
new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data) {
(void) web_view;
(void) frame;
@@ -579,7 +614,7 @@ mime_policy_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequ
return TRUE;
}
- /* ...everything we can't displayed is downloaded */
+ /* ...everything we can't display is downloaded */
webkit_web_policy_decision_download (policy_decision);
return TRUE;
}
@@ -609,7 +644,17 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
if (uzbl.state.verbose)
printf("Download -> %s\n",uri);
/* if urls not escaped, we may have to escape and quote uri before this call */
- run_handler(uzbl.behave.download_handler, uri);
+
+ GString *args = g_string_new(uri);
+
+ if (uzbl.net.proxy_url) {
+ g_string_append_c(args, ' ');
+ g_string_append(args, uzbl.net.proxy_url);
+ }
+
+ run_handler(uzbl.behave.download_handler, args->str);
+
+ g_string_free(args, TRUE);
}
send_event(DOWNLOAD_REQ, webkit_download_get_uri ((WebKitDownload*)download));
return (FALSE);
@@ -783,7 +828,6 @@ load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
(void) frame;
(void) data;
uzbl.gui.sbar.load_progress = 0;
- clear_keycmd(); // don't need old commands to remain on new page?
if (uzbl.behave.load_start_handler)
run_handler(uzbl.behave.load_start_handler, "");
@@ -828,19 +872,6 @@ destroy_cb (GtkWidget* widget, gpointer data) {
gtk_main_quit ();
}
-void
-log_history_cb () {
- if (uzbl.behave.history_handler) {
- time_t rawtime;
- struct tm * timeinfo;
- char date [80];
- time ( &rawtime );
- timeinfo = localtime ( &rawtime );
- strftime (date, 80, "\"%Y-%m-%d %H:%M:%S\"", timeinfo);
- run_handler(uzbl.behave.history_handler, date);
- }
-}
-
/* 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);}
@@ -1029,7 +1060,7 @@ load_uri (WebKitWebView *web_view, GArray *argv, GString *result) {
run_js(web_view, argv, NULL);
return;
}
- if (g_strrstr (argv_idx(argv, 0), "://") == NULL && g_strstr_len (argv_idx(argv, 0), 5, "data:") == NULL)
+ if (!soup_uri_new(argv_idx(argv, 0)))
g_string_prepend (newuri, "http://");
/* if we do handle cookies, ask our handler for them */
webkit_web_view_load_uri (web_view, newuri->str);
@@ -1840,14 +1871,14 @@ cmd_cookie_handler() {
}
void
-cmd_new_window() {
- gchar **split = g_strsplit(uzbl.behave.new_window, " ", 2);
+cmd_scheme_handler() {
+ gchar **split = g_strsplit(uzbl.behave.scheme_handler, " ", 2);
/* pitfall: doesn't handle chain actions; must the sync_ action manually */
if ((g_strcmp0(split[0], "sh") == 0) ||
(g_strcmp0(split[0], "spawn") == 0)) {
- g_free (uzbl.behave.new_window);
- uzbl.behave.new_window =
- g_strdup_printf("%s %s", split[0], split[1]);
+ g_free (uzbl.behave.scheme_handler);
+ uzbl.behave.scheme_handler =
+ g_strdup_printf("sync_%s %s", split[0], split[1]);
}
g_strfreev (split);
}
@@ -1930,6 +1961,7 @@ set_var_value(const gchar *name, gchar *val) {
char *endp = NULL;
char *buf = NULL;
char *invalid_chars = "^°!\"§$%&/()=?'`'+~*'#-.:,;@<>| \\{}[]¹²³¼½";
+ GString *msg;
if( (c = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) {
if(!c->writeable) return FALSE;
@@ -1939,6 +1971,10 @@ set_var_value(const gchar *name, gchar *val) {
buf = expand(val, 0);
g_free(*c->ptr.s);
*c->ptr.s = buf;
+ msg = g_string_new(name);
+ g_string_append_printf(msg, " %s", buf);
+ send_event(VARIABLE_SET, msg->str);
+ g_string_free(msg,TRUE);
} else if(c->type == TYPE_INT) {
buf = expand(val, 0);
*c->ptr.i = (int)strtoul(buf, &endp, 10);
@@ -2061,6 +2097,7 @@ init_fifo(gchar *dir) { /* return dir or, on error, free dir and return NULL */
if (g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_fifo, NULL)) {
if (uzbl.state.verbose)
printf ("init_fifo: created successfully as %s\n", path);
+ send_event(FIFO_SET, path);
uzbl.comm.fifo_path = path;
return dir;
} else g_warning ("init_fifo: could not add watch on %s\n", path);
@@ -2267,11 +2304,13 @@ key_press_cb (GtkWidget* window, GdkEventKey* event)
(void) window;
if(event->type == GDK_KEY_PRESS)
- send_event(KEYPRESS, gdk_keyval_name(event->keyval) );
+ send_event(KEY_PRESS, gdk_keyval_name(event->keyval) );
if (event->type != GDK_KEY_PRESS ||
event->keyval == GDK_Page_Up ||
event->keyval == GDK_Page_Down ||
+ event->keyval == GDK_Home ||
+ event->keyval == GDK_End ||
event->keyval == GDK_Up ||
event->keyval == GDK_Down ||
event->keyval == GDK_Left ||
@@ -2280,13 +2319,6 @@ key_press_cb (GtkWidget* window, GdkEventKey* event)
event->keyval == GDK_Shift_R)
return FALSE;
- /* turn off insert mode (if always_insert_mode is not used) */
- if (uzbl.behave.insert_mode && (event->keyval == GDK_Escape)) {
- set_insert_mode(uzbl.behave.always_insert_mode);
- update_title();
- return TRUE;
- }
-
if (uzbl.behave.insert_mode &&
( ((event->state & uzbl.behave.modmask) != uzbl.behave.modmask) ||
(!uzbl.behave.modmask)
@@ -2294,46 +2326,6 @@ key_press_cb (GtkWidget* window, GdkEventKey* event)
)
return FALSE;
- if (event->keyval == GDK_Escape) {
- clear_keycmd();
- update_title();
- dehilight(uzbl.gui.web_view, NULL, NULL);
- return TRUE;
- }
-
- //Insert without shift - insert from clipboard; Insert with shift - insert from primary
- if (event->keyval == GDK_Insert) {
- gchar * str;
- if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) {
- str = gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY));
- } else {
- str = gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD));
- }
- if (str) {
- GString* keycmd = g_string_new(uzbl.state.keycmd);
- g_string_append (keycmd, str);
- uzbl.state.keycmd = g_string_free(keycmd, FALSE);
- update_title ();
- g_free (str);
- }
- return TRUE;
- }
-
- if (event->keyval == GDK_BackSpace)
- keycmd_bs(NULL, NULL, NULL);
-
- gboolean key_ret = FALSE;
- if ((event->keyval == GDK_Return) || (event->keyval == GDK_KP_Enter))
- key_ret = TRUE;
- if (!key_ret) {
- GString* keycmd = g_string_new(uzbl.state.keycmd);
- g_string_append(keycmd, event->string);
- uzbl.state.keycmd = g_string_free(keycmd, FALSE);
- }
-
- run_keycmd(key_ret);
- update_title();
- if (key_ret) return (!uzbl.behave.insert_mode);
return TRUE;
}
@@ -2419,10 +2411,10 @@ create_browser () {
g_signal_connect (G_OBJECT (g->web_view), "load-progress-changed", G_CALLBACK (progress_change_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "load-committed", G_CALLBACK (load_commit_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "load-started", G_CALLBACK (load_start_cb), g->web_view);
- g_signal_connect (G_OBJECT (g->web_view), "load-finished", G_CALLBACK (log_history_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "load-finished", G_CALLBACK (load_finish_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "load-error", G_CALLBACK (load_error_cb), g->web_view);
g_signal_connect (G_OBJECT (g->web_view), "hovering-over-link", G_CALLBACK (link_hover_cb), g->web_view);
+ g_signal_connect (G_OBJECT (g->web_view), "navigation-policy-decision-requested", G_CALLBACK (navigation_decision_cb), g->web_view);
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);
@@ -2968,6 +2960,7 @@ main (int argc, char* argv[]) {
printf("window_id %i\n",(int) uzbl.xwin);
printf("pid %i\n", getpid ());
printf("name: %s\n", uzbl.state.instance_name);
+ printf("commit: %s\n", uzbl.info.commit);
}
uzbl.gui.scbar_v = (GtkScrollbar*) gtk_vscrollbar_new (NULL);
@@ -2990,7 +2983,9 @@ main (int argc, char* argv[]) {
gboolean verbose_override = uzbl.state.verbose;
settings_init ();
- set_insert_mode(FALSE);
+
+ if (!uzbl.behave.always_insert_mode)
+ set_insert_mode(FALSE);
if (!uzbl.behave.show_status)
gtk_widget_hide(uzbl.gui.mainbar);