aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c60
-rw-r--r--src/callbacks.h9
-rw-r--r--src/cookie-jar.c14
-rw-r--r--src/events.c104
-rw-r--r--src/events.h2
-rwxr-xr-xsrc/uzbl-browser10
-rw-r--r--src/uzbl-core.c99
-rw-r--r--src/uzbl-core.h6
8 files changed, 205 insertions, 99 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 9a37543..aea5c43 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -46,6 +46,19 @@ set_authentication_handler() {
}
void
+set_status_background() {
+ GdkColor color;
+ gdk_color_parse (uzbl.behave.status_background, &color);
+ /* 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) */
+ if (uzbl.gui.main_window)
+ gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
+ else if (uzbl.gui.plug)
+ gtk_widget_modify_bg (GTK_WIDGET(uzbl.gui.plug), GTK_STATE_NORMAL, &color);
+}
+
+void
set_icon() {
if(file_exists(uzbl.gui.icon)) {
if (uzbl.gui.main_window)
@@ -589,9 +602,9 @@ motion_notify_cb(GtkWidget* window, GdkEventMotion* event, gpointer user_data) {
(void) event;
(void) user_data;
- gchar *details;
- details = g_strdup_printf("%.0lf %.0lf %u", event->x, event->y, event->state);
+ gchar *details = g_strdup_printf("%.0lf %.0lf %u", event->x, event->y, event->state);
send_event(PTR_MOVE, details, NULL);
+ g_free(details);
return FALSE;
}
@@ -703,11 +716,10 @@ create_web_view_js2_cb (WebKitWebView* web_view, GParamSpec param_spec) {
if (strncmp(uri, "javascript:", strlen("javascript:")) == 0) {
eval_js(uzbl.gui.web_view, (gchar*) uri + strlen("javascript:"), NULL, "javascript:");
+ gtk_widget_destroy(GTK_WIDGET(web_view));
}
else
send_event(NEW_WINDOW, uri, NULL);
-
- gtk_widget_destroy(GTK_WIDGET(web_view));
}
@@ -717,7 +729,7 @@ create_web_view_js_cb (WebKitWebView* web_view, gpointer user_data) {
(void) user_data;
g_object_connect (web_view, "signal::notify::uri",
- G_CALLBACK(create_web_view_js2_cb), NULL);
+ G_CALLBACK(create_web_view_js2_cb), NULL, NULL);
return TRUE;
}
@@ -764,6 +776,44 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
return (FALSE);
}
+gboolean
+scroll_vert_cb(GtkAdjustment *adjust, void *w)
+{
+ (void) w;
+
+ gdouble value = gtk_adjustment_get_value(adjust);
+ gdouble min = gtk_adjustment_get_lower(adjust);
+ gdouble max = gtk_adjustment_get_upper(adjust);
+ gdouble page = gtk_adjustment_get_page_size(adjust);
+ gchar* details;
+ details = g_strdup_printf("%g %g %g %g", value, min, max, page);
+
+ send_event(SCROLL_VERT, details, NULL);
+
+ g_free(details);
+
+ return (FALSE);
+}
+
+gboolean
+scroll_horiz_cb(GtkAdjustment *adjust, void *w)
+{
+ (void) w;
+
+ gdouble value = gtk_adjustment_get_value(adjust);
+ gdouble min = gtk_adjustment_get_lower(adjust);
+ gdouble max = gtk_adjustment_get_upper(adjust);
+ gdouble page = gtk_adjustment_get_page_size(adjust);
+ gchar* details;
+ details = g_strdup_printf("%g %g %g %g", value, min, max, page);
+
+ send_event(SCROLL_HORIZ, details, NULL);
+
+ g_free(details);
+
+ return (FALSE);
+}
+
void
run_menu_command(GtkWidget *menu, const char *line) {
(void) menu;
diff --git a/src/callbacks.h b/src/callbacks.h
index 0b89f96..a2862f4 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -16,6 +16,9 @@ void
set_authentication_handler();
void
+set_status_background();
+
+void
set_icon();
void
@@ -211,5 +214,11 @@ button_release_cb (GtkWidget* window, GdkEventButton* event);
gboolean
focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud);
+gboolean
+scroll_vert_cb(GtkAdjustment *adjust, void *w);
+
+gboolean
+scroll_horiz_cb(GtkAdjustment *adjust, void *w);
+
void
cmd_set_cookie_handler();
diff --git a/src/cookie-jar.c b/src/cookie-jar.c
index cd8e4b8..f2e340b 100644
--- a/src/cookie-jar.c
+++ b/src/cookie-jar.c
@@ -70,14 +70,16 @@ uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar* handler) {
}
char *get_cookies(UzblCookieJar *jar, SoupURI *uri) {
- gchar *result;
+ gchar *result, *path;
GString *s = g_string_new ("GET");
+ path = uri->path[0] ? uri->path : "/";
+
if(has_socket_handler(jar)) {
g_string_append_c(s, 0); /* null-terminate the GET */
g_string_append_len(s, uri->scheme, strlen(uri->scheme)+1);
g_string_append_len(s, uri->host, strlen(uri->host)+1 );
- g_string_append_len(s, uri->path, strlen(uri->path)+1 );
+ g_string_append_len(s, path, strlen(path)+1 );
result = do_socket_request(jar, s->str, s->len);
/* try it again; older cookie daemons closed the connection after each request */
@@ -160,7 +162,8 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) {
GString *s = g_string_new ("PUT");
- gchar *scheme = (new_cookie->secure == TRUE) ? "https" : "http";
+ gchar *scheme = new_cookie->secure ? "https" : "http";
+
if(has_socket_handler(uzbl_jar)) {
g_string_append_c(s, 0); /* null-terminate the PUT */
g_string_append_len(s, scheme, strlen(scheme)+1);
@@ -239,7 +242,7 @@ static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_
gchar *result = NULL;
if(jar->connection_fd < 0)
- connect_cookie_socket(jar); /* connection was lost, reconnect */
+ connect_cookie_socket(jar); /* connection was lost, reconnect */
/* write request */
ret = write(jar->connection_fd, request, request_length);
@@ -259,7 +262,8 @@ static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_
if(errno == EINTR) continue;
g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n",
strerror(errno));
- disconnect_cookie_socket(jar);
+ if(errno != ETIMEDOUT)
+ disconnect_cookie_socket(jar);
return NULL;
}
diff --git a/src/events.c b/src/events.c
index c209550..20e3675 100644
--- a/src/events.c
+++ b/src/events.c
@@ -46,6 +46,9 @@ const char *event_table[LAST_EVENT] = {
"COMMAND_ERROR" ,
"BUILTINS" ,
"PTR_MOVE"
+ "PTR_MOVE" ,
+ "SCROLL_VERT" ,
+ "SCROLL_HORIZ"
};
void
@@ -57,56 +60,53 @@ event_buffer_timeout(guint sec) {
setitimer(ITIMER_REAL, &t, NULL);
}
-
-void
-send_event_socket(GString *msg) {
+static void
+send_event_sockets(GPtrArray *sockets, GString *msg) {
GError *error = NULL;
- GString *tmp;
- GIOChannel *gio = NULL;
GIOStatus ret;
gsize len;
- guint i=0, j=0;
+ guint i=0;
+
+ while(i < sockets->len) {
+ GIOChannel *gio = g_ptr_array_index(sockets, i++);
+
+ if(gio && gio->is_writeable && msg) {
+ ret = g_io_channel_write_chars (gio,
+ msg->str, msg->len,
+ &len, &error);
+
+ if (ret == G_IO_STATUS_ERROR)
+ g_warning ("Error sending event to socket: %s", error->message);
+ else
+ g_io_channel_flush(gio, &error);
+ }
+ }
+}
+
+static void
+replay_buffered_events() {
+ guint i = 0;
+ event_buffer_timeout(0);
+
+ /* replay buffered events */
+ while(i < uzbl.state.event_buffer->len) {
+ GString *tmp = g_ptr_array_index(uzbl.state.event_buffer, i++);
+ send_event_sockets(uzbl.comm.connect_chan, tmp);
+ g_string_free(tmp, TRUE);
+ }
+
+ g_ptr_array_free(uzbl.state.event_buffer, TRUE);
+ uzbl.state.event_buffer = NULL;
+}
+
+void
+send_event_socket(GString *msg) {
/* write to all --connect-socket sockets */
if(uzbl.comm.connect_chan) {
- while(i < uzbl.comm.connect_chan->len) {
- gio = g_ptr_array_index(uzbl.comm.connect_chan, i++);
- j=0;
-
- if(gio && gio->is_writeable) {
- if(uzbl.state.event_buffer) {
- event_buffer_timeout(0);
-
- /* replay buffered events */
- while(j < uzbl.state.event_buffer->len) {
- tmp = g_ptr_array_index(uzbl.state.event_buffer, j++);
- ret = g_io_channel_write_chars (gio,
- tmp->str, tmp->len,
- &len, &error);
-
- if (ret == G_IO_STATUS_ERROR)
- g_warning ("Error sending event to socket: %s", error->message);
- else
- g_io_channel_flush(gio, &error);
- }
- }
-
- if(msg) {
- ret = g_io_channel_write_chars (gio,
- msg->str, msg->len,
- &len, &error);
-
- if (ret == G_IO_STATUS_ERROR)
- g_warning ("Error sending event to socket: %s", error->message);
- else
- g_io_channel_flush(gio, &error);
- }
- }
- }
- if(uzbl.state.event_buffer) {
- g_ptr_array_free(uzbl.state.event_buffer, TRUE);
- uzbl.state.event_buffer = NULL;
- }
+ send_event_sockets(uzbl.comm.connect_chan, msg);
+ if(uzbl.state.event_buffer)
+ replay_buffered_events();
}
/* buffer events until a socket is set and connected
* or a timeout is encountered
@@ -118,22 +118,8 @@ send_event_socket(GString *msg) {
}
/* write to all client sockets */
- i=0;
if(msg && uzbl.comm.client_chan) {
- while(i < uzbl.comm.client_chan->len) {
- gio = g_ptr_array_index(uzbl.comm.client_chan, i++);
-
- if(gio && gio->is_writeable && msg) {
- ret = g_io_channel_write_chars (gio,
- msg->str, msg->len,
- &len, &error);
-
- if (ret == G_IO_STATUS_ERROR)
- g_warning ("Error sending event to socket: %s", error->message);
- else
- g_io_channel_flush(gio, &error);
- }
- }
+ send_event_sockets(uzbl.comm.client_chan, msg);
}
}
diff --git a/src/events.h b/src/events.h
index 1bd8804..bc7960d 100644
--- a/src/events.h
+++ b/src/events.h
@@ -15,7 +15,7 @@ enum event_type {
LINK_UNHOVER, FORM_ACTIVE, ROOT_ACTIVE,
FOCUS_LOST, FOCUS_GAINED, FILE_INCLUDED,
PLUG_CREATED, COMMAND_ERROR, BUILTINS,
- PTR_MOVE,
+ PTR_MOVE, SCROLL_VERT, SCROLL_HORIZ,
/* must be last entry */
LAST_EVENT
diff --git a/src/uzbl-browser b/src/uzbl-browser
index de4f7af..fabefc4 100755
--- a/src/uzbl-browser
+++ b/src/uzbl-browser
@@ -40,10 +40,16 @@ done
# if no config exists yet in the recommended location, put the default (recommended) config there
if [ ! -f $XDG_CONFIG_HOME/uzbl/config ]
then
+ if [ ! -r $PREFIX/share/uzbl/examples/config/config ]
+ then
+ echo "Error: Global config not found; please check if your distribution ships them separately"
+ exit 3
+ fi
if ! cp $PREFIX/share/uzbl/examples/config/config $XDG_CONFIG_HOME/uzbl/config
then
echo "Could not copy default config to $XDG_CONFIG_HOME/uzbl/config" >&2
- exit 3
+ # Run with the global configs as a last resort
+ config="--config $PREFIX/share/uzbl/examples/config/config"
fi
fi
@@ -63,4 +69,4 @@ DAEMON_PID=${DAEMON_SOCKET}.pid
uzbl-event-manager -va start
#fi
-exec uzbl-core "$@" --connect-socket $DAEMON_SOCKET
+exec uzbl-core "$@" $config --connect-socket $DAEMON_SOCKET
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index 12d20ae..6e72c32 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -93,7 +93,7 @@ const struct var_name_to_ptr_t {
{ "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_background", PTR_V_STR(uzbl.behave.status_background, 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)},
@@ -704,7 +704,8 @@ struct {const char *key; CommandInfo value;} cmdlist[] =
{ "menu_image_remove", {menu_remove_image, TRUE} },
{ "menu_editable_remove", {menu_remove_edit, TRUE} },
{ "hardcopy", {hardcopy, TRUE} },
- { "include", {include, TRUE} }
+ { "include", {include, TRUE} },
+ { "show_inspector", {show_inspector, 0} }
};
void
@@ -999,6 +1000,13 @@ include(WebKitWebView *page, GArray *argv, GString *result) {
}
void
+show_inspector(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page; (void) argv; (void) result;
+
+ webkit_web_inspector_show(uzbl.gui.inspector);
+}
+
+void
act_dump_config() {
dump_config();
}
@@ -1262,6 +1270,29 @@ sharg_append(GArray *a, const gchar *str) {
g_array_append_val(a, s);
}
+gboolean
+uzbl_setup_environ() {
+ gchar *util_dirs = expand("@scripts_util_dir", 0);
+ gchar *util_dir = NULL;
+ gboolean succeed = FALSE;
+
+ if(!util_dirs) {
+ g_free(util_dirs);
+ return succeed;
+ }
+
+ if(!(util_dir = find_existing_file(util_dirs))) {
+ g_free(util_dirs);
+ return succeed;
+ }
+
+ succeed = g_setenv("UZBL_UTIL_DIR", util_dir, TRUE);
+
+ g_free(util_dirs);
+ g_free(util_dir);
+ return succeed;
+}
+
// make sure that the args string you pass can properly be interpreted (eg properly escaped against whitespace, quotes etc)
gboolean
run_command (const gchar *command, const guint npre, const gchar **args,
@@ -1273,6 +1304,8 @@ run_command (const gchar *command, const guint npre, const gchar **args,
gchar *pid = itos(getpid());
gchar *xwin = itos(uzbl.xwin);
guint i;
+ gboolean environ_set = uzbl_setup_environ();
+
sharg_append(a, command);
for (i = 0; i < npre; i++) /* add n args before the default vars */
sharg_append(a, args[i]);
@@ -1311,6 +1344,9 @@ run_command (const gchar *command, const guint npre, const gchar **args,
printf("Stdout: %s\n", *output_stdout);
}
}
+ if (!environ_set) {
+ g_printerr("failed to set the environment for scripts");
+ }
if (err) {
g_printerr("error on run_command: %s\n", err->message);
g_error_free (err);
@@ -1881,10 +1917,15 @@ update_title (void) {
Behaviour *b = &uzbl.behave;
gchar *parsed;
+ if(!GTK_IS_WINDOW(uzbl.gui.main_window))
+ return; /* we're just starting up or just shutting down. */
+
+ const gchar *current_title = gtk_window_get_title (GTK_WINDOW(uzbl.gui.main_window));
+
if (b->show_status) {
- if (b->title_format_short) {
+ if (b->title_format_short && uzbl.gui.main_window) {
parsed = expand(b->title_format_short, 0);
- if (uzbl.gui.main_window)
+ if(!current_title || strcmp(current_title, parsed))
gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
g_free(parsed);
}
@@ -1893,19 +1934,10 @@ update_title (void) {
gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label), parsed);
g_free(parsed);
}
- if (b->status_background) {
- GdkColor color;
- gdk_color_parse (b->status_background, &color);
- //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)
- if (uzbl.gui.main_window)
- gtk_widget_modify_bg (uzbl.gui.main_window, GTK_STATE_NORMAL, &color);
- else if (uzbl.gui.plug)
- gtk_widget_modify_bg (GTK_WIDGET(uzbl.gui.plug), GTK_STATE_NORMAL, &color);
- }
} else {
- if (b->title_format_long) {
+ if (b->title_format_long && uzbl.gui.main_window) {
parsed = expand(b->title_format_long, 0);
- if (uzbl.gui.main_window)
+ if(!current_title || strcmp(current_title, parsed))
gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), parsed);
g_free(parsed);
}
@@ -2381,6 +2413,7 @@ initialize(int argc, char *argv[]) {
void
load_uri_imp(gchar *uri) {
GString* newuri;
+ SoupURI* soup_uri;
/* Strip leading whitespaces */
while (*uri) {
@@ -2392,26 +2425,28 @@ load_uri_imp(gchar *uri) {
eval_js(uzbl.gui.web_view, uri, NULL, "javascript:");
return;
}
+
newuri = g_string_new (uri);
- if (!soup_uri_new(uri)) {
- GString* fullpath = g_string_new ("");
+ soup_uri = soup_uri_new(uri);
+
+ if (!soup_uri) {
+ gchar* fullpath;
if (g_path_is_absolute (newuri->str))
- g_string_assign (fullpath, newuri->str);
+ fullpath = newuri->str;
else {
- gchar* wd;
- wd = g_get_current_dir ();
- g_string_assign (fullpath, g_build_filename (wd, newuri->str, NULL));
- free(wd);
+ gchar* wd = g_get_current_dir ();
+ fullpath = g_build_filename (wd, newuri->str, NULL);
+ g_free(wd);
}
struct stat stat_result;
- if (! g_stat(fullpath->str, &stat_result)) {
- g_string_prepend (fullpath, "file://");
- g_string_assign (newuri, fullpath->str);
- }
+ if (! g_stat(fullpath, &stat_result))
+ g_string_printf (newuri, "file://%s", fullpath);
else
g_string_prepend (newuri, "http://");
- g_string_free (fullpath, TRUE);
+ } else {
+ 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->str);
g_string_free (newuri, TRUE);
@@ -2462,6 +2497,16 @@ main (int argc, char* argv[]) {
uzbl.gui.bar_h = gtk_range_get_adjustment((GtkRange*) uzbl.gui.scbar_h);
gtk_widget_set_scroll_adjustments ((GtkWidget*) uzbl.gui.web_view, uzbl.gui.bar_h, uzbl.gui.bar_v);
+ g_object_connect((GObject*)uzbl.gui.bar_v,
+ "signal::value-changed", (GCallback)scroll_vert_cb, NULL,
+ "signal::changed", (GCallback)scroll_vert_cb, NULL,
+ NULL);
+
+ g_object_connect((GObject*)uzbl.gui.bar_h,
+ "signal::value-changed", (GCallback)scroll_horiz_cb, NULL,
+ "signal::changed", (GCallback)scroll_horiz_cb, NULL,
+ NULL);
+
if(!uzbl.state.instance_name)
uzbl.state.instance_name = itos((int)uzbl.xwin);
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index b4b251d..19a5887 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -276,6 +276,9 @@ void
close_uzbl (WebKitWebView *page, GArray *argv, GString *result);
gboolean
+uzbl_setup_environ();
+
+gboolean
run_command(const gchar *command, const guint npre,
const gchar **args, const gboolean sync, char **output_stdout);
@@ -471,6 +474,9 @@ void
include(WebKitWebView *page, GArray *argv, GString *result);
void
+show_inspector(WebKitWebView *page, GArray *argv, GString *result);
+
+void
builtins();
typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);