aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/callbacks.c8
-rw-r--r--src/events.h7
-rw-r--r--src/io.c341
-rw-r--r--src/io.h23
-rw-r--r--src/menu.c192
-rw-r--r--src/menu.h18
-rw-r--r--src/util.c86
-rw-r--r--src/util.h20
-rw-r--r--src/uzbl-core.c825
-rw-r--r--src/uzbl-core.h442
10 files changed, 976 insertions, 986 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 546b8ca..c261234 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -7,12 +7,14 @@
#include "callbacks.h"
#include "events.h"
#include "util.h"
+#include "io.h"
+
void
set_proxy_url() {
SoupURI *suri;
- if(uzbl.net.proxy_url == NULL || *uzbl.net.proxy_url == ' ') {
+ 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);
}
@@ -23,9 +25,11 @@ set_proxy_url() {
suri, NULL);
soup_uri_free(suri);
}
+
return;
}
+
void
set_authentication_handler() {
/* Check if WEBKIT_TYPE_SOUP_AUTH_DIALOG feature is set */
@@ -45,6 +49,7 @@ set_authentication_handler() {
return;
}
+
void
set_status_background() {
/* labels and hboxes do not draw their own background. applying this
@@ -63,6 +68,7 @@ set_status_background() {
#endif
}
+
void
set_icon() {
if(file_exists(uzbl.gui.icon)) {
diff --git a/src/events.h b/src/events.h
index 3c7b933..4edc5ab 100644
--- a/src/events.h
+++ b/src/events.h
@@ -3,6 +3,11 @@
** (c) 2009 by Robert Manea
*/
+#ifndef __EVENTS__
+#define __EVENTS__
+
+#include <glib.h>
+
/* Event system */
enum event_type {
LOAD_START, LOAD_COMMIT, LOAD_FINISH, LOAD_ERROR,
@@ -37,3 +42,5 @@ send_event(int type, const gchar *details, const gchar *custom_event);
void
key_to_event(guint keyval, gint mode);
+
+#endif
diff --git a/src/io.c b/src/io.c
new file mode 100644
index 0000000..1e85237
--- /dev/null
+++ b/src/io.c
@@ -0,0 +1,341 @@
+#define _POSIX_SOURCE
+
+#include <stdio.h>
+
+#include "events.h"
+#include "io.h"
+#include "util.h"
+#include "uzbl-core.h"
+
+/*@null@*/ gchar*
+build_stream_name(int type, const gchar* dir) {
+ State *s = &uzbl.state;
+ gchar *str = NULL;
+
+ if (type == FIFO) {
+ str = g_strdup_printf
+ ("%s/uzbl_fifo_%s", dir, s->instance_name);
+ } else if (type == SOCKET) {
+ str = g_strdup_printf
+ ("%s/uzbl_socket_%s", dir, s->instance_name);
+ }
+ return str;
+}
+
+
+gboolean
+control_fifo(GIOChannel *gio, GIOCondition condition) {
+ if (uzbl.state.verbose)
+ printf("triggered\n");
+ gchar *ctl_line;
+ GIOStatus ret;
+ GError *err = NULL;
+
+ if (condition & G_IO_HUP)
+ g_error ("Fifo: Read end of pipe died!\n");
+
+ if(!gio)
+ g_error ("Fifo: GIOChannel broke\n");
+
+ ret = g_io_channel_read_line(gio, &ctl_line, NULL, NULL, &err);
+ if (ret == G_IO_STATUS_ERROR) {
+ g_error ("Fifo: Error reading: %s\n", err->message);
+ g_error_free (err);
+ }
+
+ parse_cmd_line(ctl_line, NULL);
+ g_free(ctl_line);
+
+ return TRUE;
+}
+
+
+gboolean
+attach_fifo(gchar *path) {
+ GError *error = NULL;
+ /* we don't really need to write to the file, but if we open the
+ * file as 'r' we will block here, waiting for a writer to open
+ * the file. */
+ GIOChannel *chan = g_io_channel_new_file(path, "r+", &error);
+ if (chan) {
+ if (g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_fifo, NULL)) {
+ if (uzbl.state.verbose)
+ printf ("attach_fifo: created successfully as %s\n", path);
+ send_event(FIFO_SET, path, NULL);
+ uzbl.comm.fifo_path = path;
+ g_setenv("UZBL_FIFO", uzbl.comm.fifo_path, TRUE);
+ return TRUE;
+ } else g_warning ("attach_fifo: could not add watch on %s\n", path);
+ } else g_warning ("attach_fifo: can't open: %s\n", error->message);
+
+ if (error) g_error_free (error);
+ return FALSE;
+}
+
+
+/*@null@*/ gchar*
+init_fifo(gchar *dir) { /* return dir or, on error, free dir and return NULL */
+ if (uzbl.comm.fifo_path) { /* get rid of the old fifo if one exists */
+ if (unlink(uzbl.comm.fifo_path) == -1)
+ g_warning ("Fifo: Can't unlink old fifo at %s\n", uzbl.comm.fifo_path);
+ g_free(uzbl.comm.fifo_path);
+ uzbl.comm.fifo_path = NULL;
+ }
+
+ gchar *path = build_stream_name(FIFO, dir);
+
+ if (!file_exists(path)) {
+ if (mkfifo (path, 0666) == 0 && attach_fifo(path)) {
+ return dir;
+ } else g_warning ("init_fifo: can't create %s: %s\n", path, strerror(errno));
+ } else {
+ /* the fifo exists. but is anybody home? */
+ int fd = open(path, O_WRONLY|O_NONBLOCK);
+ if(fd < 0) {
+ /* some error occurred, presumably nobody's on the read end.
+ * we can attach ourselves to it. */
+ if(attach_fifo(path))
+ return dir;
+ else
+ g_warning("init_fifo: can't attach to %s: %s\n", path, strerror(errno));
+ } else {
+ /* somebody's there, we can't use that fifo. */
+ close(fd);
+ /* whatever, this instance can live without a fifo. */
+ g_warning ("init_fifo: can't create %s: file exists and is occupied\n", path);
+ }
+ }
+
+ /* if we got this far, there was an error; cleanup */
+ g_free(dir);
+ g_free(path);
+ return NULL;
+}
+
+
+gboolean
+control_stdin(GIOChannel *gio, GIOCondition condition) {
+ (void) condition;
+ gchar *ctl_line = NULL;
+ GIOStatus ret;
+
+ ret = g_io_channel_read_line(gio, &ctl_line, NULL, NULL, NULL);
+ if ( (ret == G_IO_STATUS_ERROR) || (ret == G_IO_STATUS_EOF) )
+ return FALSE;
+
+ parse_cmd_line(ctl_line, NULL);
+ g_free(ctl_line);
+
+ return TRUE;
+}
+
+void
+create_stdin() {
+ GIOChannel *chan = g_io_channel_unix_new(fileno(stdin));
+ if (chan) {
+ if (!g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_stdin, NULL)) {
+ g_error ("create_stdin: could not add watch\n");
+ } else if (uzbl.state.verbose) {
+ printf ("create_stdin: watch added successfully\n");
+ }
+ } else {
+ g_error ("create_stdin: error while opening stdin\n");
+ }
+}
+
+gboolean
+remove_socket_from_array(GIOChannel *chan) {
+ gboolean ret = 0;
+
+ ret = g_ptr_array_remove_fast(uzbl.comm.connect_chan, chan);
+ if(!ret)
+ ret = g_ptr_array_remove_fast(uzbl.comm.client_chan, chan);
+
+ if(ret)
+ g_io_channel_unref (chan);
+ return ret;
+}
+
+gboolean
+control_socket(GIOChannel *chan) {
+ struct sockaddr_un remote;
+ unsigned int t = sizeof(remote);
+ GIOChannel *iochan;
+ int clientsock;
+
+ clientsock = accept (g_io_channel_unix_get_fd(chan),
+ (struct sockaddr *) &remote, &t);
+
+ if(!uzbl.comm.client_chan)
+ uzbl.comm.client_chan = g_ptr_array_new();
+
+ if ((iochan = g_io_channel_unix_new(clientsock))) {
+ g_io_channel_set_encoding(iochan, NULL, NULL);
+ g_io_add_watch(iochan, G_IO_IN|G_IO_HUP,
+ (GIOFunc) control_client_socket, iochan);
+ g_ptr_array_add(uzbl.comm.client_chan, (gpointer)iochan);
+ }
+ return TRUE;
+}
+
+
+void
+init_connect_socket() {
+ int sockfd, replay = 0;
+ struct sockaddr_un local;
+ GIOChannel *chan;
+ gchar **name = NULL;
+
+ if(!uzbl.comm.connect_chan)
+ uzbl.comm.connect_chan = g_ptr_array_new();
+
+ name = uzbl.state.connect_socket_names;
+
+ while(name && *name) {
+ sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
+ local.sun_family = AF_UNIX;
+ strcpy (local.sun_path, *name);
+
+ if(!connect(sockfd, (struct sockaddr *) &local, sizeof(local))) {
+ if ((chan = g_io_channel_unix_new(sockfd))) {
+ g_io_channel_set_encoding(chan, NULL, NULL);
+ g_io_add_watch(chan, G_IO_IN|G_IO_HUP,
+ (GIOFunc) control_client_socket, chan);
+ g_ptr_array_add(uzbl.comm.connect_chan, (gpointer)chan);
+ replay++;
+ }
+ }
+ else
+ g_warning("Error connecting to socket: %s\n", *name);
+ name++;
+ }
+
+ /* replay buffered events */
+ if(replay)
+ send_event_socket(NULL);
+}
+
+
+gboolean
+control_client_socket(GIOChannel *clientchan) {
+ char *ctl_line;
+ GString *result = g_string_new("");
+ GError *error = NULL;
+ GIOStatus ret;
+ gsize len;
+
+ ret = g_io_channel_read_line(clientchan, &ctl_line, &len, NULL, &error);
+ if (ret == G_IO_STATUS_ERROR) {
+ g_warning ("Error reading: %s", error->message);
+ g_clear_error (&error);
+ ret = g_io_channel_shutdown (clientchan, TRUE, &error);
+ remove_socket_from_array (clientchan);
+ if (ret == G_IO_STATUS_ERROR) {
+ g_warning ("Error closing: %s", error->message);
+ g_clear_error (&error);
+ }
+ return FALSE;
+ } else if (ret == G_IO_STATUS_EOF) {
+ /* shutdown and remove channel watch from main loop */
+ ret = g_io_channel_shutdown (clientchan, TRUE, &error);
+ remove_socket_from_array (clientchan);
+ if (ret == G_IO_STATUS_ERROR) {
+ g_warning ("Error closing: %s", error->message);
+ g_clear_error (&error);
+ }
+ return FALSE;
+ }
+
+ if (ctl_line) {
+ parse_cmd_line (ctl_line, result);
+ g_string_append_c(result, '\n');
+ ret = g_io_channel_write_chars (clientchan, result->str, result->len,
+ &len, &error);
+ if (ret == G_IO_STATUS_ERROR) {
+ g_warning ("Error writing: %s", error->message);
+ g_clear_error (&error);
+ }
+ if (g_io_channel_flush(clientchan, &error) == G_IO_STATUS_ERROR) {
+ g_warning ("Error flushing: %s", error->message);
+ g_clear_error (&error);
+ }
+ }
+
+ g_string_free(result, TRUE);
+ g_free(ctl_line);
+ return TRUE;
+}
+
+
+gboolean
+attach_socket(gchar *path, struct sockaddr_un *local) {
+ GIOChannel *chan = NULL;
+ int sock = socket (AF_UNIX, SOCK_STREAM, 0);
+
+ if (bind (sock, (struct sockaddr *) local, sizeof(*local)) != -1) {
+ if (uzbl.state.verbose)
+ printf ("init_socket: opened in %s\n", path);
+
+ if(listen (sock, 5) < 0)
+ g_warning ("attach_socket: could not listen on %s: %s\n", path, strerror(errno));
+
+ if( (chan = g_io_channel_unix_new(sock)) ) {
+ g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_socket, chan);
+ uzbl.comm.socket_path = path;
+ send_event(SOCKET_SET, path, NULL);
+ g_setenv("UZBL_SOCKET", uzbl.comm.socket_path, TRUE);
+ return TRUE;
+ }
+ } else g_warning ("attach_socket: could not bind to %s: %s\n", path, strerror(errno));
+
+ return FALSE;
+}
+
+
+/*@null@*/ gchar*
+init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL */
+ if (uzbl.comm.socket_path) { /* remove an existing socket should one exist */
+ if (unlink(uzbl.comm.socket_path) == -1)
+ g_warning ("init_socket: couldn't unlink socket at %s\n", uzbl.comm.socket_path);
+ g_free(uzbl.comm.socket_path);
+ uzbl.comm.socket_path = NULL;
+ }
+
+ if (*dir == ' ') {
+ g_free(dir);
+ return NULL;
+ }
+
+ struct sockaddr_un local;
+ gchar *path = build_stream_name(SOCKET, dir);
+
+ local.sun_family = AF_UNIX;
+ strcpy (local.sun_path, path);
+
+ if(!file_exists(path) && attach_socket(path, &local)) {
+ /* it's free for the taking. */
+ return dir;
+ } else {
+ /* see if anybody's listening on the socket path we want. */
+ int sock = socket (AF_UNIX, SOCK_STREAM, 0);
+ if(connect(sock, (struct sockaddr *) &local, sizeof(local)) < 0) {
+ /* some error occurred, presumably nobody's listening.
+ * we can attach ourselves to it. */
+ unlink(path);
+ if(attach_socket(path, &local))
+ return dir;
+ else
+ g_warning("init_socket: can't attach to existing socket %s: %s\n", path, strerror(errno));
+ } else {
+ /* somebody's there, we can't use that socket path. */
+ close(sock);
+ /* whatever, this instance can live without a socket. */
+ g_warning ("init_socket: can't create %s: socket exists and is occupied\n", path);
+ }
+ }
+
+ /* if we got this far, there was an error; cleanup */
+ g_free(path);
+ g_free(dir);
+ return NULL;
+}
diff --git a/src/io.h b/src/io.h
new file mode 100644
index 0000000..a6ea0a1
--- /dev/null
+++ b/src/io.h
@@ -0,0 +1,23 @@
+#ifndef __IO__
+#define __IO__
+
+#include <glib/gstdio.h>
+
+/*@null@*/ gchar*
+build_stream_name(int type, const gchar *dir);
+
+gboolean control_fifo(GIOChannel *gio, GIOCondition condition);
+
+/*@null@*/ gchar*
+init_fifo(gchar *dir);
+
+gboolean control_stdin(GIOChannel *gio, GIOCondition condition);
+void create_stdin();
+
+/*@null@*/ gchar*
+init_socket(gchar *dir);
+
+gboolean control_socket(GIOChannel *chan);
+gboolean control_client_socket(GIOChannel *chan);
+
+#endif
diff --git a/src/menu.c b/src/menu.c
new file mode 100644
index 0000000..451b35a
--- /dev/null
+++ b/src/menu.c
@@ -0,0 +1,192 @@
+#include "menu.h"
+#include "util.h"
+#include "uzbl-core.h"
+
+void
+add_to_menu(GArray *argv, guint context) {
+ GUI *g = &uzbl.gui;
+ MenuItem *m;
+ gchar *item_cmd = NULL;
+
+ if(!argv_idx(argv, 0))
+ return;
+
+ gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2);
+ if(!g->menu_items)
+ g->menu_items = g_ptr_array_new();
+
+ if(split[1])
+ item_cmd = split[1];
+
+ if(split[0]) {
+ m = malloc(sizeof(MenuItem));
+ m->name = g_strdup(split[0]);
+ m->cmd = g_strdup(item_cmd?item_cmd:"");
+ m->context = context;
+ m->issep = FALSE;
+ g_ptr_array_add(g->menu_items, m);
+ }
+
+ g_strfreev(split);
+}
+
+
+void
+menu_add(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
+
+}
+
+
+void
+menu_add_link(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
+}
+
+
+void
+menu_add_image(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
+}
+
+
+void
+menu_add_edit(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
+}
+
+
+void
+add_separator_to_menu(GArray *argv, guint context) {
+ GUI *g = &uzbl.gui;
+ MenuItem *m;
+ gchar *sep_name;
+
+ if(!g->menu_items)
+ g->menu_items = g_ptr_array_new();
+
+ if(!argv_idx(argv, 0))
+ return;
+ else
+ sep_name = argv_idx(argv, 0);
+
+ m = malloc(sizeof(MenuItem));
+ m->name = g_strdup(sep_name);
+ m->cmd = NULL;
+ m->context = context;
+ m->issep = TRUE;
+ g_ptr_array_add(g->menu_items, m);
+}
+
+
+void
+menu_add_separator(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
+}
+
+
+void
+menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
+}
+
+
+void
+menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
+}
+
+
+void
+menu_add_separator_edit(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
+}
+
+
+void
+remove_from_menu(GArray *argv, guint context) {
+ GUI *g = &uzbl.gui;
+ MenuItem *mi;
+ gchar *name = NULL;
+ guint i=0;
+
+ if(!g->menu_items)
+ return;
+
+ if(!argv_idx(argv, 0))
+ return;
+ else
+ name = argv_idx(argv, 0);
+
+ for(i=0; i < g->menu_items->len; i++) {
+ mi = g_ptr_array_index(g->menu_items, i);
+
+ if((context == mi->context) && !strcmp(name, mi->name)) {
+ g_free(mi->name);
+ g_free(mi->cmd);
+ g_free(mi);
+ g_ptr_array_remove_index(g->menu_items, i);
+ }
+ }
+}
+
+
+void
+menu_remove(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
+}
+
+
+void
+menu_remove_link(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
+}
+
+
+void
+menu_remove_image(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
+}
+
+
+void
+menu_remove_edit(WebKitWebView *page, GArray *argv, GString *result) {
+ (void) page;
+ (void) result;
+
+ remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
+}
+
diff --git a/src/menu.h b/src/menu.h
new file mode 100644
index 0000000..8b89f2f
--- /dev/null
+++ b/src/menu.h
@@ -0,0 +1,18 @@
+#ifndef __MENU__
+#define __MENU__
+
+#include <webkit/webkit.h>
+
+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);
+void menu_add_edit(WebKitWebView *page, GArray *argv, GString *result);
+void menu_add_separator(WebKitWebView *page, GArray *argv, GString *result);
+void menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result);
+void menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result);
+void menu_add_separator_edit(WebKitWebView *page, GArray *argv, GString *result);
+void menu_remove(WebKitWebView *page, GArray *argv, GString *result);
+void menu_remove_link(WebKitWebView *page, GArray *argv, GString *result);
+void menu_remove_image(WebKitWebView *page, GArray *argv, GString *result);
+void menu_remove_edit(WebKitWebView *page, GArray *argv, GString *result);
+#endif
diff --git a/src/util.c b/src/util.c
index c9c728e..f56eb57 100644
--- a/src/util.c
+++ b/src/util.c
@@ -6,8 +6,7 @@
#include "util.h"
-const XDG_Var XDG[] =
-{
+const XDG_Var XDG[] = {
{ "XDG_CONFIG_HOME", "~/.config" },
{ "XDG_DATA_HOME", "~/.local/share" },
{ "XDG_CACHE_HOME", "~/.cache" },
@@ -108,3 +107,86 @@ for_each_line_in_file(const gchar *path, void (*callback)(const gchar *l, void *
return FALSE;
}
+
+
+enum exp_type
+get_exp_type(const gchar *s) {
+ /* variables */
+ if(*(s+1) == '(')
+ return EXP_EXPR;
+ else if(*(s+1) == '{')
+ return EXP_BRACED_VAR;
+ else if(*(s+1) == '<')
+ return EXP_JS;
+ else if(*(s+1) == '[')
+ return EXP_ESCAPE;
+ else
+ return EXP_SIMPLE_VAR;
+
+ /*@notreached@*/
+return EXP_ERR;
+}
+
+
+/* search a PATH style string for an existing file+path combination */
+gchar*
+find_existing_file(gchar* path_list) {
+ int i=0;
+ int cnt;
+ gchar **split;
+ gchar *tmp = NULL;
+ gchar *executable;
+
+ if(!path_list)
+ return NULL;
+
+ split = g_strsplit(path_list, ":", 0);
+ while(split[i])
+ i++;
+
+ if(i<=1) {
+ tmp = g_strdup(split[0]);
+ g_strfreev(split);
+ return tmp;
+ }
+ else
+ cnt = i-1;
+
+ i=0;
+ tmp = g_strdup(split[cnt]);
+ g_strstrip(tmp);
+ if(tmp[0] == '/')
+ executable = g_strdup_printf("%s", tmp+1);
+ else
+ executable = g_strdup(tmp);
+ g_free(tmp);
+
+ while(i<cnt) {
+ tmp = g_strconcat(g_strstrip(split[i]), "/", executable, NULL);
+ if(g_file_test(tmp, G_FILE_TEST_EXISTS)) {
+ g_strfreev(split);
+ return tmp;
+ }
+ else
+ g_free(tmp);
+ i++;
+ }
+
+ g_free(executable);
+ g_strfreev(split);
+ return NULL;
+}
+
+
+char*
+itos(int val) {
+ char tmp[20];
+
+ snprintf(tmp, sizeof(tmp), "%i", val);
+ return g_strdup(tmp);
+}
+
+gchar*
+argv_idx(const GArray *a, const guint idx) {
+ return g_array_index(a, gchar*, idx);
+}
diff --git a/src/util.h b/src/util.h
index f03f13e..388c202 100644
--- a/src/util.h
+++ b/src/util.h
@@ -1,18 +1,20 @@
#include <glib.h>
+#include <stdio.h>
typedef struct {
gchar* environmental;
gchar* default_value;
} XDG_Var;
-gchar* get_xdg_var (XDG_Var xdg);
+enum exp_type {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE};
-gchar* find_xdg_file (int xdg_type, const char* filename);
-gboolean file_exists(const char* filename);
-
-char *
-str_replace (const char* search, const char* replace, const char* string);
-
-gboolean
-for_each_line_in_file(const gchar *path, void (*callback)(const gchar *l, void *c), void *user_data);
+gchar* get_xdg_var(XDG_Var xdg);
+gchar* find_xdg_file(int xdg_type, const char* filename);
+gboolean file_exists(const char* filename);
+char* str_replace(const char* search, const char* replace, const char* string);
+gboolean for_each_line_in_file(const gchar *path, void (*callback)(const gchar *l, void *c), void *user_data);
+enum exp_type get_exp_type(const gchar*);
+gchar* find_existing_file(gchar*);
+char* itos(int val);
+gchar* argv_idx(const GArray*, const guint);
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index f1426e2..a3a03b0 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -35,13 +35,14 @@
#include "inspector.h"
#include "config.h"
#include "util.h"
+#include "menu.h"
+#include "io.h"
UzblCore uzbl;
/* commandline arguments (set initial values for the state variables) */
const
-GOptionEntry entries[] =
-{
+GOptionEntry entries[] = {
{ "uri", 'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
"Uri to load at startup (equivalent to 'uzbl <uri>' or 'set uri = URI' after uzbl has launched)", "URI" },
{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &uzbl.state.verbose,
@@ -164,43 +165,25 @@ create_var_to_name_hash() {
/* --- UTILITY FUNCTIONS --- */
-enum exp_type {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE};
-enum exp_type
-get_exp_type(const gchar *s) {
- /* variables */
- if(*(s+1) == '(')
- return EXP_EXPR;
- else if(*(s+1) == '{')
- return EXP_BRACED_VAR;
- else if(*(s+1) == '<')
- return EXP_JS;
- else if(*(s+1) == '[')
- return EXP_ESCAPE;
- else
- return EXP_SIMPLE_VAR;
-
- /*@notreached@*/
-return EXP_ERR;
-}
/*
* recurse == 1: don't expand '@(command)@'
* recurse == 2: don't expand '@<java script>@'
*/
-gchar *
-expand(const char *s, guint recurse) {
- uzbl_cmdprop *c;
+gchar*
+expand(const char* s, guint recurse) {
+ uzbl_cmdprop* c;
enum exp_type etype;
- char *end_simple_var = "\t^°!\"§$%&/()=?'`'+~*'#-:,;@<>| \\{}[]¹²³¼½";
- char *ret = NULL;
- char *vend = NULL;
- GError *err = NULL;
- gchar *cmd_stdout = NULL;
- gchar *mycmd = NULL;
- GString *buf = g_string_new("");
- GString *js_ret = g_string_new("");
-
- while(s && *s) {
+ char* end_simple_var = "\t^°!\"§$%&/()=?'`'+~*'#-:,;@<>| \\{}[]¹²³¼½";
+ char* ret = NULL;
+ char* vend = NULL;
+ GError* err = NULL;
+ gchar* cmd_stdout = NULL;
+ gchar* mycmd = NULL;
+ GString* buf = g_string_new("");
+ GString* js_ret = g_string_new("");
+
+ while (s && *s) {
switch(*s) {
case '\\':
g_string_append_c(buf, *++s);
@@ -351,75 +334,15 @@ expand(const char *s, guint recurse) {
return g_string_free(buf, FALSE);
}
-char *
-itos(int val) {
- char tmp[20];
-
- snprintf(tmp, sizeof(tmp), "%i", val);
- return g_strdup(tmp);
-}
-
-gchar*
-argv_idx(const GArray *a, const guint idx) { return g_array_index(a, gchar*, idx); }
-
-/* search a PATH style string for an existing file+path combination */
-gchar*
-find_existing_file(gchar* path_list) {
- int i=0;
- int cnt;
- gchar **split;
- gchar *tmp = NULL;
- gchar *executable;
-
- if(!path_list)
- return NULL;
-
- split = g_strsplit(path_list, ":", 0);
- while(split[i])
- i++;
-
- if(i<=1) {
- tmp = g_strdup(split[0]);
- g_strfreev(split);
- return tmp;
- }
- else
- cnt = i-1;
-
- i=0;
- tmp = g_strdup(split[cnt]);
- g_strstrip(tmp);
- if(tmp[0] == '/')
- executable = g_strdup_printf("%s", tmp+1);
- else
- executable = g_strdup(tmp);
- g_free(tmp);
-
- while(i<cnt) {
- tmp = g_strconcat(g_strstrip(split[i]), "/", executable, NULL);
- if(g_file_test(tmp, G_FILE_TEST_EXISTS)) {
- g_strfreev(split);
- return tmp;
- }
- else
- g_free(tmp);
- i++;
- }
-
- g_free(executable);
- g_strfreev(split);
- return NULL;
-}
-
void
clean_up(void) {
- if(uzbl.info.pid_str) {
+ if (uzbl.info.pid_str) {
send_event(INSTANCE_EXIT, uzbl.info.pid_str, NULL);
g_free(uzbl.info.pid_str);
uzbl.info.pid_str = NULL;
}
- if(uzbl.state.executable_path) {
+ if (uzbl.state.executable_path) {
g_free(uzbl.state.executable_path);
uzbl.state.executable_path = NULL;
}
@@ -429,7 +352,7 @@ clean_up(void) {
uzbl.behave.commands = NULL;
}
- if(uzbl.state.event_buffer) {
+ if (uzbl.state.event_buffer) {
g_ptr_array_free(uzbl.state.event_buffer, TRUE);
uzbl.state.event_buffer = NULL;
}
@@ -489,7 +412,7 @@ empty_event_buffer(int s) {
/* scroll a bar in a given direction */
void
-scroll (GtkAdjustment* bar, gchar *amount_str) {
+scroll(GtkAdjustment* bar, gchar *amount_str) {
gchar *end;
gdouble max_value;
@@ -617,8 +540,7 @@ CommandInfo cmdlist[] =
};
void
-commands_hash(void)
-{
+commands_hash(void) {
unsigned int i;
uzbl.behave.commands = g_hash_table_new(g_str_hash, g_str_equal);
@@ -626,11 +548,12 @@ commands_hash(void)
g_hash_table_insert(uzbl.behave.commands, (gpointer) cmdlist[i].key, &cmdlist[i]);
}
+
void
builtins() {
- unsigned int i,
- len = LENGTH(cmdlist);
- GString *command_list = g_string_new("");
+ 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);
@@ -658,178 +581,6 @@ set_var(WebKitWebView *page, GArray *argv, GString *result) {
g_strfreev(split);
}
-void
-add_to_menu(GArray *argv, guint context) {
- GUI *g = &uzbl.gui;
- MenuItem *m;
- gchar *item_cmd = NULL;
-
- if(!argv_idx(argv, 0))
- return;
-
- gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2);
- if(!g->menu_items)
- g->menu_items = g_ptr_array_new();
-
- if(split[1])
- item_cmd = split[1];
-
- if(split[0]) {
- m = malloc(sizeof(MenuItem));
- m->name = g_strdup(split[0]);
- m->cmd = g_strdup(item_cmd?item_cmd:"");
- m->context = context;
- m->issep = FALSE;
- g_ptr_array_add(g->menu_items, m);
- }
-
- g_strfreev(split);
-}
-
-void
-menu_add(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
-
-}
-
-void
-menu_add_link(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
-}
-
-void
-menu_add_image(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
-}
-
-void
-menu_add_edit(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
-}
-
-void
-add_separator_to_menu(GArray *argv, guint context) {
- GUI *g = &uzbl.gui;
- MenuItem *m;
- gchar *sep_name;
-
- if(!g->menu_items)
- g->menu_items = g_ptr_array_new();
-
- if(!argv_idx(argv, 0))
- return;
- else
- sep_name = argv_idx(argv, 0);
-
- m = malloc(sizeof(MenuItem));
- m->name = g_strdup(sep_name);
- m->cmd = NULL;
- m->context = context;
- m->issep = TRUE;
- g_ptr_array_add(g->menu_items, m);
-}
-
-void
-menu_add_separator(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
-}
-
-void
-menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
-}
-void
-menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
-}
-
-void
-menu_add_separator_edit(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- add_separator_to_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
-}
-
-void
-remove_from_menu(GArray *argv, guint context) {
- GUI *g = &uzbl.gui;
- MenuItem *mi;
- gchar *name = NULL;
- guint i=0;
-
- if(!g->menu_items)
- return;
-
- if(!argv_idx(argv, 0))
- return;
- else
- name = argv_idx(argv, 0);
-
- for(i=0; i < g->menu_items->len; i++) {
- mi = g_ptr_array_index(g->menu_items, i);
-
- if((context == mi->context) && !strcmp(name, mi->name)) {
- g_free(mi->name);
- g_free(mi->cmd);
- g_free(mi);
- g_ptr_array_remove_index(g->menu_items, i);
- }
- }
-}
-
-void
-menu_remove(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT);
-}
-
-void
-menu_remove_link(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK);
-}
-
-void
-menu_remove_image(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE);
-}
-
-void
-menu_remove_edit(WebKitWebView *page, GArray *argv, GString *result) {
- (void) page;
- (void) result;
-
- remove_from_menu(argv, WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE);
-}
void
event(WebKitWebView *page, GArray *argv, GString *result) {
@@ -967,7 +718,7 @@ act_dump_config_as_events() {
}
void
-load_uri (WebKitWebView *web_view, GArray *argv, GString *result) {
+load_uri(WebKitWebView *web_view, GArray *argv, GString *result) {
(void) web_view; (void) result;
set_var_value("uri", argv_idx(argv, 0));
}
@@ -1123,19 +874,19 @@ search_forward_text (WebKitWebView *page, GArray *argv, GString *result) {
}
void
-search_reverse_text (WebKitWebView *page, GArray *argv, GString *result) {
+search_reverse_text(WebKitWebView *page, GArray *argv, GString *result) {
(void) result;
search_text(page, argv, FALSE);
}
void
-dehilight (WebKitWebView *page, GArray *argv, GString *result) {
+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) {
+chain(WebKitWebView *page, GArray *argv, GString *result) {
(void) page;
guint i = 0;
const gchar *cmd;
@@ -1540,335 +1291,8 @@ parse_cmd_line(const char *ctl_line, GString *result) {
g_free(work_string);
}
-/*@null@*/ gchar*
-build_stream_name(int type, const gchar* dir) {
- State *s = &uzbl.state;
- gchar *str = NULL;
-
- if (type == FIFO) {
- str = g_strdup_printf
- ("%s/uzbl_fifo_%s", dir, s->instance_name);
- } else if (type == SOCKET) {
- str = g_strdup_printf
- ("%s/uzbl_socket_%s", dir, s->instance_name);
- }
- return str;
-}
-
-gboolean
-control_fifo(GIOChannel *gio, GIOCondition condition) {
- if (uzbl.state.verbose)
- printf("triggered\n");
- gchar *ctl_line;
- GIOStatus ret;
- GError *err = NULL;
-
- if (condition & G_IO_HUP)
- g_error ("Fifo: Read end of pipe died!\n");
-
- if(!gio)
- g_error ("Fifo: GIOChannel broke\n");
-
- ret = g_io_channel_read_line(gio, &ctl_line, NULL, NULL, &err);
- if (ret == G_IO_STATUS_ERROR) {
- g_error ("Fifo: Error reading: %s\n", err->message);
- g_error_free (err);
- }
-
- parse_cmd_line(ctl_line, NULL);
- g_free(ctl_line);
-
- return TRUE;
-}
-
-gboolean
-attach_fifo(gchar *path) {
- GError *error = NULL;
- /* we don't really need to write to the file, but if we open the
- * file as 'r' we will block here, waiting for a writer to open
- * the file. */
- GIOChannel *chan = g_io_channel_new_file(path, "r+", &error);
- if (chan) {
- if (g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_fifo, NULL)) {
- if (uzbl.state.verbose)
- printf ("attach_fifo: created successfully as %s\n", path);
- send_event(FIFO_SET, path, NULL);
- uzbl.comm.fifo_path = path;
- g_setenv("UZBL_FIFO", uzbl.comm.fifo_path, TRUE);
- return TRUE;
- } else g_warning ("attach_fifo: could not add watch on %s\n", path);
- } else g_warning ("attach_fifo: can't open: %s\n", error->message);
-
- if (error) g_error_free (error);
- return FALSE;
-}
-
-/*@null@*/ gchar*
-init_fifo(gchar *dir) { /* return dir or, on error, free dir and return NULL */
- if (uzbl.comm.fifo_path) { /* get rid of the old fifo if one exists */
- if (unlink(uzbl.comm.fifo_path) == -1)
- g_warning ("Fifo: Can't unlink old fifo at %s\n", uzbl.comm.fifo_path);
- g_free(uzbl.comm.fifo_path);
- uzbl.comm.fifo_path = NULL;
- }
-
- gchar *path = build_stream_name(FIFO, dir);
-
- if (!file_exists(path)) {
- if (mkfifo (path, 0666) == 0 && attach_fifo(path)) {
- return dir;
- } else g_warning ("init_fifo: can't create %s: %s\n", path, strerror(errno));
- } else {
- /* the fifo exists. but is anybody home? */
- int fd = open(path, O_WRONLY|O_NONBLOCK);
- if(fd < 0) {
- /* some error occurred, presumably nobody's on the read end.
- * we can attach ourselves to it. */
- if(attach_fifo(path))
- return dir;
- else
- g_warning("init_fifo: can't attach to %s: %s\n", path, strerror(errno));
- } else {
- /* somebody's there, we can't use that fifo. */
- close(fd);
- /* whatever, this instance can live without a fifo. */
- g_warning ("init_fifo: can't create %s: file exists and is occupied\n", path);
- }
- }
-
- /* if we got this far, there was an error; cleanup */
- g_free(dir);
- g_free(path);
- return NULL;
-}
-
-gboolean
-control_stdin(GIOChannel *gio, GIOCondition condition) {
- (void) condition;
- gchar *ctl_line = NULL;
- GIOStatus ret;
-
- ret = g_io_channel_read_line(gio, &ctl_line, NULL, NULL, NULL);
- if ( (ret == G_IO_STATUS_ERROR) || (ret == G_IO_STATUS_EOF) )
- return FALSE;
-
- parse_cmd_line(ctl_line, NULL);
- g_free(ctl_line);
-
- return TRUE;
-}
-
void
-create_stdin () {
- GIOChannel *chan = g_io_channel_unix_new(fileno(stdin));
- if (chan) {
- if (!g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_stdin, NULL)) {
- g_error ("create_stdin: could not add watch\n");
- } else if (uzbl.state.verbose) {
- printf ("create_stdin: watch added successfully\n");
- }
- } else {
- g_error ("create_stdin: error while opening stdin\n");
- }
-}
-
-gboolean
-remove_socket_from_array(GIOChannel *chan) {
- gboolean ret = 0;
-
- ret = g_ptr_array_remove_fast(uzbl.comm.connect_chan, chan);
- if(!ret)
- ret = g_ptr_array_remove_fast(uzbl.comm.client_chan, chan);
-
- if(ret)
- g_io_channel_unref (chan);
- return ret;
-}
-
-gboolean
-control_socket(GIOChannel *chan) {
- struct sockaddr_un remote;
- unsigned int t = sizeof(remote);
- GIOChannel *iochan;
- int clientsock;
-
- clientsock = accept (g_io_channel_unix_get_fd(chan),
- (struct sockaddr *) &remote, &t);
-
- if(!uzbl.comm.client_chan)
- uzbl.comm.client_chan = g_ptr_array_new();
-
- if ((iochan = g_io_channel_unix_new(clientsock))) {
- g_io_channel_set_encoding(iochan, NULL, NULL);
- g_io_add_watch(iochan, G_IO_IN|G_IO_HUP,
- (GIOFunc) control_client_socket, iochan);
- g_ptr_array_add(uzbl.comm.client_chan, (gpointer)iochan);
- }
- return TRUE;
-}
-
-void
-init_connect_socket() {
- int sockfd, replay = 0;
- struct sockaddr_un local;
- GIOChannel *chan;
- gchar **name = NULL;
-
- if(!uzbl.comm.connect_chan)
- uzbl.comm.connect_chan = g_ptr_array_new();
-
- name = uzbl.state.connect_socket_names;
-
- while(name && *name) {
- sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
- local.sun_family = AF_UNIX;
- strcpy (local.sun_path, *name);
-
- if(!connect(sockfd, (struct sockaddr *) &local, sizeof(local))) {
- if ((chan = g_io_channel_unix_new(sockfd))) {
- g_io_channel_set_encoding(chan, NULL, NULL);
- g_io_add_watch(chan, G_IO_IN|G_IO_HUP,
- (GIOFunc) control_client_socket, chan);
- g_ptr_array_add(uzbl.comm.connect_chan, (gpointer)chan);
- replay++;
- }
- }
- else
- g_warning("Error connecting to socket: %s\n", *name);
- name++;
- }
-
- /* replay buffered events */
- if(replay)
- send_event_socket(NULL);
-}
-
-gboolean
-control_client_socket(GIOChannel *clientchan) {
- char *ctl_line;
- GString *result = g_string_new("");
- GError *error = NULL;
- GIOStatus ret;
- gsize len;
-
- ret = g_io_channel_read_line(clientchan, &ctl_line, &len, NULL, &error);
- if (ret == G_IO_STATUS_ERROR) {
- g_warning ("Error reading: %s", error->message);
- g_clear_error (&error);
- ret = g_io_channel_shutdown (clientchan, TRUE, &error);
- remove_socket_from_array (clientchan);
- if (ret == G_IO_STATUS_ERROR) {
- g_warning ("Error closing: %s", error->message);
- g_clear_error (&error);
- }
- return FALSE;
- } else if (ret == G_IO_STATUS_EOF) {
- /* shutdown and remove channel watch from main loop */
- ret = g_io_channel_shutdown (clientchan, TRUE, &error);
- remove_socket_from_array (clientchan);
- if (ret == G_IO_STATUS_ERROR) {
- g_warning ("Error closing: %s", error->message);
- g_clear_error (&error);
- }
- return FALSE;
- }
-
- if (ctl_line) {
- parse_cmd_line (ctl_line, result);
- g_string_append_c(result, '\n');
- ret = g_io_channel_write_chars (clientchan, result->str, result->len,
- &len, &error);
- if (ret == G_IO_STATUS_ERROR) {
- g_warning ("Error writing: %s", error->message);
- g_clear_error (&error);
- }
- if (g_io_channel_flush(clientchan, &error) == G_IO_STATUS_ERROR) {
- g_warning ("Error flushing: %s", error->message);
- g_clear_error (&error);
- }
- }
-
- g_string_free(result, TRUE);
- g_free(ctl_line);
- return TRUE;
-}
-
-
-gboolean
-attach_socket(gchar *path, struct sockaddr_un *local) {
- GIOChannel *chan = NULL;
- int sock = socket (AF_UNIX, SOCK_STREAM, 0);
-
- if (bind (sock, (struct sockaddr *) local, sizeof(*local)) != -1) {
- if (uzbl.state.verbose)
- printf ("init_socket: opened in %s\n", path);
-
- if(listen (sock, 5) < 0)
- g_warning ("attach_socket: could not listen on %s: %s\n", path, strerror(errno));
-
- if( (chan = g_io_channel_unix_new(sock)) ) {
- g_io_add_watch(chan, G_IO_IN|G_IO_HUP, (GIOFunc) control_socket, chan);
- uzbl.comm.socket_path = path;
- send_event(SOCKET_SET, path, NULL);
- g_setenv("UZBL_SOCKET", uzbl.comm.socket_path, TRUE);
- return TRUE;
- }
- } else g_warning ("attach_socket: could not bind to %s: %s\n", path, strerror(errno));
-
- return FALSE;
-}
-
-
-/*@null@*/ gchar*
-init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL */
- if (uzbl.comm.socket_path) { /* remove an existing socket should one exist */
- if (unlink(uzbl.comm.socket_path) == -1)
- g_warning ("init_socket: couldn't unlink socket at %s\n", uzbl.comm.socket_path);
- g_free(uzbl.comm.socket_path);
- uzbl.comm.socket_path = NULL;
- }
-
- if (*dir == ' ') {
- g_free(dir);
- return NULL;
- }
-
- struct sockaddr_un local;
- gchar *path = build_stream_name(SOCKET, dir);
-
- local.sun_family = AF_UNIX;
- strcpy (local.sun_path, path);
-
- if(!file_exists(path) && attach_socket(path, &local)) {
- /* it's free for the taking. */
- return dir;
- } else {
- /* see if anybody's listening on the socket path we want. */
- int sock = socket (AF_UNIX, SOCK_STREAM, 0);
- if(connect(sock, (struct sockaddr *) &local, sizeof(local)) < 0) {
- /* some error occurred, presumably nobody's listening.
- * we can attach ourselves to it. */
- unlink(path);
- if(attach_socket(path, &local))
- return dir;
- else
- g_warning("init_socket: can't attach to existing socket %s: %s\n", path, strerror(errno));
- } else {
- /* somebody's there, we can't use that socket path. */
- close(sock);
- /* whatever, this instance can live without a socket. */
- g_warning ("init_socket: can't create %s: socket exists and is occupied\n", path);
- }
- }
-
- /* if we got this far, there was an error; cleanup */
- g_free(path);
- g_free(dir);
- return NULL;
-}
-
-void
-update_title (void) {
+update_title(void) {
Behaviour *b = &uzbl.behave;
const gchar *title_format = b->title_format_long;
@@ -1906,11 +1330,24 @@ update_title (void) {
}
}
+
void
-create_browser () {
- GUI *g = &uzbl.gui;
+create_scrolled_win() {
+ GUI* g = &uzbl.gui;
+
+ g->web_view = WEBKIT_WEB_VIEW(webkit_web_view_new());
+ g->scrolled_win = gtk_scrolled_window_new(NULL, NULL);
+
+ gtk_scrolled_window_set_policy(
+ GTK_SCROLLED_WINDOW(g->scrolled_win),
+ GTK_POLICY_NEVER,
+ GTK_POLICY_NEVER
+ );
- g->web_view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
+ gtk_container_add(
+ GTK_CONTAINER(g->scrolled_win),
+ GTK_WIDGET(g->web_view)
+ );
g_object_connect((GObject*)g->web_view,
"signal::key-press-event", (GCallback)key_press_cb, NULL,
@@ -1936,8 +1373,9 @@ create_browser () {
NULL);
}
+
GtkWidget*
-create_mainbar () {
+create_mainbar() {
GUI *g = &uzbl.gui;
g->mainbar = gtk_hbox_new (FALSE, 0);
@@ -1969,11 +1407,12 @@ create_mainbar () {
GtkWidget*
-create_window () {
+create_window() {
GtkWidget* window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
gtk_widget_set_name (window, "Uzbl browser");
+ gtk_window_set_title(GTK_WINDOW(window), "Uzbl browser");
/* if the window has been made small, it shouldn't try to resize itself due
* to a long statusbar. */
@@ -1988,8 +1427,9 @@ create_window () {
return window;
}
+
GtkPlug*
-create_plug () {
+create_plug() {
GtkPlug* plug = GTK_PLUG (gtk_plug_new (uzbl.state.socket_id));
g_signal_connect (G_OBJECT (plug), "destroy", G_CALLBACK (destroy_cb), NULL);
g_signal_connect (G_OBJECT (plug), "key-press-event", G_CALLBACK (key_press_cb), NULL);
@@ -2000,10 +1440,11 @@ create_plug () {
void
settings_init () {
- State *s = &uzbl.state;
- Network *n = &uzbl.net;
-
- int i;
+ State* s = &uzbl.state;
+ Network* n = &uzbl.net;
+ int i;
+
+ /* Load default config */
for (i = 0; default_config[i].command != NULL; i++) {
parse_cmd_line(default_config[i].command, NULL);
}
@@ -2014,11 +1455,12 @@ settings_init () {
}
else if (!s->config_file) {
- s->config_file = find_xdg_file (0, "/uzbl/config");
+ s->config_file = find_xdg_file(0, "/uzbl/config");
}
+ /* Load config file, if any */
if (s->config_file) {
- if(!for_each_line_in_file(s->config_file, parse_cmd_line_cb, NULL)) {
+ 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, tmp, NULL);
g_free(tmp);
@@ -2027,17 +1469,17 @@ settings_init () {
} else if (uzbl.state.verbose)
printf ("No configuration file loaded.\n");
- if(s->connect_socket_names)
+ if (s->connect_socket_names)
init_connect_socket();
g_signal_connect(n->soup_session, "authenticate", G_CALLBACK(handle_authentication), NULL);
}
-void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data) {
+void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data) {
(void) user_data;
- if(uzbl.behave.authentication_handler && *uzbl.behave.authentication_handler != 0) {
+ if (uzbl.behave.authentication_handler && *uzbl.behave.authentication_handler != 0) {
soup_session_pause_message(session, msg);
GString *result = g_string_new ("");
@@ -2173,63 +1615,76 @@ set_webview_scroll_adjustments() {
NULL);
}
-/* set up gtk, gobject, variable defaults and other things that tests and other
+
+/* Set up gtk, gobject, variable defaults and other things that tests and other
* external applications need to do anyhow */
void
-initialize(int argc, char *argv[]) {
- int i;
+initialize(int argc, char** argv) {
+ /* Initialize variables */
+ uzbl.state.socket_id = 0;
+ uzbl.state.plug_mode = FALSE;
- for(i=0; i<argc; ++i) {
- if(!strcmp(argv[i], "-s") || !strcmp(argv[i], "--socket")) {
- uzbl.state.plug_mode = TRUE;
- break;
- }
- }
+ uzbl.state.executable_path = g_strdup(argv[0]);
+ uzbl.state.selected_url = NULL;
+ uzbl.state.searchtx = NULL;
- if (!g_thread_supported ())
- g_thread_init (NULL);
- gtk_init (&argc, &argv);
+ uzbl.info.webkit_major = webkit_major_version();
+ uzbl.info.webkit_minor = webkit_minor_version();
+ uzbl.info.webkit_micro = webkit_micro_version();
+ uzbl.info.arch = ARCH;
+ uzbl.info.commit = COMMIT;
- uzbl.state.executable_path = g_strdup(argv[0]);
- uzbl.state.selected_url = NULL;
- uzbl.state.searchtx = NULL;
uzbl.state.last_result = NULL;
+ /* Parse commandline arguments */
GOptionContext* context = g_option_context_new ("[ uri ] - load a uri by default");
- g_option_context_add_main_entries (context, entries, NULL);
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
- g_option_context_parse (context, &argc, &argv, NULL);
+ g_option_context_add_main_entries(context, entries, NULL);
+ g_option_context_add_group(context, gtk_get_option_group (TRUE));
+ g_option_context_parse(context, &argc, &argv, NULL);
g_option_context_free(context);
+ /* Only print version */
if (uzbl.behave.print_version) {
printf("Commit: %s\n", COMMIT);
exit(EXIT_SUCCESS);
}
- uzbl.net.soup_session = webkit_get_default_session();
+ /* Embedded mode */
+ if (uzbl.state.socket_id)
+ uzbl.state.plug_mode = TRUE;
+
+ if (!g_thread_supported())
+ g_thread_init(NULL);
- 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));
/* TODO: move the handler setup to event_buffer_timeout and disarm the
* handler in empty_event_buffer? */
- if(setup_signal(SIGALRM, empty_event_buffer) == SIG_ERR)
+ if (setup_signal(SIGALRM, empty_event_buffer) == SIG_ERR)
fprintf(stderr, "uzbl: error hooking %d: %s\n", SIGALRM, strerror(errno));
event_buffer_timeout(10);
- uzbl.info.webkit_major = webkit_major_version();
- uzbl.info.webkit_minor = webkit_minor_version();
- uzbl.info.webkit_micro = webkit_micro_version();
- uzbl.info.arch = ARCH;
- uzbl.info.commit = COMMIT;
+
+ /* HTTP client */
+ uzbl.net.soup_session = webkit_get_default_session();
+ 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));
- commands_hash ();
+
+ commands_hash();
create_var_to_name_hash();
+ /* GUI */
+ gtk_init(&argc, &argv);
create_mainbar();
- create_browser();
+ create_scrolled_win();
+
+ uzbl.gui.vbox = gtk_vbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
}
+
void
load_uri_imp(gchar *uri) {
GString* newuri;
@@ -2279,21 +1734,9 @@ int
main (int argc, char* argv[]) {
initialize(argc, argv);
- uzbl.gui.scrolled_win = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (uzbl.gui.scrolled_win),
- GTK_POLICY_NEVER, GTK_POLICY_NEVER);
-
- gtk_container_add (GTK_CONTAINER (uzbl.gui.scrolled_win),
- GTK_WIDGET (uzbl.gui.web_view));
-
- uzbl.gui.vbox = gtk_vbox_new (FALSE, 0);
-
- /* initial packing */
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.scrolled_win, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (uzbl.gui.vbox), uzbl.gui.mainbar, FALSE, TRUE, 0);
-
+ /* Embedded mode */
if (uzbl.state.plug_mode) {
- uzbl.gui.plug = create_plug ();
+ uzbl.gui.plug = create_plug();
gtk_container_add (GTK_CONTAINER (uzbl.gui.plug), uzbl.gui.vbox);
gtk_widget_show_all (GTK_WIDGET (uzbl.gui.plug));
/* in xembed mode the window has no unique id and thus
@@ -2304,13 +1747,20 @@ main (int argc, char* argv[]) {
gettimeofday(&tv, NULL);
srand((unsigned int)tv.tv_sec*tv.tv_usec);
uzbl.xwin = rand();
- } else {
- uzbl.gui.main_window = create_window ();
+ }
+
+ /* Windowed mode */
+ else {
+ uzbl.gui.main_window = create_window();
gtk_container_add (GTK_CONTAINER (uzbl.gui.main_window), uzbl.gui.vbox);
gtk_widget_show_all (uzbl.gui.main_window);
+
uzbl.xwin = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (uzbl.gui.main_window)));
+
+ gtk_widget_grab_focus (GTK_WIDGET (uzbl.gui.web_view));
}
+ /* Scrolling */
uzbl.gui.scbar_v = (GtkScrollbar*) gtk_vscrollbar_new (NULL);
uzbl.gui.bar_v = gtk_range_get_adjustment((GtkRange*) uzbl.gui.scbar_v);
uzbl.gui.scbar_h = (GtkScrollbar*) gtk_hscrollbar_new (NULL);
@@ -2330,32 +1780,18 @@ main (int argc, char* argv[]) {
g_setenv("UZBL_PID", uzbl.info.pid_str, TRUE);
send_event(INSTANCE_START, uzbl.info.pid_str, NULL);
- if(uzbl.state.plug_mode) {
+ if (uzbl.state.plug_mode) {
char *t = itos(gtk_plug_get_id(uzbl.gui.plug));
send_event(PLUG_CREATED, t, NULL);
g_free(t);
}
- /* generate an event with a list of built in commands */
+ /* Generate an event with a list of built in commands */
builtins();
- if (!uzbl.state.plug_mode)
- gtk_widget_grab_focus (GTK_WIDGET (uzbl.gui.web_view));
-
- if (uzbl.state.verbose) {
- printf("Uzbl start location: %s\n", argv[0]);
- if (uzbl.state.socket_id)
- printf("plug_id %i\n", gtk_plug_get_id(uzbl.gui.plug));
- else
- printf("window_id %i\n",(int) uzbl.xwin);
- printf("pid %i\n", getpid ());
- printf("name: %s\n", uzbl.state.instance_name);
- printf("commit: %s\n", uzbl.info.commit);
- }
-
/* Check uzbl is in window mode before getting/setting geometry */
if (uzbl.gui.main_window) {
- if(uzbl.gui.geometry)
+ if (uzbl.gui.geometry)
cmd_set_geometry();
else
retrieve_geometry();
@@ -2364,10 +1800,13 @@ main (int argc, char* argv[]) {
gchar *uri_override = (uzbl.state.uri ? g_strdup(uzbl.state.uri) : NULL);
if (argc > 1 && !uzbl.state.uri)
uri_override = g_strdup(argv[1]);
+
gboolean verbose_override = uzbl.state.verbose;
- settings_init ();
+ /* Read configuration file */
+ settings_init();
+ /* Update status bar */
if (!uzbl.behave.show_status)
gtk_widget_hide(uzbl.gui.mainbar);
else
@@ -2376,6 +1815,7 @@ main (int argc, char* argv[]) {
/* WebInspector */
set_up_inspector();
+ /* Options overriding */
if (verbose_override > uzbl.state.verbose)
uzbl.state.verbose = verbose_override;
@@ -2384,7 +1824,22 @@ main (int argc, char* argv[]) {
g_free(uri_override);
}
- gtk_main ();
+ /* Verbose feedback */
+ if (uzbl.state.verbose) {
+ printf("Uzbl start location: %s\n", argv[0]);
+ if (uzbl.state.socket_id)
+ printf("plug_id %i\n", gtk_plug_get_id(uzbl.gui.plug));
+ else
+ printf("window_id %i\n",(int) uzbl.xwin);
+ printf("pid %i\n", getpid ());
+ printf("name: %s\n", uzbl.state.instance_name);
+ printf("commit: %s\n", uzbl.info.commit);
+ }
+
+
+ gtk_main();
+
+ /* Cleanup and exit*/
clean_up();
return EXIT_SUCCESS;
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index 28092b4..a10c0ce 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -10,6 +10,9 @@
*
*/
+#ifndef __UZBL_CORE__
+#define __UZBL_CORE__
+
#define _POSIX_SOURCE
#include <glib/gstdio.h>
@@ -48,8 +51,10 @@
#define LENGTH(x) (sizeof x / sizeof x[0])
-/* gui elements */
+
+/* GUI elements */
typedef struct {
+ /* Window */
GtkWidget* main_window;
gchar* geometry;
GtkPlug* plug;
@@ -61,99 +66,110 @@ typedef struct {
GtkWidget* mainbar_label_left;
GtkWidget* mainbar_label_right;
- GtkScrollbar* scbar_v; // Horizontal and Vertical Scrollbar
- GtkScrollbar* scbar_h; // (These are still hidden)
- GtkAdjustment* bar_v; // Information about document length
- GtkAdjustment* bar_h; // and scrolling position
+ /* Scrolling */
+ GtkScrollbar* scbar_v; /* Horizontal and Vertical Scrollbar */
+ GtkScrollbar* scbar_h; /* (These are still hidden) */
+ GtkAdjustment* bar_v; /* Information about document length */
+ GtkAdjustment* bar_h; /* and scrolling position */
int scrollbars_visible;
+
+ /* Web page */
WebKitWebView* web_view;
gchar* main_title;
gchar* icon;
/* WebInspector */
- GtkWidget *inspector_window;
- WebKitWebInspector *inspector;
+ GtkWidget* inspector_window;
+ WebKitWebInspector* inspector;
- /* custom context menu item */
- GPtrArray *menu_items;
+ /* Custom context menu item */
+ GPtrArray* menu_items;
} GUI;
-/* external communication*/
+/* External communication */
enum { FIFO, SOCKET};
typedef struct {
gchar *fifo_path;
gchar *socket_path;
- /* stores (key)"variable name" -> (value)"pointer to var*/
- GHashTable *proto_var;
+ GHashTable *proto_var; /* stores (key)"variable name" -> (value)"pointer to var */
GPtrArray *connect_chan;
GPtrArray *client_chan;
} Communication;
-/* internal state */
+/* Internal state */
typedef struct {
- gchar *uri;
- gchar *config_file;
- int socket_id;
- char *instance_name;
- gchar *selected_url;
- gchar *last_selected_url;
- gchar *executable_path;
- gchar *searchtx;
- gchar *last_result;
- gboolean verbose;
- gboolean events_stdout;
- GPtrArray *event_buffer;
- gchar** connect_socket_names;
- GdkEventButton *last_button;
- gboolean plug_mode;
+ gchar* uri;
+ gchar* config_file;
+ char* instance_name;
+ gchar* selected_url;
+ gchar* last_selected_url;
+ gchar* executable_path;
+ gchar* searchtx;
+ gboolean verbose;
+ GdkEventButton* last_button;
+ gchar* last_result;
+ gboolean plug_mode;
+
+ /* Events */
+ int socket_id;
+ gboolean events_stdout;
+ GPtrArray* event_buffer;
+ gchar** connect_socket_names;
} State;
-/* networking */
+/* Networking */
typedef struct {
- SoupSession *soup_session;
- UzblCookieJar *soup_cookie_jar;
- SoupLogger *soup_logger;
- char *proxy_url;
- char *useragent;
- char *accept_languages;
- gint max_conns;
- gint max_conns_host;
+ SoupSession* soup_session;
+ UzblCookieJar* soup_cookie_jar;
+ SoupLogger* soup_logger;
+ char* proxy_url;
+ char* useragent;
+ char* accept_languages;
+ gint max_conns;
+ gint max_conns_host;
} Network;
-/* behaviour */
+/* Behaviour */
typedef struct {
/* Status bar */
gchar* status_format;
gchar* status_format_right;
gchar* status_background;
+ gboolean show_status;
+ gboolean status_top;
/* Window title */
gchar* title_format_short;
gchar* title_format_long;
+ /* Communication */
gchar* fifo_dir;
gchar* socket_dir;
+
+ /* Handlers */
gchar* authentication_handler;
+ gchar* scheme_handler;
+ gchar* download_handler;
+
+ /* Fonts */
gchar* default_font_family;
gchar* monospace_font_family;
gchar* sans_serif_font_family;
gchar* serif_font_family;
gchar* fantasy_font_family;
gchar* cursive_font_family;
- gchar* scheme_handler;
- gchar* download_handler;
- gboolean show_status;
+
gboolean forward_keys;
- gboolean status_top;
guint modmask;
guint http_debug;
gchar* shell_cmd;
guint view_source;
+
/* WebKitWebSettings exports */
guint font_size;
guint monospace_size;
@@ -180,30 +196,33 @@ typedef struct {
gboolean print_version;
/* command list: (key)name -> (value)Command */
- /* command list: (key)name -> (value)Command */
GHashTable* commands;
+
/* event lookup: (key)event_id -> (value)event_name */
GHashTable *event_lookup;
} Behaviour;
-/* javascript */
+
+/* Javascript */
typedef struct {
gboolean initialized;
JSClassDefinition classdef;
JSClassRef classref;
} Javascript;
-/* static information */
+
+/* Static information */
typedef struct {
- int webkit_major;
- int webkit_minor;
- int webkit_micro;
- gchar *arch;
- gchar *commit;
- gchar *pid_str;
+ int webkit_major;
+ int webkit_minor;
+ int webkit_micro;
+ gchar* arch;
+ gchar* commit;
+ gchar* pid_str;
} Info;
-/* main uzbl data structure */
+
+/* Main uzbl data structure */
typedef struct {
GUI gui;
State state;
@@ -216,12 +235,12 @@ typedef struct {
Window xwin;
} UzblCore;
-/* Main Uzbl object */
-extern UzblCore uzbl;
+extern UzblCore uzbl; /* Main Uzbl object */
+
typedef void sigfunc(int);
-/* uzbl variables */
+/* Uzbl variables */
enum ptr_type {TYPE_INT, TYPE_STR, TYPE_FLOAT};
typedef struct {
enum ptr_type type;
@@ -236,242 +255,87 @@ typedef struct {
} uzbl_cmdprop;
/* Functions */
-char *
-itos(int val);
-
-void
-clean_up(void);
-
-void
-catch_sigterm(int s);
-
-sigfunc *
-setup_signal(int signe, sigfunc *shandler);
-
-gboolean
-set_var_value(const gchar *name, gchar *val);
-
-void
-load_uri_imp(gchar *uri);
-
-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);
-
-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
-parse_command(const char *cmd, const char *param, GString *result);
-
-void
-parse_cmd_line(const char *ctl_line, GString *result);
-
-/*@null@*/ gchar*
-build_stream_name(int type, const gchar *dir);
-
-gboolean
-control_fifo(GIOChannel *gio, GIOCondition condition);
-
-/*@null@*/ gchar*
-init_fifo(gchar *dir);
-
-gboolean
-control_stdin(GIOChannel *gio, GIOCondition condition);
-
-void
-create_stdin();
-
-/*@null@*/ gchar*
-init_socket(gchar *dir);
-
-gboolean
-control_socket(GIOChannel *chan);
-
-gboolean
-control_client_socket(GIOChannel *chan);
-
-void
-update_title (void);
-
-gboolean
-key_press_cb (GtkWidget* window, GdkEventKey* event);
-
-gboolean
-key_release_cb (GtkWidget* window, GdkEventKey* event);
-
-void
-initialize (int argc, char *argv[]);
-
-void
-create_browser ();
-
-GtkWidget*
-create_mainbar ();
-
-GtkWidget*
-create_window ();
-
-GtkPlug*
-create_plug ();
-
-void
-settings_init ();
-
-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
-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, gchar *script, GString *result, const gchar *script_file);
-
-void
-handle_authentication (SoupSession *session,
+void clean_up(void);
+void update_title(void);
+
+/* Signal management functions */
+void catch_sigterm(int s);
+sigfunc* setup_signal(int signe, sigfunc *shandler);
+
+gboolean set_var_value(const gchar *name, gchar *val);
+void load_uri_imp(gchar *uri);
+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);
+
+/* Running commands */
+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 parse_command(const char *cmd, const char *param, GString *result);
+void parse_cmd_line(const char *ctl_line, GString *result);
+
+/* Keyboard events functions */
+gboolean key_press_cb(GtkWidget* window, GdkEventKey* event);
+gboolean key_release_cb(GtkWidget* window, GdkEventKey* event);
+
+/* Initialization functions */
+void initialize(int argc, char *argv[]);
+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);
+
+/* 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, gchar *script, GString *result, const gchar *script_file);
+
+/* Network functions */
+void handle_authentication (SoupSession *session,
SoupMessage *msg,
SoupAuth *auth,
gboolean retrying,
gpointer user_data);
-
-void handle_cookies (SoupSession *session,
+void handle_cookies (SoupSession *session,
SoupMessage *msg,
gpointer user_data);
-
-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
-set_webview_scroll_adjustments();
-
-void
-event(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-init_connect_socket();
-
-gboolean
-remove_socket_from_array(GIOChannel *chan);
-
-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);
-
-void
-menu_add_edit(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_add_separator(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_add_separator_edit(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_remove(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_remove_link(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_remove_image(WebKitWebView *page, GArray *argv, GString *result);
-
-void
-menu_remove_edit(WebKitWebView *page, GArray *argv, GString *result);
-
-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
-builtins();
+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 set_webview_scroll_adjustments();
+void event(WebKitWebView *page, GArray *argv, GString *result);
+void init_connect_socket();
+gboolean remove_socket_from_array(GIOChannel *chan);
+
+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 builtins();
typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);
@@ -491,11 +355,11 @@ void
run_parsed_command(const CommandInfo *c, GArray *a, GString *result);
typedef struct {
- gchar *name;
- gchar *cmd;
+ gchar* name;
+ gchar* cmd;
gboolean issep;
- guint context;
+ guint context;
} MenuItem;
-
+#endif
/* vi: set et ts=4: */