Merge commit 'dequis/experimental' into experimental
[uzbl-mobile] / uzbl.c
diff --git a/uzbl.c b/uzbl.c
index bb98360..c0cd77f 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -208,14 +208,17 @@ get_exp_type(gchar *s) {
 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;
@@ -233,28 +236,45 @@ expand(char *s, gboolean recurse) {
 
             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) {
@@ -267,10 +287,12 @@ expand(char *s, gboolean recurse) {
                             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);
@@ -284,18 +306,20 @@ expand(char *s, gboolean recurse) {
                         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;
 
@@ -305,6 +329,7 @@ expand(char *s, gboolean recurse) {
                 break;
         }
     }
+    g_string_free(js_ret, TRUE);
     return g_string_free(buf, FALSE);
 }
 
@@ -517,12 +542,24 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
 /* 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
@@ -2455,11 +2492,6 @@ settings_init () {
         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");
     }
@@ -2745,7 +2777,9 @@ main (int argc, char* argv[]) {
 
     /* WebInspector */
     set_up_inspector();
-    
+
+    create_stdin();
+
     if (verbose_override > uzbl.state.verbose)
         uzbl.state.verbose = verbose_override;