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