📄 bfu.c
字号:
s = 2; } } if (!s) { delete_window_ev(win, (ev->x >= KBD_F1 && ev->x <= KBD_F12) || ev->y & KBD_ALT ? ev : NULL); break; } draw_to_window(win, (void (*)(struct terminal *, void *))display_mainmenu, menu); if (s == 2) select_mainmenu(win->term, menu); break; case EV_ABORT: break; }}struct menu_item *new_menu(int free_i){ struct menu_item *mi; mi = mem_calloc(sizeof(struct menu_item)); mi->free_i = free_i; return mi;}void add_to_menu(struct menu_item **mi, unsigned char *text, unsigned char *rtext, unsigned char *hotkey, void (*func)(struct terminal *, void *, void *), void *data, int in_m, int pos){ struct menu_item *mii; int n; if (pos != -1) { n = pos; if ((*mi)[n].text) internal("invalid menu position %d", n); } else { for (n = 0; (*mi)[n].text; n++) if (n == MAXINT) overalloc(); } if (((unsigned)n + 2) > MAXINT / sizeof(struct menu_item)) overalloc(); mii = mem_realloc(*mi, (n + 2) * sizeof(struct menu_item)); *mi = mii; memcpy(mii + n + 1, mii + n, sizeof(struct menu_item)); mii[n].text = text; mii[n].rtext = rtext; mii[n].hotkey = hotkey; mii[n].func = func; mii[n].data = data; mii[n].in_m = in_m;}void do_dialog(struct terminal *term, struct dialog *dlg, struct memory_list *ml){ struct dialog_data *dd; struct dialog_item *d; int n = 0; for (d = dlg->items; d->type != D_END; d++) { if (n == MAXINT) overalloc(); n++; } if ((unsigned)n > (MAXINT - sizeof(struct dialog_data)) / sizeof(struct dialog_item_data)) overalloc(); dd = mem_calloc(sizeof(struct dialog_data) + sizeof(struct dialog_item_data) * n); dd->dlg = dlg; dd->n = n; dd->ml = ml; add_window(term, dialog_func, dd);}void display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int sel){ struct terminal *term = dlg->win->term; if (!F) switch (di->item->type) { int co; unsigned char *text, *t, *tt; case D_CHECKBOX: if (di->item->gid) /* radio */ { if (di->checked) print_text(term, di->x, di->y, 3, "[X]", COLOR_DIALOG_CHECKBOX); else print_text(term, di->x, di->y, 3, "[ ]", COLOR_DIALOG_CHECKBOX); } else /* checkbox */ { if (di->checked) print_text(term, di->x, di->y, 3, "[X]", COLOR_DIALOG_CHECKBOX); else print_text(term, di->x, di->y, 3, "[ ]", COLOR_DIALOG_CHECKBOX); } if (sel) { set_cursor(term, di->x + 1, di->y, di->x + 1, di->y); set_window_ptr(dlg->win, di->x, di->y); } break; case D_FIELD: case D_FIELD_PASS: if (di->vpos + di->l <= di->cpos) di->vpos = di->cpos - di->l + 1; if (di->vpos > di->cpos) di->vpos = di->cpos; if (di->vpos < 0) di->vpos = 0; fill_area(term, di->x, di->y, di->l, 1, COLOR_DIALOG_FIELD); if (di->item->type == D_FIELD_PASS) { t = stracpy(di->cdata); for (tt = t; *tt; *tt++ = '*'); } else t = di->cdata; print_text(term, di->x, di->y, strlen(t + di->vpos) <= (size_t)di->l ? (int)strlen(t + di->vpos) : di->l, t + di->vpos, COLOR_DIALOG_FIELD_TEXT); if (di->item->type == D_FIELD_PASS) mem_free(t); if (sel) { set_cursor(term, di->x + di->cpos - di->vpos, di->y, di->x + di->cpos - di->vpos, di->y); set_window_ptr(dlg->win, di->x, di->y); } break; case D_BUTTON: co = sel ? COLOR_DIALOG_BUTTON_SELECTED : COLOR_DIALOG_BUTTON; text = _(di->item->text, term); print_text(term, di->x, di->y, 2, "[ ", co); print_text(term, di->x + 2, di->y, strlen(text), text, co); print_text(term, di->x + 2 + strlen(text), di->y, 2, " ]", co); if (sel) { set_cursor(term, di->x + 2, di->y, di->x + 2, di->y); set_window_ptr(dlg->win, di->x, di->y); } break; default: internal("display_dlg_item: unknown item: %d", di->item->type);#ifdef G } else { struct rect rr; struct graphics_device *dev = term->dev; if (!dlg->s) restrict_clip_area(dev, &rr, dlg->rr.x1, dlg->rr.y1, dlg->rr.x2, dlg->rr.y2); switch (di->item->type) { int p, pp; struct style *st; unsigned char *text, *text2, *text3, *tt, *t; struct rect r; case D_CHECKBOX: p = di->x; if (di->checked) { if (!sel) g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?(G_DIALOG_RADIO_L G_DIALOG_RADIO_X G_DIALOG_RADIO_R):(G_DIALOG_CHECKBOX_L G_DIALOG_CHECKBOX_X G_DIALOG_CHECKBOX_R), &p); else { g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_L:G_DIALOG_CHECKBOX_L, &p); g_print_text(drv, dev, p, di->y, bfu_style_bw_u, di->item->gid?G_DIALOG_RADIO_X:G_DIALOG_CHECKBOX_X, &p); g_print_text(drv, dev, p, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_R:G_DIALOG_CHECKBOX_R, &p); } } else { int s = g_text_width(bfu_style_bw, di->item->gid?G_DIALOG_RADIO_X:G_DIALOG_CHECKBOX_X); g_print_text(drv, dev, di->x, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_L:G_DIALOG_CHECKBOX_L, &p); if (!sel) drv->fill_area(dev, p, di->y, p + s, di->y + G_BFU_FONT_SIZE, bfu_bg_color), p += s; else { restrict_clip_area(dev, &r, p, di->y, p + s, di->y + G_BFU_FONT_SIZE); g_print_text(drv, dev, p, di->y, bfu_style_bw_u, " ", NULL); p += s; drv->set_clip_area(dev, &r); } g_print_text(drv, dev, p, di->y, bfu_style_bw, di->item->gid?G_DIALOG_RADIO_R:G_DIALOG_CHECKBOX_R, &p); } di->l = p - di->x; if (sel) set_window_ptr(dlg->win, di->x, di->y + G_BFU_FONT_SIZE); if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, p, di->y + G_BFU_FONT_SIZE); break; case D_FIELD: case D_FIELD_PASS: if (!(text = memacpy(di->cdata, di->cpos))) break; if (*(text2 = text3 = di->cdata + di->cpos)) { GET_UTF_8(text3, p); text2 = memacpy(text2, text3 - text2); } else { text2 = stracpy(" "); text3 = ""; } if (!text2) { mem_free(text); break; } text3 = stracpy(text3); if (di->item->type == D_FIELD_PASS) { unsigned d; for (tt = t = text; *tt; ) { t = tt; GET_UTF_8(tt, d); *t++ = '*'; } *t = 0; if (di->cdata[di->cpos]) { for (tt = t = text2; *tt; ) { t = tt; GET_UTF_8(tt, d); *t++ = '*'; } *t = 0; for (tt = t = text3; *tt; ) { t = tt; GET_UTF_8(tt, d); *t++ = '*'; } *t = 0; } } p = g_text_width(bfu_style_wb_mono, text); pp = g_text_width(bfu_style_wb_mono, text2); if (di->vpos + di->l < p + pp) di->vpos = p + pp - di->l; if (di->vpos > p) di->vpos = p; if (di->vpos < 0) di->vpos = 0; if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE); restrict_clip_area(dev, &r, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE); p = di->x - di->vpos; g_print_text(drv, dev, p, di->y, bfu_style_wb_mono, text, &p); g_print_text(drv, dev, p, di->y, sel ? bfu_style_wb_mono_u : bfu_style_wb_mono, text2, &p); g_print_text(drv, dev, p, di->y, bfu_style_wb_mono, text3, &p); drv->fill_area(dev, p, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE, bfu_fg_color); drv->set_clip_area(dev, &r); mem_free(text); mem_free(text2); mem_free(text3); if (sel) { set_window_ptr(dlg->win, di->x, di->y); } break; case D_BUTTON: st = sel ? bfu_style_wb_b : bfu_style_bw; text = _(di->item->text, term); text2 = mem_alloc(strlen(text) + 5); strcpy(text2, G_DIALOG_BUTTON_L); strcpy(text2 + 2, text); strcat(text2, G_DIALOG_BUTTON_R); di->l = 0; g_print_text(drv, dev, di->x, di->y, st, text2, &di->l); mem_free(text2); if (dlg->s) exclude_from_set(&dlg->s, di->x, di->y, di->x + di->l, di->y + G_BFU_FONT_SIZE); if (sel) set_window_ptr(dlg->win, di->x, di->y + G_BFU_FONT_SIZE); break; default: internal("display_dlg_item: unknown item: %d", di->item->type); } if (!dlg->s) drv->set_clip_area(dev, &rr);#endif }}struct dspd { struct dialog_data *dlg; struct dialog_item_data *di; int sel;};void u_display_dlg_item(struct terminal *term, void *p){ struct dspd *d = p; display_dlg_item(d->dlg, d->di, d->sel);}void x_display_dlg_item(struct dialog_data *dlg, struct dialog_item_data *di, int sel){ struct dspd dspd; dspd.dlg = dlg, dspd.di = di, dspd.sel = sel; draw_to_window(dlg->win, u_display_dlg_item, &dspd);}void dlg_select_item(struct dialog_data *dlg, struct dialog_item_data *di){ if (di->item->type == D_CHECKBOX) { if (!di->item->gid) di -> checked = *(int *)di->cdata = !*(int *)di->cdata; else { int i; for (i = 0; i < dlg->n; i++) { if (dlg->items[i].item->type == D_CHECKBOX && dlg->items[i].item->gid == di->item->gid) { *(int *)dlg->items[i].cdata = di->item->gnum; dlg->items[i].checked = 0; x_display_dlg_item(dlg, &dlg->items[i], 0); } } di->checked = 1; } x_display_dlg_item(dlg, di, 1); } else if (di->item->type == D_BUTTON) di->item->fn(dlg, di);}void dlg_set_history(struct dialog_item_data *di){ unsigned char *s = ""; int l; if ((void *)di->cur_hist != &di->history) s = di->cur_hist->d; if ((l = strlen(s)) > di->item->dlen) l = di->item->dlen - 1; memcpy(di->cdata, s, l); di->cdata[l] = 0; di->cpos = l; di->vpos = 0;}int dlg_mouse(struct dialog_data *dlg, struct dialog_item_data *di, struct event *ev){ switch (di->item->type) { case D_BUTTON: if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + (int)gf_val(strlen(_(di->item->text, dlg->win->term)) + 4, (size_t)di->l)) return 0; if (dlg->selected != di - dlg->items) { x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0); dlg->selected = di - dlg->items; x_display_dlg_item(dlg, di, 1); } if ((ev->b & BM_ACT) == B_UP) dlg_select_item(dlg, di); return 1; case D_FIELD: case D_FIELD_PASS: if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + di->l) return 0; if (!F) { if ((size_t)(di->cpos = di->vpos + ev->x - di->x) > strlen(di->cdata)) di->cpos = strlen(di->cdata);#ifdef G } else { int p, u; unsigned char *t = di->cdata; p = di->x - di->vpos; while (1) { di->cpos = t - di->cdata; if (!*t) break; GET_UTF_8(t, u); if (!u) continue; p += g_char_width(bfu_style_wb_mono, u); if (p > ev->x) break; }#endif } if (dlg->selected != di - dlg->items) { x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0); dlg->selected = di - dlg->items; x_display_dlg_item(dlg, di, 1); } else x_display_dlg_item(dlg, di, 1); return 1; case D_CHECKBOX: if (gf_val(ev->y != di->y, ev->y < di->y || ev->y >= di->y + G_BFU_FONT_SIZE) || ev->x < di->x || ev->x >= di->x + gf_val(3, di->l)) return 0; if (dlg->selected != di - dlg->items) { x_display_dlg_item(dlg, &dlg->items[dlg->selected], 0); dlg->selected = di - dlg->items; x_display_dlg_item(dlg, di, 1); } if ((ev->b & BM_ACT) == B_UP) dlg_select_item(dlg, di); return 1; } return 0;}void redraw_dialog_items(struct terminal *term, struct dialog_data *dlg){ int i; for (i = 0; i < dlg->n; i++) display_dlg_item(dlg, &dlg->items[i], i == dlg->selected);}int dlg_is_braille_moving(struct dialog_data *dlg){ return dlg->win->term->spec->braille && (dlg->dlg->fn == msg_box_fn || dlg->dlg->fn == download_window_function);}void redraw_dialog(struct terminal *term, struct dialog_data *dlg){#ifdef G int i;#endif dlg->dlg->fn(dlg); redraw_dialog_items(term, dlg); if (dlg_is_braille_moving(dlg)) { if (dlg->brl_y < dlg->items[0].y - 3) set_cursor(term, dlg->x + 6, dlg->y + 3 + dlg->brl_y, dlg->x + 6, dlg->y + 3 + dlg->brl_y); }#ifdef G if (F) { drv->set_clip_area(term->dev, &dlg->r); for (i = 0; i < dlg->s->m; i++) if (is_rect_valid(&dlg->s->r[i])) drv->fill_area(term->dev, dlg->s->r[i].x1, dlg->s->r[i].y1, dlg->s->r[i].x2, dlg->s->r[i].y2, bfu_bg_color); mem_free(dlg->s); dlg->s = NULL; }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -