Some dialog boxes dont fit on the screen.
Here are 3 concatenated patches, which fixes that issue.
When a dialog is displayed on the screen for the first
time the bottom of it is shown.
Later one can scroll using UP and DOWN keys.

Witek
commit 0f02ab5501c976c1d9b9f42894f936a403773c58
Author: Witold Filipczyk <[EMAIL PROTECTED]>
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 b392a24716905f4b2a1efba45384705d90a1941c
Author: Witold Filipczyk <[EMAIL PROTECTED]>
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 9fd863d024e00e1f907b1581780a195b59bf6f0a
Author: Witold Filipczyk <[EMAIL PROTECTED]>
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);
 
_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev

Reply via email to