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