return EXP_ERR;
}
-/* setting 'recurse = 1' will prevent expand() from
- * expanding '@(command)'
+/*
+ * recurse == 1: don't expand '@(command)@'
+ * recurse == 2: don't expand '@<java script>@'
*/
static gchar *
-expand(char *s, gboolean recurse) {
+expand(char *s, guint recurse) {
uzbl_cmdprop *c;
guint etype;
char upto = ' ';
+ char *end_simple_var = "^°!\"§$%&/()=?'`'+~*'#-.:,;@<>| \\{}[]¹²³¼½";
+ char str_end[2];
char ret[4096];
char *vend;
GError *err = NULL;
case '@':
etype = get_exp_type(s);
+ s++;
switch(etype) {
case EXP_SIMPLE_VAR:
- upto = ' ';
+ if( (vend = strpbrk(s, end_simple_var)) ||
+ (vend = strchr(s, '\0')) ) {
+ strncpy(ret, s, vend-s);
+ ret[vend-s] = '\0';
+ }
break;
case EXP_BRACED_VAR:
s++; upto = '}';
+ if( (vend = strchr(s, upto)) ||
+ (vend = strchr(s, '\0')) ) {
+ strncpy(ret, s, vend-s);
+ ret[vend-s] = '\0';
+ }
break;
case EXP_EXPR:
- s++; upto = ')';
+ s++;
+ strcpy(str_end, ")@");
+ str_end[2] = '\0';
+ if( (vend = strstr(s, str_end)) ||
+ (vend = strchr(s, '\0')) ) {
+ strncpy(ret, s, vend-s);
+ ret[vend-s] = '\0';
+ }
break;
- case EXP_JS:
- s++; upto = '>';
+ case EXP_JS:
+ s++;
+ strcpy(str_end, ">@");
+ str_end[2] = '\0';
+ if( (vend = strstr(s, str_end)) ||
+ (vend = strchr(s, '\0')) ) {
+ strncpy(ret, s, vend-s);
+ ret[vend-s] = '\0';
+ }
break;
}
- s++;
-
- if( (vend = strchr(s, upto)) ||
- (vend = strchr(s, '\0')) ) {
- strncpy(ret, s, vend-s);
- ret[vend-s] = '\0';
- }
if(etype == EXP_SIMPLE_VAR ||
etype == EXP_BRACED_VAR) {
g_free(b);
}
}
- if(upto == ' ') s = vend;
- else s = vend+1;
+ if(etype == EXP_SIMPLE_VAR)
+ s = vend;
+ else
+ s = vend+1;
}
- else if(!recurse &&
+ else if(recurse != 1 &&
etype == EXP_EXPR) {
mycmd = expand(ret, 1);
g_spawn_command_line_sync(mycmd, &cmd_stdout, NULL, NULL, &err);
g_string_append(buf, cmd_stdout);
g_free(cmd_stdout);
}
- s = vend+1;
+ s = vend+2;
}
- else if(!recurse &&
+ else if(recurse != 2 &&
etype == EXP_JS) {
- mycmd = expand(ret, 1);
+ mycmd = expand(ret, 2);
eval_js(uzbl.gui.web_view, mycmd, js_ret);
g_free(mycmd);
if(js_ret->str) {
g_string_append(buf, js_ret->str);
- g_string_free(js_ret, 1);
+ g_string_free(js_ret, TRUE);
+ js_ret = g_string_new("");
}
+ s = vend+2;
}
break;
break;
}
}
+ g_string_free(js_ret, TRUE);
return g_string_free(buf, FALSE);
}
/* scroll a bar in a given direction */
static void
scroll (GtkAdjustment* bar, GArray *argv) {
- gdouble amount;
gchar *end;
+ gdouble max_value;
+
+ gdouble page_size = gtk_adjustment_get_page_size(bar);
+ gdouble value = gtk_adjustment_get_value(bar);
+ gdouble amount = g_ascii_strtod(g_array_index(argv, gchar*, 0), &end);
- amount = g_ascii_strtod(g_array_index(argv, gchar*, 0), &end);
- if (*end == '%') amount = gtk_adjustment_get_page_size(bar) * amount * 0.01;
- gtk_adjustment_set_value (bar, gtk_adjustment_get_value(bar)+amount);
+ if (*end == '%')
+ value += page_size * amount * 0.01;
+ else
+ value += amount;
+
+ max_value = gtk_adjustment_get_upper(bar) - page_size;
+
+ if (value > max_value)
+ value = max_value; /* don't scroll past the end of the page */
+
+ gtk_adjustment_set_value (bar, value);
}
static void
parse_cmd_line(default_config[i].command, NULL);
}
- if (g_strcmp0(s->config_file, "-") == 0) {
- s->config_file = NULL;
- create_stdin();
- }
-
if (!s->config_file) {
s->config_file = find_xdg_file (0, "/uzbl/config");
}
/* WebInspector */
set_up_inspector();
-
+
+ create_stdin();
+
if (verbose_override > uzbl.state.verbose)
uzbl.state.verbose = verbose_override;