Add action: sh, add var: shell_cmd
[uzbl-mobile] / uzbl.h
1 /*
2  * See LICENSE for license details
3  *
4  * Changelog:
5  * ---------
6  *
7  * (c) 2009 by Robert Manea
8  *     - introduced struct concept
9  *     - statusbar template
10  *
11  */
12
13 #define STATUS_DEFAULT "<span background=\"darkblue\" foreground=\"white\"> MODE </span> <span background=\"red\" foreground=\"white\">KEYCMD</span> (LOAD_PROGRESS%)  <b>TITLE</b>  - Uzbl browser"
14
15 enum {
16   /* statusbar symbols */
17   SYM_TITLE, SYM_URI, SYM_NAME,
18   SYM_LOADPRGS, SYM_LOADPRGSBAR,
19   SYM_KEYCMD, SYM_MODE, SYM_MSG,
20   /* useragent symbols */
21   SYM_WK_MAJ, SYM_WK_MIN, SYM_WK_MIC,
22   SYM_SYSNAME, SYM_NODENAME,
23   SYM_KERNREL, SYM_KERNVER,
24   SYM_ARCHSYS, SYM_ARCHUZBL,
25   SYM_DOMAINNAME, SYM_COMMIT
26 };
27
28 const struct {
29     gchar *symbol_name;
30     guint symbol_token;
31 } symbols[] = {
32     {"NAME",                 SYM_NAME},
33     {"URI",                  SYM_URI},
34     {"TITLE",                SYM_TITLE},
35     {"KEYCMD",               SYM_KEYCMD},
36     {"MODE",                 SYM_MODE},
37     {"MSG",                  SYM_MSG},
38     {"LOAD_PROGRESS",        SYM_LOADPRGS},
39     {"LOAD_PROGRESSBAR",     SYM_LOADPRGSBAR},
40
41     {"WEBKIT_MAJOR",         SYM_WK_MAJ},
42     {"WEBKIT_MINOR",         SYM_WK_MIN},
43     {"WEBKIT_MICRO",         SYM_WK_MIC},
44     {"SYSNAME",              SYM_SYSNAME},
45     {"NODENAME",             SYM_NODENAME},
46     {"KERNREL",              SYM_KERNREL},
47     {"KERNVER",              SYM_KERNVER},
48     {"ARCH_SYSTEM",          SYM_ARCHSYS},
49     {"ARCH_UZBL",            SYM_ARCHUZBL},
50     {"DOMAINNAME",           SYM_DOMAINNAME},
51     {"COMMIT",               SYM_COMMIT},
52     {NULL,                   0}
53 }, *symp = symbols;
54
55 /* status bar elements */
56 typedef struct {
57     gint           load_progress;
58     gchar          *msg;
59 } StatusBar;
60
61
62 /* gui elements */
63 typedef struct {
64     GtkWidget*     main_window;
65     GtkWidget*     scrolled_win;
66     GtkWidget*     vbox;
67     GtkWidget*     mainbar;
68     GtkWidget*     mainbar_label;
69     GtkScrollbar*  scbar_v;   // Horizontal and Vertical Scrollbar
70     GtkScrollbar*  scbar_h;   // (These are still hidden)
71     GtkAdjustment* bar_v; // Information about document length
72     GtkAdjustment* bar_h; // and scrolling position
73     WebKitWebView* web_view;
74     gchar*         main_title;
75
76     StatusBar sbar;
77 } GUI;
78
79
80 /* external communication*/
81 enum { FIFO, SOCKET};
82 typedef struct {
83     gchar          *fifo_path;
84     gchar          *socket_path;
85     /* stores (key)"variable name" -> (value)"pointer to this var*/
86     GHashTable     *proto_var;
87     /* command parsing regexes */
88     GRegex         *set_regex;
89     GRegex         *act_regex;
90     GRegex         *keycmd_regex;
91     GRegex         *get_regex;
92     GRegex         *bind_regex;
93 } Communication;
94
95
96 /* internal state */
97 typedef struct {
98     gchar    *uri;
99     gchar    *config_file;
100     char    *instance_name;
101     gchar    config_file_path[500];
102     gchar    selected_url[500];
103     char     executable_path[500];
104     GString* keycmd;
105     gchar    searchtx[500];
106     struct utsname unameinfo; /* system info */
107 } State;
108
109
110 /* networking */
111 typedef struct {
112     SoupSession *soup_session;
113     SoupLogger *soup_logger;
114     char *proxy_url;
115     char *useragent;
116     gint max_conns;
117     gint max_conns_host;
118 } Network;
119
120
121 /* behaviour */
122 typedef struct {
123     gchar*   load_finish_handler;
124     gchar*   status_format;
125     gchar*   status_background;
126     gchar*   history_handler;
127     gchar*   fifo_dir;
128     gchar*   socket_dir;
129     gchar*   download_handler;
130     gchar*   cookie_handler;
131     gboolean always_insert_mode;
132     gboolean show_status;
133     gboolean insert_mode;
134     gboolean status_top;
135     gboolean reset_command_mode;
136     gchar*   modkey;
137     guint    modmask;
138     guint    http_debug;
139     guint    default_font_size;
140     guint    minimum_font_size;
141     gchar*   shell_cmd;
142
143     /* command list: name -> Command  */
144     GHashTable* commands;
145 } Behaviour;
146
147
148 /* main uzbl data structure */
149 typedef struct {
150     GUI           gui;
151     State         state;
152     Network       net;
153     Behaviour     behave;
154     Communication comm;
155
156     Window        xwin;
157     GScanner      *scan;
158
159     /* group bindings: key -> action */
160     GHashTable* bindings;
161 } Uzbl;
162
163
164 typedef struct {
165     char* name;
166     char* param;
167 } Action;
168
169 typedef void sigfunc(int);
170
171 /* Functions */
172 static void
173 setup_scanner();
174
175 char *
176 itos(int val);
177
178 static void
179 clean_up(void);
180
181 static void
182 catch_sigterm(int s);
183
184 static sigfunc *
185 setup_signal(int signe, sigfunc *shandler);
186
187 static gboolean
188 new_window_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data);
189
190 WebKitWebView*
191 create_web_view_cb (WebKitWebView  *web_view, WebKitWebFrame *frame, gpointer user_data);
192
193 static gboolean
194 download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data);
195
196 static void
197 toggle_status_cb (WebKitWebView* page, const char *param);
198
199 static void
200 link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpointer data);
201
202 static void
203 title_change_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, const gchar* title, gpointer data);
204
205 static void
206 progress_change_cb (WebKitWebView* page, gint progress, gpointer data);
207
208 static void
209 load_commit_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
210
211 static void
212 load_finish_cb (WebKitWebView* page, WebKitWebFrame* frame, gpointer data);
213
214 static void
215 destroy_cb (GtkWidget* widget, gpointer data);
216
217 static void
218 log_history_cb ();
219
220 static void
221 commands_hash(void);
222
223 void
224 free_action(gpointer act);
225
226 Action*
227 new_action(const gchar *name, const gchar *param);
228
229 static bool
230 file_exists (const char * filename);
231
232 void
233 set_insert_mode(WebKitWebView *page, const gchar *param);
234
235 static void
236 load_uri (WebKitWebView * web_view, const gchar *param);
237
238 static void
239 new_window_load_uri (const gchar * uri);
240
241 static void
242 close_uzbl (WebKitWebView *page, const char *param);
243
244 static gboolean
245 run_command(const char *command, const char *args, const gboolean sync, char **stdout);
246
247 static void
248 spawn(WebKitWebView *web_view, const char *param);
249
250 static void
251 spawn_sh(WebKitWebView *web_view, const char *param);
252
253 static void
254 parse_command(const char *cmd, const char *param);
255
256 static void
257 runcmd(WebKitWebView *page, const char *param);
258
259 static void
260 parse_cmd_line(const char *ctl_line);
261
262 static gchar*
263 build_stream_name(int type, const gchar *dir);
264
265 static gboolean
266 var_is(const char *x, const char *y);
267
268 static gchar*
269 set_useragent(gchar *val);
270
271 static gboolean
272 control_fifo(GIOChannel *gio, GIOCondition condition);
273
274 static gchar*
275 init_fifo(gchar *dir);
276
277 static gboolean
278 control_stdin(GIOChannel *gio, GIOCondition condition);
279
280 static void
281 create_stdin();
282
283 static gchar*
284 init_socket(gchar *dir);
285
286 static gboolean
287 control_socket(GIOChannel *chan);
288
289 static void
290 update_title (void);
291
292 static gboolean
293 key_press_cb (WebKitWebView* page, GdkEventKey* event);
294
295 static void
296 run_keycmd(const gboolean key_ret);
297
298 static GtkWidget*
299 create_browser ();
300
301 static GtkWidget*
302 create_mainbar ();
303
304 static
305 GtkWidget* create_window ();
306
307 static void
308 add_binding (const gchar *key, const gchar *act);
309
310 static void
311 settings_init ();
312
313 static void
314 search_text (WebKitWebView *page, const char *param);
315
316 static void
317 run_js (WebKitWebView * web_view, const gchar *param);
318
319 static void handle_cookies (SoupSession *session,
320                                                         SoupMessage *msg,
321                                                         gpointer     user_data);
322 static void
323 save_cookies (SoupMessage *msg,
324                           gpointer     user_data);
325 /* vi: set et ts=4: */