1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-09-28 03:06:20 -04:00

[color] Removed code related to draw_text_node

This idea failed. Code was slow.
This commit is contained in:
Witold Filipczyk 2022-10-16 15:18:34 +02:00
parent d0537ce3c0
commit c086cbe26e
22 changed files with 303 additions and 990 deletions

View File

@ -184,19 +184,19 @@ static widget_handler_status_T
display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
{ {
struct terminal *term = dlg_data->win->term; struct terminal *term = dlg_data->win->term;
unsigned int color_node, shortcut_color_node; struct color_pair *color, *shortcut_color;
struct el_box *pos = &widget_data->box; struct el_box *pos = &widget_data->box;
int len, x; int len, x;
int sel = is_selected_widget(dlg_data, widget_data); int sel = is_selected_widget(dlg_data, widget_data);
if (sel) { if (sel) {
shortcut_color_node = get_bfu_color_node(term, "dialog.button-shortcut-selected"); shortcut_color = get_bfu_color(term, "dialog.button-shortcut-selected");
color_node = get_bfu_color_node(term, "dialog.button-selected"); color = get_bfu_color(term, "dialog.button-selected");
} else { } else {
shortcut_color_node = get_bfu_color_node(term, "dialog.button-shortcut"); shortcut_color = get_bfu_color(term, "dialog.button-shortcut");
color_node = get_bfu_color_node(term, "dialog.button"); color = get_bfu_color(term, "dialog.button");
} }
if (!color_node || !shortcut_color_node) return EVENT_PROCESSED; if (!color || !shortcut_color) return EVENT_PROCESSED;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
if (term->utf8_cp) { if (term->utf8_cp) {
@ -215,7 +215,7 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
} }
draw_dlg_text_node(dlg_data, pos->x, pos->y, BUTTON_LEFT, BUTTON_LEFT_LEN, 0, color_node); draw_dlg_text(dlg_data, pos->x, pos->y, BUTTON_LEFT, BUTTON_LEFT_LEN, 0, color);
if (len > 0) { if (len > 0) {
char *text = widget_data->widget->text; char *text = widget_data->widget->text;
int hk_pos = widget_data->widget->info.button.hotkey_pos; int hk_pos = widget_data->widget->info.button.hotkey_pos;
@ -240,18 +240,18 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
NULL); NULL);
if (hk_pos) if (hk_pos)
draw_dlg_text_node(dlg_data, x, pos->y, draw_dlg_text(dlg_data, x, pos->y,
text, hk_pos, 0, color_node); text, hk_pos, 0, color);
draw_dlg_text_node(dlg_data, x + cells_to_hk, pos->y, draw_dlg_text(dlg_data, x + cells_to_hk, pos->y,
&text[hk_pos + 1], hk_bytes, &text[hk_pos + 1], hk_bytes,
attr, shortcut_color_node); attr, shortcut_color);
if (right > 1) if (right > 1)
draw_dlg_text_node(dlg_data, x+cells_to_hk+hk_cells, draw_dlg_text(dlg_data, x+cells_to_hk+hk_cells,
pos->y, pos->y,
&text[hk_pos + hk_bytes + 1], &text[hk_pos + hk_bytes + 1],
right - 1, 0, color_node); right - 1, 0, color);
} else { } else {
int hk_width = utf8_char2cells(text, NULL); int hk_width = utf8_char2cells(text, NULL);
@ -261,13 +261,13 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
len - hk_width, len - hk_width,
NULL); NULL);
draw_dlg_text_node(dlg_data, x, pos->y, draw_dlg_text(dlg_data, x, pos->y,
text, hk_len, text, hk_len,
attr, shortcut_color_node); attr, shortcut_color);
draw_dlg_text_node(dlg_data, x + hk_width, pos->y, draw_dlg_text(dlg_data, x + hk_width, pos->y,
&text[hk_len], len_to_display, &text[hk_len], len_to_display,
0, color_node); 0, color);
} }
} else } else
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
@ -275,18 +275,18 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
int right = widget_data->widget->info.button.truetextlen - hk_pos - 1; int right = widget_data->widget->info.button.truetextlen - hk_pos - 1;
if (hk_pos) { if (hk_pos) {
draw_dlg_text_node(dlg_data, x, pos->y, text, hk_pos, 0, color_node); draw_dlg_text(dlg_data, x, pos->y, text, hk_pos, 0, color);
} }
draw_dlg_text_node(dlg_data, x + hk_pos, pos->y, draw_dlg_text(dlg_data, x + hk_pos, pos->y,
&text[hk_pos + 1], 1, attr, shortcut_color_node); &text[hk_pos + 1], 1, attr, shortcut_color);
if (right > 1) { if (right > 1) {
draw_dlg_text_node(dlg_data, x + hk_pos + 1, pos->y, draw_dlg_text(dlg_data, x + hk_pos + 1, pos->y,
&text[hk_pos + 2], right - 1, 0, color_node); &text[hk_pos + 2], right - 1, 0, color);
} }
} else { } else {
draw_dlg_text_node(dlg_data, x, pos->y, text, 1, attr, shortcut_color_node); draw_dlg_text(dlg_data, x, pos->y, text, 1, attr, shortcut_color);
draw_dlg_text_node(dlg_data, x + 1, pos->y, &text[1], len - 1, 0, color_node); draw_dlg_text(dlg_data, x + 1, pos->y, &text[1], len - 1, 0, color);
} }
} }
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -294,12 +294,12 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data)
int text_cells = utf8_ptr2cells(widget_data->widget->text, NULL); int text_cells = utf8_ptr2cells(widget_data->widget->text, NULL);
int hk = (widget_data->widget->info.button.hotkey_pos >= 0); int hk = (widget_data->widget->info.button.hotkey_pos >= 0);
draw_dlg_text_node(dlg_data, x + text_cells - hk, pos->y, draw_dlg_text(dlg_data, x + text_cells - hk, pos->y,
BUTTON_RIGHT, BUTTON_RIGHT_LEN, 0, color_node); BUTTON_RIGHT, BUTTON_RIGHT_LEN, 0, color);
} else } else
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
draw_dlg_text_node(dlg_data, x + len, pos->y, BUTTON_RIGHT, draw_dlg_text(dlg_data, x + len, pos->y, BUTTON_RIGHT,
BUTTON_RIGHT_LEN, 0, color_node); BUTTON_RIGHT_LEN, 0, color);
if (sel) { if (sel) {
set_dlg_cursor(term, dlg_data, x, pos->y, 1); set_dlg_cursor(term, dlg_data, x, pos->y, 1);
set_dlg_window_ptr(dlg_data, dlg_data->win, pos->x, pos->y); set_dlg_window_ptr(dlg_data, dlg_data->win, pos->x, pos->y);

View File

@ -50,11 +50,10 @@ dlg_format_checkbox(struct dialog_data *dlg_data,
if (text && *text) { if (text && *text) {
if (rw) *rw -= CHECKBOX_LS; if (rw) *rw -= CHECKBOX_LS;
dlg_format_text_do_node(dlg_data, text, x + CHECKBOX_LS, y, dlg_format_text_do(dlg_data, text, x + CHECKBOX_LS, y,
w - CHECKBOX_LS, rw, w - CHECKBOX_LS, rw,
get_bfu_color_node(term, "dialog.checkbox-label"), get_bfu_color(term, "dialog.checkbox-label"),
align, format_only); align, format_only);
if (rw) *rw += CHECKBOX_LS; if (rw) *rw += CHECKBOX_LS;
} }
} }
@ -63,24 +62,24 @@ static widget_handler_status_T
display_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data) display_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
{ {
struct terminal *term = dlg_data->win->term; struct terminal *term = dlg_data->win->term;
unsigned int color_node; struct color_pair *color;
const char *text; const char *text;
struct el_box *pos = &widget_data->box; struct el_box *pos = &widget_data->box;
int selected = is_selected_widget(dlg_data, widget_data); int selected = is_selected_widget(dlg_data, widget_data);
if (selected) { if (selected) {
color_node = get_bfu_color_node(term, "dialog.checkbox-selected"); color = get_bfu_color(term, "dialog.checkbox-selected");
} else { } else {
color_node = get_bfu_color_node(term, "dialog.checkbox"); color = get_bfu_color(term, "dialog.checkbox");
} }
if (!color_node) return EVENT_PROCESSED; if (!color) return EVENT_PROCESSED;
if (widget_data->info.checkbox.checked) if (widget_data->info.checkbox.checked)
text = widget_data->widget->info.checkbox.gid ? "(X)" : "[X]"; text = widget_data->widget->info.checkbox.gid ? "(X)" : "[X]";
else else
text = widget_data->widget->info.checkbox.gid ? "( )" : "[ ]"; text = widget_data->widget->info.checkbox.gid ? "( )" : "[ ]";
draw_dlg_text_node(dlg_data, pos->x, pos->y, text, CHECKBOX_LEN, 0, color_node); draw_dlg_text(dlg_data, pos->x, pos->y, text, CHECKBOX_LEN, 0, color);
if (selected) { if (selected) {
set_dlg_cursor(term, dlg_data, pos->x + 1, pos->y, 1); set_dlg_cursor(term, dlg_data, pos->x + 1, pos->y, 1);

View File

@ -72,7 +72,7 @@ void
redraw_dialog(struct dialog_data *dlg_data, int layout) redraw_dialog(struct dialog_data *dlg_data, int layout)
{ {
struct terminal *term = dlg_data->win->term; struct terminal *term = dlg_data->win->term;
unsigned int title_color_node; struct color_pair *title_color;
if (layout) { if (layout) {
dlg_data->dlg->layouter(dlg_data); dlg_data->dlg->layouter(dlg_data);
@ -91,12 +91,12 @@ redraw_dialog(struct dialog_data *dlg_data, int layout)
dlg_data->box.width - 2 * (DIALOG_LEFT_BORDER + 1), dlg_data->box.width - 2 * (DIALOG_LEFT_BORDER + 1),
dlg_data->box.height - 2 * (DIALOG_TOP_BORDER + 1)); dlg_data->box.height - 2 * (DIALOG_TOP_BORDER + 1));
draw_border_node(term, &dlg_data->real_box, get_bfu_color_node(term, "dialog.frame"), DIALOG_FRAME); draw_border(term, &dlg_data->real_box, get_bfu_color(term, "dialog.frame"), DIALOG_FRAME);
assert(dlg_data->dlg->title); assert(dlg_data->dlg->title);
title_color_node = get_bfu_color_node(term, "dialog.title"); title_color = get_bfu_color(term, "dialog.title");
if (title_color_node && dlg_data->real_box.width > 2) { if (title_color && dlg_data->real_box.width > 2) {
char *title = dlg_data->dlg->title; char *title = dlg_data->dlg->title;
int titlelen = strlen(title); int titlelen = strlen(title);
int titlecells = titlelen; int titlecells = titlelen;
@ -120,10 +120,10 @@ redraw_dialog(struct dialog_data *dlg_data, int layout)
y = dlg_data->real_box.y - 1; y = dlg_data->real_box.y - 1;
draw_text_node(term, x - 1, y, " ", 1, 0, title_color_node); draw_text(term, x - 1, y, " ", 1, 0, title_color);
draw_text_node(term, x, y, title, titlelen, 0, title_color_node); draw_text(term, x, y, title, titlelen, 0, title_color);
draw_text_node(term, x + titlecells, y, " ", 1, 0, draw_text(term, x + titlecells, y, " ", 1, 0,
title_color_node); title_color);
} }
} }
@ -686,13 +686,13 @@ draw_dialog(struct dialog_data *dlg_data, int width, int height)
(term->width - dlg_width) / 2, (term->height - dlg_height) / 2, (term->width - dlg_width) / 2, (term->height - dlg_height) / 2,
dlg_width, dlg_height); dlg_width, dlg_height);
draw_box_node(term, &dlg_data->box, ' ', 0, draw_box(term, &dlg_data->box, ' ', 0,
get_bfu_color_node(term, "dialog.generic")); get_bfu_color(term, "dialog.generic"));
if (get_opt_bool("ui.dialogs.shadows", NULL)) { if (get_opt_bool("ui.dialogs.shadows", NULL)) {
/* Draw shadow */ /* Draw shadow */
draw_shadow_node(term, &dlg_data->box, draw_shadow(term, &dlg_data->box,
get_bfu_color_node(term, "dialog.shadow"), 2, 1); get_bfu_color(term, "dialog.shadow"), 2, 1);
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
if (term->utf8_cp) if (term->utf8_cp)
fix_dwchar_around_box(term, &dlg_data->box, 0, 2, 1); fix_dwchar_around_box(term, &dlg_data->box, 0, 2, 1);

View File

@ -28,7 +28,7 @@ dlg_format_group(struct dialog_data *dlg_data,
int space_between_widgets = 1; int space_between_widgets = 1;
int line_width = 0; int line_width = 0;
int xpos; int xpos;
unsigned int color_node = get_bfu_color_node(term, "dialog.text"); struct color_pair *color = get_bfu_color(term, "dialog.text");
assert(n > 0); assert(n > 0);
if_assert_failed return; if_assert_failed return;
@ -88,18 +88,18 @@ dlg_format_group(struct dialog_data *dlg_data,
text, text,
label_length, label_length,
NULL); NULL);
draw_dlg_text_node(dlg_data, xpos + width draw_dlg_text(dlg_data, xpos + width
+ label_padding, + label_padding,
*y, text, lb, 0, *y, text, lb, 0,
color_node); color);
} else } else
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
{ {
draw_dlg_text_node(dlg_data, xpos + width draw_dlg_text(dlg_data, xpos + width
+ label_padding, + label_padding,
*y, text, *y, text,
label_length, 0, label_length, 0,
color_node); color);
} }
} }
@ -114,14 +114,14 @@ dlg_format_group(struct dialog_data *dlg_data,
text, text,
label_length, label_length,
NULL); NULL);
draw_dlg_text_node(dlg_data, xpos, *y, draw_dlg_text(dlg_data, xpos, *y,
text, lb, 0, color_node); text, lb, 0, color);
} else } else
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
{ {
draw_dlg_text_node(dlg_data, xpos, *y, draw_dlg_text(dlg_data, xpos, *y,
text, label_length, text, label_length,
0, color_node); 0, color);
} }
} }

View File

