Merge branch 'master' of ssh://opensource.conformal.com/git/xxxterm
[xxxterm.git] / xxxterm.h
blobd04bc796b3d061ca162707b35b3d67a9d4ecc312
1 /*
2 * Copyright (c) 2011 Conformal Systems LLC <info@conformal.com>
3 * Copyright (c) 2011 Marco Peereboom <marco@peereboom.us>
4 * Copyright (c) 2010, 2011, 2012 Edd Barrett <vext01@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <ctype.h>
20 #include <dlfcn.h>
21 #include <err.h>
22 #include <errno.h>
23 #include <libgen.h>
24 #include <pwd.h>
25 #include <regex.h>
26 #include <signal.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <dirent.h>
32 #include <fcntl.h>
33 #include <inttypes.h>
35 #include <sys/types.h>
36 #if defined(__linux__)
37 #include "linux/util.h"
38 #include "linux/tree.h"
39 #include <bsd/stdlib.h>
40 # if !defined(sane_libbsd_headers)
41 void arc4random_buf(void *, size_t);
42 u_int32_t arc4random_uniform(u_int32_t);
43 # endif
44 #elif defined(__FreeBSD__)
45 #include <libutil.h>
46 #include "freebsd/util.h"
47 #include <sys/tree.h>
48 #elif defined(__OpenBSD__)
49 #include <util.h>
50 #include <sys/tree.h>
51 #else
52 void arc4random_buf(void *, size_t);
53 uint32_t arc4random_uniform(uint32_t);
54 #include "tree.h"
55 #endif
56 #include <sys/queue.h>
57 #include <sys/socket.h>
58 #include <sys/stat.h>
59 #include <sys/time.h>
60 #include <sys/un.h>
62 #include <gtk/gtk.h>
63 #include <gdk/gdkkeysyms.h>
65 #if GTK_CHECK_VERSION(3,0,0)
66 /* we still use GDK_* instead of GDK_KEY_* */
67 #include <gdk/gdkkeysyms-compat.h>
68 #endif
70 #include <webkit/webkit.h>
71 #include <libsoup/soup.h>
72 #include <JavaScriptCore/JavaScript.h>
73 #include <gnutls/gnutls.h>
74 #include <gnutls/x509.h>
76 /* comment if you don't want to use threads */
77 #define USE_THREADS
79 #ifdef USE_THREADS
80 #include <gcrypt.h>
81 #include <pthread.h>
82 #endif
84 /* set if you don't want to use signals */
85 #ifndef XT_SIGNALS_DISABLE
86 #include <sys/wait.h>
87 #endif
89 /* set if you don't want to use resource limits */
90 #ifndef XT_RESOURCE_LIMITS_DISABLE
91 #include <sys/resource.h>
92 #endif
94 #include "javascript.h"
96 javascript.h borrowed from vimprobable2 under the following license:
98 Copyright (c) 2009 Leon Winter
99 Copyright (c) 2009-2011 Hannes Schueller
100 Copyright (c) 2009-2010 Matto Fransen
101 Copyright (c) 2010-2011 Hans-Peter Deifel
102 Copyright (c) 2010-2011 Thomas Adam
103 Copyright (c) 2011 Albert Kim
104 Copyright (c) 2011 Daniel Carl
106 Permission is hereby granted, free of charge, to any person obtaining a copy
107 of this software and associated documentation files (the "Software"), to deal
108 in the Software without restriction, including without limitation the rights
109 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
110 copies of the Software, and to permit persons to whom the Software is
111 furnished to do so, subject to the following conditions:
113 The above copyright notice and this permission notice shall be included in
114 all copies or substantial portions of the Software.
116 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
117 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
118 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
119 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
120 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
121 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
122 THE SOFTWARE.
125 /*#define XT_DEBUG*/
126 #ifdef XT_DEBUG
127 #define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0)
128 #define DNPRINTF(n,x...) do { if (swm_debug & n) fprintf(stderr, x); } while (0)
129 #define XT_D_MOVE 0x0001
130 #define XT_D_KEY 0x0002
131 #define XT_D_TAB 0x0004
132 #define XT_D_URL 0x0008
133 #define XT_D_CMD 0x0010
134 #define XT_D_NAV 0x0020
135 #define XT_D_DOWNLOAD 0x0040
136 #define XT_D_CONFIG 0x0080
137 #define XT_D_JS 0x0100
138 #define XT_D_FAVORITE 0x0200
139 #define XT_D_PRINTING 0x0400
140 #define XT_D_COOKIE 0x0800
141 #define XT_D_KEYBINDING 0x1000
142 #define XT_D_CLIP 0x2000
143 #define XT_D_BUFFERCMD 0x4000
144 #define XT_D_INSPECTOR 0x8000
145 #define XT_D_VISITED 0x10000
146 #define XT_D_HISTORY 0x20000
147 extern uint32_t swm_debug;
148 #else
149 #define DPRINTF(x...)
150 #define DNPRINTF(n,x...)
151 #endif
153 #define LENGTH(x) (sizeof x / sizeof x[0])
154 #define CLEAN(mask) (mask & ~(GDK_MOD2_MASK) & \
155 ~(GDK_BUTTON1_MASK) & \
156 ~(GDK_BUTTON2_MASK) & \
157 ~(GDK_BUTTON3_MASK) & \
158 ~(GDK_BUTTON4_MASK) & \
159 ~(GDK_BUTTON5_MASK))
161 #define XT_MARKS "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"
162 #define XT_NOMARKS (sizeof(XT_MARKS) - 1)
163 #define XT_QMARKS "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
164 #define XT_NOQMARKS (sizeof(XT_QMARKS) - 1)
166 /* Path Separator */
167 #ifndef PS
168 #define PS "/"
169 #endif
171 struct tab {
172 TAILQ_ENTRY(tab) entry;
173 GtkWidget *vbox;
174 GtkWidget *tab_content;
175 struct {
176 GtkWidget *label;
177 GtkWidget *favicon;
178 GtkWidget *eventbox;
179 GtkWidget *box;
180 GtkWidget *sep;
181 } tab_elems;
182 GtkWidget *label;
183 GtkWidget *spinner;
184 GtkWidget *uri_entry;
185 GtkStyle *default_style;
186 GtkWidget *search_entry;
187 GtkWidget *toolbar;
188 GtkWidget *browser_win;
189 GtkWidget *statusbar_box;
190 struct {
191 GtkWidget *statusbar;
192 GtkWidget *buffercmd;
193 GtkWidget *zoom;
194 GtkWidget *position;
195 } sbe;
196 GtkWidget *cmd;
197 GtkWidget *buffers;
198 GtkWidget *oops;
199 GtkWidget *backward;
200 GtkWidget *forward;
201 GtkWidget *stop;
202 GtkWidget *gohome;
203 GtkWidget *js_toggle;
204 GtkEntryCompletion *completion;
205 guint tab_id;
206 WebKitWebView *wv;
208 WebKitWebHistoryItem *item;
209 WebKitWebBackForwardList *bfl;
211 /* favicon */
212 WebKitNetworkRequest *icon_request;
213 WebKitDownload *icon_download;
214 gchar *icon_dest_uri;
216 /* adjustments for browser */
217 GtkScrollbar *sb_h;
218 GtkScrollbar *sb_v;
219 GtkAdjustment *adjust_h;
220 GtkAdjustment *adjust_v;
222 /* flags */
223 int mode;
224 #define XT_MODE_COMMAND (0)
225 #define XT_MODE_INSERT (1)
226 #define XT_MODE_HINT (2)
227 #define XT_MODE_PASSTHROUGH (3)
228 int (*mode_cb)(struct tab *, GdkEventKey *, gpointer);
229 gpointer mode_cb_data;
230 int focus_wv;
231 int ctrl_click;
232 gchar *status;
233 int xtp_meaning; /* identifies dls/favorites */
234 gchar *tmp_uri;
235 int popup; /* 1 if cmd_entry has popup visible */
236 #ifdef USE_THREADS
237 /* https thread stuff */
238 GThread *thread;
239 #endif
240 /* hints */
241 int script_init;
242 int new_tab;
244 /* custom stylesheet */
245 int styled;
246 char *stylesheet;
248 /* search */
249 char *search_text;
250 int search_forward;
251 guint search_id;
253 /* settings */
254 WebKitWebSettings *settings;
255 gchar *user_agent;
256 gboolean load_images;
258 /* marks */
259 double mark[XT_NOMARKS];
261 /* inspector */
262 WebKitWebInspector *inspector;
263 GtkWidget *inspector_window;
264 GtkWidget *inspector_view;
266 TAILQ_HEAD(tab_list, tab);
268 struct karg {
269 int i;
270 char *s;
271 int precount;
274 struct download {
275 RB_ENTRY(download) entry;
276 int id;
277 WebKitDownload *download;
278 struct tab *tab;
280 RB_HEAD(download_list, download);
281 RB_PROTOTYPE(download_list, download, entry, download_rb_cmp);
283 struct history {
284 RB_ENTRY(history) entry;
285 gchar *uri;
286 gchar *title;
287 time_t time; /* When the item was added. */
289 RB_HEAD(history_list, history);
290 RB_PROTOTYPE(history_list, history, entry, history_rb_cmp);
292 #define XT_STS_FLAGS_INCLUDE_SUBDOMAINS (1)
293 #define XT_STS_FLAGS_EXPAND (2)
294 #define XT_STS_FILE ("strict-transport")
296 struct strict_transport {
297 RB_ENTRY(strict_transport) entry;
298 gchar *host;
299 time_t timeout;
300 int flags;
302 RB_HEAD(strict_transport_tree, strict_transport);
303 RB_PROTOTYPE(strict_transport_tree, strict_transport, entry, strict_transport_rb_cmp);
305 /* utility */
306 #define XT_NAME ("XXXTerm")
307 #define XT_CB_HANDLED (TRUE)
308 #define XT_CB_PASSTHROUGH (FALSE)
309 #define XT_FAVS_FILE ("favorites")
310 #define XT_SOD_FILE ("startofday")
312 int run_script(struct tab *, char *);
313 void xt_icon_from_file(struct tab *, char *);
314 GtkWidget *create_window(const gchar *);
315 void show_oops(struct tab *, const char *, ...);
316 gchar *get_html_page(gchar *, gchar *, gchar *, bool);
317 const gchar *get_uri(struct tab *);
318 const gchar *get_title(struct tab *, bool);
319 void load_uri(struct tab *t, gchar *uri);
320 gboolean match_uri(const gchar *uri, const gchar *key);
321 int valid_url_type(char *);
323 void load_webkit_string(struct tab *, const char *, gchar *);
324 void button_set_stockid(GtkWidget *, char *);
326 /* cookies */
327 int remove_cookie(int);
328 int remove_cookie_domain(int);
329 int remove_cookie_all(void);
330 void print_cookie(char *msg, SoupCookie *);
331 void setup_cookies(void);
333 /* history */
334 int insert_history_item(const gchar *uri, const gchar *title, time_t time);
335 int save_global_history_to_disk(struct tab *t);
336 int restore_global_history(void);
337 char *color_visited_helper(void);
338 int color_visited(struct tab *t, char *visited);
340 /* completion */
341 void completion_add(struct tab *);
342 void completion_add_uri(const gchar *uri);
344 /* external editor */
345 #define XT_EE_BUFSZ (64 * 1024)
346 int edit_src(struct tab *t, struct karg *args);
347 int edit_element(struct tab *t, struct karg *a);
349 /* proxy */
350 #define XT_PRXY_SHOW (1<<0)
351 #define XT_PRXY_TOGGLE (1<<1)
353 /* inspector */
354 #define XT_INS_SHOW (1<<0)
355 #define XT_INS_HIDE (1<<1)
356 #define XT_INS_CLOSE (1<<2)
358 WebKitWebView* inspector_inspect_web_view_cb(WebKitWebInspector *,
359 WebKitWebView*, struct tab *);
360 void setup_inspector(struct tab *);
361 int inspector_cmd(struct tab *, struct karg *);
363 /* tld public suffix */
364 void tld_tree_init();
365 char *tld_get_suffix(const char *);
367 /* about */
368 #define XT_XTP_STR "xxxt://"
369 #define XT_URI_ABOUT ("about:")
370 #define XT_URI_ABOUT_LEN (strlen(XT_URI_ABOUT))
371 #define XT_URI_ABOUT_ABOUT ("about")
372 #define XT_URI_ABOUT_ALLTHETHINGS ("allthethings")
373 #define XT_URI_ABOUT_BLANK ("blank")
374 #define XT_URI_ABOUT_CERTS ("certs")
375 #define XT_URI_ABOUT_COOKIEWL ("cookiewl")
376 #define XT_URI_ABOUT_COOKIEJAR ("cookiejar")
377 #define XT_URI_ABOUT_DOWNLOADS ("downloads")
378 #define XT_URI_ABOUT_FAVORITES ("favorites")
379 #define XT_URI_ABOUT_HELP ("help")
380 #define XT_URI_ABOUT_HISTORY ("history")
381 #define XT_URI_ABOUT_JSWL ("jswl")
382 #define XT_URI_ABOUT_PLUGINWL ("plwl")
383 #define XT_URI_ABOUT_SET ("set")
384 #define XT_URI_ABOUT_STATS ("stats")
385 #define XT_URI_ABOUT_MARCO ("marco")
386 #define XT_URI_ABOUT_STARTPAGE ("startpage")
387 #define XT_URI_ABOUT_WEBKIT ("webkit")
389 struct about_type {
390 char *name;
391 int (*func)(struct tab *, struct karg *);
394 struct sp {
395 char *line;
396 TAILQ_ENTRY(sp) entry;
398 TAILQ_HEAD(sp_list, sp);
400 int blank(struct tab *, struct karg *);
401 int help(struct tab *, struct karg *);
402 int about(struct tab *, struct karg *);
403 int stats(struct tab *, struct karg *);
404 void show_certs(struct tab *, gnutls_x509_crt_t *,
405 size_t, char *);
406 int ca_cmd(struct tab *, struct karg *);
407 int cookie_show_wl(struct tab *, struct karg *);
408 int xtp_page_cl(struct tab *, struct karg *);
409 int xtp_page_dl(struct tab *, struct karg *);
410 int xtp_page_fl(struct tab *, struct karg *);
411 int xtp_page_hl(struct tab *, struct karg *);
412 int parse_xtp_url(struct tab *, const char *);
413 int add_favorite(struct tab *, struct karg *);
414 void update_favorite_tabs(struct tab *);
415 void update_history_tabs(struct tab *);
416 void update_download_tabs(struct tab *);
417 void xtp_generate_keys(void);
418 size_t about_list_size(void);
419 int cookie_cmd(struct tab *, struct karg *);
420 int js_cmd(struct tab *, struct karg *);
421 int pl_cmd(struct tab *, struct karg *);
422 void startpage_add(const char *, ...);
425 * xtp tab meanings
426 * identifies which tabs have xtp pages in (corresponding to about_list indices)
428 #define XT_XTP_TAB_MEANING_NORMAL (-1) /* normal url */
429 #define XT_XTP_TAB_MEANING_BL (1) /* about:blank in this tab */
430 #define XT_XTP_TAB_MEANING_CL (4) /* cookie manager in this tab */
431 #define XT_XTP_TAB_MEANING_DL (5) /* download manager in this tab */
432 #define XT_XTP_TAB_MEANING_FL (6) /* favorite manager in this tab */
433 #define XT_XTP_TAB_MEANING_HL (8) /* history manager in this tab */
435 /* whitelists */
436 #define XT_WL_TOGGLE (1<<0)
437 #define XT_WL_ENABLE (1<<1)
438 #define XT_WL_DISABLE (1<<2)
439 #define XT_WL_FQDN (1<<3) /* default */
440 #define XT_WL_TOPLEVEL (1<<4)
441 #define XT_WL_PERSISTENT (1<<5)
442 #define XT_WL_SESSION (1<<6)
443 #define XT_WL_RELOAD (1<<7)
444 #define XT_SHOW (1<<8)
445 #define XT_DELETE (1<<9)
446 #define XT_SAVE (1<<10)
447 #define XT_OPEN (1<<11)
449 #define XT_WL_INVALID (0)
450 #define XT_WL_JAVASCRIPT (1)
451 #define XT_WL_COOKIE (2)
452 #define XT_WL_PLUGIN (3)
454 struct domain {
455 RB_ENTRY(domain) entry;
456 gchar *d;
457 int handy; /* app use */
459 RB_HEAD(domain_list, domain);
460 RB_PROTOTYPE(domain_list, domain, entry, domain_rb_cmp);
462 int wl_show(struct tab *, struct karg *, char *,
463 struct domain_list *);
465 /* uri aliases */
466 struct alias {
467 char *a_name;
468 char *a_uri;
469 TAILQ_ENTRY(alias) entry;
471 TAILQ_HEAD(alias_list, alias);
473 /* mime types */
474 struct mime_type {
475 char *mt_type;
476 char *mt_action;
477 int mt_default;
478 int mt_download;
479 TAILQ_ENTRY(mime_type) entry;
481 TAILQ_HEAD(mime_type_list, mime_type);
483 struct domain * wl_find(const gchar *, struct domain_list *);
484 int wl_save(struct tab *, struct karg *, int);
485 int toggle_cwl(struct tab *, struct karg *);
486 int toggle_js(struct tab *, struct karg *);
487 int toggle_pl(struct tab *, struct karg *);
489 /* input autofocus */
490 void input_autofocus(struct tab *);
491 void input_focus_blur(struct tab *, void *);
492 void *input_check_mode(struct tab *);
493 int command_mode(struct tab *, struct karg *);
495 /* OS specific */
496 int fork_exec(struct tab *, char *, const gchar *, char *, int);
498 /* settings */
499 #define XT_BM_NORMAL (0)
500 #define XT_BM_WHITELIST (1)
501 #define XT_BM_KIOSK (2)
503 #define XT_GM_CLASSIC (0)
504 #define XT_GM_MINIMAL (1)
506 #define XT_TABS_NORMAL (0)
507 #define XT_TABS_COMPACT (1)
509 #define XT_EM_HYBRID (0)
510 #define XT_EM_VI (1)
512 #define XT_DM_START (0)
513 #define XT_DM_ASK (1)
514 #define XT_DM_ADD (2)
516 #define XT_REFERER_ALWAYS (0)
517 #define XT_REFERER_NEVER (1)
518 #define XT_REFERER_SAME_DOMAIN (2)
519 #define XT_REFERER_CUSTOM (3)
520 #define XT_REFERER_SAME_FQDN (4)
522 #define CTRL GDK_CONTROL_MASK
523 #define MOD1 GDK_MOD1_MASK
524 #define SHFT GDK_SHIFT_MASK
526 /* actions */
527 #define XT_STYLE_CURRENT_TAB (0)
528 #define XT_STYLE_GLOBAL (1)
530 #define XT_TAB_LAST (-4)
531 #define XT_TAB_FIRST (-3)
532 #define XT_TAB_PREV (-2)
533 #define XT_TAB_NEXT (-1)
534 #define XT_TAB_INVALID (0)
535 #define XT_TAB_NEW (1)
536 #define XT_TAB_DELETE (2)
537 #define XT_TAB_DELQUIT (3)
538 #define XT_TAB_OPEN (4)
539 #define XT_TAB_UNDO_CLOSE (5)
540 #define XT_TAB_SHOW (6)
541 #define XT_TAB_HIDE (7)
542 #define XT_TAB_NEXTSTYLE (8)
543 #define XT_TAB_LOAD_IMAGES (9)
545 #define XT_URL_SHOW (1)
546 #define XT_URL_HIDE (2)
548 struct key_binding {
549 char *cmd;
550 guint mask;
551 guint use_in_entry;
552 guint key;
553 TAILQ_ENTRY(key_binding) entry; /* in bss so no need to init */
555 TAILQ_HEAD(keybinding_list, key_binding);
557 struct user_agent {
558 char *value;
559 TAILQ_ENTRY(user_agent) entry;
561 TAILQ_HEAD(user_agent_list, user_agent);
563 struct settings {
564 char *name;
565 int type;
566 #define XT_S_INVALID (0)
567 #define XT_S_INT (1)
568 #define XT_S_STR (2)
569 #define XT_S_FLOAT (3)
570 uint32_t flags;
571 #define XT_SF_RESTART (1<<0)
572 #define XT_SF_RUNTIME (1<<1)
573 int *ival;
574 char **sval;
575 struct special *s;
576 gfloat *fval;
577 int (*activate)(char *);
580 int set(struct tab *, struct karg *);
581 size_t get_settings_size(void);
582 int settings_add(char *, char *);
583 void setup_proxy(char *);
584 int set_browser_mode(struct settings *, char *);
585 int set_encoding(struct tab *, struct karg *);
586 int set_gui_mode(struct settings *, char *);
587 int set_cookie_policy(struct settings *, char *);
588 int set_ssl_ca_file(char *);
589 char *get_browser_mode(struct settings *);
590 char *get_gui_mode(struct settings *);
591 char *get_cookie_policy(struct settings *);
592 void init_keybindings(void);
593 void config_parse(char *, int);
594 char *get_setting_name(int);
595 void statusbar_set_visibility(void);
596 int tabaction(struct tab *, struct karg *);
597 int urlaction(struct tab *, struct karg *);
598 int userstyle(struct tab *, struct karg *);
599 struct tab *get_current_tab(void);
600 int resizetab(struct tab *, struct karg *);
602 #define XT_DL_START (0)
603 #define XT_DL_RESTART (1)
604 int download_start(struct tab *, struct download *, int flag);
606 extern int tabless;
607 extern int enable_socket;
608 extern int single_instance;
609 extern int fancy_bar;
610 extern int browser_mode;
611 extern int enable_localstorage;
612 extern char *statusbar_elems;
614 extern int show_tabs;
615 extern int tab_style;
616 extern int show_url;
617 extern int show_statusbar;
618 extern int ctrl_click_focus;
619 extern int cookies_enabled;
620 extern int read_only_cookies;
621 extern int enable_scripts;
622 extern int enable_plugins;
623 extern gfloat default_zoom_level;
624 extern char default_script[PATH_MAX];
625 extern int window_height;
626 extern int window_width;
627 extern int window_maximize;
628 extern int icon_size;
629 extern int refresh_interval;
630 extern int enable_plugin_whitelist;
631 extern int enable_cookie_whitelist;
632 extern int enable_js_whitelist;
633 extern int session_timeout;
634 extern int cookie_policy;
635 extern char *ssl_ca_file;
636 extern char *resource_dir;
637 extern gboolean ssl_strict_certs;
638 extern gboolean enable_strict_transport;
639 extern int append_next;
640 extern char *home;
641 extern char *search_string;
642 extern char *http_proxy;
643 extern char *external_editor;
644 extern char download_dir[PATH_MAX];
645 extern int download_mode;
646 extern char runtime_settings[PATH_MAX];
647 extern int allow_volatile_cookies;
648 extern int color_visited_uris;
649 extern int save_global_history;
650 extern struct user_agent *user_agent;
651 extern int save_rejected_cookies;
652 extern int session_autosave;
653 extern int guess_search;
654 extern int dns_prefetch;
655 extern gint max_connections;
656 extern gint max_host_connections;
657 extern gint enable_spell_checking;
658 extern char *spell_check_languages;
659 extern int xterm_workaround;
660 extern char *url_regex;
661 extern int history_autosave;
662 extern char search_file[PATH_MAX];
663 extern char command_file[PATH_MAX];
664 extern char *encoding;
665 extern int autofocus_onload;
666 extern int enable_js_autorun;
667 extern char *cmd_font_name;
668 extern char *oops_font_name;
669 extern char *statusbar_font_name;
670 extern char *tabbar_font_name;
671 extern int edit_mode;
672 extern int userstyle_global;
673 extern int auto_load_images;
674 extern int enable_autoscroll;
675 extern int enable_favicon_entry;
676 extern int enable_favicon_tabs;
677 extern int referer_mode;
678 extern char *referer_custom;
680 /* globals */
681 extern char *version;
682 extern char *icons[];
683 extern char rc_fname[PATH_MAX];
684 extern char work_dir[PATH_MAX];
685 extern char temp_dir[PATH_MAX];
686 extern struct passwd *pwd;
687 extern SoupCookieJar *s_cookiejar;
688 extern SoupCookieJar *p_cookiejar;
689 extern SoupSession *session;
690 extern GtkNotebook *notebook;
691 extern GtkListStore *completion_model;
692 extern uint64_t blocked_cookies;
694 extern void (*_soup_cookie_jar_add_cookie)(SoupCookieJar *, SoupCookie *);
696 extern struct history_list hl;
697 extern int hl_purge_count;
698 extern struct download_list downloads;
699 extern struct tab_list tabs;
700 extern struct about_type about_list[];
701 extern struct domain_list c_wl;
702 extern struct domain_list js_wl;
703 extern struct domain_list pl_wl;
704 extern struct strict_transport_tree st_tree;
705 extern struct alias_list aliases;
706 extern struct mime_type_list mtl;
707 extern struct keybinding_list kbl;
708 extern struct sp_list spl;
709 extern struct user_agent_list ua_list;
710 extern int user_agent_count;
712 extern PangoFontDescription *cmd_font;
713 extern PangoFontDescription *oops_font;
714 extern PangoFontDescription *statusbar_font;
715 extern PangoFontDescription *tabbar_font;