bfu.c
来自「this is the file used to browse web」· C语言 代码 · 共 1,481 行 · 第 1/4 页
C
1,481 行
memmove(di->cdata + di->cpos, di->cdata + di->cpos + 1, strlen(di->cdata) - di->cpos + 1); goto dsp_f; case ACT_KILL_TO_BOL: memmove(di->cdata, di->cdata + di->cpos, strlen(di->cdata + di->cpos) + 1); di->cpos = 0; goto dsp_f; case ACT_KILL_TO_EOL: di->cdata[di->cpos] = 0; goto dsp_f; case ACT_COPY_CLIPBOARD: /* Copy to clipboard */ set_clipboard_text(di->cdata); break; /* We don't need to redraw */ case ACT_CUT_CLIPBOARD: /* Cut to clipboard */ set_clipboard_text(di->cdata); di->cdata[0] = 0; di->cpos = 0; goto dsp_f; case ACT_PASTE_CLIPBOARD: { /* Paste from clipboard */ unsigned char * clipboard = get_clipboard_text(); if (clipboard) { strncpy(di->cdata , clipboard, di->item->dlen); di->cdata[di->item->dlen - 1] = 0; di->cpos = strlen(di->cdata); mem_free(clipboard); } goto dsp_f; } case ACT_AUTO_COMPLETE: do_tab_compl(term, &di->history, win); goto dsp_f; default: if (ev->x >= ' ' && ev->x < 0x100 && !ev->y) { if (strlen(di->cdata) + 1 < (size_t)di->item->dlen) { memmove(di->cdata + di->cpos + 1, di->cdata + di->cpos, strlen(di->cdata) - di->cpos + 1); di->cdata[di->cpos++] = ev->x; } goto dsp_f; } } goto gh; dsp_f: display_dlg_item(dlg, di, 1); redraw_from_window(dlg->win); break; } if ((ev->x == KBD_ENTER && di->item->type == D_BUTTON) || ev->x == ' ') { dlg_select_item(dlg, di); break; } gh: if (ev->x > ' ' && ev->x < 0x100) for (i = 0; i < dlg->n; i++) if (dlg->dlg->items[i].type == D_BUTTON && upcase(_(dlg->dlg->items[i].text, term)[0]) == upcase(ev->x)) { sel: if (dlg->selected != i) { display_dlg_item(dlg, &dlg->items[dlg->selected], 0); display_dlg_item(dlg, &dlg->items[i], 1); dlg->selected = i; } dlg_select_item(dlg, &dlg->items[i]); goto bla; } if (ev->x == KBD_ENTER) for (i = 0; i < dlg->n; i++) if (dlg->dlg->items[i].type == D_BUTTON && dlg->dlg->items[i].gid & B_ENTER) goto sel; if (ev->x == KBD_ESC) for (i = 0; i < dlg->n; i++) if (dlg->dlg->items[i].type == D_BUTTON && dlg->dlg->items[i].gid & B_ESC) goto sel; if ((ev->x == KBD_TAB && !ev->y) || ev->x == KBD_DOWN || ev->x == KBD_RIGHT) { display_dlg_item(dlg, &dlg->items[dlg->selected], 0); if ((++dlg->selected) >= dlg->n) dlg->selected = 0; display_dlg_item(dlg, &dlg->items[dlg->selected], 1); redraw_from_window(dlg->win); break; } if ((ev->x == KBD_TAB && ev->y) || ev->x == KBD_UP || ev->x == KBD_LEFT) { display_dlg_item(dlg, &dlg->items[dlg->selected], 0); if ((--dlg->selected) < 0) dlg->selected = dlg->n - 1; display_dlg_item(dlg, &dlg->items[dlg->selected], 1); redraw_from_window(dlg->win); break; } break; case EV_ABORT: /* Moved this line up so that the dlg would have access to its member vars before they get freed. */ if (dlg->dlg->abort) dlg->dlg->abort(dlg); for (i = 0; i < dlg->n; i++) { struct dialog_item_data *di = &dlg->items[i]; if (di->cdata) mem_free(di->cdata); free_list(di->history); } freeml(dlg->ml); } bla:;}int check_number(struct dialog_data *dlg, struct dialog_item_data *di){ unsigned char *end; long l = strtol(di->cdata, (char **)(void *)&end, 10); if (!*di->cdata || *end) { msg_box(dlg->win->term, NULL, TEXT(T_BAD_NUMBER), AL_CENTER, TEXT(T_NUMBER_EXPECTED), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC); return 1; } if (l < di->item->gid || l > di->item->gnum) { msg_box(dlg->win->term, NULL, TEXT(T_BAD_NUMBER), AL_CENTER, TEXT(T_NUMBER_OUT_OF_RANGE), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC); return 1; } return 0;}int check_nonempty(struct dialog_data *dlg, struct dialog_item_data *di){ unsigned char *p; for (p = di->cdata; *p; p++) if (*p > ' ') return 0; msg_box(dlg->win->term, NULL, TEXT(T_BAD_STRING), AL_CENTER, TEXT(T_EMPTY_STRING_NOT_ALLOWED), NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC); return 1;}int cancel_dialog(struct dialog_data *dlg, struct dialog_item_data *di){ /*struct dialog *dl = dlg->dlg;*/ delete_window(dlg->win); /*mem_free(dl);*/ return 0;}int check_dialog(struct dialog_data *dlg){ int i; for (i = 0; i < dlg->n; i++) if (dlg->dlg->items[i].type == D_CHECKBOX || dlg->dlg->items[i].type == D_FIELD || dlg->dlg->items[i].type == D_FIELD_PASS) if (dlg->dlg->items[i].fn && dlg->dlg->items[i].fn(dlg, &dlg->items[i])) { dlg->selected = i; redraw_dialog(dlg); return 1; } return 0;}int ok_dialog(struct dialog_data *dlg, struct dialog_item_data *di){ int i; void (*fn)(void *) = dlg->dlg->refresh; void *data = dlg->dlg->refresh_data; if (check_dialog(dlg)) return 1; for (i = 0; i < dlg->n; i++) memcpy(dlg->dlg->items[i].data, dlg->items[i].cdata, dlg->dlg->items[i].dlen); if (fn) fn(data); i = cancel_dialog(dlg, di); return i;}void center_dlg(struct dialog_data *dlg){ dlg->x = (dlg->win->term->x - dlg->xw) / 2; dlg->y = (dlg->win->term->y - dlg->yw) / 2;}void draw_dlg(struct dialog_data *dlg){ fill_area(dlg->win->term, dlg->x, dlg->y, dlg->xw, dlg->yw, COLOR_DIALOG);}void max_text_width(struct terminal *term, unsigned char *text, int *width){ text = _(text, term); do { int c = 0; while (*text && *text != '\n') text++, c++; if (c > *width) *width = c; } while (*(text++));}void min_text_width(struct terminal *term, unsigned char *text, int *width){ text = _(text, term); do { int c = 0; while (*text && *text != '\n' && *text != ' ') text++, c++; if (c > *width) *width = c; } while (*(text++));}void dlg_format_text(struct terminal *term, struct terminal *t2, unsigned char *text, int x, int *y, int w, int *rw, int co, int align){ text = _(text, t2); do { unsigned char *tx; unsigned char *tt = text; int s; int xx = x; do { while (*text && *text != '\n' && *text != ' ') { /*if (term) set_char(term, xx, *y, co | *text);*/ text++, xx++; } tx = ++text; xx++; if (*(text - 1) != ' ') break; while (*tx && *tx != '\n' && *tx != ' ') tx++; } while (tx - text + xx - x <= w); s = (align & AL_MASK) == AL_CENTER ? (w - (xx - 1 - x)) / 2 : 0; if (s < 0) s = 0; while (tt < text - 1) { if (s >= w) { s = 0, (*y)++; if (rw) *rw = w; rw = NULL; } if (term) set_char(term, x + s, *y, co | *tt); s++, tt++; } if (rw && xx - 1 - x > *rw) *rw = xx - 1 - x; (*y)++; } while (*(text - 1));}void max_buttons_width(struct terminal *term, struct dialog_item_data *butt, int n, int *width){ int w = -2; int i; for (i = 0; i < n; i++) w += strlen(_((butt++)->item->text, term)) + 6; if (w > *width) *width = w;}void min_buttons_width(struct terminal *term, struct dialog_item_data *butt, int n, int *width){ int i; for (i = 0; i < n; i++) { int w = strlen(_((butt++)->item->text, term)) + 4; if (w > *width) *width = w; }}void dlg_format_buttons(struct terminal *term, struct terminal *t2, struct dialog_item_data *butt, int n, int x, int *y, int w, int *rw, int align){ int i1 = 0; while (i1 < n) { int i2 = i1 + 1; int mw; while (i2 < n) { mw = 0; max_buttons_width(t2, butt + i1, i2 - i1 + 1, &mw); if (mw <= w) i2++; else break; } mw = 0; max_buttons_width(t2, butt + i1, i2 - i1, &mw); if (rw && mw > *rw) if ((*rw = mw) > w) *rw = w; if (term) { int i; int p = x + ((align & AL_MASK) == AL_CENTER ? (w - mw) / 2 : 0); for (i = i1; i < i2; i++) { butt[i].x = p; butt[i].y = *y; p += (butt[i].l = strlen(_(butt[i].item->text, t2)) + 4) + 2; } } *y += 2; i1 = i2; }}void dlg_format_checkbox(struct terminal *term, struct terminal *t2, struct dialog_item_data *chkb, int x, int *y, int w, int *rw, unsigned char *text){ if (term) { chkb->x = x; chkb->y = *y; } if (rw) *rw -= 4; dlg_format_text(term, t2, text, x + 4, y, w - 4, rw, COLOR_DIALOG_CHECKBOX_TEXT, AL_LEFT); if (rw) *rw += 4;}void dlg_format_checkboxes(struct terminal *term, struct terminal *t2, struct dialog_item_data *chkb, int n, int x, int *y, int w, int *rw, unsigned char **texts){ while (n) { dlg_format_checkbox(term, t2, chkb, x, y, w, rw, _(texts[0], t2)); texts++; chkb++; n--; }}void checkboxes_width(struct terminal *term, unsigned char **texts, int *w, void (*fn)(struct terminal *, unsigned char *, int *)){ while (texts[0]) { *w -= 4; fn(term, _(texts[0], term), w); *w += 4; texts++; }}void dlg_format_field(struct terminal *term, struct terminal *t2, struct dialog_item_data *item, int x, int *y, int w, int *rw, int align){ item->x = x; item->y = *y; item->l = w; /*if ((item->l = w) > item->item->dlen - 1) item->l = item->item->dlen - 1;*/ if (rw && item->l > *rw) if ((*rw = item->l) > w) *rw = w; (*y)++;}/* Layout for generic boxes */void dlg_format_box(struct terminal *term, struct terminal *t2, struct dialog_item_data *item, int x, int *y, int w, int *rw, int align) { item->x = x; item->y = *y; item->l = w; if (rw && item->l > *rw) if ((*rw = item->l) > w) *rw = w; (*y) += item->item->gid;}void max_group_width(struct terminal *term, unsigned char **texts, struct dialog_item_data *item, int n, int *w){ int ww = 0; while (n--) { int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, term)) + 5 : (size_t)item->item->dlen + 1; wx += strlen(_(texts[0], term)); if (n) wx++; ww += wx; texts++; item++; } if (ww > *w) *w = ww;}void min_group_width(struct terminal *term, unsigned char **texts, struct dialog_item_data *item, int n, int *w){ while (n--) { int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, term)) + 5 : (size_t)item->item->dlen + 1; wx += strlen(_(texts[0], term)); if (wx > *w) *w = wx; texts++; item++; }}void dlg_format_group(struct terminal *term, struct terminal *t2, unsigned char **texts, struct dialog_item_data *item, int n, int x, int *y, int w, int *rw){ int nx = 0; while (n--) { int sl; int wx = item->item->type == D_CHECKBOX ? 4 : item->item->type == D_BUTTON ? strlen(_(item->item->text, t2)) + 5 : (size_t)item->item->dlen + 1; if (_(texts[0], t2)[0]) sl = strlen(_(texts[0], t2)); else sl = -1; wx += sl; if (nx && nx + wx > w) { nx = 0; (*y) += 2; } if (term) { print_text(term, x + nx + 4 * (item->item->type == D_CHECKBOX), *y, strlen(_(texts[0], t2)), _(texts[0], t2), COLOR_DIALOG_TEXT); item->x = x + nx + (sl + 1) * (item->item->type != D_CHECKBOX); item->y = *y; if (item->item->type == D_FIELD || item->item->type == D_FIELD_PASS) item->l = item->item->dlen; } if (rw && nx + wx > *rw) if ((*rw = nx + wx) > w) *rw = w; nx += wx + 1; texts++; item++; } (*y)++;}void checkbox_list_fn(struct dialog_data *dlg){ struct terminal *term = dlg->win->term; int max = 0, min = 0; int w, rw; int y = 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?