@ -111,7 +111,7 @@ dlg_format_field(struct dialog_data *dlg_data,
static int max_label_width; static int max_label_width;
static int *prev_y; /* Assert the uniqueness of y */ /* TODO: get rid of this !! --Zas */ static int *prev_y; /* Assert the uniqueness of y */ /* TODO: get rid of this !! --Zas */
char *label = widget_data->widget->text; char *label = widget_data->widget->text;
unsigned int text_color_node = 0; struct color_pair *text_color = NULL;
int label_width = 0; int label_width = 0;
int float_label = widget_data->widget->info.field.flags & (INPFIELD_FLOAT|INPFIELD_FLOAT2); int float_label = widget_data->widget->info.field.flags & (INPFIELD_FLOAT|INPFIELD_FLOAT2);
@ -131,11 +131,9 @@ dlg_format_field(struct dialog_data *dlg_data,
} }
if (label && *label) { if (label && *label) {
if (!format_only) { if (!format_only) text_color = get_bfu_color(term, "dialog.text");
text_color_node = get_bfu_color_node(term, "dialog.text");
}
dlg_format_text_do_node(dlg_data, label, x, y, w, rw, text_color_node, ALIGN_LEFT, format_only); dlg_format_text_do(dlg_data, label, x, y, w, rw, text_color, ALIGN_LEFT, format_only);
} }
/* XXX: We want the field and label on the same line if the terminal /* XXX: We want the field and label on the same line if the terminal
@ -143,9 +141,9 @@ dlg_format_field(struct dialog_data *dlg_data,
if (label && *label && float_label) { if (label && *label && float_label) {
if (widget_data->widget->info.field.flags & INPFIELD_FLOAT) { if (widget_data->widget->info.field.flags & INPFIELD_FLOAT) {
(*y) -= INPUTFIELD_HEIGHT; (*y) -= INPUTFIELD_HEIGHT;
dlg_format_text_do_node(dlg_data, INPUTFIELD_FLOAT_SEPARATOR, dlg_format_text_do(dlg_data, INPUTFIELD_FLOAT_SEPARATOR,
x + label_width, y, w, rw, x + label_width, y, w, rw,
text_color_node, ALIGN_LEFT, format_only); text_color, ALIGN_LEFT, format_only);
w -= INPUTFIELD_FLOAT_SEPARATOR_LEN + INPUTFIELD_FLOATLABEL_PADDING; w -= INPUTFIELD_FLOAT_SEPARATOR_LEN + INPUTFIELD_FLOATLABEL_PADDING;
x += INPUTFIELD_FLOAT_SEPARATOR_LEN + INPUTFIELD_FLOATLABEL_PADDING; x += INPUTFIELD_FLOAT_SEPARATOR_LEN + INPUTFIELD_FLOATLABEL_PADDING;
} }
@ -267,7 +265,7 @@ display_field_do(struct dialog_data *dlg_data, struct widget_data *widget_data,
int hide) int hide)
{ {
struct terminal *term = dlg_data->win->term; struct terminal *term = dlg_data->win->term;
unsigned int color_node; struct color_pair *color;
int sel = is_selected_widget(dlg_data, widget_data); int sel = is_selected_widget(dlg_data, widget_data);
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
int len = 0, left = 0; int len = 0, left = 0;
@ -291,16 +289,12 @@ display_field_do(struct dialog_data *dlg_data, struct widget_data *widget_data,
int_lower_bound(&widget_data->info.field.vpos, 0); int_lower_bound(&widget_data->info.field.vpos, 0);
} }
color_node = get_bfu_color_node(term, "dialog.field"); color = get_bfu_color(term, "dialog.field");
if (color)
if (color_node) { draw_box(term, &widget_data->box, ' ', 0, color);
draw_box_node(term, &widget_data->box, ' ', 0, color_node);
}
color_node = get_bfu_color_node(term, "dialog.field-text");
if (color_node) {
color = get_bfu_color(term, "dialog.field-text");
if (color) {
char *text = widget_data->cdata + widget_data->info.field.vpos; char *text = widget_data->cdata + widget_data->info.field.vpos;
int len, w; int len, w;
@ -319,15 +313,15 @@ display_field_do(struct dialog_data *dlg_data, struct widget_data *widget_data,
if (term->utf8_cp) if (term->utf8_cp)
w = utf8_cells2bytes(text, w, NULL); w = utf8_cells2bytes(text, w, NULL);
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
draw_dlg_text_node(dlg_data, widget_data->box.x, widget_data->box.y, draw_dlg_text(dlg_data, widget_data->box.x, widget_data->box.y,
text, w, 0, color_node); text, w, 0, color);
} else { } else {
struct el_box box; struct el_box box;
copy_box(&box, &widget_data->box); copy_box(&box, &widget_data->box);
box.width = w; box.width = w;
draw_box_node(term, &box, '*', 0, color_node); draw_box(term, &box, '*', 0, color);
} }
} }
@ -601,9 +595,9 @@ kbd_field(struct dialog_data *dlg_data, struct widget_data *widget_data)
int cdata_len = strlen(widget_data->cdata); int cdata_len = strlen(widget_data->cdata);
int start = widget_data->info.field.cpos; int start = widget_data->info.field.cpos;
while (start > 0 && isspace((unsigned char)widget_data->cdata[start - 1])) while (start > 0 && isspace(widget_data->cdata[start - 1]))
--start; --start;
while (start > 0 && !isspace((unsigned char)widget_data->cdata[start - 1])) while (start > 0 && !isspace(widget_data->cdata[start - 1]))
--start; --start;
memmove(widget_data->cdata + start, memmove(widget_data->cdata + start,
@ -616,19 +610,19 @@ kbd_field(struct dialog_data *dlg_data, struct widget_data *widget_data)
} }
case ACT_EDIT_MOVE_BACKWARD_WORD: case ACT_EDIT_MOVE_BACKWARD_WORD:
while (widget_data->info.field.cpos > 0 && isspace((unsigned char)widget_data->cdata[widget_data->info.field.cpos - 1])) while (widget_data->info.field.cpos > 0 && isspace(widget_data->cdata[widget_data->info.field.cpos - 1]))
--widget_data->info.field.cpos; --widget_data->info.field.cpos;
while (widget_data->info.field.cpos > 0 && !isspace((unsigned char)widget_data->cdata[widget_data->info.field.cpos - 1])) while (widget_data->info.field.cpos > 0 && !isspace(widget_data->cdata[widget_data->info.field.cpos - 1]))
--widget_data->info.field.cpos; --widget_data->info.field.cpos;
goto display_field; goto display_field;
case ACT_EDIT_MOVE_FORWARD_WORD: case ACT_EDIT_MOVE_FORWARD_WORD:
while (isspace((unsigned char)widget_data->cdata[widget_data->info.field.cpos])) while (isspace(widget_data->cdata[widget_data->info.field.cpos]))
++widget_data->info.field.cpos; ++widget_data->info.field.cpos;
while (widget_data->cdata[widget_data->info.field.cpos] && !isspace((unsigned char)widget_data->cdata[widget_data->info.field.cpos])) while (widget_data->cdata[widget_data->info.field.cpos] && !isspace(widget_data->cdata[widget_data->info.field.cpos]))
++widget_data->info.field.cpos; ++widget_data->info.field.cpos;
while (isspace((unsigned char)widget_data->cdata[widget_data->info.field.cpos])) while (isspace(widget_data->cdata[widget_data->info.field.cpos]))
++widget_data->info.field.cpos; ++widget_data->info.field.cpos;
goto display_field; goto display_field;

View File

@ -178,7 +178,7 @@ init_led_panel(struct led_panel *leds)
} }
static int static int
draw_timer_node(struct terminal *term, int xpos, int ypos, unsigned int node_number) draw_timer(struct terminal *term, int xpos, int ypos, struct color_pair *color)
{ {
char s[64]; char s[64];
int i, length; int i, length;
@ -187,14 +187,13 @@ draw_timer_node(struct terminal *term, int xpos, int ypos, unsigned int node_num
length = strlen(s); length = strlen(s);
for (i = length - 1; i >= 0; i--) for (i = length - 1; i >= 0; i--)
draw_char_node(term, xpos - (length - i), ypos, s[i], 0, node_number); draw_char(term, xpos - (length - i), ypos, s[i], 0, color);
return length; return length;
} }
static int static int
draw_show_ip_node(struct session *ses, int xpos, int ypos, unsigned int node_number) draw_show_ip(struct session *ses, int xpos, int ypos, struct color_pair *color)
{ {
if (ses->doc_view && ses->doc_view->document && ses->doc_view->document->ip) { if (ses->doc_view && ses->doc_view->document && ses->doc_view->document->ip) {
struct terminal *term = ses->tab->term; struct terminal *term = ses->tab->term;
@ -203,21 +202,19 @@ draw_show_ip_node(struct session *ses, int xpos, int ypos, unsigned int node_num
int i; int i;
for (i = length - 1; i >= 0; i--) for (i = length - 1; i >= 0; i--)
draw_char_node(term, xpos - (length - i), ypos, s[i], 0, node_number); draw_char(term, xpos - (length - i), ypos, s[i], 0, color);
return length; return length;
} }
return 0; return 0;
} }
static int static int
draw_temperature_node(struct session *ses, int xpos, int ypos, unsigned int node_number) draw_temperature(struct session *ses, int xpos, int ypos, struct color_pair *color)
{ {
struct terminal *term = ses->tab->term; struct terminal *term = ses->tab->term;
FILE *f; FILE *f;
int temp = 0; int temp = 0;
int ret;
struct string text; struct string text;
int i; int i;
int length; int length;
@ -225,16 +222,9 @@ draw_temperature_node(struct session *ses, int xpos, int ypos, unsigned int node
f = fopen(get_leds_temperature_filename(), "r"); f = fopen(get_leds_temperature_filename(), "r");
if (!f) { if (!f) return 0;
return 0; fscanf(f, "%d", &temp);
}
ret = fscanf(f, "%d", &temp);
fclose(f); fclose(f);
if (ret < 1) {
return 0;
}
if (!init_string(&text)) { if (!init_string(&text)) {
return 0; return 0;
} }
@ -255,7 +245,7 @@ draw_temperature_node(struct session *ses, int xpos, int ypos, unsigned int node
#else #else
unsigned char data = pos[i]; unsigned char data = pos[i];
#endif #endif
draw_char_node(term, xpos - length + i, ypos, data, 0, node_number); draw_char(term, xpos - length + i, ypos, data, 0, color);
} }
done_string(&text); done_string(&text);
@ -264,7 +254,7 @@ draw_temperature_node(struct session *ses, int xpos, int ypos, unsigned int node
#ifdef HAVE_STRFTIME #ifdef HAVE_STRFTIME
static int static int
draw_clock_node(struct terminal *term, int xpos, int ypos, unsigned int node_number) draw_clock(struct terminal *term, int xpos, int ypos, struct color_pair *color)
{ {
char s[64]; char s[64];
time_t curtime = time(NULL); time_t curtime = time(NULL);
@ -274,7 +264,7 @@ draw_clock_node(struct terminal *term, int xpos, int ypos, unsigned int node_num
length = strftime(s, sizeof(s), get_leds_clock_format(), loctime); length = strftime(s, sizeof(s), get_leds_clock_format(), loctime);
s[length] = '\0'; s[length] = '\0';
for (i = length - 1; i >= 0; i--) for (i = length - 1; i >= 0; i--)
draw_char_node(term, xpos - (length - i), ypos, s[i], 0, node_number); draw_char(term, xpos - (length - i), ypos, s[i], 0, color);
return length; return length;
} }
@ -299,7 +289,7 @@ void
draw_leds(struct session *ses) draw_leds(struct session *ses)
{ {
struct terminal *term = ses->tab->term; struct terminal *term = ses->tab->term;
unsigned int node_number = 0; struct color_pair *led_color = NULL;
int i; int i;
int xpos = term->width - LEDS_COUNT - 3; int xpos = term->width - LEDS_COUNT - 3;
int ypos = term->height - 1; int ypos = term->height - 1;
@ -309,50 +299,50 @@ draw_leds(struct session *ses)
/* This should be done elsewhere, but this is very nice place where we /* This should be done elsewhere, but this is very nice place where we
* could do that easily. */ * could do that easily. */
if (get_opt_int("ui.timer.enable", NULL) == 2) { if (get_opt_int("ui.timer.enable", NULL) == 2) {
node_number = get_bfu_color_node(term, "status.status-text"); led_color = get_bfu_color(term, "status.status-text");
if (!node_number) goto end; if (!led_color) goto end;
term->leds_length += draw_timer_node(term, xpos, ypos, node_number); term->leds_length += draw_timer(term, xpos, ypos, led_color);
} }
if (!get_leds_panel_enable()) return; if (!get_leds_panel_enable()) return;
if (!node_number) { if (!led_color) {
node_number = get_bfu_color_node(term, "status.status-text"); led_color = get_bfu_color(term, "status.status-text");
if (!node_number) goto end; if (!led_color) goto end;
} }
#ifdef HAVE_STRFTIME #ifdef HAVE_STRFTIME
if (get_leds_clock_enable()) { if (get_leds_clock_enable()) {
term->leds_length += draw_clock_node(term, xpos - term->leds_length, ypos, node_number); term->leds_length += draw_clock(term, xpos - term->leds_length, ypos, led_color);
} }
#endif #endif
if (get_leds_temperature_enable()) { if (get_leds_temperature_enable()) {
unsigned int node_number = get_bfu_color_node(term, "status.status-text"); struct color_pair *color = get_bfu_color(term, "status.status-text");
if (node_number) term->leds_length += draw_temperature_node(ses, xpos - term->leds_length, ypos, node_number); if (color) term->leds_length += draw_temperature(ses, xpos - term->leds_length, ypos, color);
} }
if (get_leds_show_ip_enable()) { if (get_leds_show_ip_enable()) {
unsigned int node_number = get_bfu_color_node(term, "status.showip-text"); struct color_pair *color = get_bfu_color(term, "status.showip-text");
if (node_number) term->leds_length += draw_show_ip_node(ses, xpos - term->leds_length, ypos, node_number); if (color) term->leds_length += draw_show_ip(ses, xpos - term->leds_length, ypos, color);
} }
/* We must shift the whole thing by one char to left, because we don't /* We must shift the whole thing by one char to left, because we don't
* draft the char in the right-down corner :(. */ * draft the char in the right-down corner :(. */
draw_char_node(term, xpos, ypos, '[', 0, node_number); draw_char(term, xpos, ypos, '[', 0, led_color);
for (i = 0; i < LEDS_COUNT; i++) { for (i = 0; i < LEDS_COUNT; i++) {
struct led *led = &ses->status.leds.leds[i]; struct led *led = &ses->status.leds.leds[i];
draw_char_node(term, xpos + i + 1, ypos, led->value__, 0, node_number); draw_char(term, xpos + i + 1, ypos, led->value__, 0, led_color);
led->value_changed__ = 0; led->value_changed__ = 0;
} }
draw_char_node(term, xpos + LEDS_COUNT + 1, ypos, ']', 0, node_number); draw_char(term, xpos + LEDS_COUNT + 1, ypos, ']', 0, led_color);
term->leds_length += LEDS_COUNT + 2; term->leds_length += LEDS_COUNT + 2;

View File

@ -354,20 +354,20 @@ display_listbox_item(struct listbox_item *item, void *data_, int *offset)
{ {
struct listbox_context *data = (struct listbox_context *)data_; struct listbox_context *data = (struct listbox_context *)data_;
int len; /* Length of the current text field. */ int len; /* Length of the current text field. */
unsigned int tree_color_node, text_color_node; struct color_pair *tree_color, *text_color;
int depth = item->depth + 1; int depth = item->depth + 1;
int d; int d;
int x, y; int x, y;
tree_color_node = get_bfu_color_node(data->term, "menu.normal"); tree_color = get_bfu_color(data->term, "menu.normal");
if (item == data->box->sel) { if (item == data->box->sel) {
text_color_node = get_bfu_color_node(data->term, "menu.selected"); text_color = get_bfu_color(data->term, "menu.selected");
} else if (item->marked) { } else if (item->marked) {
text_color_node = get_bfu_color_node(data->term, "menu.marked"); text_color = get_bfu_color(data->term, "menu.marked");
} else { } else {
text_color_node = tree_color_node; text_color = tree_color;
} }
y = data->widget_data->box.y + data->offset; y = data->widget_data->box.y + data->offset;
@ -383,13 +383,13 @@ display_listbox_item(struct listbox_item *item, void *data_, int *offset)
/* XXX */ /* XXX */
x = data->widget_data->box.x + d * 5; x = data->widget_data->box.x + d * 5;
draw_text_node(data->term, x, y, " ", 5, 0, tree_color_node); draw_text(data->term, x, y, " ", 5, 0, tree_color);
if (root ? root->child.prev == child if (root ? root->child.prev == child
: data->box->items->prev == child) : data->box->items->prev == child)
continue; /* We were the last branch. */ continue; /* We were the last branch. */
draw_border_char_node(data->term, x + 1, y, BORDER_SVLINE, tree_color_node); draw_border_char(data->term, x + 1, y, BORDER_SVLINE, tree_color);
} }
if (depth) { if (depth) {
@ -440,7 +440,7 @@ display_listbox_item(struct listbox_item *item, void *data_, int *offset)
x = data->widget_data->box.x + (depth - 1) * 5; x = data->widget_data->box.x + (depth - 1) * 5;
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
draw_border_char_node(data->term, x + i, y, str[i], tree_color_node); draw_border_char(data->term, x + i, y, str[i], tree_color);
} }
} }
@ -451,7 +451,7 @@ display_listbox_item(struct listbox_item *item, void *data_, int *offset)
int width = data->widget_data->box.width - depth * 5; int width = data->widget_data->box.width - depth * 5;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
draw_border_char_node(data->term, x + i, y, BORDER_SHLINE, text_color_node); draw_border_char(data->term, x + i, y, BORDER_SHLINE, text_color);
} }
} else if (data->box->ops && data->box->ops->draw) { } else if (data->box->ops && data->box->ops->draw) {
@ -478,7 +478,7 @@ display_listbox_item(struct listbox_item *item, void *data_, int *offset)
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
len_bytes = len; len_bytes = len;
draw_text_node(data->term, x, y, text, len_bytes, 0, text_color_node); draw_text(data->term, x, y, text, len_bytes, 0, text_color);
mem_free(text); mem_free(text);
} }
@ -505,8 +505,8 @@ display_listbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
listbox_sel_move(widget_data, 0); listbox_sel_move(widget_data, 0);
draw_box_node(term, &widget_data->box, ' ', 0, draw_box(term, &widget_data->box, ' ', 0,
get_bfu_color_node(term, "menu.normal")); get_bfu_color(term, "menu.normal"));
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
data.term = term; data.term = term;

View File

@ -371,8 +371,8 @@ set_menu_selection(struct menu *menu, int pos)
* separators). For double-width glyph width == 2. * separators). For double-width glyph width == 2.
* len - length of text in bytes */ * len - length of text in bytes */
static inline void static inline void
draw_menu_left_text_node(struct terminal *term, char *text, int len, draw_menu_left_text(struct terminal *term, char *text, int len,
int x, int y, int width, unsigned int color_node) int x, int y, int width, struct color_pair *color)
{ {
int w = width - (L_TEXT_SPACE + R_TEXT_SPACE); int w = width - (L_TEXT_SPACE + R_TEXT_SPACE);
int max_len; int max_len;
@ -393,17 +393,17 @@ draw_menu_left_text_node(struct terminal *term, char *text, int len,
if (len > max_len) len = max_len; if (len > max_len) len = max_len;
draw_text_node(term, x + L_TEXT_SPACE, y, text, len, 0, color_node); draw_text(term, x + L_TEXT_SPACE, y, text, len, 0, color);
} }
static inline void static inline void
draw_menu_left_text_hk_node(struct terminal *term, char *text, draw_menu_left_text_hk(struct terminal *term, char *text,
int hotkey_pos, int x, int y, int width, int hotkey_pos, int x, int y, int width,
unsigned int color_node, int selected) struct color_pair *color, int selected)
{ {
unsigned int hk_color_node = get_bfu_color_node(term, "menu.hotkey.normal"); struct color_pair *hk_color = get_bfu_color(term, "menu.hotkey.normal");
unsigned int hk_color_sel_node = get_bfu_color_node(term, "menu.hotkey.selected"); struct color_pair *hk_color_sel = get_bfu_color(term, "menu.hotkey.selected");
screen_char_attr_T hk_attr = get_opt_bool("ui.dialogs.underline_hotkeys", NULL) screen_char_attr_T hk_attr = get_opt_bool("ui.dialogs.underline_hotkeys", NULL)
? SCREEN_ATTR_UNDERLINE : 0; ? SCREEN_ATTR_UNDERLINE : 0;
unsigned char c; unsigned char c;
@ -424,10 +424,10 @@ draw_menu_left_text_hk_node(struct terminal *term, char *text,
if (!hotkey_pos || w <= 0) return; if (!hotkey_pos || w <= 0) return;
if (selected) { if (selected) {
unsigned int tmp = hk_color_node; struct color_pair *tmp = hk_color;
hk_color_node = hk_color_sel_node; hk_color = hk_color_sel;
hk_color_sel_node = tmp; hk_color_sel = tmp;
} }
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -442,14 +442,14 @@ draw_menu_left_text_hk_node(struct terminal *term, char *text,
if (hk_state == 1) { if (hk_state == 1) {
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
draw_char_node(term, xbase + x - 1, y, c, hk_attr, draw_char(term, xbase + x - 1, y, c, hk_attr,
(double_hk ? hk_color_sel_node : hk_color_node)); (double_hk ? hk_color_sel : hk_color));
#else #else
draw_char_node(term, xbase + x - 1, y, c, hk_attr, hk_color_node); draw_char(term, xbase + x - 1, y, c, hk_attr, hk_color);
#endif /* CONFIG_DEBUG */ #endif /* CONFIG_DEBUG */
hk_state = 2; hk_state = 2;
} else { } else {
draw_char_node(term, xbase + x - !!hk_state, y, c, 0, color_node); draw_char(term, xbase + x - !!hk_state, y, c, 0, color);
} }
} }
return; return;
@ -470,30 +470,30 @@ utf8:
if (unicode_to_cell(data) == 2) { if (unicode_to_cell(data) == 2) {
if (x < w && xbase + x < term->width) { if (x < w && xbase + x < term->width) {
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
data, hk_attr, data, hk_attr,
(double_hk ? hk_color_sel_node (double_hk ? hk_color_sel
: hk_color_node)); : hk_color));
#else #else
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
data, hk_attr, hk_color_node); data, hk_attr, hk_color);
#endif /* CONFIG_DEBUG */ #endif /* CONFIG_DEBUG */
x++; x++;
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
UCS_NO_CHAR, 0, hk_color_node); UCS_NO_CHAR, 0, hk_color);
} else { } else {
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
UCS_ORPHAN_CELL, 0, hk_color_node); UCS_ORPHAN_CELL, 0, hk_color);
} }
} else { } else {
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
data, hk_attr, data, hk_attr,
(double_hk ? hk_color_sel_node (double_hk ? hk_color_sel
: hk_color_node)); : hk_color));
#else #else
draw_char_node(term, xbase + x - 1, y, draw_char(term, xbase + x - 1, y,
data, hk_attr, hk_color_node); data, hk_attr, hk_color);
#endif /* CONFIG_DEBUG */ #endif /* CONFIG_DEBUG */
} }
hk_state = 2; hk_state = 2;
@ -501,18 +501,18 @@ utf8:
if (unicode_to_cell(data) == 2) { if (unicode_to_cell(data) == 2) {
if (x - !!hk_state + 1 < w && if (x - !!hk_state + 1 < w &&
xbase + x - !!hk_state + 1 < term->width) { xbase + x - !!hk_state + 1 < term->width) {
draw_char_node(term, xbase + x - !!hk_state, draw_char(term, xbase + x - !!hk_state,
y, data, 0, color_node); y, data, 0, color);
x++; x++;
draw_char_node(term, xbase + x - !!hk_state, draw_char(term, xbase + x - !!hk_state,
y, UCS_NO_CHAR, 0, color_node); y, UCS_NO_CHAR, 0, color);
} else { } else {
draw_char_node(term, xbase + x - !!hk_state, draw_char(term, xbase + x - !!hk_state,
y, UCS_ORPHAN_CELL, 0, color_node); y, UCS_ORPHAN_CELL, 0, color);
} }
} else { } else {
draw_char_node(term, xbase + x - !!hk_state, draw_char(term, xbase + x - !!hk_state,
y, data, 0, color_node); y, data, 0, color);
} }
} }
@ -521,8 +521,8 @@ utf8:
} }
static inline void static inline void
draw_menu_right_text_node(struct terminal *term, char *text, int len, draw_menu_right_text(struct terminal *term, char *text, int len,
int x, int y, int width, unsigned int color_node) int x, int y, int width, struct color_pair *color)
{ {
int w = width - (L_RTEXT_SPACE + R_RTEXT_SPACE); int w = width - (L_RTEXT_SPACE + R_RTEXT_SPACE);
@ -534,17 +534,15 @@ draw_menu_right_text_node(struct terminal *term, char *text, int len,
x += w - len + L_RTEXT_SPACE + L_TEXT_SPACE; x += w - len + L_RTEXT_SPACE + L_TEXT_SPACE;
draw_text_node(term, x, y, text, len, 0, color_node); draw_text(term, x, y, text, len, 0, color);
} }
static void static void
display_menu(struct terminal *term, struct menu *menu) display_menu(struct terminal *term, struct menu *menu)
{ {
unsigned int normal_color_node = get_bfu_color_node(term, "menu.normal"); struct color_pair *normal_color = get_bfu_color(term, "menu.normal");
unsigned int selected_color_node = get_bfu_color_node(term, "menu.selected"); struct color_pair *selected_color = get_bfu_color(term, "menu.selected");
unsigned int frame_color_node = get_bfu_color_node(term, "menu.frame"); struct color_pair *frame_color = get_bfu_color(term, "menu.frame");
struct el_box box; struct el_box box;
int p; int p;
int menu_height; int menu_height;
@ -555,13 +553,13 @@ display_menu(struct terminal *term, struct menu *menu)
int_max(0, menu->box.width - MENU_BORDER_SIZE * 2), int_max(0, menu->box.width - MENU_BORDER_SIZE * 2),
int_max(0, menu->box.height - MENU_BORDER_SIZE * 2)); int_max(0, menu->box.height - MENU_BORDER_SIZE * 2));
draw_box_node(term, &box, ' ', 0, normal_color_node); draw_box(term, &box, ' ', 0, normal_color);
draw_border_node(term, &box, frame_color_node, 1); draw_border(term, &box, frame_color, 1);
if (get_opt_bool("ui.dialogs.shadows", NULL)) { if (get_opt_bool("ui.dialogs.shadows", NULL)) {
/* Draw shadow */ /* Draw shadow */
draw_shadow_node(term, &menu->box, draw_shadow(term, &menu->box,
get_bfu_color_node(term, "dialog.shadow"), 2, 1); get_bfu_color(term, "dialog.shadow"), 2, 1);
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
if (term->utf8_cp) if (term->utf8_cp)
fix_dwchar_around_box(term, &box, 1, 2, 1); fix_dwchar_around_box(term, &box, 1, 2, 1);
@ -578,7 +576,7 @@ display_menu(struct terminal *term, struct menu *menu)
for (p = menu->first; for (p = menu->first;
p < menu->size && p < menu->first + menu_height; p < menu->size && p < menu->first + menu_height;
p++, box.y++) { p++, box.y++) {
unsigned int color_node = normal_color_node; struct color_pair *color = normal_color;
struct menu_item *mi = &menu->items[p]; struct menu_item *mi = &menu->items[p];
int selected = (p == menu->selected); int selected = (p == menu->selected);
@ -590,23 +588,23 @@ display_menu(struct terminal *term, struct menu *menu)
if (selected) { if (selected) {
/* This entry is selected. */ /* This entry is selected. */
color_node = selected_color_node; color = selected_color;
set_cursor(term, box.x, box.y, 1); set_cursor(term, box.x, box.y, 1);
set_window_ptr(menu->win, menu->box.x + menu->box.width, box.y); set_window_ptr(menu->win, menu->box.x + menu->box.width, box.y);
draw_box_node(term, &box, ' ', 0, color_node); draw_box(term, &box, ' ', 0, color);
} }
if (mi_is_horizontal_bar(mi)) { if (mi_is_horizontal_bar(mi)) {
/* Horizontal separator */ /* Horizontal separator */
draw_border_char_node(term, menu->box.x, box.y, draw_border_char(term, menu->box.x, box.y,
BORDER_SRTEE, frame_color_node); BORDER_SRTEE, frame_color);
draw_box_node(term, &box, BORDER_SHLINE, draw_box(term, &box, BORDER_SHLINE,
SCREEN_ATTR_FRAME, frame_color_node); SCREEN_ATTR_FRAME, frame_color);
draw_border_char_node(term, box.x + box.width, box.y, draw_border_char(term, box.x + box.width, box.y,
BORDER_SLTEE, frame_color_node); BORDER_SLTEE, frame_color);
continue; continue;
} }
@ -622,29 +620,29 @@ display_menu(struct terminal *term, struct menu *menu)
l = 0; l = 0;
if (l) { if (l) {
draw_menu_left_text_hk_node(term, text, l, draw_menu_left_text_hk(term, text, l,
box.x, box.y, box.width, color_node, box.x, box.y, box.width, color,
selected); selected);
} else { } else {
draw_menu_left_text_node(term, text, -1, draw_menu_left_text(term, text, -1,
box.x, box.y, box.width, color_node); box.x, box.y, box.width, color);
} }
} }
if (mi_is_submenu(mi)) { if (mi_is_submenu(mi)) {
draw_menu_right_text_node(term, m_submenu, m_submenu_len, draw_menu_right_text(term, m_submenu, m_submenu_len,
menu->box.x, box.y, box.width, color_node); menu->box.x, box.y, box.width, color);
} else if (mi->action_id != ACT_MAIN_NONE) { } else if (mi->action_id != ACT_MAIN_NONE) {
struct string keystroke; struct string keystroke;
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
/* Help to detect action + right text. --Zas */ /* Help to detect action + right text. --Zas */
if (mi_has_right_text(mi)) { if (mi_has_right_text(mi)) {
if (color_node == selected_color_node) if (color == selected_color)
color_node = normal_color_node; color = normal_color;
else else
color_node = selected_color_node; color = selected_color;
} }
#endif /* CONFIG_DEBUG */ #endif /* CONFIG_DEBUG */
@ -652,10 +650,10 @@ display_menu(struct terminal *term, struct menu *menu)
add_keystroke_action_to_string(&keystroke, add_keystroke_action_to_string(&keystroke,
mi->action_id, mi->action_id,
KEYMAP_MAIN); KEYMAP_MAIN);
draw_menu_right_text_node(term, keystroke.source, draw_menu_right_text(term, keystroke.source,
keystroke.length, keystroke.length,
menu->box.x, box.y, menu->box.x, box.y,
box.width, color_node); box.width, color);
done_string(&keystroke); done_string(&keystroke);
} }
@ -667,9 +665,9 @@ display_menu(struct terminal *term, struct menu *menu)
if (*rtext) { if (*rtext) {
/* There's a right text, so print it */ /* There's a right text, so print it */
draw_menu_right_text_node(term, rtext, -1, draw_menu_right_text(term, rtext, -1,
menu->box.x, menu->box.x,
box.y, box.width, color_node); box.y, box.width, color);
} }
} }
} }
@ -1087,8 +1085,8 @@ do_mainmenu(struct terminal *term, struct menu_item *items,
static void static void
display_mainmenu(struct terminal *term, struct menu *menu) display_mainmenu(struct terminal *term, struct menu *menu)
{ {
unsigned int normal_color_node = get_bfu_color_node(term, "menu.normal"); struct color_pair *normal_color = get_bfu_color(term, "menu.normal");
unsigned int selected_color_node = get_bfu_color_node(term, "menu.selected"); struct color_pair *selected_color = get_bfu_color(term, "menu.selected");
int p = 0; int p = 0;
int i; int i;
struct el_box box; struct el_box box;
@ -1117,18 +1115,18 @@ display_mainmenu(struct terminal *term, struct menu *menu)
int_bounds(&menu->first, 0, menu->last); int_bounds(&menu->first, 0, menu->last);
set_box(&box, 0, 0, term->width, 1); set_box(&box, 0, 0, term->width, 1);
draw_box_node(term, &box, ' ', 0, normal_color_node); draw_box(term, &box, ' ', 0, normal_color);
if (menu->first != 0) { if (menu->first != 0) {
box.width = L_MAINMENU_SPACE; box.width = L_MAINMENU_SPACE;
draw_box_node(term, &box, '<', 0, normal_color_node); draw_box(term, &box, '<', 0, normal_color);
} }
p += L_MAINMENU_SPACE; p += L_MAINMENU_SPACE;
for (i = menu->first; i < menu->size; i++) { for (i = menu->first; i < menu->size; i++) {
struct menu_item *mi = &menu->items[i]; struct menu_item *mi = &menu->items[i];
unsigned int color_node = normal_color_node; struct color_pair *color = normal_color;
char *text = mi->text; char *text = mi->text;
int l = mi->hotkey_pos; int l = mi->hotkey_pos;
int textlen; int textlen;
@ -1147,7 +1145,7 @@ display_mainmenu(struct terminal *term, struct menu *menu)
screencnt = textlen; screencnt = textlen;
if (selected) { if (selected) {
color_node = selected_color_node; color = selected_color;
box.x = p; box.x = p;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
if (term->utf8_cp) if (term->utf8_cp)
@ -1160,7 +1158,7 @@ display_mainmenu(struct terminal *term, struct menu *menu)
+ textlen + textlen
+ R_TEXT_SPACE + R_MAINTEXT_SPACE; + R_TEXT_SPACE + R_MAINTEXT_SPACE;
draw_box_node(term, &box, ' ', 0, color_node); draw_box(term, &box, ' ', 0, color);
set_cursor(term, p, 0, 1); set_cursor(term, p, 0, 1);
set_window_ptr(menu->win, p, 1); set_window_ptr(menu->win, p, 1);
} }
@ -1168,13 +1166,13 @@ display_mainmenu(struct terminal *term, struct menu *menu)
p += L_MAINTEXT_SPACE; p += L_MAINTEXT_SPACE;
if (l) { if (l) {
draw_menu_left_text_hk_node(term, text, l, draw_menu_left_text_hk(term, text, l,
p, 0, textlen + R_TEXT_SPACE + L_TEXT_SPACE, p, 0, textlen + R_TEXT_SPACE + L_TEXT_SPACE,
color_node, selected); color, selected);
} else { } else {
draw_menu_left_text_node(term, text, textlen, draw_menu_left_text(term, text, textlen,
p, 0, textlen + R_TEXT_SPACE + L_TEXT_SPACE, p, 0, textlen + R_TEXT_SPACE + L_TEXT_SPACE,
color_node); color);
} }
p += screencnt; p += screencnt;
@ -1207,7 +1205,7 @@ display_mainmenu(struct terminal *term, struct menu *menu)
set_box(&box, set_box(&box,
term->width - R_MAINMENU_SPACE, 0, term->width - R_MAINMENU_SPACE, 0,
R_MAINMENU_SPACE, 1); R_MAINMENU_SPACE, 1);
draw_box_node(term, &box, '>', 0, normal_color_node); draw_box(term, &box, '>', 0, normal_color);
} }
redraw_windows(REDRAW_IN_FRONT_OF_WINDOW, menu->win); redraw_windows(REDRAW_IN_FRONT_OF_WINDOW, menu->win);

View File

@ -20,7 +20,7 @@
#include "util/color.h" #include "util/color.h"
/* FIXME: For UTF-8 strings we need better function than isspace. */ /* FIXME: For UTF-8 strings we need better function than isspace. */
#define is_unsplitable(pos) (*(pos) && *(pos) != '\n' && !isspace((unsigned char)*(pos))) #define is_unsplitable(pos) (*(pos) && *(pos) != '\n' && !isspace(*(pos)))
void void
add_dlg_text(struct dialog *dlg, char *text, add_dlg_text(struct dialog *dlg, char *text,
@ -175,7 +175,7 @@ split_lines(struct widget_data *widget_data, int max_width)
int cells = 0; int cells = 0;
/* Skip first leading \n or space. */ /* Skip first leading \n or space. */
if (isspace((unsigned char)*text)) text++; if (isspace(*text)) text++;
if (!*text) break; if (!*text) break;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -210,13 +210,12 @@ split_lines(struct widget_data *widget_data, int max_width)
return lines; return lines;
} }
/* Format text according to dialog box and alignment. */ /* Format text according to dialog box and alignment. */
void void
dlg_format_text_do_node(struct dialog_data *dlg_data, dlg_format_text_do(struct dialog_data *dlg_data,
const char *text, const char *text,
int x, int *y, int width, int *real_width, int x, int *y, int width, int *real_width,
unsigned int color_node, format_align_T align, struct color_pair *color, format_align_T align,
int format_only) int format_only)
{ {
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -230,7 +229,7 @@ dlg_format_text_do_node(struct dialog_data *dlg_data,
int cells = 0; int cells = 0;
/* Skip first leading \n or space. */ /* Skip first leading \n or space. */
if (!firstline && isspace((unsigned char)*text)) if (!firstline && isspace(*text))
text++; text++;
else else
firstline = 0; firstline = 0;
@ -261,11 +260,10 @@ dlg_format_text_do_node(struct dialog_data *dlg_data,
assert(cells <= width && shift < width); assert(cells <= width && shift < width);
draw_dlg_text_node(dlg_data, x + shift, *y, text, line_width, 0, color_node); draw_dlg_text(dlg_data, x + shift, *y, text, line_width, 0, color);
} }
} }
void void
dlg_format_text(struct dialog_data *dlg_data, dlg_format_text(struct dialog_data *dlg_data,
struct widget_data *widget_data, struct widget_data *widget_data,
@ -344,12 +342,11 @@ dlg_format_text(struct dialog_data *dlg_data,
widget_data->info.text.current = 0; widget_data->info.text.current = 0;
} }
dlg_format_text_do_node(dlg_data, text, dlg_format_text_do(dlg_data, text,
x, y, width, real_width, x, y, width, real_width,
get_bfu_color_node(term, "dialog.text"), get_bfu_color(term, "dialog.text"),
widget_data->widget->info.text.align, format_only); widget_data->widget->info.text.align, format_only);
if (widget_data->widget->info.text.is_label) (*y)--; if (widget_data->widget->info.text.is_label) (*y)--;
/* If we scrolled and something was trimmed restore it */ /* If we scrolled and something was trimmed restore it */
@ -373,8 +370,8 @@ display_text(struct dialog_data *dlg_data, struct widget_data *widget_data)
if (!text_is_scrollable(widget_data) || box.height <= 0) if (!text_is_scrollable(widget_data) || box.height <= 0)
return EVENT_PROCESSED; return EVENT_PROCESSED;
draw_box_node(win->term, &box, ' ', 0, draw_box(win->term, &box, ' ', 0,
get_bfu_color_node(win->term, "dialog.scrollbar")); get_bfu_color(win->term, "dialog.scrollbar"));
current = widget_data->info.text.current; current = widget_data->info.text.current;
scale = (box.height + 1) * 100 / lines; scale = (box.height + 1) * 100 / lines;
@ -400,8 +397,8 @@ display_text(struct dialog_data *dlg_data, struct widget_data *widget_data)
widget_data->info.text.scroller_y = box.y; widget_data->info.text.scroller_y = box.y;
#endif #endif
draw_box_node(win->term, &box, ' ', 0, draw_box(win->term, &box, ' ', 0,
get_bfu_color_node(win->term, "dialog.scrollbar-selected")); get_bfu_color(win->term, "dialog.scrollbar-selected"));
/* Hope this is at least a bit reasonable. Set cursor /* Hope this is at least a bit reasonable. Set cursor
* and window pointer to start of the first text line. */ * and window pointer to start of the first text line. */
@ -430,8 +427,8 @@ format_and_display_text(struct widget_data *widget_data,
widget_data->info.text.current = current; widget_data->info.text.current = current;
draw_box_node(term, &widget_data->box, ' ', 0, draw_box(term, &widget_data->box, ' ', 0,
get_bfu_color_node(term, "dialog.generic")); get_bfu_color(term, "dialog.generic"));
dlg_format_text(dlg_data, widget_data, dlg_format_text(dlg_data, widget_data,
widget_data->box.x, &y, widget_data->box.width, NULL, widget_data->box.x, &y, widget_data->box.width, NULL,

View File

@ -135,7 +135,7 @@ download_dialog_layouter(struct dialog_data *dlg_data)
int url_len; int url_len;
char *url; char *url;
struct download *download = &file_download->download; struct download *download = &file_download->download;
unsigned int dialog_text_color_node = get_bfu_color_node(term, "dialog.text"); struct color_pair *dialog_text_color = get_bfu_color(term, "dialog.text");
char *msg = get_download_msg(download, term, 1, 1, "\n"); char *msg = get_download_msg(download, term, 1, 1, "\n");
int show_meter = (download_is_progressing(download) int show_meter = (download_is_progressing(download)
&& download->progress->size >= 0); && download->progress->size >= 0);
@ -166,8 +166,8 @@ download_dialog_layouter(struct dialog_data *dlg_data)
int_lower_bound(&w, DOWN_DLG_MIN); int_lower_bound(&w, DOWN_DLG_MIN);
} }
dlg_format_text_do_node(dlg_data, url, 0, &y, w, &rw, dlg_format_text_do(dlg_data, url, 0, &y, w, &rw,
dialog_text_color_node, ALIGN_LEFT, 1); dialog_text_color, ALIGN_LEFT, 1);
y++; y++;
if (show_meter) y += 2; if (show_meter) y += 2;
@ -175,8 +175,8 @@ download_dialog_layouter(struct dialog_data *dlg_data)
#ifdef CONFIG_BITTORRENT #ifdef CONFIG_BITTORRENT
if (bittorrent) y += 2; if (bittorrent) y += 2;
#endif #endif
dlg_format_text_do_node(dlg_data, msg, 0, &y, w, &rw, dlg_format_text_do(dlg_data, msg, 0, &y, w, &rw,
dialog_text_color_node, ALIGN_LEFT, 1); dialog_text_color, ALIGN_LEFT, 1);
y++; y++;
dlg_format_buttons(dlg_data, dlg_data->widgets_data, dlg_format_buttons(dlg_data, dlg_data->widgets_data,
@ -199,25 +199,25 @@ download_dialog_layouter(struct dialog_data *dlg_data)
y = dlg_data->box.y + DIALOG_TB + 1; y = dlg_data->box.y + DIALOG_TB + 1;
x = dlg_data->box.x + DIALOG_LB; x = dlg_data->box.x + DIALOG_LB;
dlg_format_text_do_node(dlg_data, url, x, &y, w, NULL, dlg_format_text_do(dlg_data, url, x, &y, w, NULL,
dialog_text_color_node, ALIGN_LEFT, 0); dialog_text_color, ALIGN_LEFT, 0);
if (show_meter) { if (show_meter) {
y++; y++;
draw_progress_bar_node(download->progress, term, x, y, w, NULL, 0); draw_progress_bar(download->progress, term, x, y, w, NULL, NULL);
y++; y++;
} }
#ifdef CONFIG_BITTORRENT #ifdef CONFIG_BITTORRENT
if (bittorrent) { if (bittorrent) {
y++; y++;
draw_bittorrent_piece_progress_node(download, term, x, y, w, NULL, 0); draw_bittorrent_piece_progress(download, term, x, y, w, NULL, NULL);
y++; y++;
} }
#endif #endif
y++; y++;
dlg_format_text_do_node(dlg_data, msg, x, &y, w, NULL, dlg_format_text_do(dlg_data, msg, x, &y, w, NULL,
dialog_text_color_node, ALIGN_LEFT, 0); dialog_text_color, ALIGN_LEFT, 0);
y++; y++;
dlg_format_buttons(dlg_data, dlg_data->widgets_data, dlg_format_buttons(dlg_data, dlg_data->widgets_data,
@ -378,7 +378,7 @@ draw_file_download(struct listbox_item *item, struct listbox_context *context,
struct file_download *file_download = (struct file_download *)item->udata; struct file_download *file_download = (struct file_download *)item->udata;
struct download *download = &file_download->download; struct download *download = &file_download->download;
const char *stylename; const char *stylename;
unsigned int color_node; struct color_pair *color;
char *text; char *text;
int length; int length;
int trimmedlen; int trimmedlen;
@ -391,7 +391,7 @@ draw_file_download(struct listbox_item *item, struct listbox_context *context,
: ((item->marked) ? "menu.marked" : ((item->marked) ? "menu.marked"
: "menu.normal"); : "menu.normal");
color_node = get_bfu_color_node(context->term, stylename); color = get_bfu_color(context->term, stylename);
text = get_file_download_text(item, context->term); text = get_file_download_text(item, context->term);
if (!text) return; if (!text) return;
@ -404,9 +404,9 @@ draw_file_download(struct listbox_item *item, struct listbox_context *context,
trimmedlen = int_min(length, width - 3); trimmedlen = int_min(length, width - 3);
} }
draw_text_node(context->term, x, y, text, trimmedlen, 0, color_node); draw_text(context->term, x, y, text, trimmedlen, 0, color);
if (trimmedlen < length) { if (trimmedlen < length) {
draw_text_node(context->term, x + trimmedlen, y, "...", 3, 0, color_node); draw_text(context->term, x + trimmedlen, y, "...", 3, 0, color);
trimmedlen += 3; trimmedlen += 3;
} }
@ -427,7 +427,7 @@ draw_file_download(struct listbox_item *item, struct listbox_context *context,
x += width - meter; x += width - meter;
draw_progress_bar_node(download->progress, context->term, x, y, meter, NULL, 0); draw_progress_bar(download->progress, context->term, x, y, meter, NULL, NULL);
} }
static struct listbox_ops_messages download_messages = { static struct listbox_ops_messages download_messages = {

View File

@ -104,11 +104,10 @@ get_progress_msg(struct progress *progress, struct terminal *term,
return get_progress_msg_2(progress, term, wide, full, separator, _("Received", term)); return get_progress_msg_2(progress, term, wide, full, separator, _("Received", term));
} }
void void
draw_progress_bar_node(struct progress *progress, struct terminal *term, draw_progress_bar(struct progress *progress, struct terminal *term,
int x, int y, int width, int x, int y, int width,
char *text, unsigned int meter_color_node) char *text, struct color_pair *meter_color)
{ {
/* Note : values > 100% are theorically possible and were seen. */ /* Note : values > 100% are theorically possible and were seen. */
int percent = 0; int percent = 0;
@ -120,14 +119,14 @@ draw_progress_bar_node(struct progress *progress, struct terminal *term,
/* Draw the progress meter part "[### ]" */ /* Draw the progress meter part "[### ]" */
if (!text && width > 2) { if (!text && width > 2) {
width -= 2; width -= 2;
draw_text_node(term, x++, y, "[", 1, 0, 0); draw_text(term, x++, y, "[", 1, 0, NULL);
draw_text_node(term, x + width, y, "]", 1, 0, 0); draw_text(term, x + width, y, "]", 1, 0, NULL);
} }
if (!meter_color_node) meter_color_node = get_bfu_color_node(term, "dialog.meter"); if (!meter_color) meter_color = get_bfu_color(term, "dialog.meter");
set_box(&barprogress, set_box(&barprogress,
x, y, int_min(width * percent / 100, width), 1); x, y, int_min(width * percent / 100, width), 1);
draw_box_node(term, &barprogress, ' ', 0, meter_color_node); draw_box(term, &barprogress, ' ', 0, meter_color);
/* On error, will print '?' only, should not occur. */ /* On error, will print '?' only, should not occur. */
if (text) { if (text) {
@ -153,5 +152,5 @@ draw_progress_bar_node(struct progress *progress, struct terminal *term,
text = s; text = s;
} }
draw_text_node(term, x, y, text, width, 0, 0); draw_text(term, x, y, text, width, 0, NULL);
} }

View File

@ -17,21 +17,12 @@ char *
get_upload_progress_msg(struct progress *progress, struct terminal *term, get_upload_progress_msg(struct progress *progress, struct terminal *term,
int wide, int full, const char *separator); int wide, int full, const char *separator);
#if 0
/* Draws a progress bar meter or progress coloured text depending on whether /* Draws a progress bar meter or progress coloured text depending on whether
* @text is NULL. If @meter_color is NULL dialog.meter color is used. */ * @text is NULL. If @meter_color is NULL dialog.meter color is used. */
void void
draw_progress_bar(struct progress *progress, struct terminal *term, draw_progress_bar(struct progress *progress, struct terminal *term,
int x, int y, int width, int x, int y, int width,
char *text, struct color_pair *meter_color); char *text, struct color_pair *meter_color);
#endif
/* Draws a progress bar meter or progress coloured text depending on whether
* @text is NULL. If @meter_color is NULL dialog.meter color is used. */
void
draw_progress_bar_node(struct progress *progress, struct terminal *term,
int x, int y, int width,
char *text, unsigned int meter_color_node);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -173,7 +173,7 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count)
unsigned int tab_info_len = 0; unsigned int tab_info_len = 0;
struct download *download = get_current_download(ses); struct download *download = get_current_download(ses);
struct session_status *status = &ses->status; struct session_status *status = &ses->status;
unsigned int text_color_node = 0; struct color_pair *text_color = NULL;
int msglen; int msglen;
struct el_box box; struct el_box box;
@ -240,7 +240,7 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count)
} }
set_box(&box, 0, term->height - 1, term->width, 1); set_box(&box, 0, term->height - 1, term->width, 1);
draw_box_node(term, &box, ' ', 0, get_bfu_color_node(term, "status.status-bar")); draw_box(term, &box, ' ', 0, get_bfu_color(term, "status.status-bar"));
if (!status->show_tabs_bar && tabs_count > 1) { if (!status->show_tabs_bar && tabs_count > 1) {
char tab_info[8]; char tab_info[8];
@ -251,19 +251,19 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count)
tab_info[tab_info_len++] = ' '; tab_info[tab_info_len++] = ' ';
tab_info[tab_info_len] = '\0'; tab_info[tab_info_len] = '\0';
text_color_node = get_bfu_color_node(term, "status.status-text"); text_color = get_bfu_color(term, "status.status-text");
draw_text_node(term, 0, term->height - 1, tab_info, tab_info_len, draw_text(term, 0, term->height - 1, tab_info, tab_info_len,
0, text_color_node); 0, text_color);
} }
if (!msg) return; if (!msg) return;
if (!text_color_node) if (!text_color)
text_color_node = get_bfu_color_node(term, "status.status-text"); text_color = get_bfu_color(term, "status.status-text");
msglen = strlen(msg); msglen = strlen(msg);
draw_text_node(term, 0 + tab_info_len, term->height - 1, draw_text(term, 0 + tab_info_len, term->height - 1,
msg, msglen, 0, text_color_node); msg, msglen, 0, text_color);
mem_free(msg); mem_free(msg);
if (download_is_progressing(download) && download->progress->size > 0) { if (download_is_progressing(download) && download->progress->size > 0) {
@ -278,20 +278,20 @@ display_status_bar(struct session *ses, struct terminal *term, int tabs_count)
width = int_max(0, xend - msglen - tab_info_len - 1); width = int_max(0, xend - msglen - tab_info_len - 1);
if (width < 6) return; if (width < 6) return;
int_upper_bound(&width, 20); int_upper_bound(&width, 20);
draw_progress_bar_node(download->progress, term, draw_progress_bar(download->progress, term,
xend - width, term->height - 1, width, xend - width, term->height - 1, width,
NULL, 0); NULL, NULL);
} }
} }
static inline void static inline void
display_tab_bar(struct session *ses, struct terminal *term, int tabs_count) display_tab_bar(struct session *ses, struct terminal *term, int tabs_count)
{ {
unsigned int normal_color_node = get_bfu_color_node(term, "tabs.normal"); struct color_pair *normal_color = get_bfu_color(term, "tabs.normal");
unsigned int selected_color_node = get_bfu_color_node(term, "tabs.selected"); struct color_pair *selected_color = get_bfu_color(term, "tabs.selected");
unsigned int loading_color_node = get_bfu_color_node(term, "tabs.loading"); struct color_pair *loading_color = get_bfu_color(term, "tabs.loading");
unsigned int fresh_color_node = get_bfu_color_node(term, "tabs.unvisited"); struct color_pair *fresh_color = get_bfu_color(term, "tabs.unvisited");
unsigned int tabsep_color_node = get_bfu_color_node(term, "tabs.separator"); struct color_pair *tabsep_color = get_bfu_color(term, "tabs.separator");
struct session_status *status = &ses->status; struct session_status *status = &ses->status;
int tab_width = int_max(1, term->width / tabs_count); int tab_width = int_max(1, term->width / tabs_count);
int tab_total_width = tab_width * tabs_count; int tab_total_width = tab_width * tabs_count;
@ -305,7 +305,7 @@ display_tab_bar(struct session *ses, struct terminal *term, int tabs_count)
for (tab_num = 0; tab_num < tabs_count; tab_num++) { for (tab_num = 0; tab_num < tabs_count; tab_num++) {
struct download *download = NULL; struct download *download = NULL;
unsigned int color_node = normal_color_node; struct color_pair *color = normal_color;
struct window *tab = get_tab_by_number(term, tab_num); struct window *tab = get_tab_by_number(term, tab_num);
struct document_view *doc_view; struct document_view *doc_view;
struct session *tab_ses = (struct session *)tab->data; struct session *tab_ses = (struct session *)tab->data;
@ -331,21 +331,21 @@ display_tab_bar(struct session *ses, struct terminal *term, int tabs_count)
} }
if (tab_num) { if (tab_num) {
draw_char_node(term, box.x, box.y, BORDER_SVLINE, draw_char(term, box.x, box.y, BORDER_SVLINE,
SCREEN_ATTR_FRAME, tabsep_color_node); SCREEN_ATTR_FRAME, tabsep_color);
box.x++; box.x++;
} }
if (tab_num == term->current_tab) { if (tab_num == term->current_tab) {
color_node = selected_color_node; color = selected_color;
} else { } else {
download = get_current_download(tab_ses); download = get_current_download(tab_ses);
if (download && !is_in_state(download->state, S_OK)) { if (download && !is_in_state(download->state, S_OK)) {
color_node = loading_color_node; color = loading_color;
} else if (!tab_ses || !tab_ses->status.visited) { } else if (!tab_ses || !tab_ses->status.visited) {
color_node = fresh_color_node; color = fresh_color;
} }
if (!download_is_progressing(download) if (!download_is_progressing(download)
@ -354,12 +354,12 @@ display_tab_bar(struct session *ses, struct terminal *term, int tabs_count)
} }
box.width = actual_tab_width + 1; box.width = actual_tab_width + 1;
draw_box_node(term, &box, ' ', 0, color_node); draw_box(term, &box, ' ', 0, color);
if (download) { if (download) {
draw_progress_bar_node(download->progress, term, draw_progress_bar(download->progress, term,
box.x, box.y, actual_tab_width, box.x, box.y, actual_tab_width,
msg, 0); msg, NULL);
} else { } else {
int msglen; int msglen;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -372,7 +372,7 @@ display_tab_bar(struct session *ses, struct terminal *term, int tabs_count)
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
msglen = int_min(strlen(msg), actual_tab_width); msglen = int_min(strlen(msg), actual_tab_width);
draw_text_node(term, box.x, box.y, msg, msglen, 0, color_node); draw_text(term, box.x, box.y, msg, msglen, 0, color);
} }
tab->xpos = box.x; tab->xpos = box.x;
@ -405,7 +405,7 @@ display_title_bar(struct session *ses, struct terminal *term)
struct el_box box; struct el_box box;
set_box(&box, 0, 0, term->width, 1); set_box(&box, 0, 0, term->width, 1);
draw_box_node(term, &box, ' ', 0, get_bfu_color_node(term, "title.title-bar")); draw_box(term, &box, ' ', 0, get_bfu_color(term, "title.title-bar"));
} }
doc_view = current_frame(ses); doc_view = current_frame(ses);
@ -472,8 +472,8 @@ display_title_bar(struct session *ses, struct terminal *term)
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
x = int_max(term->width - 1 - title.length, 0); x = int_max(term->width - 1 - title.length, 0);
draw_text_node(term, x, 0, title.source, title.length, 0, draw_text(term, x, 0, title.source, title.length, 0,
get_bfu_color_node(term, "title.title-text")); get_bfu_color(term, "title.title-text"));
} }
done_string(&title); done_string(&title);

View File

@ -452,22 +452,14 @@ get_bittorrent_message(struct download *download, struct terminal *term,
return string.source; return string.source;
} }
#if 0
void void
draw_bittorrent_piece_progress(struct download *download, struct terminal *term, draw_bittorrent_piece_progress(struct download *download, struct terminal *term,
int x, int y, int width, char *text, int x, int y, int width, char *text,
struct color_pair *color) struct color_pair *color)
#endif
void
draw_bittorrent_piece_progress_node(struct download *download, struct terminal *term,
int x, int y, int width, char *text,
unsigned int color_node)
{ {
struct bittorrent_connection *bittorrent; struct bittorrent_connection *bittorrent;
uint32_t piece; uint32_t piece;
int x_start; int x_start;
unsigned int node_number = 0;
if (!download->conn || !download->conn->info) if (!download->conn || !download->conn->info)
return; return;
@ -477,8 +469,8 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
/* Draw the progress meter part "[### ]" */ /* Draw the progress meter part "[### ]" */
if (!text && width > 2) { if (!text && width > 2) {
width -= 2; width -= 2;
draw_text_node(term, x++, y, "[", 1, 0, 0); draw_text(term, x++, y, "[", 1, 0, NULL);
draw_text_node(term, x + width, y, "]", 1, 0, 0); draw_text(term, x + width, y, "]", 1, 0, NULL);
} }
x_start = x; x_start = x;
@ -486,7 +478,7 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
if (width <= 0 || !bittorrent->cache) if (width <= 0 || !bittorrent->cache)
return; return;
if (!color_node) node_number = get_bfu_color_node(term, "dialog.meter"); if (!color) color = get_bfu_color(term, "dialog.meter");
if (bittorrent->meta.pieces <= width) { if (bittorrent->meta.pieces <= width) {
int chars_per_piece = width / bittorrent->meta.pieces; int chars_per_piece = width / bittorrent->meta.pieces;
@ -497,9 +489,8 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
set_box(&piecebox, x, y, chars_per_piece + !!remainder, 1); set_box(&piecebox, x, y, chars_per_piece + !!remainder, 1);
if (bittorrent->cache->entries[piece].completed) { if (bittorrent->cache->entries[piece].completed)
draw_box_node(term, &piecebox, ' ', 0, node_number); draw_box(term, &piecebox, ' ', 0, color);
}
x += chars_per_piece + !!remainder; x += chars_per_piece + !!remainder;
if (remainder > 0) remainder--; if (remainder > 0) remainder--;
@ -508,10 +499,13 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
} else { } else {
int pieces_per_char = bittorrent->meta.pieces / width; int pieces_per_char = bittorrent->meta.pieces / width;
int remainder = bittorrent->meta.pieces % width; int remainder = bittorrent->meta.pieces % width;
unsigned int inverted_node = get_bfu_color_node(term, "dialog.meter"); // must be inverted struct color_pair inverted;
uint32_t completed = 0, remaining = 0; uint32_t completed = 0, remaining = 0;
int steps = pieces_per_char + !!remainder; int steps = pieces_per_char + !!remainder;
inverted.background = color->foreground;
inverted.foreground = color->background;
for (piece = 0; piece < bittorrent->meta.pieces; piece++) { for (piece = 0; piece < bittorrent->meta.pieces; piece++) {
if (bittorrent->cache->entries[piece].completed) if (bittorrent->cache->entries[piece].completed)
completed++; completed++;
@ -524,18 +518,16 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
assert(completed <= pieces_per_char + !!remainder); assert(completed <= pieces_per_char + !!remainder);
assert(remaining <= pieces_per_char + !!remainder); assert(remaining <= pieces_per_char + !!remainder);
if (!remaining) /* 100% */ { if (!remaining) /* 100% */
draw_char_color_node(term, x, y, node_number); draw_char_color(term, x, y, color);
}
else if (completed > remaining) /* > 50% */ { else if (completed > remaining) /* > 50% */
draw_char_node(term, x, y, BORDER_SVLINE, draw_char(term, x, y, BORDER_SVLINE,
SCREEN_ATTR_FRAME, node_number); SCREEN_ATTR_FRAME, color);
}
else if (completed) /* > 0% */ else if (completed) /* > 0% */
draw_char_node(term, x, y, BORDER_SVLINE, draw_char(term, x, y, BORDER_SVLINE,
SCREEN_ATTR_FRAME, inverted_node); SCREEN_ATTR_FRAME, &inverted);
x++; x++;
if (remainder > 0) remainder--; if (remainder > 0) remainder--;
@ -566,7 +558,7 @@ draw_bittorrent_piece_progress_node(struct download *download, struct terminal *
assert(slen <= width); assert(slen <= width);
draw_text_node(term, x_start, y, s, slen, 0, 0); draw_text(term, x_start, y, s, slen, 0, NULL);
} }
} }

View File

@ -19,18 +19,10 @@ char *
get_bittorrent_message(struct download *download, struct terminal *term, get_bittorrent_message(struct download *download, struct terminal *term,
int wide, int full, const char *separator); int wide, int full, const char *separator);
#if 0
void void
draw_bittorrent_piece_progress(struct download *download, struct terminal *term, draw_bittorrent_piece_progress(struct download *download, struct terminal *term,
int x, int y, int width, char *text, int x, int y, int width, char *text,
struct color_pair *meter_color); struct color_pair *meter_color);
#endif
void
draw_bittorrent_piece_progress_node(struct download *download, struct terminal *term,
int x, int y, int width, char *text,
unsigned int meter_color_node);
void set_bittorrent_files_for_deletion(struct download *download); void set_bittorrent_files_for_deletion(struct download *download);
void set_bittorrent_notify_on_completion(struct download *download, struct terminal *term); void set_bittorrent_notify_on_completion(struct download *download, struct terminal *term);

View File

@ -384,7 +384,6 @@ set_term_color(struct screen_char *schar, struct color_pair *pair,
assert(color_mode >= COLOR_MODE_DUMP && color_mode < COLOR_MODES); assert(color_mode >= COLOR_MODE_DUMP && color_mode < COLOR_MODES);
schar->is_node = 0;
/* Options for the various color modes. */ /* Options for the various color modes. */
switch (color_mode) { switch (color_mode) {

View File

@ -26,10 +26,10 @@
#if SCREEN_COLOR_SIZE > 1 #if SCREEN_COLOR_SIZE > 1
#define clear_screen_char_color(schar) \ #define clear_screen_char_color(schar) \
do { memset((schar)->c.color, 0, SCREEN_COLOR_SIZE); (schar)->is_node = 0;} while (0) do { memset((schar)->c.color, 0, SCREEN_COLOR_SIZE); } while (0)
#else #else
#define clear_screen_char_color(schar) \ #define clear_screen_char_color(schar) \
do { (schar)->c.color[0] = 0; (schar)->is_node = 0; } while (0) do { (schar)->c.color[0] = 0; } while (0)
#endif #endif
@ -74,46 +74,11 @@ draw_border_cross(struct terminal *term, int x, int y,
} else if (screen_char->data == border_trans[d][2 - (dir & 1)]) { } else if (screen_char->data == border_trans[d][2 - (dir & 1)]) {
screen_char->data = BORDER_SCROSS; screen_char->data = BORDER_SCROSS;
} }
screen_char->is_node = 0;
set_term_color(screen_char, color, 0, set_term_color(screen_char, color, 0,
get_opt_int_tree(term->spec, "colors", NULL)); get_opt_int_tree(term->spec, "colors", NULL));
} }
void
draw_border_cross_node(struct terminal *term, int x, int y,
enum border_cross_direction dir, unsigned int node_number)
{
static const unsigned char border_trans[2][4] = {
/* Used for BORDER_X_{RIGHT,LEFT}: */
{ BORDER_SVLINE, BORDER_SRTEE, BORDER_SLTEE },
/* Used for BORDER_X_{DOWN,UP}: */
{ BORDER_SHLINE, BORDER_SDTEE, BORDER_SUTEE },
};
struct screen_char *screen_char = get_char(term, x, y);
unsigned int d;
if (!screen_char) return;
if (!(screen_char->attr & SCREEN_ATTR_FRAME)) return;
/* First check if there is already a horizontal/vertical line, so that
* we will have to replace with a T char. Example: if there is a '|'
* and the direction is right, replace with a '|-' T char.
*
* If this is not the case check if there is a T char and we are adding
* the direction so that we end up with a cross. Example : if there is
* a '|-' and the direction is left, replace with a '+' (cross) char. */
d = dir>>1;
if (screen_char->data == border_trans[d][0]) {
screen_char->data = border_trans[d][1 + (dir & 1)];
} else if (screen_char->data == border_trans[d][2 - (dir & 1)]) {
screen_char->data = BORDER_SCROSS;
}
screen_char->c.node_number = node_number;
screen_char->is_node = 1;
}
void void
draw_border_char(struct terminal *term, int x, int y, draw_border_char(struct terminal *term, int x, int y,
border_char_T border, struct color_pair *color) border_char_T border, struct color_pair *color)
@ -124,28 +89,11 @@ draw_border_char(struct terminal *term, int x, int y,
screen_char->data = (unsigned char) border; screen_char->data = (unsigned char) border;
screen_char->attr = SCREEN_ATTR_FRAME; screen_char->attr = SCREEN_ATTR_FRAME;
screen_char->is_node = 0;
set_term_color(screen_char, color, 0, set_term_color(screen_char, color, 0,
get_opt_int_tree(term->spec, "colors", NULL)); get_opt_int_tree(term->spec, "colors", NULL));
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
void
draw_border_char_node(struct terminal *term, int x, int y,
border_char_T border, unsigned int node_number)
{
struct screen_char *screen_char = get_char(term, x, y);
if (!screen_char) return;
screen_char->data = (unsigned char) border;
screen_char->attr = SCREEN_ATTR_FRAME;
screen_char->c.node_number = node_number;
screen_char->is_node = 1;
set_screen_dirty(term->screen, y, y);
}
void void
draw_char_color(struct terminal *term, int x, int y, struct color_pair *color) draw_char_color(struct terminal *term, int x, int y, struct color_pair *color)
{ {
@ -155,19 +103,6 @@ draw_char_color(struct terminal *term, int x, int y, struct color_pair *color)
set_term_color(screen_char, color, 0, set_term_color(screen_char, color, 0,
get_opt_int_tree(term->spec, "colors", NULL)); get_opt_int_tree(term->spec, "colors", NULL));
screen_char->is_node = 0;
set_screen_dirty(term->screen, y, y);
}
void
draw_char_color_node(struct terminal *term, int x, int y, unsigned int node_number)
{
struct screen_char *screen_char = get_char(term, x, y);
if (!screen_char) return;
screen_char->c.node_number = node_number;
screen_char->is_node = 1;
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
@ -206,20 +141,6 @@ draw_char_data(struct terminal *term, int x, int y, unsigned char data)
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
void
draw_space(struct terminal *term, int x, int y, struct screen_char *color)
{
struct screen_char *screen_char = get_char(term, x, y);
if (!screen_char) return;
screen_char->data = ' ';
if (color) {
screen_char->c = color->c;
screen_char->is_node = color->is_node;
}
}
/*! Used by viewer to copy over a document. /*! Used by viewer to copy over a document.
* When doing frame drawing @a x can be different than 0. */ * When doing frame drawing @a x can be different than 0. */
void void
@ -338,73 +259,6 @@ draw_border(struct terminal *term, struct el_box *box,
set_screen_dirty(term->screen, borderbox.y, borderbox.y + borderbox.height); set_screen_dirty(term->screen, borderbox.y, borderbox.y + borderbox.height);
} }
void
draw_border_node(struct terminal *term, struct el_box *box,
unsigned int node_number, int width)
{
static const border_char_T p1[] = {
BORDER_SULCORNER,
BORDER_SURCORNER,
BORDER_SDLCORNER,
BORDER_SDRCORNER,
BORDER_SVLINE,
BORDER_SHLINE,
};
static const border_char_T p2[] = {
BORDER_DULCORNER,
BORDER_DURCORNER,
BORDER_DDLCORNER,
BORDER_DDRCORNER,
BORDER_DVLINE,
BORDER_DHLINE,
};
const border_char_T *p = (width > 1) ? p2 : p1;
struct el_box borderbox;
set_box(&borderbox, box->x - 1, box->y - 1,
box->width + 2, box->height + 2);
if (borderbox.width > 2) {
struct el_box bbox;
/* Horizontal top border */
set_box(&bbox, box->x, borderbox.y, box->width, 1);
draw_box_node(term, &bbox, p[5], SCREEN_ATTR_FRAME, node_number);
/* Horizontal bottom border */
bbox.y += borderbox.height - 1;
draw_box_node(term, &bbox, p[5], SCREEN_ATTR_FRAME, node_number);
}
if (borderbox.height > 2) {
struct el_box bbox;
/* Vertical left border */
set_box(&bbox, borderbox.x, box->y, 1, box->height);
draw_box_node(term, &bbox, p[4], SCREEN_ATTR_FRAME, node_number);
/* Vertical right border */
bbox.x += borderbox.width - 1;
draw_box_node(term, &bbox, p[4], SCREEN_ATTR_FRAME, node_number);
}
if (borderbox.width > 1 && borderbox.height > 1) {
int right = borderbox.x + borderbox.width - 1;
int bottom = borderbox.y + borderbox.height - 1;
/* Upper left corner */
draw_border_char_node(term, borderbox.x, borderbox.y, p[0], node_number);
/* Upper right corner */
draw_border_char_node(term, right, borderbox.y, p[1], node_number);
/* Lower left corner */
draw_border_char_node(term, borderbox.x, bottom, p[2], node_number);
/* Lower right corner */
draw_border_char_node(term, right, bottom, p[3], node_number);
}
set_screen_dirty(term->screen, borderbox.y, borderbox.y + borderbox.height);
}
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
/** Checks cells left and right to the box for broken double-width chars. /** Checks cells left and right to the box for broken double-width chars.
* Replace it with UCS_ORPHAN_CELL. * Replace it with UCS_ORPHAN_CELL.
@ -497,37 +351,12 @@ draw_char(struct terminal *term, int x, int y,
screen_char->data = data; screen_char->data = data;
screen_char->attr = attr; screen_char->attr = attr;
screen_char->is_node = 0;
set_term_color(screen_char, color, 0, set_term_color(screen_char, color, 0,
get_opt_int_tree(term->spec, "colors", NULL)); get_opt_int_tree(term->spec, "colors", NULL));
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
#ifdef CONFIG_UTF8
void
draw_char_node(struct terminal *term, int x, int y,
unicode_val_T data, int attr,
unsigned int node_number)
#else
void
draw_char_node(struct terminal *term, int x, int y,
unsigned char data, int attr,
unsigned int node_number)
#endif /* CONFIG_UTF8 */
{
struct screen_char *screen_char = get_char(term, x, y);
if (!screen_char) return;
screen_char->data = data;
screen_char->attr = attr;
screen_char->is_node = 1;
screen_char->c.node_number = node_number;
set_screen_dirty(term->screen, y, y);
}
void void
draw_box(struct terminal *term, struct el_box *box, draw_box(struct terminal *term, struct el_box *box,
unsigned char data, int attr, unsigned char data, int attr,
@ -549,7 +378,6 @@ draw_box(struct terminal *term, struct el_box *box,
end->attr = attr; end->attr = attr;
end->data = data; end->data = data;
if (color) { if (color) {
end->is_node = 0;
set_term_color(end, color, 0, set_term_color(end, color, 0,
get_opt_int_tree(term->spec, "colors", NULL)); get_opt_int_tree(term->spec, "colors", NULL));
} else { } else {
@ -572,57 +400,6 @@ draw_box(struct terminal *term, struct el_box *box,
set_screen_dirty(term->screen, box->y, box->y + box->height); set_screen_dirty(term->screen, box->y, box->y + box->height);
} }
#ifdef CONFIG_UTF8
void
draw_box_node(struct terminal *term, struct el_box *box,
unicode_val_T data, int attr,
unsigned int node_number)
#else
void
draw_box_node(struct terminal *term, struct el_box *box,
unsigned char data, int attr,
unsigned int node_number)
#endif
{
struct screen_char *line, *pos, *end;
int width, height;
line = get_char(term, box->x, box->y);
if (!line) return;
height = int_min(box->height, term->height - box->y);
width = int_min(box->width, term->width - box->x);
if (height <= 0 || width <= 0) return;
/* Compose off the ending screen position in the areas first line. */
end = &line[width - 1];
end->attr = attr;
end->data = data;
if (node_number) {
end->is_node = 1;
end->c.node_number = node_number;
} else {
clear_screen_char_color(end);
}
/* Draw the first area line. */
for (pos = line; pos < end; pos++) {
copy_screen_chars(pos, end, 1);
}
/* Now make @end point to the last line */
/* For the rest of the area use the first area line. */
pos = line;
while (--height) {
pos += term->width;
copy_screen_chars(pos, line, width);
}
set_screen_dirty(term->screen, box->y, box->y + box->height);
}
void void
draw_shadow(struct terminal *term, struct el_box *box, draw_shadow(struct terminal *term, struct el_box *box,
struct color_pair *color, int width, int height) struct color_pair *color, int width, int height)
@ -642,26 +419,6 @@ draw_shadow(struct terminal *term, struct el_box *box,
draw_box(term, &dbox, ' ', 0, color); draw_box(term, &dbox, ' ', 0, color);
} }
void
draw_shadow_node(struct terminal *term, struct el_box *box,
unsigned int node_number, int width, int height)
{
struct el_box dbox;
/* (horizontal) */
set_box(&dbox, box->x + width, box->y + box->height,
box->width - width, height);
draw_box_node(term, &dbox, ' ', 0, node_number);
/* (vertical) */
set_box(&dbox, box->x + box->width, box->y + height,
width, box->height);
draw_box_node(term, &dbox, ' ', 0, node_number);
}
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
static void static void
draw_text_utf8(struct terminal *term, int x, int y, draw_text_utf8(struct terminal *term, int x, int y,
@ -735,79 +492,6 @@ draw_text_utf8(struct terminal *term, int x, int y,
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
static void
draw_text_utf8_node(struct terminal *term, int x, int y,
const char *text2, int length,
int attr, unsigned int node_number)
{
struct screen_char *start, *pos;
char *text = (char *)text2;
char *end = text + length;
unicode_val_T data;
assert(text && length >= 0);
if_assert_failed return;
if (length <= 0) return;
if (x >= term->width) return;
data = utf8_to_unicode(&text, end);
if (data == UCS_NO_CHAR) return;
start = get_char(term, x, y);
if (node_number) {
start->attr = attr;
start->is_node = 1;
start->c.node_number = node_number;
}
if (start->data == UCS_NO_CHAR && x - 1 > 0)
draw_char_data(term, x - 1, y, UCS_ORPHAN_CELL);
pos = start;
if (unicode_to_cell(data) == 2) {
/* Is there enough room for whole double-width char? */
if (x + 1 < term->width) {
pos->data = data;
pos++;
x++;
pos->data = UCS_NO_CHAR;
pos->attr = 0;
} else {
pos->data = UCS_ORPHAN_CELL;
}
} else {
pos->data = data;
}
pos++;
x++;
for (; x < term->width; x++, pos++) {
data = utf8_to_unicode(&text, end);
if (data == UCS_NO_CHAR) break;
if (node_number) copy_screen_chars(pos, start, 1);
if (unicode_to_cell(data) == 2) {
/* Is there enough room for whole double-width char? */
if (x + 1 < term->width) {
pos->data = data;
x++;
pos++;
pos->data = UCS_NO_CHAR;
pos->attr = 0;
} else {
pos->data = UCS_ORPHAN_CELL;
}
} else {
pos->data = data;
}
}
set_screen_dirty(term->screen, y, y);
}
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
void void
@ -876,73 +560,6 @@ draw_text(struct terminal *term, int x, int y,
set_screen_dirty(term->screen, y, y); set_screen_dirty(term->screen, y, y);
} }
void
draw_text_node(struct terminal *term, int x, int y,
const char *text, int length,
int attr, unsigned int node_number)
{
int end_pos;
struct screen_char *pos, *end;
assert(text && length >= 0);
if_assert_failed return;
if (x >= term->width || y >= term->height) return;
#ifdef CONFIG_UTF8
if (term->utf8_cp) {
draw_text_utf8_node(term, x, y, text, length, attr, node_number);
return;
}
#endif /* CONFIG_UTF8 */
if (length <= 0) return;
pos = get_char(term, x, y);
if (!pos) return;
end_pos = int_min(length, term->width - x) - 1;
#ifdef CONFIG_DEBUG
/* Detect attempt to set @end to a point outside @text,
* it may occur in case of bad calculations. --Zas */
if (end_pos < 0) {
INTERNAL("end_pos < 0 !!");
end_pos = 0;
} else {
int textlen = strlen(text);
if (end_pos >= textlen) {
INTERNAL("end_pos (%d) >= text length (%d) !!", end_pos, textlen);
end_pos = textlen - 1;
}
}
#endif
end = &pos[int_max(0, end_pos)];
if (node_number) {
/* Use the last char as template. */
end->attr = attr;
end->is_node = 1;
end->c.node_number = node_number;
for (; pos < end && *text; text++, pos++) {
end->data = *text;
copy_screen_chars(pos, end, 1);
}
end->data = *text;
} else {
for (; pos <= end && *text; text++, pos++) {
pos->data = *text;
}
}
set_screen_dirty(term->screen, y, y);
}
void void
draw_dlg_text(struct dialog_data *dlg_data, int x, int y, draw_dlg_text(struct dialog_data *dlg_data, int x, int y,
const char *text, int length, const char *text, int length,
@ -960,23 +577,6 @@ draw_dlg_text(struct dialog_data *dlg_data, int x, int y,
draw_text(term, x, y, text, length, attr, color); draw_text(term, x, y, text, length, attr, color);
} }
void
draw_dlg_text_node(struct dialog_data *dlg_data, int x, int y,
const char *text, int length,
int attr, unsigned int node_number)
{
struct terminal *term = dlg_data->win->term;
struct el_box *box = &dlg_data->real_box;
if (box->height) {
int y_max = box->y + box->height;
y -= dlg_data->y;
if (y < box->y || y >= y_max) return;
}
draw_text_node(term, x, y, text, length, attr, node_number);
}
void void
set_cursor(struct terminal *term, int x, int y, int blockable) set_cursor(struct terminal *term, int x, int y, int blockable)
@ -1021,13 +621,8 @@ void
clear_terminal(struct terminal *term) clear_terminal(struct terminal *term)
{ {
struct el_box box; struct el_box box;
int bgchar = get_opt_int("ui.background_char", NULL);
set_box(&box, 0, 0, term->width, term->height); set_box(&box, 0, 0, term->width, term->height);
#ifdef CONFIG_UTF8 draw_box(term, &box, ' ', 0, NULL);
draw_box_node(term, &box, bgchar, 0, get_bfu_color_node(term, "desktop"));
#else
draw_box_node(term, &box, (unsigned char)bgchar, 0, get_bfu_color_node(term, "desktop"));
#endif
set_cursor(term, 0, 0, 1); set_cursor(term, 0, 0, 1);
} }

View File

@ -59,8 +59,6 @@ struct screen_char {
/** Attributes are ::screen_char_attr bits. */ /** Attributes are ::screen_char_attr bits. */
unsigned char attr; unsigned char attr;
unsigned int is_node:1;
union { union {
/** The fore- and background color. */ /** The fore- and background color. */
unsigned char color[SCREEN_COLOR_SIZE]; unsigned char color[SCREEN_COLOR_SIZE];
@ -245,8 +243,6 @@ struct screen_char *get_char(struct terminal *, int x, int y);
void draw_char_color(struct terminal *term, int x, int y, void draw_char_color(struct terminal *term, int x, int y,
struct color_pair *color); struct color_pair *color);
void draw_char_color_node(struct terminal *term, int x, int y, unsigned int node_number);
/** Sets the data of a screen position. */ /** Sets the data of a screen position. */
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
void draw_char_data(struct terminal *term, int x, int y, unicode_val_T data); void draw_char_data(struct terminal *term, int x, int y, unicode_val_T data);
@ -258,69 +254,35 @@ void draw_char_data(struct terminal *term, int x, int y, unsigned char data);
void draw_border_char(struct terminal *term, int x, int y, void draw_border_char(struct terminal *term, int x, int y,
border_char_T border, struct color_pair *color); border_char_T border, struct color_pair *color);
void draw_border_char_node(struct terminal *term, int x, int y,
border_char_T border, unsigned int node_number);
/** Sets the cross position of two borders. */ /** Sets the cross position of two borders. */
void draw_border_cross(struct terminal *, int x, int y, void draw_border_cross(struct terminal *, int x, int y,
enum border_cross_direction, struct color_pair *color); enum border_cross_direction, struct color_pair *color);
void draw_border_cross_node(struct terminal *, int x, int y,
enum border_cross_direction, unsigned int node_number);
/** Draws a char. */ /** Draws a char. */
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
void draw_char(struct terminal *term, int x, int y, void draw_char(struct terminal *term, int x, int y,
unicode_val_T data, int attr, unicode_val_T data, int attr,
struct color_pair *color); struct color_pair *color);
void draw_char_node(struct terminal *term, int x, int y,
unicode_val_T data, int attr,
unsigned int node_number);
#else #else
void draw_char(struct terminal *term, int x, int y, void draw_char(struct terminal *term, int x, int y,
unsigned char data, int attr, unsigned char data, int attr,
struct color_pair *color); struct color_pair *color);
void draw_char_node(struct terminal *term, int x, int y,
unsigned char data, int attr,
unsigned int node_number);
#endif /* CONFIG_UTF8 */ #endif /* CONFIG_UTF8 */
void draw_space(struct terminal *term, int x, int y,
struct screen_char *color);
/** Draws area defined by @a box using the same colors and attributes. */ /** Draws area defined by @a box using the same colors and attributes. */
void draw_box(struct terminal *term, struct el_box *box, void draw_box(struct terminal *term, struct el_box *box,
unsigned char data, int attr, unsigned char data, int attr,
struct color_pair *color); struct color_pair *color);
#ifdef CONFIG_UTF8
void draw_box_node(struct terminal *term, struct el_box *box,
unicode_val_T data, int attr,
unsigned int node_number);
#else
void draw_box_node(struct terminal *term, struct el_box *box,
unsigned char data, int attr,
unsigned int node_number);
#endif
/** Draws a shadow of @a width and @a height with color @a color /** Draws a shadow of @a width and @a height with color @a color
* around @a box. */ * around @a box. */
void draw_shadow(struct terminal *term, struct el_box *box, void draw_shadow(struct terminal *term, struct el_box *box,
struct color_pair *color, int width, int height); struct color_pair *color, int width, int height);
void draw_shadow_node(struct terminal *term, struct el_box *box,
unsigned int node_number, int width, int height);
/** Draw borders. */ /** Draw borders. */
void draw_border(struct terminal *term, struct el_box *box, void draw_border(struct terminal *term, struct el_box *box,
struct color_pair *color, int width); struct color_pair *color, int width);
void draw_border_node(struct terminal *term, struct el_box *box,
unsigned int node_number, int width);
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
void fix_dwchar_around_box(struct terminal *term, struct el_box *box, int border, void fix_dwchar_around_box(struct terminal *term, struct el_box *box, int border,
int shadow_width, int shadow_height); int shadow_width, int shadow_height);
@ -332,20 +294,11 @@ void draw_text(struct terminal *term, int x, int y,
int attr, int attr,
struct color_pair *color); struct color_pair *color);
void draw_text_node(struct terminal *term, int x, int y,
const char *text, int length,
int attr,
unsigned int node_number);
/** Draws text for dialogs. */ /** Draws text for dialogs. */
void draw_dlg_text(struct dialog_data *dlg_data, int x, int y, void draw_dlg_text(struct dialog_data *dlg_data, int x, int y,
const char *text, int length, const char *text, int length,
int attr, struct color_pair *color); int attr, struct color_pair *color);
void draw_dlg_text_node(struct dialog_data *dlg_data, int x, int y,
const char *text, int length,
int attr, unsigned int node_number);
/** Draws @a length chars from @a line on the screen. */ /** Draws @a length chars from @a line on the screen. */
void draw_line(struct terminal *term, int x, int y, int length, void draw_line(struct terminal *term, int x, int y, int length,

View File

@ -10,7 +10,6 @@
#include "elinks.h" #include "elinks.h"
#include "bfu/style.h"
#include "config/options.h" #include "config/options.h"
#include "intl/charsets.h" #include "intl/charsets.h"
#include "main/module.h" #include "main/module.h"
@ -443,21 +442,6 @@ static const struct screen_driver_opt *const screen_driver_opts[] = {
static INIT_LIST_OF(struct screen_driver, active_screen_drivers); static INIT_LIST_OF(struct screen_driver, active_screen_drivers);
static struct screen_char *get_mono_from_node(struct screen_char *ch);
static struct screen_char *get_color16_from_node(struct screen_char *ch);
#ifdef CONFIG_88_COLORS
static struct screen_char *get_color88_from_node(struct screen_char *ch);
#endif
#ifdef CONFIG_256_COLORS
static struct screen_char *get_color256_from_node(struct screen_char *ch);
#endif
#ifdef CONFIG_TRUE_COLOR
static struct screen_char *get_true_color_from_node(struct screen_char *ch);
#endif
/** Set screen_driver.opt according to screen_driver.type and @a term_spec. /** Set screen_driver.opt according to screen_driver.type and @a term_spec.
* Other members of @a *driver need not have been initialized. * Other members of @a *driver need not have been initialized.
* *
@ -748,9 +732,9 @@ compare_fg_color_true(unsigned char *a, unsigned char *b)
} }
static inline void static inline void
copy_color_true(unsigned char *dest, unsigned char *src) copy_color_true(unsigned char *a, unsigned char *b)
{ {
memcpy(dest, src, 6); memcpy(a, b, 6);
} }
static inline int static inline int
@ -884,52 +868,11 @@ add_char_data(struct string *screen, struct screen_driver *driver,
} }
} }
static struct screen_char *
get_mono_from_node(struct screen_char *ch)
{
unsigned int node_number = ch->c.node_number;
if (node_number < 1024) {
return get_bfu_mono_node(node_number);
}
return ch;
}
static struct screen_char *
get_color16_from_node(struct screen_char *ch)
{
unsigned int node_number = ch->c.node_number;
if (node_number < 1024) {
return get_bfu_color16_node(node_number);
}
return ch;
}
/** Time critical section. */ /** Time critical section. */
static inline void static inline void
add_char16(struct string *screen, struct screen_driver *driver, add_char16(struct string *screen, struct screen_driver *driver,
struct screen_char *ch, struct screen_state *state) struct screen_char *ch, struct screen_state *state)
{ {
struct screen_char copy;
if (ch->is_node) {
copy_struct(&copy, ch);
copy.is_node = 0;
if (driver->opt.color_mode == COLOR_MODE_MONO) {
struct screen_char *ch2 = get_mono_from_node(ch);
copy.attr |= ch2->attr;
copy.c.color[0] = ch2->c.color[0];
} else {
struct screen_char *ch2 = get_color16_from_node(ch);
copy.c.color[0] = ch2->c.color[0];
}
ch = &copy;
}
unsigned char border = (ch->attr & SCREEN_ATTR_FRAME); unsigned char border = (ch->attr & SCREEN_ATTR_FRAME);
unsigned char italic = (ch->attr & SCREEN_ATTR_ITALIC); unsigned char italic = (ch->attr & SCREEN_ATTR_ITALIC);
unsigned char underline = (ch->attr & SCREEN_ATTR_UNDERLINE); unsigned char underline = (ch->attr & SCREEN_ATTR_UNDERLINE);
@ -1121,35 +1064,6 @@ add_char_color(struct string *screen, const struct string *seq, unsigned char co
add_bytes_to_string(screen, &seq->source[seq_pos], seq->length - seq_pos); add_bytes_to_string(screen, &seq->source[seq_pos], seq->length - seq_pos);
} }
#ifdef CONFIG_256_COLORS
static struct screen_char *
get_color256_from_node(struct screen_char *ch)
{
unsigned int node_number = ch->c.node_number;
if (node_number < 1024) {
return get_bfu_color256_node(node_number);
}
return ch;
}
#endif
#ifdef CONFIG_88_COLORS
static struct screen_char *
get_color88_from_node(struct screen_char *ch)
{
unsigned int node_number = ch->c.node_number;
if (node_number < 1024) {
return get_bfu_color88_node(node_number);
}
return ch;
}
#endif
#define add_background_color(str, seq, chr) add_char_color(str, &(seq)[1], (chr)->c.color[1]) #define add_background_color(str, seq, chr) add_char_color(str, &(seq)[1], (chr)->c.color[1])
#define add_foreground_color(str, seq, chr) add_char_color(str, &(seq)[0], (chr)->c.color[0]) #define add_foreground_color(str, seq, chr) add_char_color(str, &(seq)[0], (chr)->c.color[0])
@ -1158,30 +1072,6 @@ static inline void
add_char256(struct string *screen, struct screen_driver *driver, add_char256(struct string *screen, struct screen_driver *driver,
struct screen_char *ch, struct screen_state *state) struct screen_char *ch, struct screen_state *state)
{ {
struct screen_char copy;
if (ch->is_node) {
struct screen_char *ch2 = NULL;
copy_struct(&copy, ch);
copy.is_node = 0;
#ifdef CONFIG_88_COLORS
if (driver->opt.color_mode == COLOR_MODE_88) {
ch2 = get_color88_from_node(ch);
} else
#endif
#ifdef CONFIG_256_COLORS
{
ch2 = get_color256_from_node(ch);
}
#endif
if (ch2) {
copy.c.color[0] = ch2->c.color[0];
copy.c.color[1] = ch2->c.color[1];
}
ch = &copy;
}
unsigned char attr_delta = (ch->attr ^ state->attr); unsigned char attr_delta = (ch->attr ^ state->attr);
if ( if (
@ -1292,25 +1182,8 @@ static const struct string color_true_seqs[] = {
/* foreground: */ TERM_STRING("\033[0;38;2"), /* foreground: */ TERM_STRING("\033[0;38;2"),
/* background: */ TERM_STRING("\033[48;2"), /* background: */ TERM_STRING("\033[48;2"),
}; };
static struct screen_char *
get_true_color_from_node(struct screen_char *ch)
{
unsigned int node_number = ch->c.node_number;
if (node_number < 1024) {
return get_bfu_true_color_node(node_number);
}
return ch;
}
static inline void add_char_true_color(struct string *screen, const struct string *seq, unsigned char *colors);
#define add_true_background_color(str, seq, chr) add_char_true_color(str, &(seq)[1], &(chr)->c.color[3]) #define add_true_background_color(str, seq, chr) add_char_true_color(str, &(seq)[1], &(chr)->c.color[3])
#define add_true_foreground_color(str, seq, chr) add_char_true_color(str, &(seq)[0], &(chr)->c.color[0]) #define add_true_foreground_color(str, seq, chr) add_char_true_color(str, &(seq)[0], &(chr)->c.color[0])
static inline void static inline void
add_char_true_color(struct string *screen, const struct string *seq, unsigned char *colors) add_char_true_color(struct string *screen, const struct string *seq, unsigned char *colors)
{ {
@ -1363,17 +1236,6 @@ static inline void
add_char_true(struct string *screen, struct screen_driver *driver, add_char_true(struct string *screen, struct screen_driver *driver,
struct screen_char *ch, struct screen_state *state) struct screen_char *ch, struct screen_state *state)
{ {
struct screen_char copy;
if (ch->is_node) {
struct screen_char *ch2 = get_true_color_from_node(ch);
copy_struct(&copy, ch);
copy.is_node = 0;
copy_color_true(copy.c.color, ch2->c.color);
ch = &copy;
}
unsigned char attr_delta = (ch->attr ^ state->attr); unsigned char attr_delta = (ch->attr ^ state->attr);
if ( if (
@ -1478,6 +1340,11 @@ add_char_true(struct string *screen, struct screen_driver *driver,
&& pos->attr == current->attr) \ && pos->attr == current->attr) \
continue; \ continue; \
\ \
/* Else if the color match and the data is
* ``space''. */ \
if (pos->data <= ' ' && current->data <= ' ' \
&& pos->attr == current->attr) \
continue; \
} \ } \
dirty = 1; \ dirty = 1; \
break; \ break; \

View File

@ -210,7 +210,7 @@ static void
draw_clipboard(struct terminal *term, struct document_view *doc_view) draw_clipboard(struct terminal *term, struct document_view *doc_view)
{ {
struct document *document = doc_view->document; struct document *document = doc_view->document;
unsigned int color_node; struct color_pair *color;
int starty, startx, endy, endx, x, y, xoffset, yoffset; int starty, startx, endy, endx, x, y, xoffset, yoffset;
assert(term && doc_view); assert(term && doc_view);
@ -220,7 +220,7 @@ draw_clipboard(struct terminal *term, struct document_view *doc_view)
return; return;
} }
color_node = get_bfu_color_node(term, "clipboard"); color = get_bfu_color(term, "clipboard");
xoffset = doc_view->box.x - doc_view->vs->x; xoffset = doc_view->box.x - doc_view->vs->x;
yoffset = doc_view->box.y - doc_view->vs->y; yoffset = doc_view->box.y - doc_view->vs->y;
@ -247,7 +247,7 @@ draw_clipboard(struct terminal *term, struct document_view *doc_view)
for (y = starty; y <= endy; ++y) { for (y = starty; y <= endy; ++y) {
for (x = startx; x <= endx; ++x) { for (x = startx; x <= endx; ++x) {
draw_char_color_node(term, x, y, color_node); draw_char_color(term, x, y, color);
} }
} }
doc_view->last_x = doc_view->last_y = -1; doc_view->last_x = doc_view->last_y = -1;
@ -293,8 +293,6 @@ draw_doc(struct session *ses, struct document_view *doc_view, int active)
struct view_state *vs; struct view_state *vs;
struct terminal *term; struct terminal *term;
struct el_box *box; struct el_box *box;
struct screen_char *last = NULL;
int vx, vy; int vx, vy;
int y; int y;
@ -326,22 +324,12 @@ draw_doc(struct session *ses, struct document_view *doc_view, int active)
vs = doc_view->vs; vs = doc_view->vs;
if (!vs) { if (!vs) {
int bgchar = get_opt_int("ui.background_char", ses); draw_box(term, box, ' ', 0, &color);
#ifdef CONFIG_UTF8
draw_box_node(term, box, bgchar, 0, get_bfu_color_node(term, "desktop"));
#else
draw_box_node(term, box, (unsigned char)bgchar, 0, get_bfu_color_node(term, "desktop"));
#endif
return; return;
} }
if (document_has_frames(doc_view->document)) { if (document_has_frames(doc_view->document)) {
int bgchar = get_opt_int("ui.background_char", ses); draw_box(term, box, ' ', 0, &color);
#ifdef CONFIG_UTF8
draw_box_node(term, box, bgchar, 0, get_bfu_color_node(term, "desktop"));
#else
draw_box_node(term, box, (unsigned char)bgchar, 0, get_bfu_color_node(term, "desktop"));
#endif
draw_frame_lines(term, doc_view->document->frame_desc, box->x, box->y, &color); draw_frame_lines(term, doc_view->document->frame_desc, box->x, box->y, &color);
if (vs->current_link == -1) if (vs->current_link == -1)
vs->current_link = 0; vs->current_link = 0;
@ -392,12 +380,7 @@ draw_doc(struct session *ses, struct document_view *doc_view, int active)
} }
doc_view->last_x = vx; doc_view->last_x = vx;
doc_view->last_y = vy; doc_view->last_y = vy;
int bgchar = get_opt_int("ui.background_char", ses); draw_box(term, box, ' ', 0, &color);
#ifdef CONFIG_UTF8
draw_box_node(term, box, bgchar, 0, get_bfu_color_node(term, "desktop"));
#else
draw_box_node(term, box, (unsigned char)bgchar, 0, get_bfu_color_node(term, "desktop"));
#endif
if (!doc_view->document->height) return; if (!doc_view->document->height) return;
while (vs->y >= doc_view->document->height) vs->y -= box->height; while (vs->y >= doc_view->document->height) vs->y -= box->height;
@ -410,43 +393,13 @@ draw_doc(struct session *ses, struct document_view *doc_view, int active)
for (y = int_max(vy, 0); for (y = int_max(vy, 0);
y < int_min(doc_view->document->height, box->height + vy); y < int_min(doc_view->document->height, box->height + vy);
y++) { y++) {
struct screen_char *first = NULL;
int i, j;
int last_index = 0;
int st = int_max(vx, 0); int st = int_max(vx, 0);
int en = int_min(doc_view->document->data[y].length, int en = int_min(doc_view->document->data[y].length,
box->width + vx); box->width + vx);
int max = int_min(en, st + 200);
if (en - st > 0) { if (en - st <= 0) continue;
draw_line(term, box->x + st - vx, box->y + y - vy, draw_line(term, box->x + st - vx, box->y + y - vy, en - st,
en - st, &doc_view->document->data[y].chars[st]);
&doc_view->document->data[y].chars[st]);
for (i = en - 1; i >= 0; --i) {
if (doc_view->document->data[y].chars[i].data != ' ') {
last = &doc_view->document->data[y].chars[i];
last_index = i + 1;
break;
}
}
}
for (i = st; i < max; i++) {
if (doc_view->document->data[y].chars[i].data != ' ') {
first = &doc_view->document->data[y].chars[i];
break;
}
}
for (j = st; j < i; j++) {
draw_space(term, box->x + j - vx, box->y + y - vy,
first);
}
for (i = last_index; i < box->width + vx; i++) {
draw_space(term, box->x + i - vx, box->y + y - vy,
last);
}
} }
draw_view_status(ses, doc_view, active); draw_view_status(ses, doc_view, active);
if (has_search_word(doc_view)) if (has_search_word(doc_view))
@ -528,16 +481,11 @@ draw_formatted(struct session *ses, int rerender)
if (!ses->doc_view || !ses->doc_view->document) { if (!ses->doc_view || !ses->doc_view->document) {
/*INTERNAL("document not formatted");*/ /*INTERNAL("document not formatted");*/
struct el_box box; struct el_box box;
int bgchar = get_opt_int("ui.background_char", ses);
set_box(&box, 0, 1, set_box(&box, 0, 1,
ses->tab->term->width, ses->tab->term->width,
ses->tab->term->height - 2); ses->tab->term->height - 2);
#ifdef CONFIG_UTF8 draw_box(ses->tab->term, &box, ' ', 0, NULL);
draw_box_node(ses->tab->term, &box, bgchar, 0, get_bfu_color_node(ses->tab->term, "desktop"));
#else
draw_box_node(ses->tab->term, &box, (unsigned char)bgchar, 0, get_bfu_color_node(ses->tab->term, "desktop"));
#endif
return; return;
} }

View File

@ -337,7 +337,7 @@ highlight_links_with_prefixes_that_start_with_n(struct terminal *term,
struct document_view *doc_view, struct document_view *doc_view,
int n) int n)
{ {
unsigned int node_number = get_bfu_color_node(term, "searched"); struct color_pair *color = get_bfu_color(term, "searched");
int xoffset = doc_view->box.x - doc_view->vs->x; int xoffset = doc_view->box.x - doc_view->vs->x;
int yoffset = doc_view->box.y - doc_view->vs->y; int yoffset = doc_view->box.y - doc_view->vs->y;
struct document *document = doc_view->document; struct document *document = doc_view->document;
@ -357,7 +357,7 @@ highlight_links_with_prefixes_that_start_with_n(struct terminal *term,
int y = link->points[i].y + yoffset; int y = link->points[i].y + yoffset;
if (is_in_box(&doc_view->box, x, y)) { if (is_in_box(&doc_view->box, x, y)) {
draw_char_color_node(term, x, y, node_number); draw_char_color(term, x, y, color);
} }
} }
} }

View File

@ -903,7 +903,7 @@ draw_searched(struct terminal *term, struct document_view *doc_view)
get_searched(doc_view, &pt, &len, utf8); get_searched(doc_view, &pt, &len, utf8);
if (len) { if (len) {
int i; int i;
unsigned int node_number = get_bfu_color_node(term, "searched"); struct color_pair *color = get_bfu_color(term, "searched");
int xoffset = doc_view->box.x - doc_view->vs->x; int xoffset = doc_view->box.x - doc_view->vs->x;
int yoffset = doc_view->box.y - doc_view->vs->y; int yoffset = doc_view->box.y - doc_view->vs->y;
@ -920,7 +920,7 @@ draw_searched(struct terminal *term, struct document_view *doc_view)
co = ((co >> 3) & 0x0700) | ((co << 3) & 0x3800); co = ((co >> 3) & 0x0700) | ((co << 3) & 0x3800);
#endif #endif
draw_char_color_node(term, x, y, node_number); draw_char_color(term, x, y, color);
} }
} }
@ -1543,8 +1543,7 @@ static void
draw_typeahead_match(struct terminal *term, struct document_view *doc_view, draw_typeahead_match(struct terminal *term, struct document_view *doc_view,
int chars, int offset) int chars, int offset)
{ {
unsigned int node_number = get_bfu_color_node(term, "searched"); struct color_pair *color = get_bfu_color(term, "searched");
int xoffset = doc_view->box.x - doc_view->vs->x; int xoffset = doc_view->box.x - doc_view->vs->x;
int yoffset = doc_view->box.y - doc_view->vs->y; int yoffset = doc_view->box.y - doc_view->vs->y;
struct link *link = get_current_link(doc_view); struct link *link = get_current_link(doc_view);
@ -1569,7 +1568,7 @@ draw_typeahead_match(struct terminal *term, struct document_view *doc_view,
} else if (i >= offset) { } else if (i >= offset) {
/* TODO: We should take in account original colors and /* TODO: We should take in account original colors and
* combine them with defined color. */ * combine them with defined color. */
draw_char_color_node(term, xoffset + x, yoffset + y, node_number); draw_char_color(term, xoffset + x, yoffset + y, color);
} }
} }
} }