📄 types.c
字号:
/* types.c * (c) 2002 Mikulas Patocka * This file is a part of the Links program, released under GPL. */#include "links.h"/*------------------------ ASSOCIATIONS -----------------------*//* DECLARATIONS */void assoc_edit_item(struct dialog_data *,void *,void (*)(struct dialog_data *,void *,void *,struct list_description *),void *, unsigned char);void assoc_copy_item(void *, void *);void *assoc_default_value(struct session*, unsigned char);void *assoc_new_item(void *);void assoc_delete_item(void *);void *assoc_find_item(void *start, unsigned char *str, int direction);unsigned char *assoc_type_item(struct terminal *, void *, int);void assoc_edit_item_fn(struct dialog_data *);void assoc_edit_done(void *);void assoc_edit_abort(struct dialog_data *);void ext_edit_item_fn(struct dialog_data *);void ext_edit_done(void *);void ext_edit_abort(struct dialog_data *);int is_in_list(unsigned char *, unsigned char *, int);unsigned char *get_content_type_by_extension(unsigned char *url);unsigned char *get_extension_by_content_type(unsigned char *ct);unsigned char *get_filename_from_header(unsigned char *head);struct list assoc={&assoc,&assoc,0,-1,NULL};struct history assoc_search_history = { 0, { &assoc_search_history.items, &assoc_search_history.items } };struct assoc_ok_struct{ void (*fn)(struct dialog_data *,void *,void *,struct list_description *); void *data; struct dialog_data *dlg;};struct list_description assoc_ld={ 0, /* 0= flat; 1=tree */ &assoc, /* list */ assoc_new_item, assoc_edit_item, assoc_default_value, assoc_delete_item, assoc_copy_item, assoc_type_item, assoc_find_item, &assoc_search_history, 0, /* this is set in init_assoc function */ 50, /* width of main window */ 10, /* # of items in main window */ T_ASSOCIATION, T_ASSOCIATIONS_ALREADY_IN_USE, T_ASSOCIATIONS_MANAGER, T_DELETE_ASSOCIATION, 0, /* no button */ NULL, /* no button */ 0,0,0,0, /* internal vars */ 0, /* modified */ NULL, NULL, 1,};void *assoc_default_value(struct session* ses, unsigned char type){ type=type; ses=ses; return NULL;}void *assoc_new_item(void *ignore){ struct assoc *new; ignore=ignore; new = mem_calloc(sizeof(struct assoc)); new->label = stracpy(""); new->ct = stracpy(""); new->prog = stracpy(""); new->block = new->xwin = new->cons = 1; new->ask = 1; new->accept_http = 0; new->accept_ftp = 0; new->type = 0; new->system = SYSTEM_ID; return new;}void assoc_delete_item(void *data){ struct assoc *del=(struct assoc *)data; struct assoc *next=del->next; struct assoc *prev=del->prev; if (del->label)mem_free(del->label); if (del->ct)mem_free(del->ct); if (del->prog)mem_free(del->prog); if (next)next->prev=del->prev; if (prev)prev->next=del->next; mem_free(del);}void assoc_copy_item(void *in, void *out){ struct assoc *item_in=(struct assoc *)in; struct assoc *item_out=(struct assoc *)out; item_out->cons=item_in->cons; item_out->xwin=item_in->xwin; item_out->block=item_in->block; item_out->ask=item_in->ask; item_out->accept_http=item_in->accept_http; item_out->accept_ftp=item_in->accept_ftp; item_out->system=item_in->system; if (item_out->label)mem_free(item_out->label); if (item_out->ct)mem_free(item_out->ct); if (item_out->prog)mem_free(item_out->prog); item_out->label=stracpy(item_in->label); item_out->ct=stracpy(item_in->ct); item_out->prog=stracpy(item_in->prog);}/* allocate string and print association into it *//* x: 0=type all, 1=type title only */unsigned char *assoc_type_item(struct terminal *term, void *data, int x){ unsigned char *txt, *txt1; struct conv_table *table; struct assoc* item=(struct assoc*)data; if ((struct list*)item==(&assoc))return stracpy(_(TEXT(T_ASSOCIATIONS),term)); txt=stracpy(""); if (item->system != SYSTEM_ID) add_to_strn(&txt, "XX "); add_to_strn(&txt, item->label); if (item->ct){add_to_strn(&txt,": ");add_to_strn(&txt,item->ct);} if (!x) { add_to_strn(&txt," -> "); if (item->prog)add_to_strn(&txt,item->prog); } table=get_translation_table(assoc_ld.codepage,term->spec->charset); txt1=convert_string(table,txt,strlen(txt),NULL); mem_free(txt); return txt1;}void menu_assoc_manager(struct terminal *term,void *fcp,struct session *ses){ create_list_window(&assoc_ld,&assoc,term,ses);}unsigned char *ct_msg[] = { TEXT(T_LABEL), TEXT(T_CONTENT_TYPES), TEXT(T_PROGRAM__IS_REPLACED_WITH_FILE_NAME),#ifdef ASSOC_BLOCK TEXT(T_BLOCK_TERMINAL_WHILE_PROGRAM_RUNNING),#endif#ifdef ASSOC_CONS_XWIN TEXT(T_RUN_ON_TERMINAL), TEXT(T_RUN_IN_XWINDOW),#endif TEXT(T_ASK_BEFORE_OPENING), TEXT(T_ACCEPT_HTTP), TEXT(T_ACCEPT_FTP),};void assoc_edit_item_fn(struct dialog_data *dlg){ struct terminal *term = dlg->win->term; int max = 0, min = 0; int w, rw; int y = gf_val(-1, -G_BFU_FONT_SIZE); int p = 3; if (dlg->win->term->spec->braille) y += gf_val(1, G_BFU_FONT_SIZE);#ifdef ASSOC_BLOCK p++;#endif#ifdef ASSOC_CONS_XWIN p += 2;#endif max_text_width(term, ct_msg[0], &max, AL_LEFT); min_text_width(term, ct_msg[0], &min, AL_LEFT); max_text_width(term, ct_msg[1], &max, AL_LEFT); min_text_width(term, ct_msg[1], &min, AL_LEFT); max_text_width(term, ct_msg[2], &max, AL_LEFT); min_text_width(term, ct_msg[2], &min, AL_LEFT); max_group_width(term, ct_msg + 3, dlg->items + 3, p, &max); min_group_width(term, ct_msg + 3, dlg->items + 3, p, &min); max_buttons_width(term, dlg->items + 3 + p, 2, &max); min_buttons_width(term, dlg->items + 3 + p, 2, &min); w = term->x * 9 / 10 - 2 * DIALOG_LB; if (w > max) w = max; if (w < min) w = min; if (w > term->x - 2 * DIALOG_LB) w = term->x - 2 * DIALOG_LB; if (w < 1) w = 1; rw = 0; dlg_format_text_and_field(dlg, NULL, _(ct_msg[0], term), &dlg->items[0], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE * 1); dlg_format_text_and_field(dlg, NULL, _(ct_msg[1], term), &dlg->items[1], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE * 1); dlg_format_text_and_field(dlg, NULL, _(ct_msg[2], term), &dlg->items[2], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE * 1); dlg_format_group(dlg, NULL, ct_msg + 3, dlg->items + 3, p, 0, &y, w, &rw); y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_buttons(dlg, NULL, dlg->items + 3 + p, 2, 0, &y, w, &rw, AL_CENTER); w = rw; dlg->xw = w + 2 * DIALOG_LB; dlg->yw = y + 2 * DIALOG_TB; center_dlg(dlg); draw_dlg(dlg); y = dlg->y + DIALOG_TB; if (dlg->win->term->spec->braille) y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_text_and_field(dlg, term, ct_msg[0], &dlg->items[0], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_text_and_field(dlg, term, ct_msg[1], &dlg->items[1], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_text_and_field(dlg, term, ct_msg[2], &dlg->items[2], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT); y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_group(dlg, term, ct_msg + 3, &dlg->items[3], p, dlg->x + DIALOG_LB, &y, w, NULL); y += gf_val(1, G_BFU_FONT_SIZE); dlg_format_buttons(dlg, term, &dlg->items[3 + p], 2, dlg->x + DIALOG_LB, &y, w, NULL, AL_CENTER);}/* Puts url and title into the bookmark item */void assoc_edit_done(void *data){ struct dialog *d=(struct dialog*)data; struct assoc *item=(struct assoc *)d->udata; struct assoc_ok_struct* s=(struct assoc_ok_struct*)d->udata2; unsigned char *txt; struct conv_table *table; unsigned char *label, *ct, *prog; label=(unsigned char *)&d->items[12]; ct=label+MAX_STR_LEN; prog=ct+MAX_STR_LEN; table=get_translation_table(s->dlg->win->term->spec->charset,assoc_ld.codepage); txt=convert_string(table,label,strlen(label),NULL); mem_free(item->label); item->label=txt; txt=convert_string(table,ct,strlen(ct),NULL); mem_free(item->ct); item->ct=txt; txt=convert_string(table,prog,strlen(prog),NULL); mem_free(item->prog); item->prog=txt; s->fn(s->dlg,s->data,item,&assoc_ld); d->udata=0; /* for abort function */}/* destroys an item, this function is called when edit window is aborted */void assoc_edit_abort(struct dialog_data *data){ struct assoc *item=(struct assoc*)data->dlg->udata; struct dialog *dlg=data->dlg; mem_free(dlg->udata2); if (item)assoc_delete_item(item);}void assoc_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){ int p; struct assoc *new=(struct assoc*)data; struct terminal *term=dlg->win->term; struct dialog *d; struct assoc_ok_struct *s; unsigned char *ct, *prog, *label; d = mem_calloc(sizeof(struct dialog) + 12 * sizeof(struct dialog_item) + 3 * MAX_STR_LEN); label=(unsigned char *)&d->items[12]; ct=label+MAX_STR_LEN; prog=ct+MAX_STR_LEN; if (new->label)strncpy(label,new->label,MAX_STR_LEN); if (new->ct)strncpy(ct,new->ct,MAX_STR_LEN); if (new->prog)strncpy(prog,new->prog,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_EDIT_ASSOCIATION); break; case TITLE_ADD: d->title=TEXT(T_ADD_ASSOCIATION); break; default: internal("Unsupported dialog title.\n"); } d->udata=data; d->udata2=s; d->fn = assoc_edit_item_fn; d->abort=assoc_edit_abort; d->refresh=assoc_edit_done; d->refresh_data = d; d->items[0].type = D_FIELD; d->items[0].dlen = MAX_STR_LEN; d->items[0].data = label; d->items[0].fn = check_nonempty; d->items[1].type = D_FIELD; d->items[1].dlen = MAX_STR_LEN; d->items[1].data = ct; d->items[1].fn = check_nonempty; d->items[2].type = D_FIELD; d->items[2].dlen = MAX_STR_LEN; d->items[2].data = prog; d->items[2].fn = check_nonempty; p = 3;#ifdef ASSOC_BLOCK d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->block; d->items[p++].dlen = sizeof(int);#endif#ifdef ASSOC_CONS_XWIN d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->cons; d->items[p++].dlen = sizeof(int); d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->xwin; d->items[p++].dlen = sizeof(int);#endif d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->ask; d->items[p++].dlen = sizeof(int); d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->accept_http; d->items[p++].dlen = sizeof(int); d->items[p].type = D_CHECKBOX; d->items[p].data = (unsigned char *)&new->accept_ftp; d->items[p++].dlen = sizeof(int); d->items[p].type = D_BUTTON; d->items[p].gid = B_ENTER; d->items[p].fn = ok_dialog; d->items[p++].text = TEXT(T_OK); d->items[p].type = D_BUTTON; d->items[p].gid = B_ESC; d->items[p].text = TEXT(T_CANCEL); d->items[p++].fn = cancel_dialog; d->items[p++].type = D_END; do_dialog(term, d, getml(d, NULL));}void *assoc_find_item(void *start, unsigned char *str, int direction){ struct assoc *a,*s=(struct assoc *)start; if (direction==1) { for (a=s->next; a!=s; a=a->next) if (a->depth>-1) { if (a->label && casestrstr(a->label,str)) return a; if (a->ct && casestrstr(a->ct,str)) return a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -