diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/callbacks.c | 43 | ||||
-rw-r--r-- | src/commands.c | 130 | ||||
-rw-r--r-- | src/commands.h | 1 | ||||
-rw-r--r-- | src/events.c | 109 | ||||
-rw-r--r-- | src/events.h | 31 | ||||
-rw-r--r-- | src/io.c | 87 | ||||
-rw-r--r-- | src/io.h | 6 | ||||
-rw-r--r-- | src/status-bar.c | 2 | ||||
-rw-r--r-- | src/status-bar.h | 4 | ||||
-rw-r--r-- | src/type.h | 34 | ||||
-rw-r--r-- | src/util.c | 4 | ||||
-rw-r--r-- | src/uzbl-core.c | 110 | ||||
-rw-r--r-- | src/uzbl-core.h | 47 | ||||
-rw-r--r-- | src/variables.c | 743 | ||||
-rw-r--r-- | src/variables.h | 31 |
15 files changed, 907 insertions, 475 deletions
diff --git a/src/callbacks.c b/src/callbacks.c index 446e868..23b8d55 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -8,6 +8,7 @@ #include "events.h" #include "menu.h" #include "type.h" +#include "variables.h" void link_hover_cb (WebKitWebView *page, const gchar *title, const gchar *link, gpointer data) { @@ -113,16 +114,15 @@ destroy_cb (GtkWidget* widget, gpointer data) { gboolean configure_event_cb(GtkWidget* window, GdkEventConfigure* event) { - (void) window; - (void) event; - gchar *lastgeo = NULL; + (void) window; (void) event; - lastgeo = g_strdup(uzbl.gui.geometry); - retrieve_geometry(); + gchar *last_geo = uzbl.gui.geometry; + gchar *current_geo = get_geometry(); - if(strcmp(lastgeo, uzbl.gui.geometry)) - send_event(GEOMETRY_CHANGED, NULL, TYPE_STR, uzbl.gui.geometry, NULL); - g_free(lastgeo); + if(!last_geo || strcmp(last_geo, current_geo)) + send_event(GEOMETRY_CHANGED, NULL, TYPE_STR, current_geo, NULL); + + g_free(current_geo); return FALSE; } @@ -165,12 +165,13 @@ button_press_cb (GtkWidget* window, GdkEventButton* event) { gboolean propagate = FALSE, sendev = FALSE; + context = get_click_context(NULL); + if(event->type == GDK_BUTTON_PRESS) { if(uzbl.state.last_button) gdk_event_free((GdkEvent *)uzbl.state.last_button); uzbl.state.last_button = (GdkEventButton *)gdk_event_copy((GdkEvent *)event); - context = get_click_context(NULL); /* left click */ if(event->button == 1) { if((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) @@ -357,7 +358,31 @@ request_starting_cb(WebKitWebView *web_view, WebKitWebFrame *frame, WebKitWebRes (void) response; (void) user_data; + const gchar* uri = webkit_network_request_get_uri (request); + + if (uzbl.state.verbose) + printf("Request starting -> %s\n", uri); send_event (REQUEST_STARTING, NULL, TYPE_STR, webkit_network_request_get_uri(request), NULL); + + if (uzbl.behave.request_handler) { + GString *result = g_string_new (""); + GArray *a = g_array_new (TRUE, FALSE, sizeof(gchar*)); + const CommandInfo *c = parse_command_parts(uzbl.behave.request_handler, a); + + if(c) { + g_array_append_val(a, uri); + run_parsed_command(c, a, result); + } + g_array_free(a, TRUE); + + if(result->len > 0) { + char *p = strchr(result->str, '\n' ); + if ( p != NULL ) *p = '\0'; + webkit_network_request_set_uri(request, result->str); + } + + g_string_free(result, TRUE); + } } void diff --git a/src/commands.c b/src/commands.c index 85057b3..b3546a9 100644 --- a/src/commands.c +++ b/src/commands.c @@ -34,6 +34,7 @@ CommandInfo cmdlist[] = { "search_clear", search_clear, TRUE }, { "dehilight", dehilight, 0 }, { "set", set_var, TRUE }, + { "toggle", toggle_var, 0 }, { "dump_config", act_dump_config, 0 }, { "dump_config_as_events", act_dump_config_as_events, 0 }, { "chain", chain, 0 }, @@ -110,23 +111,25 @@ view_go_forward(WebKitWebView *page, GArray *argv, GString *result) { void toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result) { - (void)argv; (void)result; - webkit_web_view_set_full_content_zoom (page, !webkit_web_view_get_full_content_zoom (page)); + (void)page; (void)argv; (void)result; + + int current_type = get_zoom_type(); + set_zoom_type(!current_type); } void toggle_status (WebKitWebView* page, GArray *argv, GString *result) { (void)page; (void)argv; (void)result; - uzbl.behave.show_status = !uzbl.behave.show_status; - - set_show_status(); + int current_status = get_show_status(); + set_show_status(!current_status); } /* * scroll vertical 20 * scroll vertical 20% * scroll vertical -40 + * scroll vertical 20! * scroll vertical begin * scroll vertical end * scroll horizontal 10 @@ -175,6 +178,112 @@ set_var(WebKitWebView *page, GArray *argv, GString *result) { g_strfreev(split); } +void +toggle_var(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; + + if(!argv_idx(argv, 0)) + return; + + const gchar *var_name = argv_idx(argv, 0); + + uzbl_cmdprop *c = get_var_c(var_name); + + if(!c) { + set_var_value(var_name, argv_idx(argv, 1)); + return; + } + + switch(c->type) { + case TYPE_STR: + { + const gchar *next; + + if(argv->len >= 3) { + gchar *current = get_var_value_string_c(c); + + guint i = 2; + const gchar *first = argv_idx(argv, 1); + const gchar *this = first; + next = argv_idx(argv, 2); + + while(next && strcmp(current, this)) { + this = next; + next = argv_idx(argv, ++i); + } + + if(!next) + next = first; + + g_free(current); + } else + next = ""; + + set_var_value_string_c(c, next); + break; + } + case TYPE_INT: + { + int current = get_var_value_int_c(c); + int next; + + if(argv->len >= 3) { + guint i = 2; + + int first = strtoul(argv_idx(argv, 1), NULL, 10); + int this = first; + + const gchar *next_s = argv_idx(argv, 2); + + while(next_s && this != current) { + this = strtoul(next_s, NULL, 10); + next_s = argv_idx(argv, ++i); + } + + if(next_s) + next = strtoul(next_s, NULL, 10); + else + next = first; + } else + next = !current; + + set_var_value_int_c(c, next); + break; + } + case TYPE_FLOAT: + { + float current = get_var_value_float_c(c); + float next; + + if(argv->len >= 3) { + guint i = 2; + + float first = strtod(argv_idx(argv, 1), NULL); + float this = first; + + const gchar *next_s = argv_idx(argv, 2); + + while(next_s && this != current) { + this = strtod(next_s, NULL); + next_s = argv_idx(argv, ++i); + } + + if(next_s) + next = strtod(next_s, NULL); + else + next = first; + } else + next = !current; + + set_var_value_float_c(c, next); + break; + } + default: + g_assert_not_reached(); + } + + send_set_var_event(var_name, c); +} void event(WebKitWebView *page, GArray *argv, GString *result) { @@ -418,10 +527,13 @@ chain(WebKitWebView *page, GArray *argv, GString *result) { void close_uzbl (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; (void)result; - // hide window a soon as possible to avoid getting stuck with a - // non-response window in the cleanup steps - if (uzbl.gui.main_window) - gtk_widget_destroy(uzbl.gui.main_window); + // hide window a soon as possible to avoid getting stuck with a + // non-response window in the cleanup steps + if (uzbl.gui.main_window) + gtk_widget_destroy(uzbl.gui.main_window); + else if (uzbl.gui.plug) + gtk_widget_destroy(GTK_WIDGET(uzbl.gui.plug)); + gtk_main_quit (); } diff --git a/src/commands.h b/src/commands.h index b8cf095..38bd5f2 100644 --- a/src/commands.h +++ b/src/commands.h @@ -58,6 +58,7 @@ void delete_cookie(WebKitWebView *page, GArray *argv, GString *result); void clear_cookies(WebKitWebView *pag, GArray *argv, GString *result); void download(WebKitWebView *pag, GArray *argv, GString *result); void set_var(WebKitWebView *page, GArray *argv, GString *result); +void toggle_var(WebKitWebView *page, GArray *argv, GString *result); void run_js (WebKitWebView * web_view, GArray *argv, GString *result); void run_external_js (WebKitWebView * web_view, GArray *argv, GString *result); void toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result); diff --git a/src/events.c b/src/events.c index 45140c0..081a942 100644 --- a/src/events.c +++ b/src/events.c @@ -3,6 +3,8 @@ ** (c) 2009 by Robert Manea */ +#include <glib.h> + #include "uzbl-core.h" #include "events.h" #include "util.h" @@ -58,6 +60,11 @@ const char *event_table[LAST_EVENT] = { "BLUR_ELEMENT" }; +/* for now this is just a alias for GString */ +struct _Event { + GString message; +}; + void event_buffer_timeout(guint sec) { struct itimerval t; @@ -141,12 +148,12 @@ send_event_stdout(GString *msg) { fflush(stdout); } -void -vsend_event(int type, const gchar *custom_event, va_list vargs) { - GString *event_message = g_string_sized_new (512); - +Event * +vformat_event(int type, const gchar *custom_event, va_list vargs) { if (type >= LAST_EVENT) - return; + return NULL; + + GString *event_message = g_string_sized_new (512); const gchar *event = custom_event ? custom_event : event_table[type]; char* str; @@ -160,41 +167,100 @@ vsend_event(int type, const gchar *custom_event, va_list vargs) { case TYPE_INT: g_string_append_printf (event_message, "%d", va_arg (vargs, int)); break; + case TYPE_STR: /* a string that needs to be escaped */ g_string_append_c (event_message, '\''); append_escaped (event_message, va_arg (vargs, char*)); g_string_append_c (event_message, '\''); break; + case TYPE_FORMATTEDSTR: /* a string has already been escaped */ g_string_append (event_message, va_arg (vargs, char*)); break; + + case TYPE_STR_ARRAY: + ; /* gcc is acting up and requires a expression before the variables */ + GArray *a = va_arg (vargs, GArray*); + const char *p; + int i = 0; + while ((p = argv_idx(a, i++))) { + if (i != 0) + g_string_append_c(event_message, ' '); + g_string_append_c (event_message, '\''); + append_escaped (event_message, p); + g_string_append_c (event_message, '\''); + } + break; + case TYPE_NAME: str = va_arg (vargs, char*); g_assert (valid_name (str)); g_string_append (event_message, str); break; + case TYPE_FLOAT: // ‘float’ is promoted to ‘double’ when passed through ‘...’ - g_string_append_printf (event_message, "%.2f", va_arg (vargs, double)); + + // Make sure the formatted double fits in the buffer + if (event_message->allocated_len - event_message->len < G_ASCII_DTOSTR_BUF_SIZE) + g_string_set_size (event_message, event_message->len + G_ASCII_DTOSTR_BUF_SIZE); + + // format in C locale + char *tmp = g_ascii_formatd ( + event_message->str + event_message->len, + event_message->allocated_len - event_message->len, + "%.2f", va_arg (vargs, double)); + event_message->len += strlen(tmp); break; } } - g_string_append_c(event_message, '\n'); + return (Event*) event_message; +} - if (uzbl.state.events_stdout) - send_event_stdout (event_message); - send_event_socket (event_message); +Event * +format_event(int type, const gchar *custom_event, ...) { + va_list vargs, vacopy; + va_start (vargs, custom_event); + va_copy (vacopy, vargs); + Event *event = vformat_event (type, custom_event, vacopy); + va_end (vacopy); + va_end (vargs); + return event; +} + +void +send_formatted_event(const Event *event) { + // A event string is not supposed to contain newlines as it will be + // interpreted as two events + GString *event_message = (GString*)event; - g_string_free (event_message, TRUE); + if (!strchr(event_message->str, '\n')) { + g_string_append_c(event_message, '\n'); + + if (uzbl.state.events_stdout) + send_event_stdout (event_message); + send_event_socket (event_message); + } +} + +void +event_free(Event *event) { + g_string_free ((GString*)event, TRUE); +} + +void +vsend_event(int type, const gchar *custom_event, va_list vargs) { + if (type >= LAST_EVENT) + return; + + Event *event = vformat_event(type, custom_event, vargs); + send_formatted_event (event); + event_free (event); } -/* - * build event string and send over the supported interfaces - * custom_event == NULL indicates an internal event -*/ void send_event(int type, const gchar *custom_event, ...) { va_list vargs, vacopy; @@ -246,6 +312,19 @@ get_modifier_mask(guint state) { return g_string_free(modifiers, FALSE); } +/* backwards compatibility. */ +#if ! GTK_CHECK_VERSION (2, 22, 0) +#define GDK_KEY_Shift_L GDK_Shift_L +#define GDK_KEY_Shift_R GDK_Shift_R +#define GDK_KEY_Control_L GDK_Control_L +#define GDK_KEY_Control_R GDK_Control_R +#define GDK_KEY_Alt_L GDK_Alt_L +#define GDK_KEY_Alt_R GDK_Alt_R +#define GDK_KEY_Super_L GDK_Super_L +#define GDK_KEY_Super_R GDK_Super_R +#define GDK_KEY_ISO_Level3_Shift GDK_ISO_Level3_Shift +#endif + guint key_to_modifier(guint keyval) { /* FIXME * Should really use XGetModifierMapping and/or Xkb to get actual mod keys diff --git a/src/events.h b/src/events.h index 8e89899..73d0712 100644 --- a/src/events.h +++ b/src/events.h @@ -31,18 +31,47 @@ enum event_type { LAST_EVENT }; +typedef struct _Event Event; +struct _Event; + void event_buffer_timeout(guint sec); void replay_buffered_events(); +/* + * build event string + */ +Event * +format_event(int type, const gchar *custom_event, ...) G_GNUC_NULL_TERMINATED; + +Event * +vformat_event(int type, const gchar *custom_event, va_list vargs); + +/* + * send a already formatted event string over the supported interfaces. + * returned event string should be freed by `event_free` + */ void -vsend_event(int type, const gchar *custom_event, va_list vargs); +send_formatted_event(const Event *event); +/* + * frees a event string + */ +void +event_free(Event *event); + +/* + * build event string and send over the supported interfaces + * this is the same as calling `format_event` and then `send_formatted_event` + */ void send_event(int type, const gchar *custom_event, ...) G_GNUC_NULL_TERMINATED; +void +vsend_event(int type, const gchar *custom_event, va_list vargs); + gchar * get_modifier_mask(guint state); @@ -26,8 +26,6 @@ build_stream_name(int type, const gchar* dir) { gboolean control_fifo(GIOChannel *gio, GIOCondition condition) { - if (uzbl.state.verbose) - printf("triggered\n"); gchar *ctl_line; GIOStatus ret; GError *err = NULL; @@ -36,7 +34,7 @@ control_fifo(GIOChannel *gio, GIOCondition condition) { g_error ("Fifo: Read end of pipe died!\n"); if(!gio) - g_error ("Fifo: GIOChannel broke\n"); + g_error ("Fifo: GIOChannel broke\n"); ret = g_io_channel_read_line(gio, &ctl_line, NULL, NULL, &err); if (ret == G_IO_STATUS_ERROR) { @@ -74,9 +72,10 @@ attach_fifo(gchar *path) { } -/*@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 */ +gboolean +init_fifo(const gchar *dir) { + if (uzbl.comm.fifo_path) { + /* we're changing the 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); @@ -85,32 +84,20 @@ init_fifo(gchar *dir) { /* return dir or, on error, free dir and return 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 something exists at that path, try to delete it. */ + if (file_exists(path) && unlink(path) == -1) + g_warning ("Fifo: Can't unlink old fifo at %s\n", path); - /* if we got this far, there was an error; cleanup */ - g_free(dir); + if (mkfifo (path, 0666) == 0) { + if(attach_fifo(path)) + return TRUE; + else + g_warning("init_fifo: can't attach to %s: %s\n", path, strerror(errno)); + } else g_warning ("init_fifo: can't create %s: %s\n", path, strerror(errno)); + + /* if we got this far, there was an error; clean up */ g_free(path); - return NULL; + return FALSE; } @@ -299,8 +286,8 @@ attach_socket(gchar *path, struct sockaddr_un *local) { } -/*@null@*/ gchar* -init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL */ +gboolean +init_socket(const gchar *dir) { 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); @@ -309,40 +296,24 @@ init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL * } if (*dir == ' ') { - g_free(dir); - return NULL; + return FALSE; } - struct sockaddr_un local; gchar *path = build_stream_name(SOCKET, dir); + /* if something exists at that path, try to delete it. */ + if(file_exists(path) && unlink(path) == -1) + g_warning ("Fifo: Can't unlink old fifo at %s\n", path); + + struct sockaddr_un local; 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(attach_socket(path, &local)) { + return TRUE; + } else g_warning("init_socket: can't attach to %s: %s\n", path, strerror(errno)); /* if we got this far, there was an error; cleanup */ g_free(path); - g_free(dir); - return NULL; + return FALSE; } @@ -8,14 +8,12 @@ build_stream_name(int type, const gchar *dir); gboolean control_fifo(GIOChannel *gio, GIOCondition condition); -/*@null@*/ gchar* -init_fifo(gchar *dir); +gboolean init_fifo(const gchar *dir); gboolean control_stdin(GIOChannel *gio, GIOCondition condition); void create_stdin(); -/*@null@*/ gchar* -init_socket(gchar *dir); +gboolean init_socket(const gchar *dir); gboolean control_socket(GIOChannel *chan); gboolean control_client_socket(GIOChannel *chan); diff --git a/src/status-bar.c b/src/status-bar.c index 6d4541b..d80dd51 100644 --- a/src/status-bar.c +++ b/src/status-bar.c @@ -1,6 +1,6 @@ #include "status-bar.h" -G_DEFINE_TYPE (UzblStatusBar, uzbl_status_bar, GTK_TYPE_HBOX) +G_DEFINE_TYPE (UzblStatusBar, uzbl_status_bar, GTK_TYPE_BOX) static void uzbl_status_bar_size_allocate (GtkWidget *widget, GtkAllocation *allocation); diff --git a/src/status-bar.h b/src/status-bar.h index e972701..cae8905 100644 --- a/src/status-bar.h +++ b/src/status-bar.h @@ -14,14 +14,14 @@ typedef struct _UzblStatusBar UzblStatusBar; typedef struct _UzblStatusBarClass UzblStatusBarClass; struct _UzblStatusBar { - GtkHBox hbox; + GtkBox box; GtkWidget *left_label; GtkWidget *right_label; }; struct _UzblStatusBarClass { - GtkHBoxClass parent_class; + GtkBoxClass parent_class; }; GType uzbl_status_bar_get_type (void) G_GNUC_CONST; @@ -2,23 +2,43 @@ * Uzbl Types */ +#ifndef __UZBL_TYPE__ +#define __UZBL_TYPE__ + enum ptr_type { TYPE_INT = 1, TYPE_STR, TYPE_FLOAT, TYPE_NAME, - TYPE_FORMATTEDSTR // used by send_event + // used by send_event + TYPE_FORMATTEDSTR, + TYPE_STR_ARRAY }; +// I'm doing this instead of just using "uzbl_value *" because this way our +// list of variables can be: +// { .ptr = { .s = &some_char_star }, ... } +// instead of +// { .ptr = (uzbl_value *)&some_char_star, ... } +// which works here, but I suspect has portability issues. +typedef union uzbl_value_ptr_t { + int *i; + float *f; + gchar **s; +} uzbl_value_ptr; + +/* a really generic function pointer. */ +typedef void (*uzbl_fp)(void); + typedef struct { enum ptr_type type; - union { - int *i; - float *f; - gchar **s; - } ptr; + uzbl_value_ptr ptr; int dump; int writeable; - /*@null@*/ void (*func)(void); + + /* the various get_/set_ functions cast these back into something useful. */ + uzbl_fp getter; + uzbl_fp setter; } uzbl_cmdprop; +#endif @@ -151,8 +151,8 @@ argv_idx(const GArray *a, const guint idx) { GString * append_escaped (GString *dest, const gchar *src) { - g_assert(dest); - g_assert(src); + g_assert(dest); + g_assert(src); // Hint that we are going to append another string. int oldlen = dest->len; diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 1e3bed3..770d832 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -246,7 +246,7 @@ expand(const char* s, guint recurse) { void clean_up(void) { if (uzbl.info.pid_str) { - send_event (INSTANCE_EXIT, NULL, TYPE_INT, getpid(), NULL); + send_event (INSTANCE_EXIT, NULL, TYPE_INT, uzbl.info.pid, NULL); g_free(uzbl.info.pid_str); uzbl.info.pid_str = NULL; } @@ -331,11 +331,15 @@ scroll(GtkAdjustment* bar, gchar *amount_str) { if (*end == '%') value += page_size * amount * 0.01; + else if (*end == '!') + value = amount; else value += amount; max_value = gtk_adjustment_get_upper(bar) - page_size; + if (value < 0) + value = 0; /* don't scroll past the beginning of the page */ if (value > max_value) value = max_value; /* don't scroll past the end of the page */ @@ -617,23 +621,16 @@ run_parsed_command(const CommandInfo *c, GArray *a, GString *result) { if(strcmp("set", c->key) && strcmp("event", c->key) && strcmp("request", c->key)) { - GString *param = g_string_new(""); - const gchar *p; - guint i = 0; - while ((p = argv_idx(a, i++))) { - g_string_append (param, " '"); - append_escaped (param, p); - g_string_append_c (param, '\''); - } + Event *event = format_event (COMMAND_EXECUTED, NULL, + TYPE_NAME, c->key, + TYPE_STR_ARRAY, a, + NULL); - /* might be destructive on array a */ + /* might be destructive on array a */ c->function(uzbl.gui.web_view, a, result); - send_event(COMMAND_EXECUTED, NULL, - TYPE_NAME, c->key, - TYPE_FORMATTEDSTR, param->str, - NULL); - g_string_free(param, TRUE); + send_formatted_event (event); + event_free (event); } else c->function(uzbl.gui.web_view, a, result); @@ -729,7 +726,7 @@ update_title(void) { const gchar *title_format = b->title_format_long; /* Update the status bar if shown */ - if (b->show_status) { + if (get_show_status()) { title_format = b->title_format_short; gchar *parsed = expand(b->status_format, 0); @@ -799,7 +796,6 @@ 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"); gtk_window_set_title(GTK_WINDOW(window), "Uzbl"); #if GTK_CHECK_VERSION(3,0,0) @@ -912,21 +908,6 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au } } -void -retrieve_geometry() { - int w, h, x, y; - GString *buf = g_string_new(""); - - gtk_window_get_size(GTK_WINDOW(uzbl.gui.main_window), &w, &h); - gtk_window_get_position(GTK_WINDOW(uzbl.gui.main_window), &x, &y); - - g_string_printf(buf, "%dx%d+%d+%d", w, h, x, y); - - if(uzbl.gui.geometry) - g_free(uzbl.gui.geometry); - uzbl.gui.geometry = g_string_free(buf, FALSE); -} - /* Set up gtk, gobject, variable defaults and other things that tests and other * external applications need to do anyhow */ void @@ -964,9 +945,10 @@ initialize(int argc, char** argv) { if (uzbl.state.socket_id || uzbl.state.embed) uzbl.state.plug_mode = TRUE; +#if !GLIB_CHECK_VERSION(2, 31, 0) if (!g_thread_supported()) g_thread_init(NULL); - +#endif /* TODO: move the handler setup to event_buffer_timeout and disarm the * handler in empty_event_buffer? */ @@ -1011,7 +993,13 @@ initialize(int argc, char** argv) { create_scrolled_win(); /* pack the window and the status bar */ + +#if GTK_CHECK_VERSION(3,0,0) + uzbl.gui.vbox = gtk_box_new(FALSE, 0); + gtk_orientable_set_orientation(GTK_ORIENTABLE(uzbl.gui.vbox), GTK_ORIENTATION_VERTICAL); +#else uzbl.gui.vbox = gtk_vbox_new(FALSE, 0); +#endif 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.status_bar, FALSE, TRUE, 0); @@ -1022,30 +1010,28 @@ initialize(int argc, char** argv) { /** -- MAIN -- **/ int main (int argc, char* argv[]) { + Window xwin; + initialize(argc, argv); - /* Embedded mode */ if (uzbl.state.plug_mode) { + /* Embedded mode */ uzbl.gui.plug = create_plug(); + gtk_widget_set_name (GTK_WIDGET(uzbl.gui.plug), "Uzbl"); gtk_container_add (GTK_CONTAINER (uzbl.gui.plug), uzbl.gui.vbox); - /* in xembed mode the window has no unique id and thus - * socket/fifo names aren't unique either. - * we use a custom randomizer to create a random id - */ - struct timeval tv; - gettimeofday(&tv, NULL); - srand((unsigned int)tv.tv_sec*tv.tv_usec); - uzbl.xwin = rand(); - } - - /* Windowed mode */ - else { + } else { + /* Windowed mode */ uzbl.gui.main_window = create_window(); + gtk_widget_set_name (uzbl.gui.main_window, "Uzbl"); gtk_container_add (GTK_CONTAINER (uzbl.gui.main_window), uzbl.gui.vbox); + /* We need to ensure there is a window, before we can get XID */ gtk_widget_realize (GTK_WIDGET (uzbl.gui.main_window)); + xwin = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (uzbl.gui.main_window))); - uzbl.xwin = GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (uzbl.gui.main_window))); + gchar *xwin_str = g_strdup_printf("%d", (int)xwin); + g_setenv("UZBL_XID", xwin_str, TRUE); + g_free(xwin_str); gtk_widget_grab_focus (GTK_WIDGET (uzbl.gui.web_view)); } @@ -1064,17 +1050,14 @@ main (int argc, char* argv[]) { "signal::changed", (GCallback)scroll_horiz_cb, NULL, NULL); - gchar *xwin = g_strdup_printf("%d", (int)uzbl.xwin); - g_setenv("UZBL_XID", xwin, TRUE); + uzbl.info.pid = getpid(); + uzbl.info.pid_str = g_strdup_printf("%d", uzbl.info.pid); + g_setenv("UZBL_PID", uzbl.info.pid_str, TRUE); if(!uzbl.state.instance_name) - uzbl.state.instance_name = g_strdup(xwin); - - g_free(xwin); + uzbl.state.instance_name = uzbl.info.pid_str; - uzbl.info.pid_str = g_strdup_printf("%d", getpid()); - g_setenv("UZBL_PID", uzbl.info.pid_str, TRUE); - send_event(INSTANCE_START, NULL, TYPE_INT, getpid(), NULL); + send_event(INSTANCE_START, NULL, TYPE_INT, uzbl.info.pid, NULL); if (uzbl.state.plug_mode) { send_event(PLUG_CREATED, NULL, TYPE_INT, gtk_plug_get_id (uzbl.gui.plug), NULL); @@ -1084,11 +1067,10 @@ main (int argc, char* argv[]) { builtins(); /* Check uzbl is in window mode before getting/setting geometry */ - if (uzbl.gui.main_window) { - if (uzbl.gui.geometry) - set_geometry(); - else - retrieve_geometry(); + if (uzbl.gui.main_window && uzbl.gui.geometry) { + gchar *geometry = g_strdup(uzbl.gui.geometry); + set_geometry(geometry); + g_free(geometry); } gchar *uri_override = (uzbl.state.uri ? g_strdup(uzbl.state.uri) : NULL); @@ -1101,10 +1083,7 @@ main (int argc, char* argv[]) { settings_init(); /* Update status bar */ - if (!uzbl.behave.show_status) - gtk_widget_hide(uzbl.gui.status_bar); - else - update_title(); + update_title(); /* WebInspector */ set_up_inspector(); @@ -1131,13 +1110,12 @@ main (int argc, char* argv[]) { if (uzbl.state.socket_id) printf("plug_id %i\n", (int)gtk_plug_get_id(uzbl.gui.plug)); else - printf("window_id %i\n",(int) uzbl.xwin); + printf("window_id %i\n",(int) 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*/ diff --git a/src/uzbl-core.h b/src/uzbl-core.h index c84380e..29b7b64 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -74,7 +74,6 @@ typedef struct { WebKitWebView* web_view; gchar* main_title; gchar* icon; - gchar* window_role; /* WebInspector */ GtkWidget* inspector_window; @@ -131,6 +130,11 @@ typedef struct { gint max_conns_host; } Network; +/* ssl */ +typedef struct { + gchar *ca_file; + gchar *verify_cert; +} Ssl; /* Behaviour */ typedef struct { @@ -138,7 +142,6 @@ typedef struct { gchar* status_format; gchar* status_format_right; gchar* status_background; - gboolean show_status; gboolean status_top; /* Window title */ @@ -152,50 +155,20 @@ typedef struct { /* Handlers */ gchar* authentication_handler; gchar* scheme_handler; + gchar* request_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; - gboolean forward_keys; guint http_debug; gchar* shell_cmd; guint view_source; - /* WebKitWebSettings exports */ - guint font_size; - guint monospace_size; - guint minimum_font_size; - gfloat zoom_level; - gboolean zoom_type; - guint enable_pagecache; - guint disable_plugins; - guint disable_scripts; - guint autoload_img; - guint autoshrink_img; - guint enable_spellcheck; - gchar* spellcheck_languages; - guint enable_private; - guint print_bg; - gchar* style_uri; - guint resizable_txt; - gchar* default_encoding; - gchar* current_encoding; - guint enforce_96dpi; - gchar *inject_html; - guint caret_browsing; - guint javascript_windows; gboolean print_version; /* command list: (key)name -> (value)Command */ GHashTable* commands; /* variables: (key)name -> (value)uzbl_cmdprop */ - GHashTable *proto_var; + GHashTable* proto_var; } Behaviour; @@ -206,6 +179,8 @@ typedef struct { int webkit_micro; gchar* arch; gchar* commit; + + pid_t pid; gchar* pid_str; } Info; @@ -215,11 +190,10 @@ typedef struct { GUI gui; State state; Network net; + Ssl ssl; Behaviour behave; Communication comm; Info info; - - Window xwin; } UzblCore; extern UzblCore uzbl; /* Main Uzbl object */ @@ -247,7 +221,6 @@ gchar* expand(const char* s, guint recurse); gboolean run_command(const gchar *command, const gchar **args, const gboolean sync, char **output_stdout); void run_command_file(const gchar *path); -void parse_command(const char *cmd, const char *param, GString *result); void parse_cmd_line(const char *ctl_line, GString *result); const CommandInfo * parse_command_parts(const gchar *line, GArray *a); diff --git a/src/variables.c b/src/variables.c index b72c4b0..8d874c2 100644 --- a/src/variables.c +++ b/src/variables.c @@ -4,31 +4,39 @@ #include "events.h" #include "io.h" #include "util.h" -#include "type.h" + +uzbl_cmdprop * +get_var_c(const gchar *name) { + return g_hash_table_lookup(uzbl.behave.proto_var, name); +} void send_set_var_event(const char *name, const uzbl_cmdprop *c) { /* check for the variable type */ switch(c->type) { case TYPE_STR: + { + gchar *v = get_var_value_string_c(c); send_event (VARIABLE_SET, NULL, TYPE_NAME, name, TYPE_NAME, "str", - TYPE_STR, *c->ptr.s ? *c->ptr.s : " ", + TYPE_STR, v, NULL); + g_free(v); break; + } case TYPE_INT: send_event (VARIABLE_SET, NULL, TYPE_NAME, name, TYPE_NAME, "int", - TYPE_INT, *c->ptr.i, + TYPE_INT, get_var_value_int_c(c), NULL); break; case TYPE_FLOAT: send_event (VARIABLE_SET, NULL, TYPE_NAME, name, TYPE_NAME, "float", - TYPE_FLOAT, *c->ptr.f, + TYPE_FLOAT, get_var_value_float_c(c), NULL); break; default: @@ -38,81 +46,162 @@ send_set_var_event(const char *name, const uzbl_cmdprop *c) { void expand_variable(GString *buf, const gchar *name) { - uzbl_cmdprop* c; - if((c = g_hash_table_lookup(uzbl.behave.proto_var, name))) { - if(c->type == TYPE_STR && *c->ptr.s != NULL) { - g_string_append(buf, (gchar *)*c->ptr.s); - } - else if(c->type == TYPE_INT) { - g_string_append_printf(buf, "%d", *c->ptr.i); - } - else if(c->type == TYPE_FLOAT) { - g_string_append_printf(buf, "%f", *c->ptr.f); - } + uzbl_cmdprop* c = get_var_c(name); + if(c) { + if(c->type == TYPE_STR) { + gchar *v = get_var_value_string_c(c); + g_string_append(buf, v); + g_free(v); + } else if(c->type == TYPE_INT) + g_string_append_printf(buf, "%d", get_var_value_int_c(c)); + else if(c->type == TYPE_FLOAT) + g_string_append_printf(buf, "%f", get_var_value_float_c(c)); } } +void +set_var_value_string_c(uzbl_cmdprop *c, const gchar *val) { + if(c->setter) + ((void (*)(const gchar *))c->setter)(val); + else { + g_free(*(c->ptr.s)); + *(c->ptr.s) = g_strdup(val); + } +} + +void +set_var_value_int_c(uzbl_cmdprop *c, int i) { + if(c->setter) + ((void (*)(int))c->setter)(i); + else + *(c->ptr.i) = i; +} + +void +set_var_value_float_c(uzbl_cmdprop *c, float f) { + if(c->setter) + ((void (*)(float))c->setter)(f); + else + *(c->ptr.f) = f; +} + gboolean set_var_value(const gchar *name, gchar *val) { - uzbl_cmdprop *c = NULL; - char *endp = NULL; - char *buf = NULL; - g_assert(val != NULL); - if( (c = g_hash_table_lookup(uzbl.behave.proto_var, name)) ) { + uzbl_cmdprop *c = get_var_c(name); + + if(c) { if(!c->writeable) return FALSE; switch(c->type) { case TYPE_STR: - buf = g_strdup(val); - g_free(*c->ptr.s); - *c->ptr.s = buf; + set_var_value_string_c(c, val); break; case TYPE_INT: - *c->ptr.i = (int)strtoul(val, &endp, 10); + { + int i = (int)strtoul(val, NULL, 10); + set_var_value_int_c(c, i); break; + } case TYPE_FLOAT: - *c->ptr.f = strtod(val, &endp); + { + float f = strtod(val, NULL); + set_var_value_float_c(c, f); break; + } default: g_assert_not_reached(); } send_set_var_event(name, c); - - /* invoke a command specific function */ - if(c->func) c->func(); } else { - /* check wether name violates our naming scheme */ + /* a custom var that has not been set. */ + /* check whether name violates our naming scheme */ if(!valid_name(name)) { if (uzbl.state.verbose) printf("Invalid variable name: %s\n", name); return FALSE; } - /* custom vars */ + /* create the cmdprop */ c = g_malloc(sizeof(uzbl_cmdprop)); - c->type = TYPE_STR; - c->dump = 0; - c->func = NULL; - c->writeable = 1; - buf = g_strdup(val); - c->ptr.s = g_malloc(sizeof(char *)); - *c->ptr.s = buf; + c->type = TYPE_STR; + c->dump = 0; + c->getter = NULL; + c->setter = NULL; + c->writeable = 1; + + c->ptr.s = g_malloc(sizeof(gchar*)); + g_hash_table_insert(uzbl.behave.proto_var, g_strdup(name), (gpointer) c); - send_event (VARIABLE_SET, NULL, - TYPE_NAME, name, - TYPE_NAME, "str", - TYPE_STR, buf, - NULL); + /* set the value. */ + *(c->ptr.s) = g_strdup(val); + + send_set_var_event(name, c); } update_title(); return TRUE; } +gchar* +get_var_value_string_c(const uzbl_cmdprop *c) { + if(!c) return NULL; + + gchar *result = NULL; + + if(c->getter) { + result = ((gchar *(*)())c->getter)(); + } else if(c->ptr.s) + result = g_strdup(*(c->ptr.s)); + + return result ? result : g_strdup(""); +} + +gchar* +get_var_value_string(const gchar *name) { + uzbl_cmdprop *c = get_var_c(name); + return get_var_value_string_c(c); +} + +int +get_var_value_int_c(const uzbl_cmdprop *c) { + if(!c) return 0; + + if(c->getter) { + return ((int (*)())c->getter)(); + } else if(c->ptr.i) + return *(c->ptr.i); + + return 0; +} + +int +get_var_value_int(const gchar *name) { + uzbl_cmdprop *c = get_var_c(name); + return get_var_value_int_c(c); +} + +float +get_var_value_float_c(const uzbl_cmdprop *c) { + if(!c) return 0; + + if(c->getter) { + return ((float (*)())c->getter)(); + } else if(c->ptr.f) + return *(c->ptr.f); + + return 0; +} + +float +get_var_value_float(const gchar *name) { + uzbl_cmdprop *c = get_var_c(name); + return get_var_value_float_c(c); +} + void dump_var_hash(gpointer k, gpointer v, gpointer ud) { (void) ud; @@ -121,12 +210,14 @@ dump_var_hash(gpointer k, gpointer v, gpointer ud) { if(!c->dump) return; - if(c->type == TYPE_STR) - printf("set %s = %s\n", (char *)k, *c->ptr.s ? *c->ptr.s : " "); - else if(c->type == TYPE_INT) - printf("set %s = %d\n", (char *)k, *c->ptr.i); + if(c->type == TYPE_STR) { + gchar *v = get_var_value_string_c(c); + printf("set %s = %s\n", (char *)k, v); + g_free(v); + } else if(c->type == TYPE_INT) + printf("set %s = %d\n", (char *)k, get_var_value_int_c(c)); else if(c->type == TYPE_FLOAT) - printf("set %s = %f\n", (char *)k, *c->ptr.f); + printf("set %s = %f\n", (char *)k, get_var_value_float_c(c)); } void @@ -161,36 +252,79 @@ view_settings() { } void -uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec) { - (void) param_spec; - - g_free (uzbl.state.uri); - g_object_get (web_view, "uri", &uzbl.state.uri, NULL); - g_setenv("UZBL_URI", uzbl.state.uri, TRUE); - +set_window_property(const gchar* prop, const gchar* value) { if(GTK_IS_WIDGET(uzbl.gui.main_window)) { gdk_property_change( gtk_widget_get_window (GTK_WIDGET (uzbl.gui.main_window)), - gdk_atom_intern_static_string("UZBL_URI"), + gdk_atom_intern_static_string(prop), gdk_atom_intern_static_string("STRING"), 8, GDK_PROP_MODE_REPLACE, - (unsigned char *)uzbl.state.uri, - strlen(uzbl.state.uri)); + (const guchar*)value, + strlen(value)); } } void -cmd_load_uri() { - const gchar *uri = uzbl.state.uri; +uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec) { + (void) param_spec; - gchar *newuri; - SoupURI *soup_uri; + g_free (uzbl.state.uri); + g_object_get (web_view, "uri", &uzbl.state.uri, NULL); - /* Strip leading whitespaces */ + g_setenv("UZBL_URI", uzbl.state.uri, TRUE); + set_window_property("UZBL_URI", uzbl.state.uri); +} + +gchar * +make_uri_from_user_input(const gchar *uri) { + gchar *result = NULL; + + SoupURI *soup_uri = soup_uri_new(uri); + if (soup_uri) { + /* this looks like a valid URI. */ + if(soup_uri->host == NULL && string_is_integer(soup_uri->path)) + /* the user probably typed in a host:port without a scheme. */ + result = g_strconcat("http://", uri, NULL); + else + result = g_strdup(uri); + + soup_uri_free(soup_uri); + + return result; + } + + /* it's not a valid URI, maybe it's a path on the filesystem? + * check to see if such a path exists. */ + if (file_exists(uri)) { + if (g_path_is_absolute (uri)) + return g_strconcat("file://", uri, NULL); + + /* make it into an absolute path */ + gchar *wd = g_get_current_dir (); + result = g_strconcat("file://", wd, "/", uri, NULL); + g_free(wd); + + return result; + } + + /* not a path on the filesystem, just assume it's an HTTP URL. */ + return g_strconcat("http://", uri, NULL); +} + +void +set_uri(const gchar *uri) { + /* Strip leading whitespace */ while (*uri && isspace(*uri)) uri++; + /* don't do anything when given a blank URL */ + if(uri[0] == 0) + return; + + g_free(uzbl.state.uri); + uzbl.state.uri = g_strdup(uri); + /* evaluate javascript: URIs */ if (!strncmp (uri, "javascript:", 11)) { eval_js(uzbl.gui.web_view, uri, NULL, "javascript:"); @@ -198,63 +332,34 @@ cmd_load_uri() { } /* attempt to parse the URI */ - soup_uri = soup_uri_new(uri); - - if (!soup_uri) { - /* it's not a valid URI, maybe it's a path on the filesystem. */ - const gchar *fullpath; - if (g_path_is_absolute (uri)) - fullpath = uri; - else { - gchar *wd = g_get_current_dir (); - fullpath = g_build_filename (wd, uri, NULL); - g_free(wd); - } - - struct stat stat_result; - if (! g_stat(fullpath, &stat_result)) - newuri = g_strconcat("file://", fullpath, NULL); - else - newuri = g_strconcat("http://", uri, NULL); - } else { - if(soup_uri->host == NULL && string_is_integer(soup_uri->path)) - /* the user probably typed in a host:port without a scheme */ - newuri = g_strconcat("http://", uri, NULL); - else - newuri = g_strdup(uri); - - soup_uri_free(soup_uri); - } - - if(GTK_IS_WIDGET(uzbl.gui.main_window)) { - gdk_property_change( - gtk_widget_get_window (GTK_WIDGET (uzbl.gui.main_window)), - gdk_atom_intern_static_string("UZBL_URI"), - gdk_atom_intern_static_string("STRING"), - 8, - GDK_PROP_MODE_REPLACE, - (unsigned char *)newuri, - strlen(newuri)); - } + gchar *newuri = make_uri_from_user_input(uri); + set_window_property("UZBL_URI", newuri); webkit_web_view_load_uri (uzbl.gui.web_view, newuri); + g_free (newuri); } void -cmd_max_conns() { +set_max_conns(int max_conns) { + uzbl.net.max_conns = max_conns; + g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_MAX_CONNS, uzbl.net.max_conns, NULL); } void -cmd_max_conns_host() { +set_max_conns_host(int max_conns_host) { + uzbl.net.max_conns_host = max_conns_host; + g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_MAX_CONNS_PER_HOST, uzbl.net.max_conns_host, NULL); } void -cmd_http_debug() { +set_http_debug(int debug) { + uzbl.behave.http_debug = debug; + if(uzbl.net.soup_logger) { soup_session_remove_feature (uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_logger)); @@ -267,64 +372,80 @@ cmd_http_debug() { } void -cmd_font_size() { - GObject *ws = view_settings(); - if (uzbl.behave.font_size > 0) { - g_object_set (ws, "default-font-size", uzbl.behave.font_size, NULL); - } +set_ca_file(gchar *path) { + g_object_set (uzbl.net.soup_session, "ssl-ca-file", path, NULL); +} - if (uzbl.behave.monospace_size > 0) { - g_object_set (ws, "default-monospace-font-size", - uzbl.behave.monospace_size, NULL); - } else { - g_object_set (ws, "default-monospace-font-size", - uzbl.behave.font_size, NULL); - } +gchar * +get_ca_file() { + gchar *path; + g_object_get (uzbl.net.soup_session, "ssl-ca-file", &path, NULL); + return path; } void -cmd_zoom_level() { - webkit_web_view_set_zoom_level (uzbl.gui.web_view, uzbl.behave.zoom_level); +set_verify_cert(int strict) { + g_object_set (uzbl.net.soup_session, "ssl-strict", strict, NULL); +} + +int +get_verify_cert() { + int strict; + g_object_get (uzbl.net.soup_session, "ssl-strict", &strict, NULL); + return strict; } -#define EXPOSE_WEBKIT_VIEW_SETTINGS(SYM, STORAGE, PROPERTY) void cmd_##SYM() { \ - g_object_set(view_settings(), (PROPERTY), (STORAGE), NULL); \ +#define EXPOSE_WEBKIT_VIEW_SETTINGS(SYM, PROPERTY, TYPE) \ +void set_##SYM(TYPE val) { \ + g_object_set(view_settings(), (PROPERTY), val, NULL); \ +} \ +TYPE get_##SYM() { \ + TYPE val; \ + g_object_get(view_settings(), (PROPERTY), &val, NULL); \ + return val; \ } -EXPOSE_WEBKIT_VIEW_SETTINGS(default_font_family, uzbl.behave.default_font_family, "default-font-family") -EXPOSE_WEBKIT_VIEW_SETTINGS(monospace_font_family, uzbl.behave.monospace_font_family, "monospace-font-family") -EXPOSE_WEBKIT_VIEW_SETTINGS(sans_serif_font_family, uzbl.behave.sans_serif_font_family, "sans_serif-font-family") -EXPOSE_WEBKIT_VIEW_SETTINGS(serif_font_family, uzbl.behave.serif_font_family, "serif-font-family") -EXPOSE_WEBKIT_VIEW_SETTINGS(cursive_font_family, uzbl.behave.cursive_font_family, "cursive-font-family") -EXPOSE_WEBKIT_VIEW_SETTINGS(fantasy_font_family, uzbl.behave.fantasy_font_family, "fantasy-font-family") +EXPOSE_WEBKIT_VIEW_SETTINGS(default_font_family, "default-font-family", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(monospace_font_family, "monospace-font-family", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(sans_serif_font_family, "sans_serif-font-family", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(serif_font_family, "serif-font-family", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(cursive_font_family, "cursive-font-family", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(fantasy_font_family, "fantasy-font-family", gchar *) -EXPOSE_WEBKIT_VIEW_SETTINGS(minimum_font_size, uzbl.behave.minimum_font_size, "minimum_font_size") +EXPOSE_WEBKIT_VIEW_SETTINGS(minimum_font_size, "minimum-font-size", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(font_size, "default-font-size", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(monospace_size, "default-monospace-font-size", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(disable_plugins, !uzbl.behave.disable_plugins, "enable-plugins") -EXPOSE_WEBKIT_VIEW_SETTINGS(disable_scripts, !uzbl.behave.disable_scripts, "enable-scripts") +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_plugins, "enable-plugins", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_scripts, "enable-scripts", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(javascript_windows, uzbl.behave.javascript_windows, "javascript-can-open-windows-automatically") +EXPOSE_WEBKIT_VIEW_SETTINGS(javascript_windows, "javascript-can-open-windows-automatically", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(autoload_img, uzbl.behave.autoload_img, "auto-load-images") -EXPOSE_WEBKIT_VIEW_SETTINGS(autoshrink_img, uzbl.behave.autoshrink_img, "auto-shrink-images") +EXPOSE_WEBKIT_VIEW_SETTINGS(autoload_images, "auto-load-images", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(autoshrink_images, "auto-shrink-images", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(enable_pagecache, uzbl.behave.enable_pagecache, "enable-page-cache") -EXPOSE_WEBKIT_VIEW_SETTINGS(enable_private, uzbl.behave.enable_private, "enable-private-browsing") +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_pagecache, "enable-page-cache", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_private, "enable-private-browsing", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(enable_spellcheck, uzbl.behave.enable_spellcheck, "enable-spell-checking") -EXPOSE_WEBKIT_VIEW_SETTINGS(spellcheck_languages, uzbl.behave.spellcheck_languages, "spell-checking-languages") -EXPOSE_WEBKIT_VIEW_SETTINGS(resizable_txt, uzbl.behave.resizable_txt, "resizable-text-areas") +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_spellcheck, "enable-spell-checking", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(spellcheck_languages, "spell-checking-languages", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(resizable_text_areas, "resizable-text-areas", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(style_uri, uzbl.behave.style_uri, "user-stylesheet-uri") -EXPOSE_WEBKIT_VIEW_SETTINGS(print_bg, uzbl.behave.print_bg, "print-backgrounds") -EXPOSE_WEBKIT_VIEW_SETTINGS(enforce_96dpi, uzbl.behave.enforce_96dpi, "enforce-96-dpi") +EXPOSE_WEBKIT_VIEW_SETTINGS(stylesheet_uri, "user-stylesheet-uri", gchar *) +EXPOSE_WEBKIT_VIEW_SETTINGS(print_bg, "print-backgrounds", int) +EXPOSE_WEBKIT_VIEW_SETTINGS(enforce_96_dpi, "enforce-96-dpi", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(caret_browsing, uzbl.behave.caret_browsing, "enable-caret-browsing") +EXPOSE_WEBKIT_VIEW_SETTINGS(caret_browsing, "enable-caret-browsing", int) -EXPOSE_WEBKIT_VIEW_SETTINGS(default_encoding, uzbl.behave.default_encoding, "default-encoding") +EXPOSE_WEBKIT_VIEW_SETTINGS(enable_cross_file_access, "enable-file-access-from-file-uris", int) + +EXPOSE_WEBKIT_VIEW_SETTINGS(default_encoding, "default-encoding", gchar *) void -set_proxy_url() { +set_proxy_url(const gchar *proxy_url) { + g_free(uzbl.net.proxy_url); + uzbl.net.proxy_url = g_strdup(proxy_url); + const gchar *url = uzbl.net.proxy_url; SoupSession *session = uzbl.net.soup_session; SoupURI *soup_uri = NULL; @@ -338,14 +459,16 @@ set_proxy_url() { soup_uri_free(soup_uri); } - void -set_authentication_handler() { +set_authentication_handler(const gchar *handler) { /* Check if WEBKIT_TYPE_SOUP_AUTH_DIALOG feature is set */ GSList *flist = soup_session_get_features (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG); guint feature_is_set = g_slist_length(flist); g_slist_free(flist); + g_free(uzbl.behave.authentication_handler); + uzbl.behave.authentication_handler = g_strdup(handler); + if (uzbl.behave.authentication_handler == NULL || *uzbl.behave.authentication_handler == 0) { if (!feature_is_set) soup_session_add_feature_by_type @@ -355,16 +478,18 @@ set_authentication_handler() { soup_session_remove_feature_by_type (uzbl.net.soup_session, (GType) WEBKIT_TYPE_SOUP_AUTH_DIALOG); } - return; } void -set_status_background() { +set_status_background(const gchar *background) { /* labels and hboxes do not draw their own background. applying this * on the vbox/main_window is ok as the statusbar is the only affected * widget. (if not, we could also use GtkEventBox) */ GtkWidget* widget = uzbl.gui.main_window ? uzbl.gui.main_window : GTK_WIDGET (uzbl.gui.plug); + g_free(uzbl.behave.status_background); + uzbl.behave.status_background = g_strdup(background); + #if GTK_CHECK_VERSION(2,91,0) GdkRGBA color; gdk_rgba_parse (&color, uzbl.behave.status_background); @@ -377,61 +502,96 @@ set_status_background() { } void -set_icon() { - if(file_exists(uzbl.gui.icon)) { - if (uzbl.gui.main_window) - gtk_window_set_icon_from_file (GTK_WINDOW (uzbl.gui.main_window), uzbl.gui.icon, NULL); +set_icon(const gchar *icon) { + if(file_exists(icon) && uzbl.gui.main_window) { + g_free(uzbl.gui.icon); + uzbl.gui.icon = g_strdup(icon); + + gtk_window_set_icon_from_file (GTK_WINDOW (uzbl.gui.main_window), uzbl.gui.icon, NULL); } else { - g_printerr ("Icon \"%s\" not found. ignoring.\n", uzbl.gui.icon); + g_printerr ("Icon \"%s\" not found. ignoring.\n", icon); } } void -set_window_role() { - if (uzbl.gui.main_window) - gtk_window_set_role(GTK_WINDOW (uzbl.gui.main_window), uzbl.gui.window_role); +set_window_role(const gchar *role) { + if (!uzbl.gui.main_window) + return; + + gtk_window_set_role(GTK_WINDOW (uzbl.gui.main_window), role); } -void -set_geometry() { - int ret=0, x=0, y=0; - unsigned int w=0, h=0; - if(uzbl.gui.geometry) { - if(uzbl.gui.geometry[0] == 'm') { /* m/maximize/maximized */ - gtk_window_maximize((GtkWindow *)(uzbl.gui.main_window)); - } else { - /* we used to use gtk_window_parse_geometry() but that didn't work how it was supposed to */ - ret = XParseGeometry(uzbl.gui.geometry, &x, &y, &w, &h); - if(ret & XValue) - gtk_window_move((GtkWindow *)uzbl.gui.main_window, x, y); - if(ret & WidthValue) - gtk_window_resize((GtkWindow *)uzbl.gui.main_window, w, h); - } +gchar * +get_window_role() { + if (!uzbl.gui.main_window) + return NULL; + + const gchar* role = gtk_window_get_role(GTK_WINDOW (uzbl.gui.main_window)); + return g_strdup(role); +} + +gchar * +get_geometry() { + int w, h, x, y; + GString *buf = g_string_new(""); + + if(uzbl.gui.main_window) { + gtk_window_get_size(GTK_WINDOW(uzbl.gui.main_window), &w, &h); + gtk_window_get_position(GTK_WINDOW(uzbl.gui.main_window), &x, &y); + + g_string_printf(buf, "%dx%d+%d+%d", w, h, x, y); } - /* update geometry var with the actual geometry - this is necessary as some WMs don't seem to honour - the above setting and we don't want to end up with - wrong geometry information - */ - retrieve_geometry(); + return g_string_free(buf, FALSE); } void -set_show_status() { - if (!uzbl.behave.show_status) - gtk_widget_hide(uzbl.gui.status_bar); - else - gtk_widget_show(uzbl.gui.status_bar); +set_geometry(const gchar *geometry) { + if(!geometry) + return; + + if(geometry[0] == 'm') { /* m/maximize/maximized */ + gtk_window_maximize((GtkWindow *)(uzbl.gui.main_window)); + } else { + int x=0, y=0; + unsigned int w=0, h=0; + /* we used to use gtk_window_parse_geometry() but that didn't work + * how it was supposed to. */ + int ret = XParseGeometry(uzbl.gui.geometry, &x, &y, &w, &h); + + if(ret & XValue) + gtk_window_move((GtkWindow *)uzbl.gui.main_window, x, y); + + if(ret & WidthValue) + gtk_window_resize((GtkWindow *)uzbl.gui.main_window, w, h); + } + + /* get the actual geometry (which might be different from what was + * specified) and store it (since the GEOMETRY_CHANGED event needs to + * know what it changed from) */ + g_free(uzbl.gui.geometry); + uzbl.gui.geometry = get_geometry(); +} + +void +set_show_status(int show_status) { + gtk_widget_set_visible(uzbl.gui.status_bar, show_status); update_title(); } +int +get_show_status() { + return gtk_widget_get_visible(uzbl.gui.status_bar); +} + void -set_status_top() { +set_status_top(int status_top) { if (!uzbl.gui.scrolled_win && !uzbl.gui.status_bar) return; + uzbl.behave.status_top = status_top; + g_object_ref(uzbl.gui.scrolled_win); g_object_ref(uzbl.gui.status_bar); gtk_container_remove(GTK_CONTAINER(uzbl.gui.vbox), uzbl.gui.scrolled_win); @@ -453,49 +613,67 @@ set_status_top() { } void -set_current_encoding() { - gchar *encoding = uzbl.behave.current_encoding; +set_current_encoding(const gchar *encoding) { if(strlen(encoding) == 0) encoding = NULL; webkit_web_view_set_custom_encoding(uzbl.gui.web_view, encoding); } +gchar * +get_current_encoding() { + const gchar *encoding = webkit_web_view_get_custom_encoding(uzbl.gui.web_view); + return g_strdup(encoding); +} + void -cmd_fifo_dir() { - uzbl.behave.fifo_dir = init_fifo(uzbl.behave.fifo_dir); +set_fifo_dir(const gchar *fifo_dir) { + g_free(uzbl.behave.fifo_dir); + + if(init_fifo(fifo_dir)) + uzbl.behave.fifo_dir = g_strdup(fifo_dir); + else + uzbl.behave.fifo_dir = NULL; } void -cmd_socket_dir() { - uzbl.behave.socket_dir = init_socket(uzbl.behave.socket_dir); +set_socket_dir(const gchar *socket_dir) { + g_free(uzbl.behave.socket_dir); + + if(init_socket(socket_dir)) + uzbl.behave.socket_dir = g_strdup(socket_dir); + else + uzbl.behave.socket_dir = NULL; } void -cmd_inject_html() { - if(uzbl.behave.inject_html) { - webkit_web_view_load_html_string (uzbl.gui.web_view, - uzbl.behave.inject_html, NULL); - } +set_inject_html(const gchar *html) { + webkit_web_view_load_html_string (uzbl.gui.web_view, html, NULL); } void -cmd_useragent() { - if (*uzbl.net.useragent == ' ') { - g_free (uzbl.net.useragent); +set_useragent(const gchar *useragent) { + g_free(uzbl.net.useragent); + + if (*useragent == ' ') { uzbl.net.useragent = NULL; } else { + uzbl.net.useragent = g_strdup(useragent); + g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_USER_AGENT, uzbl.net.useragent, NULL); } } void -set_accept_languages() { - if (*uzbl.net.accept_languages == ' ') { - g_free (uzbl.net.accept_languages); +set_accept_languages(const gchar *accept_languages) { + g_free(uzbl.net.accept_languages); + + if (*accept_languages == ' ') { uzbl.net.accept_languages = NULL; } else { + uzbl.net.accept_languages = g_strdup(accept_languages); + g_object_set(G_OBJECT(uzbl.net.soup_session), SOUP_SESSION_ACCEPT_LANGUAGE, uzbl.net.accept_languages, NULL); } @@ -503,26 +681,48 @@ set_accept_languages() { /* requires webkit >=1.1.14 */ void -cmd_view_source() { +set_view_source(int view_source) { + uzbl.behave.view_source = view_source; + webkit_web_view_set_view_source_mode(uzbl.gui.web_view, (gboolean) uzbl.behave.view_source); } void -cmd_set_zoom_type () { - if(uzbl.behave.zoom_type) - webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, TRUE); - else - webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, FALSE); +set_zoom_type (int type) { + webkit_web_view_set_full_content_zoom (uzbl.gui.web_view, type); +} + +int +get_zoom_type () { + return webkit_web_view_get_full_content_zoom (uzbl.gui.web_view); +} + +void +set_zoom_level(float zoom_level) { + webkit_web_view_set_zoom_level (uzbl.gui.web_view, zoom_level); +} + +float +get_zoom_level() { + return webkit_web_view_get_zoom_level (uzbl.gui.web_view); } /* abbreviations to help keep the table's width humane */ -#define PTR_V_STR(var, d, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = d, .writeable = 1, .func = fun } -#define PTR_V_INT(var, d, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = d, .writeable = 1, .func = fun } -#define PTR_V_FLOAT(var, d, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = d, .writeable = 1, .func = fun } -#define PTR_C_STR(var, fun) { .ptr.s = &(var), .type = TYPE_STR, .dump = 0, .writeable = 0, .func = fun } -#define PTR_C_INT(var, fun) { .ptr.i = (int*)&(var), .type = TYPE_INT, .dump = 0, .writeable = 0, .func = fun } -#define PTR_C_FLOAT(var, fun) { .ptr.f = &(var), .type = TYPE_FLOAT, .dump = 0, .writeable = 0, .func = fun } + +/* variables */ +#define PTR_V_STR(var, d, set) { .ptr = { .s = &(var) }, .type = TYPE_STR, .dump = d, .writeable = 1, .getter = NULL, .setter = (uzbl_fp)set } +#define PTR_V_INT(var, d, set) { .ptr = { .i = (int*)&(var) }, .type = TYPE_INT, .dump = d, .writeable = 1, .getter = NULL, .setter = (uzbl_fp)set } +#define PTR_V_FLOAT(var, d, set) { .ptr = { .f = &(var) }, .type = TYPE_FLOAT, .dump = d, .writeable = 1, .getter = NULL, .setter = (uzbl_fp)set } + +#define PTR_V_STR_GETSET(var) { .type = TYPE_STR, .dump = 1, .writeable = 1, .getter = (uzbl_fp) get_##var, .setter = (uzbl_fp)set_##var } +#define PTR_V_INT_GETSET(var) { .type = TYPE_INT, .dump = 1, .writeable = 1, .getter = (uzbl_fp) get_##var, .setter = (uzbl_fp)set_##var } +#define PTR_V_FLOAT_GETSET(var) { .type = TYPE_FLOAT, .dump = 1, .writeable = 1, .getter = (uzbl_fp) get_##var, .setter = (uzbl_fp)set_##var } + +/* constants */ +#define PTR_C_STR(var) { .ptr = { .s = &(var) }, .type = TYPE_STR, .dump = 0, .writeable = 0, .getter = NULL, .setter = NULL } +#define PTR_C_INT(var) { .ptr = { .i = (int*)&(var) }, .type = TYPE_INT, .dump = 0, .writeable = 0, .getter = NULL, .setter = NULL } +#define PTR_C_FLOAT(var) { .ptr = { .f = &(var) }, .type = TYPE_FLOAT, .dump = 0, .writeable = 0, .getter = NULL, .setter = NULL } const struct var_name_to_ptr_t { const char *name; @@ -530,78 +730,97 @@ const struct var_name_to_ptr_t { } var_name_to_ptr[] = { /* variable name pointer to variable in code dump callback function */ /* ---------------------------------------------------------------------------------------------- */ - { "uri", PTR_V_STR(uzbl.state.uri, 1, cmd_load_uri)}, + { "uri", PTR_V_STR(uzbl.state.uri, 1, set_uri)}, + { "verbose", PTR_V_INT(uzbl.state.verbose, 1, NULL)}, { "print_events", PTR_V_INT(uzbl.state.events_stdout, 1, NULL)}, - { "inject_html", PTR_V_STR(uzbl.behave.inject_html, 0, cmd_inject_html)}, - { "geometry", PTR_V_STR(uzbl.gui.geometry, 1, set_geometry)}, - { "show_status", PTR_V_INT(uzbl.behave.show_status, 1, set_show_status)}, + + { "show_status", PTR_V_INT_GETSET(show_status)}, { "status_top", PTR_V_INT(uzbl.behave.status_top, 1, set_status_top)}, { "status_format", PTR_V_STR(uzbl.behave.status_format, 1, NULL)}, { "status_format_right", PTR_V_STR(uzbl.behave.status_format_right, 1, NULL)}, { "status_background", PTR_V_STR(uzbl.behave.status_background, 1, set_status_background)}, { "title_format_long", PTR_V_STR(uzbl.behave.title_format_long, 1, NULL)}, { "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)}, + + { "geometry", PTR_V_STR_GETSET(geometry)}, { "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)}, - { "window_role", PTR_V_STR(uzbl.gui.window_role, 1, set_window_role)}, + { "window_role", PTR_V_STR_GETSET(window_role)}, + { "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)}, + { "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)}, { "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)}, + { "request_handler", PTR_V_STR(uzbl.behave.request_handler, 1, NULL)}, { "download_handler", PTR_V_STR(uzbl.behave.download_handler, 1, NULL)}, - { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, cmd_fifo_dir)}, - { "socket_dir", PTR_V_STR(uzbl.behave.socket_dir, 1, cmd_socket_dir)}, - { "http_debug", PTR_V_INT(uzbl.behave.http_debug, 1, cmd_http_debug)}, + + { "fifo_dir", PTR_V_STR(uzbl.behave.fifo_dir, 1, set_fifo_dir)}, + { "socket_dir", PTR_V_STR(uzbl.behave.socket_dir, 1, set_socket_dir)}, + { "shell_cmd", PTR_V_STR(uzbl.behave.shell_cmd, 1, NULL)}, + + { "http_debug", PTR_V_INT(uzbl.behave.http_debug, 1, set_http_debug)}, { "proxy_url", PTR_V_STR(uzbl.net.proxy_url, 1, set_proxy_url)}, - { "max_conns", PTR_V_INT(uzbl.net.max_conns, 1, cmd_max_conns)}, - { "max_conns_host", PTR_V_INT(uzbl.net.max_conns_host, 1, cmd_max_conns_host)}, - { "useragent", PTR_V_STR(uzbl.net.useragent, 1, cmd_useragent)}, + { "max_conns", PTR_V_INT(uzbl.net.max_conns, 1, set_max_conns)}, + { "max_conns_host", PTR_V_INT(uzbl.net.max_conns_host, 1, set_max_conns_host)}, + { "useragent", PTR_V_STR(uzbl.net.useragent, 1, set_useragent)}, { "accept_languages", PTR_V_STR(uzbl.net.accept_languages, 1, set_accept_languages)}, - { "javascript_windows", PTR_V_INT(uzbl.behave.javascript_windows, 1, cmd_javascript_windows)}, - /* requires webkit >=1.1.14 */ - { "view_source", PTR_V_INT(uzbl.behave.view_source, 0, cmd_view_source)}, + + { "view_source", PTR_V_INT(uzbl.behave.view_source, 0, set_view_source)}, + + { "ssl_ca_file", PTR_V_STR_GETSET(ca_file)}, + { "ssl_verify", PTR_V_INT_GETSET(verify_cert)}, /* exported WebKitWebSettings properties */ - { "zoom_level", PTR_V_FLOAT(uzbl.behave.zoom_level, 1, cmd_zoom_level)}, - { "zoom_type", PTR_V_INT(uzbl.behave.zoom_type, 1, cmd_set_zoom_type)}, - { "font_size", PTR_V_INT(uzbl.behave.font_size, 1, cmd_font_size)}, - { "default_font_family", PTR_V_STR(uzbl.behave.default_font_family, 1, cmd_default_font_family)}, - { "monospace_font_family", PTR_V_STR(uzbl.behave.monospace_font_family, 1, cmd_monospace_font_family)}, - { "cursive_font_family", PTR_V_STR(uzbl.behave.cursive_font_family, 1, cmd_cursive_font_family)}, - { "sans_serif_font_family", PTR_V_STR(uzbl.behave.sans_serif_font_family, 1, cmd_sans_serif_font_family)}, - { "serif_font_family", PTR_V_STR(uzbl.behave.serif_font_family, 1, cmd_serif_font_family)}, - { "fantasy_font_family", PTR_V_STR(uzbl.behave.fantasy_font_family, 1, cmd_fantasy_font_family)}, - { "monospace_size", PTR_V_INT(uzbl.behave.monospace_size, 1, cmd_font_size)}, - { "minimum_font_size", PTR_V_INT(uzbl.behave.minimum_font_size, 1, cmd_minimum_font_size)}, - { "enable_pagecache", PTR_V_INT(uzbl.behave.enable_pagecache, 1, cmd_enable_pagecache)}, - { "disable_plugins", PTR_V_INT(uzbl.behave.disable_plugins, 1, cmd_disable_plugins)}, - { "disable_scripts", PTR_V_INT(uzbl.behave.disable_scripts, 1, cmd_disable_scripts)}, - { "autoload_images", PTR_V_INT(uzbl.behave.autoload_img, 1, cmd_autoload_img)}, - { "autoshrink_images", PTR_V_INT(uzbl.behave.autoshrink_img, 1, cmd_autoshrink_img)}, - { "enable_spellcheck", PTR_V_INT(uzbl.behave.enable_spellcheck, 1, cmd_enable_spellcheck)}, - { "spellcheck_languages", PTR_V_STR(uzbl.behave.spellcheck_languages, 1, cmd_spellcheck_languages)}, - { "enable_private", PTR_V_INT(uzbl.behave.enable_private, 1, cmd_enable_private)}, - { "print_backgrounds", PTR_V_INT(uzbl.behave.print_bg, 1, cmd_print_bg)}, - { "stylesheet_uri", PTR_V_STR(uzbl.behave.style_uri, 1, cmd_style_uri)}, - { "resizable_text_areas", PTR_V_INT(uzbl.behave.resizable_txt, 1, cmd_resizable_txt)}, - { "default_encoding", PTR_V_STR(uzbl.behave.default_encoding, 1, cmd_default_encoding)}, - { "current_encoding", PTR_V_STR(uzbl.behave.current_encoding, 1, set_current_encoding)}, - { "enforce_96_dpi", PTR_V_INT(uzbl.behave.enforce_96dpi, 1, cmd_enforce_96dpi)}, - { "caret_browsing", PTR_V_INT(uzbl.behave.caret_browsing, 1, cmd_caret_browsing)}, + { "javascript_windows", PTR_V_INT_GETSET(javascript_windows)}, + { "zoom_level", PTR_V_FLOAT_GETSET(zoom_level)}, + { "zoom_type", PTR_V_INT_GETSET(zoom_type)}, + + { "default_font_family", PTR_V_STR_GETSET(default_font_family)}, + { "monospace_font_family", PTR_V_STR_GETSET(monospace_font_family)}, + { "cursive_font_family", PTR_V_STR_GETSET(cursive_font_family)}, + { "sans_serif_font_family", PTR_V_STR_GETSET(sans_serif_font_family)}, + { "serif_font_family", PTR_V_STR_GETSET(serif_font_family)}, + { "fantasy_font_family", PTR_V_STR_GETSET(fantasy_font_family)}, + + { "monospace_size", PTR_V_INT_GETSET(monospace_size)}, + { "font_size", PTR_V_INT_GETSET(font_size)}, + { "minimum_font_size", PTR_V_INT_GETSET(minimum_font_size)}, + + { "enable_pagecache", PTR_V_INT_GETSET(enable_pagecache)}, + { "enable_plugins", PTR_V_INT_GETSET(enable_plugins)}, + { "enable_scripts", PTR_V_INT_GETSET(enable_scripts)}, + { "autoload_images", PTR_V_INT_GETSET(autoload_images)}, + { "autoshrink_images", PTR_V_INT_GETSET(autoshrink_images)}, + { "enable_spellcheck", PTR_V_INT_GETSET(enable_spellcheck)}, + { "spellcheck_languages", PTR_V_STR_GETSET(spellcheck_languages)}, + { "enable_private", PTR_V_INT_GETSET(enable_private)}, + { "print_backgrounds", PTR_V_INT_GETSET(print_bg)}, + { "stylesheet_uri", PTR_V_STR_GETSET(stylesheet_uri)}, + { "resizable_text_areas", PTR_V_INT_GETSET(resizable_text_areas)}, + { "default_encoding", PTR_V_STR_GETSET(default_encoding)}, + { "current_encoding", PTR_V_STR_GETSET(current_encoding)}, + { "enforce_96_dpi", PTR_V_INT_GETSET(enforce_96_dpi)}, + { "caret_browsing", PTR_V_INT_GETSET(caret_browsing)}, + { "enable_cross_file_access", PTR_V_INT_GETSET(enable_cross_file_access)}, + + { "inject_html", { .type = TYPE_STR, .dump = 0, .writeable = 1, .getter = NULL, .setter = (uzbl_fp) set_inject_html }}, /* constants (not dumpable or writeable) */ - { "WEBKIT_MAJOR", PTR_C_INT(uzbl.info.webkit_major, NULL)}, - { "WEBKIT_MINOR", PTR_C_INT(uzbl.info.webkit_minor, NULL)}, - { "WEBKIT_MICRO", PTR_C_INT(uzbl.info.webkit_micro, NULL)}, - { "ARCH_UZBL", PTR_C_STR(uzbl.info.arch, NULL)}, - { "COMMIT", PTR_C_STR(uzbl.info.commit, NULL)}, - { "TITLE", PTR_C_STR(uzbl.gui.main_title, NULL)}, - { "SELECTED_URI", PTR_C_STR(uzbl.state.selected_url, NULL)}, - { "NAME", PTR_C_STR(uzbl.state.instance_name, NULL)}, - { "PID", PTR_C_STR(uzbl.info.pid_str, NULL)}, - { "_", PTR_C_STR(uzbl.state.last_result, NULL)}, - - { NULL, {.ptr.s = NULL, .type = TYPE_INT, .dump = 0, .writeable = 0, .func = NULL}} + { "WEBKIT_MAJOR", PTR_C_INT(uzbl.info.webkit_major)}, + { "WEBKIT_MINOR", PTR_C_INT(uzbl.info.webkit_minor)}, + { "WEBKIT_MICRO", PTR_C_INT(uzbl.info.webkit_micro)}, + { "ARCH_UZBL", PTR_C_STR(uzbl.info.arch)}, + { "COMMIT", PTR_C_STR(uzbl.info.commit)}, + { "TITLE", PTR_C_STR(uzbl.gui.main_title)}, + { "SELECTED_URI", PTR_C_STR(uzbl.state.selected_url)}, + { "NAME", PTR_C_STR(uzbl.state.instance_name)}, + { "PID", PTR_C_STR(uzbl.info.pid_str)}, + { "_", PTR_C_STR(uzbl.state.last_result)}, + + /* and we terminate the whole thing with the closest thing we have to NULL. + * it's important that dump = 0. */ + { NULL, {.ptr = { .i = NULL }, .type = TYPE_INT, .dump = 0, .writeable = 0}} }; /* construct a hash from the var_name_to_ptr array for quick access */ diff --git a/src/variables.h b/src/variables.h index 6aa0ab0..dade652 100644 --- a/src/variables.h +++ b/src/variables.h @@ -8,14 +8,41 @@ #include <glib.h> #include <webkit/webkit.h> +#include "type.h" + +uzbl_cmdprop *get_var_c(const gchar *name); + gboolean set_var_value(const gchar *name, gchar *val); void expand_variable(GString *buf, const gchar *name); void variables_hash(); + +gchar *get_var_value_string_c(const uzbl_cmdprop *c); +gchar *get_var_value_string(const char *name); +int get_var_value_int_c(const uzbl_cmdprop *c); +int get_var_value_int(const char *name); +float get_var_value_float_c(const uzbl_cmdprop *c); +float get_var_value_float(const char *name); + +void set_var_value_string_c(uzbl_cmdprop *c, const gchar *val); +void set_var_value_int_c(uzbl_cmdprop *c, int f); +void set_var_value_float_c(uzbl_cmdprop *c, float f); + +void send_set_var_event(const char *name, const uzbl_cmdprop *c); + void dump_config(); void dump_config_as_events(); void uri_change_cb (WebKitWebView *web_view, GParamSpec param_spec); -void set_show_status(); -void set_geometry(); + +void set_show_status(int); + +void set_zoom_type(int); +int get_zoom_type(); + +gchar *get_geometry(); +void set_geometry(const gchar *); + +int get_show_status(); +void set_show_status(int); #endif |