diff --git a/elinks-0.12-bittorrent.patch b/elinks-0.12-bittorrent.patch new file mode 100644 index 0000000..e553072 --- /dev/null +++ b/elinks-0.12-bittorrent.patch @@ -0,0 +1,54 @@ +diff --git a/src/protocol/bittorrent/peerconnect.c b/src/protocol/bittorrent/peerconnect.c +index aeafbf3..7a89523 100644 +--- a/src/protocol/bittorrent/peerconnect.c ++++ b/src/protocol/bittorrent/peerconnect.c +@@ -271,9 +271,11 @@ enum bittorrent_state + make_bittorrent_peer_connection(struct bittorrent_connection *bittorrent, + struct bittorrent_peer *peer_info) + { +- struct uri uri; ++ struct string uri_string; ++ struct uri *uri; + struct bittorrent_peer_connection *peer; +- unsigned char port[5]; ++ unsigned char port[6]; ++ int port_length; + + peer = init_bittorrent_peer_connection(-1); + if (!peer) return BITTORRENT_STATE_OUT_OF_MEM; +@@ -296,14 +298,27 @@ make_bittorrent_peer_connection(struct bittorrent_connection *bittorrent, + /* FIXME: Rather change the make_connection() interface. This is an ugly + * hack. */ + /* FIXME: Set the ipv6 flag iff ... */ +- memset(&uri, 0, sizeof(uri)); +- uri.protocol = PROTOCOL_BITTORRENT; +- uri.host = peer_info->ip; +- uri.hostlen = strlen(peer_info->ip); +- uri.port = port; +- uri.portlen = snprintf(port, sizeof(port), "%u", peer_info->port); +- +- make_connection(peer->socket, &uri, send_bittorrent_peer_handshake, 1); ++ if (!init_string(&uri_string)) { ++ done_bittorrent_peer_connection(peer); ++ return BITTORRENT_STATE_OUT_OF_MEM; ++ } ++ /* The bittorrent protocol uses free syntax. ++ * It does not set uri->port nor uri->host */ ++ add_to_string(&uri_string, "http://"); ++ add_to_string(&uri_string, peer_info->ip); ++ add_char_to_string(&uri_string, ':'); ++ port_length = snprintf(port, sizeof(port), "%u", peer_info->port); ++ add_bytes_to_string(&uri_string, port, port_length); ++ ++ uri = get_uri(uri_string.source, URI_BASE); ++ done_string(&uri_string); ++ if (!uri) { ++ done_bittorrent_peer_connection(peer); ++ return BITTORRENT_STATE_OUT_OF_MEM; ++ } ++ uri->protocol = PROTOCOL_BITTORRENT; ++ make_connection(peer->socket, uri, send_bittorrent_peer_handshake, 1); ++ done_uri(uri); + + return BITTORRENT_STATE_OK; + } diff --git a/elinks-scroll.patch b/elinks-scroll.patch new file mode 100644 index 0000000..39ec536 --- /dev/null +++ b/elinks-scroll.patch @@ -0,0 +1,891 @@ +commit b392a24716905f4b2a1efba45384705d90a1941c +Author: Witold Filipczyk +Date: Sun Aug 31 14:23:28 2008 +0200 + + Use real_box in dialog.c. + +diff --git a/src/bfu/dialog.c b/src/bfu/dialog.c +index 644f643..5b94be0 100644 +--- a/src/bfu/dialog.c ++++ b/src/bfu/dialog.c +@@ -82,20 +82,18 @@ redraw_dialog(struct dialog_data *dlg_data, int layout) + } + + if (!dlg_data->dlg->layout.only_widgets) { +- struct box box; +- +- set_box(&box, ++ set_box(&dlg_data->real_box, + dlg_data->box.x + (DIALOG_LEFT_BORDER + 1), + dlg_data->box.y + (DIALOG_TOP_BORDER + 1), + dlg_data->box.width - 2 * (DIALOG_LEFT_BORDER + 1), + dlg_data->box.height - 2 * (DIALOG_TOP_BORDER + 1)); + +- draw_border(term, &box, get_bfu_color(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); + + title_color = get_bfu_color(term, "dialog.title"); +- if (title_color && box.width > 2) { ++ if (title_color && dlg_data->real_box.width > 2) { + unsigned char *title = dlg_data->dlg->title; + int titlelen = strlen(title); + int titlecells = titlelen; +@@ -107,7 +105,7 @@ redraw_dialog(struct dialog_data *dlg_data, int layout) + &title[titlelen]); + #endif /* CONFIG_UTF8 */ + +- titlecells = int_min(box.width - 2, titlecells); ++ titlecells = int_min(dlg_data->real_box.width - 2, titlecells); + + #ifdef CONFIG_UTF8 + if (term->utf8_cp) +@@ -115,8 +113,8 @@ redraw_dialog(struct dialog_data *dlg_data, int layout) + NULL); + #endif /* CONFIG_UTF8 */ + +- x = (box.width - titlecells) / 2 + box.x; +- y = box.y - 1; ++ x = (dlg_data->real_box.width - titlecells) / 2 + dlg_data->real_box.x; ++ y = dlg_data->real_box.y - 1; + + + draw_text(term, x - 1, y, " ", 1, 0, title_color); + +commit 0f02ab5501c976c1d9b9f42894f936a403773c58 +Author: Witold Filipczyk +Date: Sun Aug 31 18:56:23 2008 +0200 + + Added draw_text2 functions and others. + + draw2_text checks whether text of dialogs fit on the screen. + At the start the bottom part of the dialogs is shown. + Scrolling works with bittorrent. I did not check listbox. + +diff --git a/src/bfu/button.c b/src/bfu/button.c +index 0915b81..b5b0c66 100644 +--- a/src/bfu/button.c ++++ b/src/bfu/button.c +@@ -212,7 +212,7 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) + } + + +- draw_text(term, pos->x, pos->y, BUTTON_LEFT, BUTTON_LEFT_LEN, 0, color); ++ draw_text2(term, dlg_data, pos->x, pos->y, BUTTON_LEFT, BUTTON_LEFT_LEN, 0, color); + if (len > 0) { + unsigned char *text = widget_data->widget->text; + int hk_pos = widget_data->widget->info.button.hotkey_pos; +@@ -237,15 +237,15 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) + NULL); + + if (hk_pos) +- draw_text(term, x, pos->y, ++ draw_text2(term, dlg_data, x, pos->y, + text, hk_pos, 0, color); + +- draw_text(term, x + cells_to_hk, pos->y, ++ draw_text2(term, dlg_data, x + cells_to_hk, pos->y, + &text[hk_pos + 1], hk_bytes, + attr, shortcut_color); + + if (right > 1) +- draw_text(term, x+cells_to_hk+hk_cells, ++ draw_text2(term, dlg_data, x+cells_to_hk+hk_cells, + pos->y, + &text[hk_pos + hk_bytes + 1], + right - 1, 0, color); +@@ -258,11 +258,11 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) + len - hk_width, + NULL); + +- draw_text(term, x, pos->y, ++ draw_text2(term, dlg_data, x, pos->y, + text, hk_len, + attr, shortcut_color); + +- draw_text(term, x + hk_width, pos->y, ++ draw_text2(term, dlg_data, x + hk_width, pos->y, + &text[hk_len], len_to_display, + 0, color); + } +@@ -272,18 +272,18 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) + int right = widget_data->widget->info.button.truetextlen - hk_pos - 1; + + if (hk_pos) { +- draw_text(term, x, pos->y, text, hk_pos, 0, color); ++ draw_text2(term, dlg_data, x, pos->y, text, hk_pos, 0, color); + } +- draw_text(term, x + hk_pos, pos->y, ++ draw_text2(term, dlg_data, x + hk_pos, pos->y, + &text[hk_pos + 1], 1, attr, shortcut_color); + if (right > 1) { +- draw_text(term, x + hk_pos + 1, pos->y, ++ draw_text2(term, dlg_data, x + hk_pos + 1, pos->y, + &text[hk_pos + 2], right - 1, 0, color); + } + + } else { +- draw_text(term, x, pos->y, text, 1, attr, shortcut_color); +- draw_text(term, x + 1, pos->y, &text[1], len - 1, 0, color); ++ draw_text2(term, dlg_data, x, pos->y, text, 1, attr, shortcut_color); ++ draw_text2(term, dlg_data, x + 1, pos->y, &text[1], len - 1, 0, color); + } + } + #ifdef CONFIG_UTF8 +@@ -291,15 +291,15 @@ display_button(struct dialog_data *dlg_data, struct widget_data *widget_data) + int text_cells = utf8_ptr2cells(widget_data->widget->text, NULL); + int hk = (widget_data->widget->info.button.hotkey_pos >= 0); + +- draw_text(term, x + text_cells - hk, pos->y, ++ draw_text2(term, dlg_data, x + text_cells - hk, pos->y, + BUTTON_RIGHT, BUTTON_RIGHT_LEN, 0, color); + } else + #endif /* CONFIG_UTF8 */ +- draw_text(term, x + len, pos->y, BUTTON_RIGHT, ++ draw_text2(term, dlg_data, x + len, pos->y, BUTTON_RIGHT, + BUTTON_RIGHT_LEN, 0, color); + if (sel) { +- set_cursor(term, x, pos->y, 1); +- set_window_ptr(dlg_data->win, pos->x, pos->y); ++ set_cursor2(term, dlg_data, x, pos->y, 1); ++ set_window_ptr2(dlg_data, dlg_data->win, pos->x, pos->y); + } + return EVENT_PROCESSED; + } +diff --git a/src/bfu/checkbox.c b/src/bfu/checkbox.c +index b44ce19..d7c974b 100644 +--- a/src/bfu/checkbox.c ++++ b/src/bfu/checkbox.c +@@ -78,11 +78,11 @@ display_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data) + else + text = widget_data->widget->info.checkbox.gid ? "( )" : "[ ]"; + +- draw_text(term, pos->x, pos->y, text, CHECKBOX_LEN, 0, color); ++ draw_text2(term, dlg_data, pos->x, pos->y, text, CHECKBOX_LEN, 0, color); + + if (selected) { +- set_cursor(term, pos->x + 1, pos->y, 1); +- set_window_ptr(dlg_data->win, pos->x, pos->y); ++ set_cursor2(term, dlg_data, pos->x + 1, pos->y, 1); ++ set_window_ptr2(dlg_data, dlg_data->win, pos->x, pos->y); + } + + return EVENT_PROCESSED; +@@ -128,7 +128,6 @@ mouse_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data) + static widget_handler_status_T + select_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data) + { +- + if (!widget_data->widget->info.checkbox.gid) { + /* Checkbox. */ + int *cdata = (int *) widget_data->cdata; +@@ -159,8 +158,8 @@ select_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data) + } + widget_data->info.checkbox.checked = 1; + } +- + display_widget(dlg_data, widget_data); ++ + return EVENT_PROCESSED; + } + +diff --git a/src/bfu/dialog.c b/src/bfu/dialog.c +index 5b94be0..bb4f901 100644 +--- a/src/bfu/dialog.c ++++ b/src/bfu/dialog.c +@@ -117,9 +117,9 @@ redraw_dialog(struct dialog_data *dlg_data, int layout) + y = dlg_data->real_box.y - 1; + + +- draw_text(term, x - 1, y, " ", 1, 0, title_color); +- draw_text(term, x, y, title, titlelen, 0, title_color); +- draw_text(term, x + titlecells, y, " ", 1, 0, ++ draw_text2(term, dlg_data, x - 1, y, " ", 1, 0, title_color); ++ draw_text2(term, dlg_data, x, y, title, titlelen, 0, title_color); ++ draw_text2(term, dlg_data, x + titlecells, y, " ", 1, 0, + title_color); + } + } +@@ -179,6 +179,23 @@ init_widget(struct dialog_data *dlg_data, int i) + return widget_data; + } + ++static int ++check_range(struct dialog_data *dlg_data, struct widget_data *widget_data) ++{ ++ if (!dlg_data->dlg->layout.only_widgets) { ++ struct box *box = &widget_data->box; ++ struct box *dlgbox = &dlg_data->real_box; ++ int y = box->y - dlgbox->y; ++ ++ if ((y < dlg_data->y) || (y >= dlg_data->y + dlgbox->height)) { ++ dlg_data->y = y / dlgbox->height * dlgbox->height; ++ redraw_dialog(dlg_data, 0); ++ return 1; ++ } ++ } ++ return 0; ++} ++ + void + select_widget(struct dialog_data *dlg_data, struct widget_data *widget_data) + { +@@ -188,6 +205,9 @@ select_widget(struct dialog_data *dlg_data, struct widget_data *widget_data) + + dlg_data->selected_widget_id = widget_data - dlg_data->widgets_data; + ++ if (check_range(dlg_data, widget_data)) ++ return; ++ + display_widget(dlg_data, previously_selected_widget); + display_widget(dlg_data, widget_data); + } +@@ -226,6 +246,11 @@ cycle_widget_focus(struct dialog_data *dlg_data, int direction) + } while (!widget_is_focusable(selected_widget(dlg_data)) + && dlg_data->selected_widget_id != prev_selected); + ++ if (check_range(dlg_data, selected_widget(dlg_data))) { ++ redraw_from_window(dlg_data->win); ++ return; ++ } ++ + display_widget(dlg_data, previously_selected_widget); + display_widget(dlg_data, selected_widget(dlg_data)); + redraw_from_window(dlg_data->win); +@@ -236,6 +261,7 @@ dialog_ev_init(struct dialog_data *dlg_data) + { + int i; + ++ dlg_data->y = 0; + /* TODO: foreachback_widget() */ + for (i = dlg_data->number_of_widgets - 1; i >= 0; i--) { + struct widget_data *widget_data; +@@ -419,6 +445,7 @@ dialog_ev_abort(struct dialog_data *dlg_data) + } + + freeml(dlg_data->ml); ++ dlg_data->y = 0; + } + + /* TODO: use EVENT_PROCESSED/EVENT_NOT_PROCESSED. */ +diff --git a/src/bfu/group.c b/src/bfu/group.c +index c3da0d2..15bd827 100644 +--- a/src/bfu/group.c ++++ b/src/bfu/group.c +@@ -87,14 +87,14 @@ dlg_format_group(struct terminal *term, struct dialog_data *dlg_data, + text, + label_length, + NULL); +- draw_text(term, xpos + width ++ draw_text2(term, dlg_data, xpos + width + + label_padding, + *y, text, lb, 0, + color); + } else + #endif /* CONFIG_UTF8 */ + { +- draw_text(term, xpos + width ++ draw_text2(term, dlg_data, xpos + width + + label_padding, + *y, text, + label_length, 0, +@@ -113,12 +113,12 @@ dlg_format_group(struct terminal *term, struct dialog_data *dlg_data, + text, + label_length, + NULL); +- draw_text(term, xpos, *y, ++ draw_text2(term, dlg_data, xpos, *y, + text, lb, 0, color); + } else + #endif /* CONFIG_UTF8 */ + { +- draw_text(term, xpos, *y, ++ draw_text2(term, dlg_data, xpos, *y, + text, label_length, + 0, color); + } +diff --git a/src/bfu/inpfield.c b/src/bfu/inpfield.c +index 0e1ba35..4ba30eb 100644 +--- a/src/bfu/inpfield.c ++++ b/src/bfu/inpfield.c +@@ -312,7 +312,7 @@ display_field_do(struct dialog_data *dlg_data, struct widget_data *widget_data, + if (term->utf8_cp) + w = utf8_cells2bytes(text, w, NULL); + #endif /* CONFIG_UTF8 */ +- draw_text(term, widget_data->box.x, widget_data->box.y, ++ draw_text2(term, dlg_data, widget_data->box.x, widget_data->box.y, + text, w, 0, color); + } else { + struct box box; +diff --git a/src/bfu/text.c b/src/bfu/text.c +index c1bfc4c..3d2895e 100644 +--- a/src/bfu/text.c ++++ b/src/bfu/text.c +@@ -256,7 +256,7 @@ dlg_format_text_do(struct terminal *term, struct dialog_data *dlg_data, + + assert(cells <= width && shift < width); + +- draw_text(term, x + shift, *y, text, line_width, 0, color); ++ draw_text2(term, dlg_data, x + shift, *y, text, line_width, 0, color); + } + } + +@@ -397,8 +397,8 @@ display_text(struct dialog_data *dlg_data, struct widget_data *widget_data) + + /* Hope this is at least a bit reasonable. Set cursor + * and window pointer to start of the first text line. */ +- set_cursor(win->term, widget_data->box.x, widget_data->box.y, 1); +- set_window_ptr(win, widget_data->box.x, widget_data->box.y); ++ set_cursor2(win->term, dlg_data, widget_data->box.x, widget_data->box.y, 1); ++ set_window_ptr2(dlg_data, win, widget_data->box.x, widget_data->box.y); + + return EVENT_PROCESSED; + } +diff --git a/src/terminal/draw.c b/src/terminal/draw.c +index 9189a2d..45deccb 100644 +--- a/src/terminal/draw.c ++++ b/src/terminal/draw.c +@@ -7,6 +7,7 @@ + + #include "elinks.h" + ++#include "bfu/dialog.h" + #include "config/options.h" + #include "intl/charsets.h" + #include "terminal/color.h" +@@ -559,6 +560,23 @@ draw_text(struct terminal *term, int x, int y, + } + + void ++draw_text2(struct terminal *term, struct dialog_data *dlg_data, int x, int y, ++ unsigned char *text, int length, ++ enum screen_char_attr attr, struct color_pair *color) ++{ ++ struct 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(term, x, y, text, length, attr, color); ++} ++ ++ ++void + set_cursor(struct terminal *term, int x, int y, int blockable) + { + assert(term && term->screen); +@@ -580,6 +598,24 @@ set_cursor(struct terminal *term, int x, int y, int blockable) + } + + void ++set_cursor2(struct terminal *term, struct dialog_data *dlg_data, int x, int y, int blockable) ++{ ++ struct box *box = &dlg_data->real_box; ++ ++ assert(term && term->screen); ++ if_assert_failed return; ++ ++ if (box->height) { ++ int y_max = box->y + box->height; ++ ++ y -= dlg_data->y; ++ if (y < box->y || y >= y_max) return; ++ } ++ set_cursor(term, x, y, blockable); ++} ++ ++ ++void + clear_terminal(struct terminal *term) + { + struct box box; +diff --git a/src/terminal/draw.h b/src/terminal/draw.h +index 6dcd31a..20fba4e 100644 +--- a/src/terminal/draw.h ++++ b/src/terminal/draw.h +@@ -4,6 +4,7 @@ + #include "intl/charsets.h" /* unicode_val_T */ + + struct color_pair; ++struct dialog_data; + struct box; + struct terminal; + +@@ -280,6 +281,12 @@ void draw_text(struct terminal *term, int x, int y, + enum screen_char_attr attr, + struct color_pair *color); + ++/** Draws text for dialogs. */ ++void draw_text2(struct terminal *term, struct dialog_data *dlg_data, int x, int y, ++ unsigned char *text, int length, ++ enum screen_char_attr attr, struct color_pair *color); ++ ++ + /** Draws @a length chars from @a line on the screen. */ + void draw_line(struct terminal *term, int x, int y, int length, + struct screen_char *line); +@@ -289,6 +296,9 @@ void draw_line(struct terminal *term, int x, int y, int length, + * bottom right corner of the screen. */ + void set_cursor(struct terminal *term, int x, int y, int blockable); + ++/* set cursor for dialogs */ ++void set_cursor2(struct terminal *term, struct dialog_data *dlg_data, int x, int y, int blockable); ++ + /** Blanks the screen. */ + void clear_terminal(struct terminal *); + +diff --git a/src/terminal/window.c b/src/terminal/window.c +index d4cd6c1..1d2273b 100644 +--- a/src/terminal/window.c ++++ b/src/terminal/window.c +@@ -7,6 +7,7 @@ + + #include "elinks.h" + ++#include "bfu/dialog.h" + #include "bfu/menu.h" + #include "terminal/event.h" + #include "terminal/tab.h" +@@ -205,3 +206,17 @@ assert_window_stacking(struct terminal *term) + } + } + #endif /* CONFIG_DEBUG */ ++ ++void ++set_window_ptr2(struct dialog_data *dlg_data, struct window *window, int x, int y) ++{ ++ struct 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; ++ } ++ set_window_ptr(window, x, y); ++} +diff --git a/src/terminal/window.h b/src/terminal/window.h +index e94da64..c9122f1 100644 +--- a/src/terminal/window.h ++++ b/src/terminal/window.h +@@ -3,6 +3,7 @@ + + #include "util/lists.h" + ++struct dialog_data; + struct term_event; + struct terminal; + struct window; +@@ -73,6 +74,7 @@ void add_window(struct terminal *, window_handler_T, void *); + void delete_window(struct window *); + void delete_window_ev(struct window *, struct term_event *ev); + #define set_window_ptr(window, x_, y_) do { (window)->x = (x_); (window)->y = (y_); } while (0) ++void set_window_ptr2(struct dialog_data *dlg_data, struct window *window, int x, int y); + void get_parent_ptr(struct window *, int *, int *); + + void add_empty_window(struct terminal *, void (*)(void *), void *); + +commit 9fd863d024e00e1f907b1581780a195b59bf6f0a +Author: Witold Filipczyk +Date: Sun Aug 31 14:17:45 2008 +0200 + + Pass dlg_data to all format functions. It will be used later by + scrolling. + +diff --git a/src/bfu/button.c b/src/bfu/button.c +index b567251..0915b81 100644 +--- a/src/bfu/button.c ++++ b/src/bfu/button.c +@@ -115,7 +115,7 @@ buttons_width(struct widget_data *widget_data, int n, + } + + void +-dlg_format_buttons(struct terminal *term, ++dlg_format_buttons(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, int n, + int x, int *y, int w, int *rw, enum format_align align, int format_only) + { +diff --git a/src/bfu/button.h b/src/bfu/button.h +index ca7b3d6..3f00b26 100644 +--- a/src/bfu/button.h ++++ b/src/bfu/button.h +@@ -5,6 +5,7 @@ + #include "util/align.h" + + struct dialog; ++struct dialog_data; + struct terminal; + struct widget_data; + +@@ -48,6 +49,6 @@ void add_dlg_button_do(struct dialog *dlg, unsigned char *text, int flags, widge + #endif + + extern const struct widget_ops button_ops; +-void dlg_format_buttons(struct terminal *, struct widget_data *, int, int, int *, int, int *, enum format_align, int); ++void dlg_format_buttons(struct terminal *, struct dialog_data *, struct widget_data *, int, int, int *, int, int *, enum format_align, int); + + #endif +diff --git a/src/bfu/checkbox.c b/src/bfu/checkbox.c +index 7ed97e0..b44ce19 100644 +--- a/src/bfu/checkbox.c ++++ b/src/bfu/checkbox.c +@@ -36,7 +36,7 @@ add_dlg_radio_do(struct dialog *dlg, unsigned char *text, + } + + void +-dlg_format_checkbox(struct terminal *term, ++dlg_format_checkbox(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, + int x, int *y, int w, int *rw, + enum format_align align, int format_only) +@@ -49,7 +49,7 @@ dlg_format_checkbox(struct terminal *term, + + if (text && *text) { + if (rw) *rw -= CHECKBOX_LS; +- dlg_format_text_do(term, text, x + CHECKBOX_LS, y, ++ dlg_format_text_do(term, dlg_data, text, x + CHECKBOX_LS, y, + w - CHECKBOX_LS, rw, + get_bfu_color(term, "dialog.checkbox-label"), + align, format_only); +diff --git a/src/bfu/checkbox.h b/src/bfu/checkbox.h +index 573f1d2..b4e65ce 100644 +--- a/src/bfu/checkbox.h ++++ b/src/bfu/checkbox.h +@@ -2,6 +2,7 @@ + #define EL__BFU_CHECKBOX_H + + struct dialog; ++struct dialog_data; + struct terminal; + struct widget_data; + +@@ -30,7 +31,7 @@ void add_dlg_radio_do(struct dialog *dlg, unsigned char *text, int groupid, int + extern const struct widget_ops checkbox_ops; + + void +-dlg_format_checkbox(struct terminal *term, ++dlg_format_checkbox(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, + int x, int *y, int w, int *rw, + enum format_align align, int format_only); +diff --git a/src/bfu/dialog.c b/src/bfu/dialog.c +index f99e781..644f643 100644 +--- a/src/bfu/dialog.c ++++ b/src/bfu/dialog.c +@@ -554,17 +554,17 @@ format_widgets(struct terminal *term, struct dialog_data *dlg_data, + switch (wdata->widget->type) { + case WIDGET_FIELD_PASS: + case WIDGET_FIELD: +- dlg_format_field(term, wdata, x, y, w, rw, ALIGN_LEFT, ++ dlg_format_field(term, dlg_data, wdata, x, y, w, rw, ALIGN_LEFT, + format_only); + break; + + case WIDGET_LISTBOX: +- dlg_format_listbox(term, wdata, x, y, w, h, rw, ++ dlg_format_listbox(term, dlg_data, wdata, x, y, w, h, rw, + ALIGN_LEFT, format_only); + break; + + case WIDGET_TEXT: +- dlg_format_text(term, wdata, x, y, w, rw, h, ++ dlg_format_text(term, dlg_data, wdata, x, y, w, rw, h, + format_only); + break; + +@@ -583,7 +583,7 @@ format_widgets(struct terminal *term, struct dialog_data *dlg_data, + break; + } + +- dlg_format_group(term, wdata, size, x, y, w, rw, ++ dlg_format_group(term, dlg_data, wdata, size, x, y, w, rw, + format_only); + wdata += size - 1; + +@@ -591,7 +591,7 @@ format_widgets(struct terminal *term, struct dialog_data *dlg_data, + + /* No horizontal space between checkboxes belonging to + * the same group. */ +- dlg_format_checkbox(term, wdata, x, y, w, rw, ++ dlg_format_checkbox(term, dlg_data, wdata, x, y, w, rw, + ALIGN_LEFT, format_only); + if (widgets > 1 + && group == widget_has_group(&wdata[1])) +@@ -603,7 +603,7 @@ format_widgets(struct terminal *term, struct dialog_data *dlg_data, + /* We assume that the buttons are all stuffed at the very end + * of the dialog. */ + case WIDGET_BUTTON: +- dlg_format_buttons(term, wdata, widgets, ++ dlg_format_buttons(term, dlg_data, wdata, widgets, + x, y, w, rw, ALIGN_CENTER, format_only); + return; + } +diff --git a/src/bfu/dialog.h b/src/bfu/dialog.h +index b0cde3b..bec914c 100644 +--- a/src/bfu/dialog.h ++++ b/src/bfu/dialog.h +@@ -100,6 +100,8 @@ struct dialog_data { + struct memory_list *ml; + + struct box box; ++ struct box real_box; ++ int y; + int number_of_widgets; + int selected_widget_id; + struct term_event *term_event; +diff --git a/src/bfu/group.c b/src/bfu/group.c +index cc4c6d8..c3da0d2 100644 +--- a/src/bfu/group.c ++++ b/src/bfu/group.c +@@ -20,7 +20,7 @@ + #define CHECKBOX_LEN 3 /* "[X]" or "(X)" */ + + void +-dlg_format_group(struct terminal *term, ++dlg_format_group(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, + int n, int x, int *y, int w, int *rw, int format_only) + { +@@ -155,11 +155,11 @@ group_layouter(struct dialog_data *dlg_data) + #endif /* CONFIG_UTF8 */ + rw = int_min(w, strlen(dlg_data->dlg->title)); + +- dlg_format_group(term, dlg_data->widgets_data, n, ++ dlg_format_group(term, dlg_data, dlg_data->widgets_data, n, + 0, &y, w, &rw, 1); + + y++; +- dlg_format_buttons(term, dlg_data->widgets_data + n, 2, 0, &y, w, ++ dlg_format_buttons(term, dlg_data, dlg_data->widgets_data + n, 2, 0, &y, w, + &rw, ALIGN_CENTER, 1); + + w = rw; +@@ -167,10 +167,10 @@ group_layouter(struct dialog_data *dlg_data) + draw_dialog(dlg_data, w, y); + + y = dlg_data->box.y + DIALOG_TB + 1; +- dlg_format_group(term, dlg_data->widgets_data, n, ++ dlg_format_group(term, dlg_data, dlg_data->widgets_data, n, + dlg_data->box.x + DIALOG_LB, &y, w, NULL, 0); + + y++; +- dlg_format_buttons(term, dlg_data->widgets_data + n, 2, ++ dlg_format_buttons(term, dlg_data, dlg_data->widgets_data + n, 2, + dlg_data->box.x + DIALOG_LB, &y, w, &rw, ALIGN_CENTER, 0); + } +diff --git a/src/bfu/group.h b/src/bfu/group.h +index 0de645d..9b92c2a 100644 +--- a/src/bfu/group.h ++++ b/src/bfu/group.h +@@ -5,7 +5,7 @@ struct dialog_data; + struct terminal; + struct widget_data; + +-void dlg_format_group(struct terminal *term, ++void dlg_format_group(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, + int n, int x, int *y, int w, int *rw, int format_only); + +diff --git a/src/bfu/inpfield.c b/src/bfu/inpfield.c +index f0b8539..0e1ba35 100644 +--- a/src/bfu/inpfield.c ++++ b/src/bfu/inpfield.c +@@ -103,7 +103,7 @@ check_nonempty(struct dialog_data *dlg_data, struct widget_data *widget_data) + } + + void +-dlg_format_field(struct terminal *term, ++dlg_format_field(struct terminal *term, struct dialog_data *dlg_data, + struct widget_data *widget_data, + int x, int *y, int w, int *rw, enum format_align align, int format_only) + { +@@ -132,7 +132,7 @@ dlg_format_field(struct terminal *term, + if (label && *label) { + if (!format_only) text_color = get_bfu_color(term, "dialog.text"); + +- dlg_format_text_do(term, label, x, y, w, rw, text_color, ALIGN_LEFT, format_only); ++ dlg_format_text_do(term, 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 +@@ -140,7 +140,7 @@ dlg_format_field(struct terminal *term, + if (label && *label && float_label) { + if (widget_data->widget->info.field.flags & INPFIELD_FLOAT) { + (*y) -= INPUTFIELD_HEIGHT; +- dlg_format_text_do(term, INPUTFIELD_FLOAT_SEPARATOR, ++ dlg_format_text_do(term, dlg_data, INPUTFIELD_FLOAT_SEPARATOR, + x + label_width, y, w, rw, + text_color, ALIGN_LEFT, format_only); + w -= INPUTFIELD_FLOAT_SEPARATOR_LEN + INPUTFIELD_FLOATLABEL_PADDING; +@@ -765,7 +765,7 @@ input_line_layouter(struct dialog_data *dlg_data) + - ses->status.show_status_bar + - ses->status.show_tabs_bar; + +- dlg_format_field(win->term, dlg_data->widgets_data, 0, ++ dlg_format_field(win->term, dlg_data, dlg_data->widgets_data, 0, + &y, win->term->width, NULL, ALIGN_LEFT, 0); + } + +diff --git a/src/bfu/inpfield.h b/src/bfu/inpfield.h +index d45a902..fb2270e 100644 +--- a/src/bfu/inpfield.h ++++ b/src/bfu/inpfield.h +@@ -62,7 +62,7 @@ extern const struct widget_ops field_pass_ops; + widget_handler_status_T check_number(struct dialog_data *, struct widget_data *); + widget_handler_status_T check_nonempty(struct dialog_data *, struct widget_data *); + +-void dlg_format_field(struct terminal *, struct widget_data *, int, int *, int, int *, enum format_align, int format_only); ++void dlg_format_field(struct terminal *, struct dialog_data *, struct widget_data *, int, int *, int, int *, enum format_align, int format_only); + + void input_field(struct terminal *, struct memory_list *, int, unsigned char *, + unsigned char *, unsigned char *, unsigned char *, void *, +diff --git a/src/bfu/listbox.c b/src/bfu/listbox.c +index 2e27aba..c4a4160 100644 +--- a/src/bfu/listbox.c ++++ b/src/bfu/listbox.c +@@ -41,7 +41,8 @@ get_listbox_widget_data(struct widget_data *widget_data) + + /* Layout for generic boxes */ + void +-dlg_format_listbox(struct terminal *term, struct widget_data *widget_data, ++dlg_format_listbox(struct terminal *term, struct dialog_data *dlg_data, ++ struct widget_data *widget_data, + int x, int *y, int w, int max_height, int *rw, + enum format_align align, int format_only) + { +diff --git a/src/bfu/listbox.h b/src/bfu/listbox.h +index c3599e5..63b8be4 100644 +--- a/src/bfu/listbox.h ++++ b/src/bfu/listbox.h +@@ -133,7 +133,7 @@ struct listbox_item { + + extern const struct widget_ops listbox_ops; + +-void dlg_format_listbox(struct terminal *, struct widget_data *, int, int *, int, int, int *, enum format_align, int format_only); ++void dlg_format_listbox(struct terminal *, struct dialog_data *, struct widget_data *, int, int *, int, int, int *, enum format_align, int format_only); + + struct listbox_item *traverse_listbox_items_list(struct listbox_item *, struct listbox_data *, int, int, int (*)(struct listbox_item *, void *, int *), void *); + +diff --git a/src/bfu/text.c b/src/bfu/text.c +index e8be019..c1bfc4c 100644 +--- a/src/bfu/text.c ++++ b/src/bfu/text.c +@@ -211,7 +211,8 @@ split_lines(struct widget_data *widget_data, int max_width) + + /* Format text according to dialog box and alignment. */ + void +-dlg_format_text_do(struct terminal *term, unsigned char *text, ++dlg_format_text_do(struct terminal *term, struct dialog_data *dlg_data, ++ unsigned char *text, + int x, int *y, int width, int *real_width, + struct color_pair *color, enum format_align align, + int format_only) +@@ -260,7 +261,8 @@ dlg_format_text_do(struct terminal *term, unsigned char *text, + } + + void +-dlg_format_text(struct terminal *term, struct widget_data *widget_data, ++dlg_format_text(struct terminal *term, struct dialog_data *dlg_data, ++ struct widget_data *widget_data, + int x, int *y, int width, int *real_width, int max_height, + int format_only) + { +@@ -335,7 +337,7 @@ dlg_format_text(struct terminal *term, struct widget_data *widget_data, + widget_data->info.text.current = 0; + } + +- dlg_format_text_do(term, text, ++ dlg_format_text_do(term, dlg_data, text, + x, y, width, real_width, + get_bfu_color(term, "dialog.text"), + widget_data->widget->info.text.align, format_only); +@@ -423,7 +425,7 @@ format_and_display_text(struct widget_data *widget_data, + draw_box(term, &widget_data->box, ' ', 0, + get_bfu_color(term, "dialog.generic")); + +- dlg_format_text(term, widget_data, ++ dlg_format_text(term, dlg_data, widget_data, + widget_data->box.x, &y, widget_data->box.width, NULL, + height, 0); + +diff --git a/src/bfu/text.h b/src/bfu/text.h +index 8dd3365..b181c1a 100644 +--- a/src/bfu/text.h ++++ b/src/bfu/text.h +@@ -4,6 +4,7 @@ + #include "util/color.h" + + struct dialog; ++struct dialog_data; + struct terminal; + + struct widget_info_text { +@@ -45,12 +46,12 @@ void add_dlg_text(struct dialog *dlg, unsigned char *text, + enum format_align align, int bottom_pad); + + extern const struct widget_ops text_ops; +-void dlg_format_text_do(struct terminal *term, ++void dlg_format_text_do(struct terminal *term, struct dialog_data *dlg_data, + unsigned char *text, int x, int *y, int w, int *rw, + struct color_pair *scolor, enum format_align align, int format_only); + + void +-dlg_format_text(struct terminal *term, struct widget_data *widget_data, ++dlg_format_text(struct terminal *term, struct dialog_data *dlg_data, struct widget_data *widget_data, + int x, int *y, int dlg_width, int *real_width, int height, int format_only); + + #define text_is_scrollable(widget_data) \ +diff --git a/src/dialogs/download.c b/src/dialogs/download.c +index 0116578..b90f047 100644 +--- a/src/dialogs/download.c ++++ b/src/dialogs/download.c +@@ -157,7 +157,7 @@ download_dialog_layouter(struct dialog_data *dlg_data) + int_lower_bound(&w, DOWN_DLG_MIN); + } + +- dlg_format_text_do(term, url, 0, &y, w, &rw, ++ dlg_format_text_do(term, dlg_data, url, 0, &y, w, &rw, + dialog_text_color, ALIGN_LEFT, 1); + + y++; +@@ -166,11 +166,11 @@ download_dialog_layouter(struct dialog_data *dlg_data) + #if CONFIG_BITTORRENT + if (bittorrent) y += 2; + #endif +- dlg_format_text_do(term, msg, 0, &y, w, &rw, ++ dlg_format_text_do(term, dlg_data, msg, 0, &y, w, &rw, + dialog_text_color, ALIGN_LEFT, 1); + + y++; +- dlg_format_buttons(term, dlg_data->widgets_data, ++ dlg_format_buttons(term, dlg_data, dlg_data->widgets_data, + dlg_data->number_of_widgets, 0, &y, w, + &rw, ALIGN_CENTER, 1); + +@@ -190,7 +190,7 @@ download_dialog_layouter(struct dialog_data *dlg_data) + + y = dlg_data->box.y + DIALOG_TB + 1; + x = dlg_data->box.x + DIALOG_LB; +- dlg_format_text_do(term, url, x, &y, w, NULL, ++ dlg_format_text_do(term, dlg_data, url, x, &y, w, NULL, + dialog_text_color, ALIGN_LEFT, 0); + + if (show_meter) { +@@ -207,11 +207,11 @@ download_dialog_layouter(struct dialog_data *dlg_data) + } + #endif + y++; +- dlg_format_text_do(term, msg, x, &y, w, NULL, ++ dlg_format_text_do(term, dlg_data, msg, x, &y, w, NULL, + dialog_text_color, ALIGN_LEFT, 0); + + y++; +- dlg_format_buttons(term, dlg_data->widgets_data, ++ dlg_format_buttons(term, dlg_data, dlg_data->widgets_data, + dlg_data->number_of_widgets, x, &y, w, + NULL, ALIGN_CENTER, 0); + diff --git a/elinks.spec b/elinks.spec index 703aa2f..8e5d29d 100644 --- a/elinks.spec +++ b/elinks.spec @@ -1,7 +1,7 @@ Name: elinks Summary: A text-mode Web browser Version: 0.12 -Release: 0.3.pre1%{?dist} +Release: 0.4.pre1%{?dist} License: GPLv2 URL: http://elinks.or.cz Group: Applications/Internet @@ -29,6 +29,8 @@ Patch5: elinks-0.10.1-xterm.patch Patch6: elinks-0.11.0-union.patch Patch7: elinks-0.11.3-macropen.patch Patch8: elinks-0.12pre1-tabreload.patch +Patch9: elinks-0.12-bittorrent.patch +Patch10: elinks-scroll.patch %description Links is a text-based Web browser. Links does not display any images, @@ -56,6 +58,10 @@ quickly and swiftly displays Web pages. %patch7 -p1 # upstream fix for opening tab during reload %patch8 -p1 +#upstream fix for bittorrent +%patch9 -p1 +#upstream fix for out of screen dialogs +%patch10 -p1 %build ./autogen.sh @@ -86,6 +92,10 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man5/* %changelog +* Mon Sep 1 2008 Ondrej Vasik 0.12-0.4.pre1 +- upstream fix for bittorrent protocol +- upstream fix for out of screen bittorrent dialog texts + * Tue Jul 15 2008 Ondrej Vasik 0.12-0.3.pre1 - get rid off fuzz in patches