2
/* $Id: menu.c,v 1.281 2004/01/08 18:37:46 jonas Exp $ */
13
#include "bfu/inpfield.h"
14
#include "bfu/inphist.h"
16
#include "bfu/msgbox.h"
17
#include "config/options.h"
18
#include "config/urlhist.h"
19
#include "document/document.h"
20
#include "document/view.h"
21
#include "dialogs/info.h"
22
#include "dialogs/menu.h"
23
#include "dialogs/options.h"
24
#include "intl/gettext/libintl.h"
25
#include "lowlevel/select.h"
26
#include "mime/dialogs.h"
27
#include "osdep/osdep.h"
28
#include "osdep/newwin.h"
29
#include "protocol/uri.h"
30
#include "sched/connection.h"
31
#include "sched/download.h"
32
#include "sched/event.h"
33
#include "sched/history.h"
34
#include "sched/location.h"
35
#include "sched/session.h"
36
#include "sched/task.h"
37
#include "terminal/kbd.h"
38
#include "terminal/tab.h"
39
#include "terminal/terminal.h"
40
#include "util/memlist.h"
41
#include "util/memory.h"
42
#include "util/string.h"
43
#include "viewer/text/link.h"
44
#include "viewer/text/view.h"
47
/* Helper for url items in help menu. */
49
menu_url_shortcut(struct terminal *term, void *d, struct session *ses)
51
unsigned char *u = stracpy((unsigned char *) d);
59
save_url_as(struct session *ses)
61
input_field(ses->tab->term, NULL, 1,
62
N_("Save URL"), N_("Enter URL"),
63
N_("OK"), N_("Cancel"), ses, &goto_url_history,
64
MAX_STR_LEN, "", 0, 0, NULL,
65
(void (*)(void *, unsigned char *)) save_url,
70
really_exit_prog(struct session *ses)
72
register_bottom_half((void (*)(void *))destroy_terminal, ses->tab->term);
76
dont_exit_prog(struct session *ses)
82
query_exit(struct session *ses)
85
msg_box(ses->tab->term, NULL, 0,
86
N_("Exit ELinks"), AL_CENTER,
87
(ses->tab->term->next == ses->tab->term->prev && are_there_downloads())
88
? N_("Do you really want to exit ELinks "
89
"(and terminate all downloads)?")
90
: N_("Do you really want to exit ELinks?"),
92
N_("Yes"), (void (*)(void *)) really_exit_prog, B_ENTER,
93
N_("No"), (void (*)(void *)) dont_exit_prog, B_ESC);
97
exit_prog(struct session *ses, int query)
102
&& (query || (ses->tab->term->next == ses->tab->term->prev
103
&& are_there_downloads()))) {
108
really_exit_prog(ses);
113
go_historywards(struct terminal *term, struct location *target,
116
go_history(ses, target);
119
static struct menu_item no_hist_menu[] = {
120
INIT_MENU_ITEM(N_("No history"), NULL, ACT_NONE, NULL, NULL, NO_SELECT),
124
#define history_menu_model(name__, dir__) \
126
name__(struct terminal *term, void *ddd, struct session *ses) \
128
struct location *loc; \
129
struct menu_item *mi = NULL; \
131
if (!have_location(ses)) goto loop_done; \
133
for (loc = cur_loc(ses)->dir__; \
134
loc != (struct location *) &ses->history.history; \
135
loc = loc->dir__) { \
136
unsigned char *url; \
139
mi = new_menu(FREE_LIST | FREE_TEXT); \
143
url = get_no_post_url(loc->vs.url, NULL); \
145
add_to_menu(&mi, url, NULL, ACT_NONE, \
146
(menu_func) go_historywards, \
147
(void *) loc, NO_INTL); \
153
do_menu(term, no_hist_menu, ses, 0); \
155
do_menu(term, mi, ses, 0); \
158
history_menu_model(history_menu, prev);
159
history_menu_model(unhistory_menu, next);
161
#undef history_menu_model
165
tab_menu(struct terminal *term, void *d, struct session *ses)
167
struct menu_item *menu;
168
struct window *tab = d;
169
int tabs = number_of_tabs(term);
171
#ifdef CONFIG_BOOKMARKS
172
int anonymous = get_opt_bool_tree(cmdline_options, "anonymous");
175
assert(term && ses && tab);
176
if_assert_failed return;
178
menu = new_menu(FREE_LIST);
181
add_menu_action(&menu, N_("Go ~back"), ACT_BACK);
182
add_menu_action(&menu, N_("Go for~ward"), ACT_UNBACK);
184
add_separator_to_menu(&menu);
186
#ifdef CONFIG_BOOKMARKS
188
add_menu_action(&menu, N_("Bookm~ark document"), ACT_ADD_BOOKMARK);
192
add_menu_action(&menu, N_("~Reload"), ACT_RELOAD);
194
if (ses->doc_view && document_has_frames(ses->doc_view->document))
195
add_menu_action(&menu, N_("Frame at ~full-screen"), ACT_ZOOM_FRAME);
197
/* Keep tab related operations below this separator */
198
add_separator_to_menu(&menu);
201
add_menu_action(&menu, N_("Nex~t tab"), ACT_TAB_NEXT);
202
add_menu_action(&menu, N_("Pre~v tab"), ACT_TAB_PREV);
205
add_menu_action(&menu, N_("~Close tab"), ACT_TAB_CLOSE);
208
add_menu_action(&menu, N_("C~lose all tabs but the current"),
209
ACT_TAB_CLOSE_ALL_BUT_CURRENT);
210
#ifdef CONFIG_BOOKMARKS
212
add_menu_action(&menu, N_("B~ookmark all tabs"),
213
ACT_ADD_BOOKMARK_TABS);
218
/* Adjust the menu position taking the menu frame into account */
219
while (menu[i].text) i++;
220
set_window_ptr(tab, tab->x, int_max(tab->y - i - 1, 0));
222
do_menu(term, menu, ses, 1);
226
do_submenu(struct terminal *term, void *menu, struct session *ses)
228
do_menu(term, menu, ses, 1);
232
static struct menu_item file_menu11[] = {
233
INIT_MENU_ACTION(N_("Open new ~tab"), ACT_OPEN_NEW_TAB),
234
INIT_MENU_ACTION(N_("Open new tab in backgroun~d"), ACT_OPEN_NEW_TAB_IN_BACKGROUND),
235
INIT_MENU_ACTION(N_("~Go to URL"), ACT_GOTO_URL),
236
INIT_MENU_ACTION(N_("Go ~back"), ACT_BACK),
237
INIT_MENU_ACTION(N_("Go ~forward"), ACT_UNBACK),
238
INIT_MENU_ACTION(N_("~Reload"), ACT_RELOAD),
239
INIT_MENU_ITEM(N_("~History"), NULL, ACT_NONE, history_menu, NULL, SUBMENU),
240
INIT_MENU_ITEM(N_("~Unhistory"), NULL, ACT_NONE, unhistory_menu, NULL, SUBMENU),
243
static struct menu_item file_menu21[] = {
245
INIT_MENU_ACTION(N_("~Save as"), ACT_SAVE_AS),
246
INIT_MENU_ACTION(N_("Save UR~L as"), ACT_SAVE_URL_AS),
247
INIT_MENU_ACTION(N_("Sa~ve formatted document"), ACT_SAVE_FORMATTED),
248
#ifdef CONFIG_BOOKMARKS
249
INIT_MENU_ACTION(N_("Bookm~ark document"), ACT_ADD_BOOKMARK),
253
static struct menu_item file_menu22[] = {
255
INIT_MENU_ACTION(N_("~Kill background connections"), ACT_KILL_BACKGROUNDED_CONNECTIONS),
256
INIT_MENU_ACTION(N_("Flush all ~caches"), ACT_CACHE_MINIMIZE),
257
INIT_MENU_ACTION(N_("Resource ~info"), ACT_RESOURCE_INFO),
259
INIT_MENU_ITEM(N_("~Memory info"), NULL, ACT_NONE, memory_inf, NULL, 0),
264
static struct menu_item file_menu3[] = {
266
INIT_MENU_ACTION(N_("E~xit"), ACT_QUIT),
271
do_file_menu(struct terminal *term, void *xxx, struct session *ses)
273
struct menu_item *file_menu, *e, *f;
274
int anonymous = get_opt_int_tree(cmdline_options, "anonymous");
277
file_menu = mem_alloc(sizeof(file_menu11) + sizeof(file_menu21)
278
+ sizeof(file_menu22) + sizeof(file_menu3)
279
+ 3 * sizeof(struct menu_item));
280
if (!file_menu) return;
283
o = can_open_in_new(term);
285
SET_MENU_ITEM(e, N_("~New window"), NULL, ACT_OPEN_NEW_WINDOW,
286
(menu_func) open_in_new_window, send_open_new_window,
287
(o - 1) ? SUBMENU : 0, 0, HKS_SHOW);
291
memcpy(e, file_menu11, sizeof(file_menu11));
292
e += sizeof(file_menu11) / sizeof(struct menu_item);
295
memcpy(e, file_menu21, sizeof(file_menu21));
296
e += sizeof(file_menu21) / sizeof(struct menu_item);
299
memcpy(e, file_menu22, sizeof(file_menu22));
300
e += sizeof(file_menu22) / sizeof(struct menu_item);
303
if (!anonymous && can_open_os_shell(term->environment)) {
304
SET_MENU_ITEM(e, N_("~OS shell"), NULL, ACT_OPEN_OS_SHELL,
305
NULL, NULL, 0, 0, HKS_SHOW);
310
if (can_resize_window(term->environment)) {
311
SET_MENU_ITEM(e, N_("Resize t~erminal"), NULL, ACT_NONE,
312
dlg_resize_terminal, NULL,
318
memcpy(e, file_menu3 + x, sizeof(file_menu3) - x * sizeof(struct menu_item));
319
e += sizeof(file_menu3) / sizeof(struct menu_item);
321
for (f = file_menu; f < e; f++)
322
f->flags |= FREE_LIST;
324
do_menu(term, file_menu, ses, 1);
327
static struct menu_item view_menu[] = {
328
INIT_MENU_ACTION(N_("~Search"), ACT_SEARCH),
329
INIT_MENU_ACTION(N_("Search ~backward"), ACT_SEARCH_BACK),
330
INIT_MENU_ACTION(N_("Find ~next"), ACT_FIND_NEXT),
331
INIT_MENU_ACTION(N_("Find ~previous"), ACT_FIND_NEXT_BACK),
332
INIT_MENU_ACTION(N_("T~ypeahead search"), ACT_SEARCH_TYPEAHEAD),
334
INIT_MENU_ACTION(N_("Toggle ~html/plain"), ACT_TOGGLE_HTML_PLAIN),
335
INIT_MENU_ACTION(N_("Toggle i~mages"), ACT_TOGGLE_DISPLAY_IMAGES),
336
INIT_MENU_ACTION(N_("Toggle ~link numbering"), ACT_TOGGLE_NUMBERED_LINKS),
337
INIT_MENU_ACTION(N_("Toggle ~document colors"), ACT_TOGGLE_DOCUMENT_COLORS),
338
INIT_MENU_ACTION(N_("Document ~info"), ACT_DOCUMENT_INFO),
339
INIT_MENU_ACTION(N_("H~eader info"), ACT_HEADER_INFO),
340
INIT_MENU_ACTION(N_("Frame at ~full-screen"), ACT_ZOOM_FRAME),
342
INIT_MENU_ACTION(N_("Nex~t tab"), ACT_TAB_NEXT),
343
INIT_MENU_ACTION(N_("Pre~v tab"), ACT_TAB_PREV),
344
INIT_MENU_ACTION(N_("~Close tab"), ACT_TAB_CLOSE),
349
static struct menu_item help_menu[] = {
350
INIT_MENU_ITEM(N_("~ELinks homepage"), NULL, ACT_NONE, menu_url_shortcut, ELINKS_HOMEPAGE, 0),
351
INIT_MENU_ITEM(N_("~Documentation"), NULL, ACT_NONE, menu_url_shortcut, ELINKS_DOC_URL, 0),
352
INIT_MENU_ITEM(N_("~Keys"), NULL, ACT_NONE, menu_keys, NULL, 0),
355
INIT_MENU_ITEM(N_("~Bugs information"), NULL, ACT_NONE, menu_url_shortcut, ELINKS_BUGS_URL, 0),
356
INIT_MENU_ITEM(N_("ELinks C~vsWeb"), NULL, ACT_NONE, menu_url_shortcut, ELINKS_CVSWEB_URL, 0),
359
INIT_MENU_ITEM(N_("~Copying"), NULL, ACT_NONE, menu_copying, NULL, 0),
360
INIT_MENU_ITEM(N_("~About"), NULL, ACT_NONE, menu_about, NULL, 0),
365
static struct menu_item ext_menu[] = {
366
INIT_MENU_ITEM(N_("~Add"), NULL, ACT_NONE, menu_add_ext, NULL, 0),
367
INIT_MENU_ITEM(N_("~Modify"), NULL, ACT_NONE, menu_list_ext, menu_add_ext, SUBMENU),
368
INIT_MENU_ITEM(N_("~Delete"), NULL, ACT_NONE, menu_list_ext, menu_del_ext, SUBMENU),
372
static struct menu_item setup_menu[] = {
374
INIT_MENU_ITEM(N_("~Language"), NULL, ACT_NONE, menu_language_list, NULL, SUBMENU),
376
INIT_MENU_ITEM(N_("C~haracter set"), NULL, ACT_NONE, charset_list, NULL, SUBMENU),
377
INIT_MENU_ACTION(N_("~Terminal options"), ACT_SHOW_TERM_OPTIONS),
378
INIT_MENU_ITEM(N_("File ~extensions"), NULL, ACT_NONE, do_submenu, ext_menu, SUBMENU),
380
INIT_MENU_ACTION(N_("~Options manager"), ACT_OPTIONS_MANAGER),
381
INIT_MENU_ACTION(N_("~Keybinding manager"), ACT_KEYBINDING_MANAGER),
382
INIT_MENU_ACTION(N_("~Save options"), ACT_SAVE_OPTIONS),
386
static struct menu_item setup_menu_anon[] = {
387
INIT_MENU_ITEM(N_("~Language"), NULL, ACT_NONE, menu_language_list, NULL, SUBMENU),
388
INIT_MENU_ITEM(N_("C~haracter set"), NULL, ACT_NONE, charset_list, NULL, SUBMENU),
389
INIT_MENU_ACTION(N_("~Terminal options"), ACT_SHOW_TERM_OPTIONS),
393
static struct menu_item tools_menu[] = {
394
#ifdef CONFIG_GLOBHIST
395
INIT_MENU_ACTION(N_("Global ~history"), ACT_HISTORY_MANAGER),
397
#ifdef CONFIG_BOOKMARKS
398
INIT_MENU_ACTION(N_("~Bookmarks"), ACT_BOOKMARK_MANAGER),
400
INIT_MENU_ACTION(N_("~Cache"), ACT_CACHE_MANAGER),
401
INIT_MENU_ACTION(N_("~Downloads"), ACT_DOWNLOAD_MANAGER),
402
#ifdef CONFIG_COOKIES
403
INIT_MENU_ACTION(N_("Coo~kies"), ACT_COOKIE_MANAGER),
405
#ifdef CONFIG_FORMHIST
406
INIT_MENU_ACTION(N_("~Form history"), ACT_FORMHIST_MANAGER),
412
do_setup_menu(struct terminal *term, void *xxx, struct session *ses)
414
if (!get_opt_int_tree(cmdline_options, "anonymous"))
415
do_menu(term, setup_menu, ses, 1);
417
do_menu(term, setup_menu_anon, ses, 1);
420
static struct menu_item main_menu[] = {
421
INIT_MENU_ITEM(N_("~File"), NULL, ACT_NONE, do_file_menu, NULL, FREE_LIST | SUBMENU),
422
INIT_MENU_ITEM(N_("~View"), NULL, ACT_NONE, do_submenu, view_menu, FREE_LIST | SUBMENU),
423
INIT_MENU_ITEM(N_("~Link"), NULL, ACT_NONE, link_menu, NULL, FREE_LIST | SUBMENU),
424
INIT_MENU_ITEM(N_("~Tools"), NULL, ACT_NONE, do_submenu, tools_menu, FREE_LIST | SUBMENU),
425
INIT_MENU_ITEM(N_("~Setup"), NULL, ACT_NONE, do_setup_menu, NULL, FREE_LIST | SUBMENU),
426
INIT_MENU_ITEM(N_("~Help"), NULL, ACT_NONE, do_submenu, help_menu, FREE_LIST | SUBMENU),
431
activate_bfu_technology(struct session *ses, int item)
433
do_mainmenu(ses->tab->term, main_menu, ses, item);
438
dialog_goto_url(struct session *ses, char *url)
440
input_field(ses->tab->term, NULL, 1,
441
N_("Go to URL"), N_("Enter URL"),
442
N_("OK"), N_("Cancel"), ses, &goto_url_history,
443
MAX_STR_LEN, url, 0, 0, NULL,
444
(void (*)(void *, unsigned char *)) goto_url_with_hook,
448
static struct input_history file_history = {
449
/* items: */ { D_LIST_HEAD(file_history.entries) },
456
query_file(struct session *ses, unsigned char *url, void *data,
457
void (*std)(void *, unsigned char *),
458
void (*cancel)(void *), int interactive)
462
if (!init_string(&def)) return;
464
add_to_string(&def, get_opt_str("document.download.directory"));
465
if (def.length && !dir_sep(def.source[def.length - 1]))
466
add_char_to_string(&def, '/');
468
add_string_uri_filename_to_string(&def, url);
471
input_field(ses->tab->term, NULL, 1,
472
N_("Download"), N_("Save to file"),
473
N_("OK"), N_("Cancel"), data, &file_history,
474
MAX_STR_LEN, def.source, 0, 0, NULL,
475
(void (*)(void *, unsigned char *)) std,
476
(void (*)(void *)) cancel);
478
std(data, def.source);
485
free_history_lists(void)
487
free_list(goto_url_history.entries);
488
free_list(file_history.entries);
489
#ifdef HAVE_SCRIPTING
490
trigger_event_name("free-history");