Escape shell commands properly.
[uzbl-mobile] / uzbl.h
diff --git a/uzbl.h b/uzbl.h
index a97f24e..506f1d3 100644 (file)
--- a/uzbl.h
+++ b/uzbl.h
@@ -1,4 +1,5 @@
-/* 
+/* -*- c-basic-offset: 4; -*- 
+
  * See LICENSE for license details
  *
  * Changelog:
@@ -7,15 +8,24 @@
  * (c) 2009 by Robert Manea
  *     - introduced struct concept
  *     - statusbar template
- *     
+ *
  */
 
 #define STATUS_DEFAULT "<span background=\"darkblue\" foreground=\"white\"> MODE </span> <span background=\"red\" foreground=\"white\">KEYCMD</span> (LOAD_PROGRESS%)  <b>TITLE</b>  - Uzbl browser"
 
-/* statusbar symbols */
-enum { SYM_TITLE, SYM_URI, SYM_NAME, 
-       SYM_LOADPRGS, SYM_LOADPRGSBAR,
-       SYM_KEYCMD, SYM_MODE};
+enum {
+  /* statusbar symbols */
+  SYM_TITLE, SYM_URI, SYM_NAME,
+  SYM_LOADPRGS, SYM_LOADPRGSBAR,
+  SYM_KEYCMD, SYM_MODE, SYM_MSG,
+  /* useragent symbols */
+  SYM_WK_MAJ, SYM_WK_MIN, SYM_WK_MIC,
+  SYM_SYSNAME, SYM_NODENAME,
+  SYM_KERNREL, SYM_KERNVER,
+  SYM_ARCHSYS, SYM_ARCHUZBL,
+  SYM_DOMAINNAME, SYM_COMMIT
+};
+
 const struct {
     gchar *symbol_name;
     guint symbol_token;
@@ -25,20 +35,36 @@ const struct {
     {"TITLE",                SYM_TITLE},
     {"KEYCMD",               SYM_KEYCMD},
     {"MODE",                 SYM_MODE},
+    {"MSG",                  SYM_MSG},
     {"LOAD_PROGRESS",        SYM_LOADPRGS},
     {"LOAD_PROGRESSBAR",     SYM_LOADPRGSBAR},
+
+    {"WEBKIT_MAJOR",         SYM_WK_MAJ},
+    {"WEBKIT_MINOR",         SYM_WK_MIN},
+    {"WEBKIT_MICRO",         SYM_WK_MIC},
+    {"SYSNAME",              SYM_SYSNAME},
+    {"NODENAME",             SYM_NODENAME},
+    {"KERNREL",              SYM_KERNREL},
+    {"KERNVER",              SYM_KERNVER},
+    {"ARCH_SYSTEM",          SYM_ARCHSYS},
+    {"ARCH_UZBL",            SYM_ARCHUZBL},
+    {"DOMAINNAME",           SYM_DOMAINNAME},
+    {"COMMIT",               SYM_COMMIT},
     {NULL,                   0}
 }, *symp = symbols;
 
 /* status bar elements */
 typedef struct {
     gint           load_progress;
+    gchar          *msg;
 } StatusBar;
 
 
 /* gui elements */
 typedef struct {
     GtkWidget*     main_window;
+    GtkWidget*     scrolled_win;
+    GtkWidget*     vbox;
     GtkWidget*     mainbar;
     GtkWidget*     mainbar_label;
     GtkScrollbar*  scbar_v;   // Horizontal and Vertical Scrollbar
@@ -55,8 +81,16 @@ typedef struct {
 /* external communication*/
 enum { FIFO, SOCKET};
 typedef struct {
-    char           fifo_path[64];
-    char           socket_path[108];
+    gchar          *fifo_path;
+    gchar          *socket_path;
+    /* stores (key)"variable name" -> (value)"pointer to this var*/
+    GHashTable     *proto_var;
+    /* command parsing regexes */
+    GRegex         *set_regex;
+    GRegex         *act_regex;
+    GRegex         *keycmd_regex;
+    GRegex         *get_regex;
+    GRegex         *bind_regex;
 } Communication;
 
 
@@ -64,13 +98,14 @@ typedef struct {
 typedef struct {
     gchar    *uri;
     gchar    *config_file;
-    gchar    *instance_name;
+    char    *instance_name;
     gchar    config_file_path[500];
     gchar    selected_url[500];
     char     executable_path[500];
     GString* keycmd;
     gchar    searchtx[500];
     struct utsname unameinfo; /* system info */
+    gboolean verbose;
 } State;
 
 
@@ -87,6 +122,7 @@ typedef struct {
 
 /* behaviour */
 typedef struct {
+    gchar*   load_finish_handler;
     gchar*   status_format;
     gchar*   status_background;
     gchar*   history_handler;
@@ -98,10 +134,13 @@ typedef struct {
     gboolean show_status;
     gboolean insert_mode;
     gboolean status_top;
-    gboolean never_reset_mode;
+    gboolean reset_command_mode;
     gchar*   modkey;
     guint    modmask;
     guint    http_debug;
+    guint    default_font_size;
+    guint    minimum_font_size;
+    gchar*   shell_cmd;
 
     /* command list: name -> Command  */
     GHashTable* commands;
@@ -131,6 +170,22 @@ typedef struct {
 
 typedef void sigfunc(int);
 
+/* XDG Stuff */
+
+typedef struct {
+    gchar* environmental;
+    gchar* default_value;
+} XDG_Var;
+
+XDG_Var XDG[] = 
+{
+    { "XDG_CONFIG_HOME", "~/.config" },
+    { "XDG_DATA_HOME",   "~/.local/share" },
+    { "XDG_CACHE_HOME",  "~/.cache" },
+    { "XDG_CONFIG_DIRS", "/etc/xdg" },
+    { "XDG_DATA_DIRS",   "/usr/local/share/:/usr/share/" },
+};
+
 /* Functions */
 static void
 setup_scanner();
@@ -138,6 +193,9 @@ setup_scanner();
 char *
 itos(int val);
 
+static char *
+str_replace (const char* search, const char* replace, const char* string);
+
 static void
 clean_up(void);
 
@@ -172,6 +230,9 @@ static void
 load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
 
 static void
+load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
+
+static void
 destroy_cb (GtkWidget* widget, gpointer data);
 
 static void
@@ -202,42 +263,59 @@ static void
 close_uzbl (WebKitWebView *page, const char *param);
 
 static gboolean
-run_command_async(const char *command, const char *args);
-
-static gboolean
-run_command_sync(const char *command, const char *args, char **stdout);
+run_command(const char *command, const char *args, const gboolean sync, char **stdout);
 
 static void
 spawn(WebKitWebView *web_view, const char *param);
 
 static void
-parse_command(const char *cmd, const char *param);
+spawn_sh(WebKitWebView *web_view, const char *param);
 
 static void
-parse_line(char *line);
+parse_command(const char *cmd, const char *param);
 
-void
-build_stream_name(int type);
+static void
+runcmd(WebKitWebView *page, const char *param);
 
 static void
+parse_cmd_line(const char *ctl_line);
+
+static gchar*
+build_stream_name(int type, const gchar *dir);
+
+static gboolean
+var_is(const char *x, const char *y);
+
+static gchar*
+set_useragent(gchar *val);
+
+static gboolean
 control_fifo(GIOChannel *gio, GIOCondition condition);
 
-static void
-create_fifo();
+static gchar*
+init_fifo(gchar *dir);
 
-static void
-create_socket();
+static gboolean
+control_stdin(GIOChannel *gio, GIOCondition condition);
 
 static void
+create_stdin();
+
+static gchar*
+init_socket(gchar *dir);
+
+static gboolean
 control_socket(GIOChannel *chan);
 
 static void
 update_title (void);
+
 static gboolean
 key_press_cb (WebKitWebView* page, GdkEventKey* event);
 
+static void
+run_keycmd(const gboolean key_ret);
+
 static GtkWidget*
 create_browser ();
 
@@ -250,6 +328,12 @@ GtkWidget* create_window ();
 static void
 add_binding (const gchar *key, const gchar *act);
 
+static gchar*
+get_xdg_var (XDG_Var xdg);
+
+static gchar*
+find_xdg_file (int xdg_type, char* filename);
+
 static void
 settings_init ();
 
@@ -259,9 +343,6 @@ search_text (WebKitWebView *page, const char *param);
 static void
 run_js (WebKitWebView * web_view, const gchar *param);
 
-static char *
-str_replace (const char* search, const char* replace, const char* string);
-
 static void handle_cookies (SoupSession *session,
                                                        SoupMessage *msg,
                                                        gpointer     user_data);