Uzbl uzbl;
-
-
/* commandline arguments (set initial values for the state variables) */
- static const
+ const
GOptionEntry entries[] =
{
- { "uri", 'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
+ { "uri", 'u', 0, G_OPTION_ARG_STRING, &uzbl.state.uri,
"Uri to load at startup (equivalent to 'set uri = URI')", "URI" },
- { "verbose", 'v', 0, G_OPTION_ARG_NONE, &uzbl.state.verbose,
+ { "verbose", 'v', 0, G_OPTION_ARG_NONE, &uzbl.state.verbose,
"Whether to print all messages or just errors.", NULL },
- { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
+ { "name", 'n', 0, G_OPTION_ARG_STRING, &uzbl.state.instance_name,
"Name of the current instance (defaults to Xorg window id)", "NAME" },
- { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
+ { "config", 'c', 0, G_OPTION_ARG_STRING, &uzbl.state.config_file,
"Config file (this is pretty much equivalent to uzbl < FILE )", "FILE" },
- { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
+ { "socket", 's', 0, G_OPTION_ARG_INT, &uzbl.state.socket_id,
"Socket ID", "SOCKET" },
+ { "geometry", 'g', 0, G_OPTION_ARG_STRING, &uzbl.gui.geometry,
+ "Set window geometry (format: WIDTHxHEIGHT+-X+-Y)", "GEOMETRY" },
{ "version", 'V', 0, G_OPTION_ARG_NONE, &uzbl.behave.print_version,
"Print the version and exit", NULL },
{ NULL, 0, 0, 0, NULL, NULL, NULL }
}
/* --- UTILITY FUNCTIONS --- */
-
-enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS};
+enum {EXP_ERR, EXP_SIMPLE_VAR, EXP_BRACED_VAR, EXP_EXPR, EXP_JS, EXP_ESCAPE};
- static guint
+ guint
get_exp_type(gchar *s) {
/* variables */
if(*(s+1) == '(')
if(etype == EXP_SIMPLE_VAR ||
etype == EXP_BRACED_VAR) {
if( (c = g_hash_table_lookup(uzbl.comm.proto_var, ret)) ) {
- if(c->type == TYPE_STR)
+ if(c->type == TYPE_STR && *c->ptr != NULL) {
g_string_append(buf, (gchar *)*c->ptr);
- else if(c->type == TYPE_INT) {
+ } else if(c->type == TYPE_INT) {
- char *b = itos((uintptr_t)*c->ptr);
- g_string_append(buf, b);
- g_free(b);
+ g_string_append_printf(buf, "%d", (int)*c->ptr);
+ }
+ else if(c->type == TYPE_FLOAT) {
+ g_string_append_printf(buf, "%f", *(float *)c->ptr);
}
}
+
if(etype == EXP_SIMPLE_VAR)
s = vend;
else
unlink (uzbl.comm.socket_path);
g_free(uzbl.state.executable_path);
- g_string_free(uzbl.state.keycmd, TRUE);
+ g_free(uzbl.state.keycmd);
g_hash_table_destroy(uzbl.bindings);
g_hash_table_destroy(uzbl.behave.commands);
+ g_scanner_destroy(uzbl.scan);
}
/* used for html_mode_timeout
scroll(uzbl.gui.bar_h, argv);
}
- static void
+ void
+cmd_set_geometry() {
+ if(!gtk_window_parse_geometry(GTK_WINDOW(uzbl.gui.main_window), uzbl.gui.geometry)) {
+ if(uzbl.state.verbose)
+ printf("Error in geometry string: %s\n", uzbl.gui.geometry);
+ }
+ /* 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
+ */
+ retreive_geometry();
+}
+
- static void
++void
cmd_set_status() {
if (!uzbl.behave.show_status) {
gtk_widget_hide(uzbl.gui.mainbar);
run_handler(uzbl.behave.load_finish_handler, "");
}
+void clear_keycmd() {
+ g_free(uzbl.state.keycmd);
+ uzbl.state.keycmd = g_strdup("");
+}
+
- static void
+ void
load_start_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data) {
(void) page;
(void) frame;
dump_config();
}
- void set_keycmd() {
+ void
++set_keycmd() {
+ run_keycmd(FALSE);
+ update_title();
+}
+
- void set_mode_indicator() {
++void
++set_mode_indicator() {
+ uzbl.gui.sbar.mode_indicator = (uzbl.behave.insert_mode ?
+ uzbl.behave.insert_indicator : uzbl.behave.cmd_indicator);
+}
+
- void set_insert_mode(gboolean mode) {
++void
++set_insert_mode(gboolean mode) {
+ uzbl.behave.insert_mode = mode;
+ set_mode_indicator();
+}
+
- static void
++void
toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result) {
(void) page; (void) result;
return g_string_free(bar, FALSE);
}
-
-void
-setup_scanner() {
- const GScannerConfig scan_config = {
- (
- "\t\r\n"
- ) /* cset_skip_characters */,
- (
- G_CSET_a_2_z
- "_#"
- G_CSET_A_2_Z
- ) /* cset_identifier_first */,
- (
- G_CSET_a_2_z
- "_0123456789"
- G_CSET_A_2_Z
- G_CSET_LATINS
- G_CSET_LATINC
- ) /* cset_identifier_nth */,
- ( "" ) /* cpair_comment_single */,
-
- TRUE /* case_sensitive */,
-
- FALSE /* skip_comment_multi */,
- FALSE /* skip_comment_single */,
- FALSE /* scan_comment_multi */,
- TRUE /* scan_identifier */,
- TRUE /* scan_identifier_1char */,
- FALSE /* scan_identifier_NULL */,
- TRUE /* scan_symbols */,
- FALSE /* scan_binary */,
- FALSE /* scan_octal */,
- FALSE /* scan_float */,
- FALSE /* scan_hex */,
- FALSE /* scan_hex_dollar */,
- FALSE /* scan_string_sq */,
- FALSE /* scan_string_dq */,
- TRUE /* numbers_2_int */,
- FALSE /* int_2_float */,
- FALSE /* identifier_2_string */,
- FALSE /* char_2_token */,
- FALSE /* symbol_2_token */,
- TRUE /* scope_0_fallback */,
- FALSE,
- TRUE
- };
-
- uzbl.scan = g_scanner_new(&scan_config);
- while(symp->symbol_name) {
- g_scanner_scope_add_symbol(uzbl.scan, 0,
- symp->symbol_name,
- GINT_TO_POINTER(symp->symbol_token));
- symp++;
- }
-}
-
-gchar *
-expand_template(const char *template, gboolean escape_markup) {
- if(!template) return NULL;
-
- GTokenType token = G_TOKEN_NONE;
- GString *ret = g_string_new("");
- char *buf=NULL;
- int sym;
-
- g_scanner_input_text(uzbl.scan, template, strlen(template));
- while(!g_scanner_eof(uzbl.scan) && token != G_TOKEN_LAST) {
- token = g_scanner_get_next_token(uzbl.scan);
-
- if(token == G_TOKEN_SYMBOL) {
- sym = GPOINTER_TO_INT(g_scanner_cur_value(uzbl.scan).v_symbol);
- switch(sym) {
- case SYM_URI:
- if(escape_markup) {
- buf = uzbl.state.uri ?
- g_markup_printf_escaped("%s", uzbl.state.uri) : g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.uri ?
- uzbl.state.uri : g_strdup(""));
- break;
- case SYM_LOADPRGS:
- buf = itos(uzbl.gui.sbar.load_progress);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_LOADPRGSBAR:
- buf = build_progressbar_ascii(uzbl.gui.sbar.load_progress);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_TITLE:
- if(escape_markup) {
- buf = uzbl.gui.main_title ?
- g_markup_printf_escaped("%s", uzbl.gui.main_title) : g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.gui.main_title ?
- uzbl.gui.main_title : "");
- break;
- case SYM_SELECTED_URI:
- if(escape_markup) {
- buf = uzbl.state.selected_url ?
- g_markup_printf_escaped("%s", uzbl.state.selected_url) : g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.selected_url ?
- uzbl.state.selected_url : "");
- break;
- case SYM_NAME:
- buf = itos(uzbl.xwin);
- g_string_append(ret,
- uzbl.state.instance_name ? uzbl.state.instance_name : buf);
- g_free(buf);
- break;
- case SYM_KEYCMD:
- if(escape_markup) {
- buf = uzbl.state.keycmd->str ?
- g_markup_printf_escaped("%s", uzbl.state.keycmd->str) : g_strdup("");
- g_string_append(ret, buf);
- g_free(buf);
- }
- else
- g_string_append(ret, uzbl.state.keycmd->str ?
- uzbl.state.keycmd->str : "");
- break;
- case SYM_MODE:
- g_string_append(ret,
- uzbl.behave.insert_mode ?
- uzbl.behave.insert_indicator : uzbl.behave.cmd_indicator);
- break;
- case SYM_MSG:
- g_string_append(ret,
- uzbl.gui.sbar.msg ? uzbl.gui.sbar.msg : "");
- break;
- /* useragent syms */
- case SYM_WK_MAJ:
- buf = itos(WEBKIT_MAJOR_VERSION);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_WK_MIN:
- buf = itos(WEBKIT_MINOR_VERSION);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_WK_MIC:
- buf = itos(WEBKIT_MICRO_VERSION);
- g_string_append(ret, buf);
- g_free(buf);
- break;
- case SYM_SYSNAME:
- g_string_append(ret, uzbl.state.unameinfo.sysname);
- break;
- case SYM_NODENAME:
- g_string_append(ret, uzbl.state.unameinfo.nodename);
- break;
- case SYM_KERNREL:
- g_string_append(ret, uzbl.state.unameinfo.release);
- break;
- case SYM_KERNVER:
- g_string_append(ret, uzbl.state.unameinfo.version);
- break;
- case SYM_ARCHSYS:
- g_string_append(ret, uzbl.state.unameinfo.machine);
- break;
- case SYM_ARCHUZBL:
- g_string_append(ret, ARCH);
- break;
-#ifdef _GNU_SOURCE
- case SYM_DOMAINNAME:
- g_string_append(ret, uzbl.state.unameinfo.domainname);
- break;
-#endif
- case SYM_COMMIT:
- g_string_append(ret, COMMIT);
- break;
- default:
- break;
- }
- }
- else if(token == G_TOKEN_INT) {
- g_string_append_printf(ret, "%lu", g_scanner_cur_value(uzbl.scan).v_int);
- }
- else if(token == G_TOKEN_IDENTIFIER) {
- g_string_append(ret, (gchar *)g_scanner_cur_value(uzbl.scan).v_identifier);
- }
- else if(token == G_TOKEN_CHAR) {
- g_string_append_c(ret, (gchar)g_scanner_cur_value(uzbl.scan).v_char);
- }
- else if(token == G_TOKEN_ERROR) {
- g_scanner_error(uzbl.scan, "Token error in template ('%s') at line %d, column %d.",
- template,
- g_scanner_cur_line(uzbl.scan),
- g_scanner_cur_position(uzbl.scan));
- }
- }
-
- return g_string_free(ret, FALSE);
-}
/* --End Statusbar functions-- */
- static void
+ void
sharg_append(GArray *a, const gchar *str) {
const gchar *s = (str ? str : "");
g_array_append_val(a, s);
g_array_free (a, TRUE);
}
- static void
+ void
cmd_always_insert_mode() {
- uzbl.behave.insert_mode =
- uzbl.behave.always_insert_mode ? TRUE : FALSE;
+ set_insert_mode(uzbl.behave.always_insert_mode);
update_title();
}
}
}
- static gchar*
+ gchar*
build_stream_name(int type, const gchar* dir) {
- char *xwin_str = NULL;
State *s = &uzbl.state;
gchar *str = NULL;
}
}
- static gboolean
+ gboolean
+configure_event_cb(GtkWidget* window, GdkEventConfigure* event) {
+ (void) window;
+ (void) event;
+
+ retreive_geometry();
+ return FALSE;
+}
+
- static gboolean
++gboolean
key_press_cb (GtkWidget* window, GdkEventKey* event)
{
//TRUE to stop other handlers from being invoked for the event. FALSE to propagate the event further.
g_string_free (short_keys_inc, TRUE);
}
- static void
+ void
exec_paramcmd(const Action *act, const guint i) {
- GString *parampart = g_string_new (uzbl.state.keycmd->str);
+ GString *parampart = g_string_new (uzbl.state.keycmd);
GString *actionname = g_string_new ("");
GString *actionparam = g_string_new ("");
g_string_erase (parampart, 0, i+1);
g_hash_table_foreach(uzbl.bindings, dump_key_hash, NULL);
}
- static void
-#ifndef UZBL_LIBRARY
-/** -- MAIN -- **/
-int
-main (int argc, char* argv[]) {
++void
+retreive_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
+initialize(int argc, char *argv[]) {
gtk_init (&argc, &argv);
if (!g_thread_supported ())
g_thread_init (NULL);
};
/* Functions */
- void
- setup_scanner();
-
-gchar *
-expand_template(const char *template, gboolean escape_markup);
-
-void
-setup_scanner();
-
char *
itos(int val);
file_exists (const char * filename);
void
+set_keycmd();
+
+void
+set_mode_indicator();
+
+void
+set_insert_mode(gboolean mode);
+
- static void
++void
toggle_insert_mode(WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
load_uri (WebKitWebView * web_view, GArray *argv, GString *result);
- static void
+ void
new_window_load_uri (const gchar * uri);
- static void
+ void
chain (WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
keycmd (WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
keycmd_nl (WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
keycmd_bs (WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
close_uzbl (WebKitWebView *page, GArray *argv, GString *result);
- static gboolean
+ gboolean
run_command(const gchar *command, const guint npre,
const gchar **args, const gboolean sync, char **output_stdout);
- static char*
++char*
+build_progressbar_ascii(int percent);
+
- static void
+ void
spawn(WebKitWebView *web_view, GArray *argv, GString *result);
- static void
+ void
spawn_sh(WebKitWebView *web_view, GArray *argv, GString *result);
- static void
+ void
spawn_sync(WebKitWebView *web_view, GArray *argv, GString *result);
- static void
+ void
spawn_sh_sync(WebKitWebView *web_view, GArray *argv, GString *result);
void
parse_command(const char *cmd, const char *param, GString *result);
- static void
+ void
parse_cmd_line(const char *ctl_line, GString *result);
- static gchar*
+ gchar*
build_stream_name(int type, const gchar *dir);
- static gboolean
+ gboolean
control_fifo(GIOChannel *gio, GIOCondition condition);
- static gchar*
+ gchar*
init_fifo(gchar *dir);
- static gboolean
+ gboolean
control_stdin(GIOChannel *gio, GIOCondition condition);
- static void
+ void
create_stdin();
- static gchar*
+ gchar*
init_socket(gchar *dir);
- static gboolean
+ gboolean
control_socket(GIOChannel *chan);
- static gboolean
+ gboolean
control_client_socket(GIOChannel *chan);
- static void
+ void
update_title (void);
- static gboolean
+ gboolean
key_press_cb (GtkWidget* window, GdkEventKey* event);
- static void
+ void
run_keycmd(const gboolean key_ret);
- static void
+ void
exec_paramcmd(const Action* act, const guint i);
+void
+initialize ();
+
GtkWidget*
create_browser ();
save_cookies (SoupMessage *msg,
gpointer user_data);
- static void
+ void
set_var(WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
act_bind(WebKitWebView *page, GArray *argv, GString *result);
- static void
+ void
act_dump_config();
- static void
+ void
render_html();
- static void
+ void
set_timeout(int seconds);
- static void
+ void
dump_var_hash(gpointer k, gpointer v, gpointer ud);
- static void
+ void
dump_key_hash(gpointer k, gpointer v, gpointer ud);
- static void
+ void
dump_config();
-
- static void
++void
+retreive_geometry();
+
- static gboolean
++gboolean
+configure_event_cb(GtkWidget* window, GdkEventConfigure* event);
+
typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result);
typedef struct {
Command function;
void
cmd_useragent() ;
- static void
+ void
cmd_autoload_img();
- static void
+ void
cmd_autoshrink_img();
- static void
+ void
cmd_enable_spellcheck();
- static void
+ void
cmd_enable_private();
- static void
+ void
cmd_print_bg();
- static void
+ void
cmd_style_uri();
- static void
+ void
cmd_resizable_txt();
- static void
+ void
cmd_default_encoding();
- static void
+ void
cmd_enforce_96dpi();
- static void
+ void
cmd_inject_html();
- static void
+ void
cmd_caret_browsing();
- static void
++void
+cmd_set_geometry();
+
/* vi: set et ts=4: */