static widget_handler_status_T push_add_server_button(struct dialog_data *dlg_data, struct widget_data *button) { /* [gettext_accelerator_context(.push_add_server_button)] */ #define SERVER_WIDGETS_COUNT 3 struct terminal *term = dlg_data->win->term; struct dialog *dlg; unsigned char *name; unsigned char *text; dlg = calloc_dialog(SERVER_WIDGETS_COUNT, MAX_STR_LEN); if (!dlg) return EVENT_NOT_PROCESSED; name = get_dialog_offset(dlg, SERVER_WIDGETS_COUNT); dlg->title = _("Add server", term); dlg->layouter = generic_dialog_layouter; dlg->udata = NULL; dlg->udata2 = NULL; text = _("Server name", term); add_dlg_field_float(dlg, text, 0, 0, check_nonempty, MAX_STR_LEN, name, NULL); add_dlg_ok_button(dlg, _("~OK", term), B_ENTER, add_server_do, name); add_dlg_button(dlg, _("~Cancel", term), B_ESC, cancel_dialog, NULL); add_dlg_end(dlg, SERVER_WIDGETS_COUNT); do_dialog(term, dlg, getml(dlg, (void *) NULL)); return EVENT_PROCESSED; #undef SERVER_WIDGETS_COUNT }
static void build_edit_dialog(struct terminal *term, struct cookie *cookie) { #define EDIT_WIDGETS_COUNT 8 /* [gettext_accelerator_context(.build_edit_dialog)] */ struct dialog *dlg; unsigned char *name, *value, *domain, *expires, *secure; unsigned char *dlg_server; int length = 0; dlg = calloc_dialog(EDIT_WIDGETS_COUNT, MAX_STR_LEN * 5); if (!dlg) return; dlg->title = _("Edit", term); dlg->layouter = generic_dialog_layouter; dlg->udata = cookie; dlg->udata2 = NULL; name = get_dialog_offset(dlg, EDIT_WIDGETS_COUNT); value = name + MAX_STR_LEN; domain = value + MAX_STR_LEN; expires = domain + MAX_STR_LEN; secure = expires + MAX_STR_LEN; safe_strncpy(name, cookie->name, MAX_STR_LEN); safe_strncpy(value, cookie->value, MAX_STR_LEN); safe_strncpy(domain, cookie->domain, MAX_STR_LEN); /* Bug 923: Assumes time_t values fit in unsigned long. */ ulongcat(expires, &length, cookie->expires, MAX_STR_LEN, 0); length = 0; ulongcat(secure, &length, cookie->secure, MAX_STR_LEN, 0); dlg_server = cookie->server->host; dlg_server = straconcat(_("Server", term), ": ", dlg_server, "\n", (unsigned char *) NULL); if (!dlg_server) { mem_free(dlg); return; } add_dlg_text(dlg, dlg_server, ALIGN_LEFT, 0); add_dlg_field_float(dlg, _("Name", term), 0, 0, set_cookie_name, MAX_STR_LEN, name, NULL); add_dlg_field_float(dlg, _("Value", term), 0, 0, set_cookie_value, MAX_STR_LEN, value, NULL); add_dlg_field_float(dlg, _("Domain", term), 0, 0, set_cookie_domain, MAX_STR_LEN, domain, NULL); add_dlg_field_float(dlg, _("Expires", term), 0, 0, set_cookie_expires, MAX_STR_LEN, expires, NULL); add_dlg_field_float(dlg, _("Secure", term), 0, 0, set_cookie_secure, MAX_STR_LEN, secure, NULL); add_dlg_button(dlg, _("~OK", term), B_ENTER, ok_dialog, NULL); add_dlg_button(dlg, _("~Cancel", term), B_ESC, cancel_dialog, NULL); add_dlg_end(dlg, EDIT_WIDGETS_COUNT); do_dialog(term, dlg, getml(dlg, (void *) dlg_server, (void *) NULL)); #undef EDIT_WIDGETS_COUNT }
void display_download(struct terminal *term, struct file_download *file_download, struct session *ses) { /* [gettext_accelerator_context(display_download)] */ struct dialog *dlg; if (!is_in_downloads_list(file_download)) return; #if CONFIG_BITTORRENT #define DOWNLOAD_WIDGETS_COUNT 5 #else #define DOWNLOAD_WIDGETS_COUNT 4 #endif dlg = calloc_dialog(DOWNLOAD_WIDGETS_COUNT, 0); if (!dlg) return; undisplay_download(file_download); file_download->ses = ses; dlg->title = _("Download", term); dlg->layouter = download_dialog_layouter; dlg->abort = download_abort_function; dlg->udata = file_download; object_lock(file_download); add_dlg_button(dlg, _("~Background", term), B_ENTER | B_ESC, dlg_undisplay_download, NULL); add_dlg_button(dlg, _("Background with ~notify", term), B_ENTER | B_ESC, dlg_set_notify, NULL); #if CONFIG_BITTORRENT if (file_download->uri->protocol == PROTOCOL_BITTORRENT) add_dlg_button(dlg, _("~Info", term), B_ENTER | B_ESC, dlg_show_bittorrent_info, NULL); #endif add_dlg_button(dlg, _("~Abort", term), 0, dlg_abort_download, NULL); /* Downloads scheduled to be opened by external handlers are always * deleted. */ if (!file_download->external_handler) { add_dlg_button(dlg, _("Abort and ~delete file", term), 0, push_delete_button, NULL); } #if CONFIG_BITTORRENT add_dlg_end(dlg, DOWNLOAD_WIDGETS_COUNT - !!file_download->external_handler - (file_download->uri->protocol != PROTOCOL_BITTORRENT)); #else add_dlg_end(dlg, DOWNLOAD_WIDGETS_COUNT - !!file_download->external_handler); #endif do_dialog(term, dlg, getml(dlg, (void *) NULL)); }
/* TODO: In bookmark/dialogs.c most users seem to want also the dialog_data * so we should make when_*() functions take dialog_data instead. --jonas */ void do_edit_dialog(struct terminal *term, int intl, unsigned char *title, const unsigned char *src_name, const unsigned char *src_url, struct session *ses, struct dialog_data *parent, done_handler_T *when_done, void when_cancel(struct dialog *), void *done_data, enum edit_dialog_type dialog_type) { /* [gettext_accelerator_context(do_edit_dialog)] */ unsigned char *name, *url; struct dialog *dlg; if (intl) title = _(title, term); /* Number of fields in edit dialog --Zas */ #define EDIT_WIDGETS_COUNT 5 /* Create the dialog */ dlg = calloc_dialog(EDIT_WIDGETS_COUNT, 2 * MAX_STR_LEN); if (!dlg) return; name = get_dialog_offset(dlg, EDIT_WIDGETS_COUNT); url = name + MAX_STR_LEN; /* Get the name */ if (!src_name) { /* Unknown name. */ get_current_title(ses, name, MAX_STR_LEN); } else { /* Known name. */ safe_strncpy(name, src_name, MAX_STR_LEN); } /* Get the url */ if (!src_url) { /* Unknown . */ get_current_url(ses, url, MAX_STR_LEN); } else { /* Known url. */ safe_strncpy(url, src_url, MAX_STR_LEN); } dlg->title = title; dlg->layouter = generic_dialog_layouter; dlg->layout.maximize_width = 1; dlg->udata = parent; dlg->udata2 = done_data; if (dialog_type == EDIT_DLG_ADD) add_dlg_field(dlg, _("Name", term), 0, 0, check_nonempty, MAX_STR_LEN, name, NULL); else add_dlg_field(dlg, _("Name", term), 0, 0, NULL, MAX_STR_LEN, name, NULL); add_dlg_field(dlg, _("URL", term), 0, 0, NULL, MAX_STR_LEN, url, NULL); add_dlg_ok_button(dlg, _("~OK", term), B_ENTER, when_done, dlg); add_dlg_button(dlg, _("C~lear", term), 0, clear_dialog, NULL); if (when_cancel) add_dlg_button(dlg, _("~Cancel", term), B_ESC, my_cancel_dialog, when_cancel); else add_dlg_button(dlg, _("~Cancel", term), B_ESC, cancel_dialog, NULL); add_dlg_end(dlg, EDIT_WIDGETS_COUNT); do_dialog(term, dlg, getml(dlg, (void *) NULL)); #undef EDIT_WIDGETS_COUNT }
void menu_keys(struct terminal *term, void *d_, void *xxx) { /* [gettext_accelerator_context(menu_keys)] */ int d = (long) d_; /* We scale by main mapping because it has the most actions */ action_id_T action_ids[MAIN_ACTIONS] = { ACT_MAIN_MENU, ACT_MAIN_QUIT, ACT_MAIN_MOVE_LINK_NEXT, ACT_MAIN_MOVE_LINK_PREV, ACT_MAIN_SCROLL_DOWN, ACT_MAIN_SCROLL_UP, ACT_MAIN_SCROLL_LEFT, ACT_MAIN_SCROLL_RIGHT, ACT_MAIN_HISTORY_MOVE_BACK, ACT_MAIN_GOTO_URL, ACT_MAIN_GOTO_URL_CURRENT, ACT_MAIN_DOCUMENT_INFO, ACT_MAIN_HEADER_INFO, ACT_MAIN_SEARCH, ACT_MAIN_SEARCH_BACK, ACT_MAIN_FIND_NEXT, ACT_MAIN_FIND_NEXT_BACK, ACT_MAIN_LINK_FOLLOW, ACT_MAIN_LINK_DOWNLOAD, ACT_MAIN_TOGGLE_HTML_PLAIN, ACT_MAIN_NONE, }; struct string keys; struct keys_toggle_info *info; info = (struct keys_toggle_info *)mem_calloc(1, sizeof(*info)); if (!info || !init_string(&keys)) { mem_free_if(info); return; } info->term = term; info->toggle = d; if (info->toggle) { int action_id; int keymap_id; for (action_id = 0; action_id < MAIN_ACTIONS - 1; action_id++) { action_ids[action_id] = action_id + 1; } for (keymap_id = 0; keymap_id < KEYMAP_MAX; keymap_id++) { add_actions_to_string(&keys, action_ids, keymap_id, term); if (keymap_id + 1 < KEYMAP_MAX) add_to_string(&keys, (const unsigned char *)"\n\n"); /* Just a little reminder that the following code takes * the easy way. */ assert((int) MAIN_ACTIONS > (int) EDIT_ACTIONS); assert((int) EDIT_ACTIONS > (int) MENU_ACTIONS); if (keymap_id == KEYMAP_MAIN) { action_ids[EDIT_ACTIONS] = ACT_EDIT_NONE; } else if (keymap_id == KEYMAP_EDIT) { action_ids[MENU_ACTIONS] = ACT_MENU_NONE; } } } else { add_actions_to_string(&keys, action_ids, KEYMAP_MAIN, term); } msg_box(term, getml(info, (void *) NULL), MSGBOX_FREE_TEXT | MSGBOX_SCROLLABLE, N_("Keys"), ALIGN_LEFT, keys.source, info, 2, MSG_BOX_BUTTON(N_("~OK"), NULL, B_ENTER | B_ESC), MSG_BOX_BUTTON(N_("~Toggle display"), push_toggle_keys_display_button, B_ENTER)); }
/* TODO: Take auth_entry from data. --jonas */ void do_auth_dialog(struct session *ses, void *data) { /* [gettext_accelerator_context(do_auth_dialog)] */ struct dialog *dlg; struct dialog_data *dlg_data; struct terminal *term = ses->tab->term; struct auth_entry *a = get_invalid_auth_entry(); unsigned char sticker[MAX_STR_LEN], *text; int sticker_len; if (!a || a->blocked) return; text = get_uri_string(a->uri, URI_HTTP_AUTH); if (!text) return; #ifdef CONFIG_FORMHIST { unsigned char *user = get_form_history_value(text, (unsigned char *)"user"); unsigned char *password = get_form_history_value(text, (unsigned char *)"password"); if (user) { strncpy((char *)a->user, (const char *)user, AUTH_USER_MAXLEN - 1); } if (password) { strncpy((char *)a->password, (const char *)password, AUTH_PASSWORD_MAXLEN - 1); } } #endif sticker_len = snprintf((char *)sticker, sizeof(sticker), (const char *)_("Authentication required for %s at %s", term), a->realm, text); mem_free(text); if (sticker_len < 0 || sticker_len > MAX_STR_LEN) return; #define AUTH_WIDGETS_COUNT 5 /* + 1 to leave room for the '\0'. */ dlg = calloc_dialog(AUTH_WIDGETS_COUNT, sticker_len + 1); if (!dlg) return; a->blocked = 1; /* This function is used for at least HTTP and FTP, so don't * name the protocol here. Consider also what an FTP server * behind an HTTP proxy should be called. */ dlg->title = _("Authentication required", term); dlg->layouter = generic_dialog_layouter; text = get_dialog_offset(dlg, AUTH_WIDGETS_COUNT); memcpy(text, sticker, sticker_len); /* calloc_dialog has stored '\0' */ dlg->udata = (void *) ses; dlg->udata2 = a; add_dlg_text(dlg, text, ALIGN_LEFT, 0); add_dlg_field_float(dlg, _("Login", term), 0, 0, NULL, AUTH_USER_MAXLEN, a->user, NULL); add_dlg_field_float_pass(dlg, _("Password", term), 0, 0, NULL, AUTH_PASSWORD_MAXLEN, a->password); add_dlg_ok_button(dlg, _("~OK", term), B_ENTER, auth_ok, dlg); add_dlg_ok_button(dlg, _("~Cancel", term), B_ESC, auth_cancel, a); add_dlg_end(dlg, AUTH_WIDGETS_COUNT); dlg_data = do_dialog(term, dlg, getml(dlg, (void *) NULL)); /* When there's some username, but no password, automagically jump to * the password. */ if (dlg_data && a->user[0] && !a->password[0]) select_widget_by_id(dlg_data, 1); }
static void block_edit_item(struct dialog_data *dlg, void *data, void (*ok_fn)(struct dialog_data *, void *, void *, struct list_description *), void *ok_arg, unsigned char dlg_title) { /*Copied from types.c */ /*Data is a new item generated by the "default" function*/ struct block *neww=(struct block*)data; struct terminal *term=dlg->win->term; struct dialog *d; struct assoc_ok_struct *s; unsigned char *url; /*Allocate space for dialog, 4 items followed by 1 string*/ d = mem_alloc(sizeof(struct dialog) + 4 * sizeof(struct dialog_item) + 1 * MAX_STR_LEN); memset(d, 0, sizeof(struct dialog) + 4 * sizeof(struct dialog_item) + 1 * MAX_STR_LEN); /*Set up this string */ url=(unsigned char *)&d->items[4]; if (neww->url)safe_strncpy(url,neww->url,MAX_STR_LEN); /* Create the dialog */ s = mem_alloc(sizeof(struct assoc_ok_struct)); s->fn=ok_fn; s->data=ok_arg; s->dlg=dlg; switch (dlg_title) { case TITLE_EDIT: d->title=TEXT_(T_BLOCK_EDIT); break; case TITLE_ADD: d->title=TEXT_(T_BLOCK_ADD); break; default: internal("Unsupported dialog title.\n"); } d->udata=data; d->udata2=s; d->fn = block_edit_item_fn; d->abort=block_edit_abort; d->refresh=block_edit_done; d->refresh_data = d; d->items[0].type = D_FIELD; d->items[0].dlen = MAX_STR_LEN; d->items[0].data = url; d->items[0].fn = check_nonempty; d->items[1].type = D_BUTTON; d->items[1].gid = B_ENTER; d->items[1].fn = ok_dialog; d->items[1].text = TEXT_(T_OK); d->items[2].type = D_BUTTON; d->items[2].gid = B_ESC; d->items[2].text = TEXT_(T_CANCEL); d->items[2].fn = cancel_dialog; d->items[3].type = D_END; do_dialog(term, d, getml(d, NULL)); }