aboutsummaryrefslogtreecommitdiffhomepage
path: root/uzbl.c
diff options
context:
space:
mode:
authorGravatar Robert Manea <gotmor@gmail.com>2009-05-05 13:06:33 +0200
committerGravatar Robert Manea <gotmor@gmail.com>2009-05-05 13:06:33 +0200
commitfdb283bb3827f09ce8bd51c2a405b080bd194aa6 (patch)
treecca064f051f54af0d5964683b52ce79f293db6d1 /uzbl.c
parent52476946951ce3d5833ed5c128c3653e056809ba (diff)
Added a statusbar parser that allows using arbitrary templates for the status bar
Diffstat (limited to 'uzbl.c')
-rw-r--r--uzbl.c106
1 files changed, 105 insertions, 1 deletions
diff --git a/uzbl.c b/uzbl.c
index 0ba9098..7f453ab 100644
--- a/uzbl.c
+++ b/uzbl.c
@@ -54,6 +54,12 @@
#include <libsoup/soup.h>
#include "uzbl.h"
+
+/* status bar format
+ TODO: integrate with the config file
+*/
+char *status_format = "[Progress: LOAD_PROGRESS%] on <TITLE> - Uzbl browser";
+
/* housekeeping / internal variables */
static gchar selected_url[500] = "\0";
static char executable_path[500];
@@ -404,6 +410,99 @@ close_uzbl (WebKitWebView *page, const char *param) {
gtk_main_quit ();
}
+enum { SYM_TITLE, SYM_LOADPRGS};
+static 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 */,
+ ( "#\n" ) /* 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);
+ g_scanner_scope_add_symbol(uzbl.scan, 0, "TITLE", (gpointer)SYM_TITLE);
+ g_scanner_scope_add_symbol(uzbl.scan, 0, "LOAD_PROGRESS", (gpointer)SYM_LOADPRGS);
+}
+
+static gchar *
+parse_status_template(const char *template) {
+ GTokenType token = G_TOKEN_NONE;
+ GString *ret = g_string_new("");
+ int sym;
+
+ if(!template)
+ return NULL;
+
+ 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 = (int)g_scanner_cur_value(uzbl.scan).v_symbol;
+ switch(sym) {
+ case SYM_TITLE:
+ g_string_append(ret, uzbl.state.uri);
+ break;
+ case SYM_LOADPRGS:
+ g_string_append(ret, itos(uzbl.gui.sbar.load_progress));
+ break;
+ default:
+ break;
+ }
+ }
+ else if(token == G_TOKEN_INT) {
+ g_string_append(ret, itos(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_printf(ret, "%c", g_scanner_cur_value(uzbl.scan).v_char);
+ }
+ }
+
+ return g_string_free(ret, FALSE);
+}
+
+
// make sure to put '' around args, so that if there is whitespace we can still keep arguments together.
static gboolean
run_command(const char *command, const char *args) {
@@ -626,6 +725,7 @@ update_title (void) {
GString* string_long = g_string_new ("");
GString* string_short = g_string_new ("");
char* iname = NULL;
+ gchar *statln;
int iname_len;
State *s = &uzbl.state;
@@ -661,7 +761,9 @@ update_title (void) {
if (show_status) {
gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), title_short);
- gtk_label_set_text(GTK_LABEL(uzbl.gui.mainbar_label), title_long);
+ statln = parse_status_template(status_format);
+ gtk_label_set_text(GTK_LABEL(uzbl.gui.mainbar_label), statln);
+ g_free(statln);
} else {
gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), title_long);
}
@@ -1059,8 +1161,10 @@ main (int argc, char* argv[]) {
uzbl.gui.bar_h = gtk_range_get_adjustment((GtkRange*) uzbl.gui.scbar_h);
gtk_widget_set_scroll_adjustments ((GtkWidget*) uzbl.gui.web_view, uzbl.gui.bar_h, uzbl.gui.bar_v);
+
if (!show_status)
gtk_widget_hide(uzbl.gui.mainbar);
+ setup_scanner();
if (fifo_dir)
create_fifo ();