summaryrefslogtreecommitdiffstats
path: root/contrib/dialog/arrows.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/dialog/arrows.c')
-rw-r--r--contrib/dialog/arrows.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/contrib/dialog/arrows.c b/contrib/dialog/arrows.c
index 6a25fd9..5e5c723 100644
--- a/contrib/dialog/arrows.c
+++ b/contrib/dialog/arrows.c
@@ -1,9 +1,9 @@
/*
- * $Id: arrows.c,v 1.36 2011/06/27 09:13:56 tom Exp $
+ * $Id: arrows.c,v 1.50 2013/05/24 00:05:21 tom Exp $
*
* arrows.c -- draw arrows to indicate end-of-range for lists
*
- * Copyright 2000-2010,2011 Thomas E. Dickey
+ * Copyright 2000-2012,2013 Thomas E. Dickey
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License, version 2.1
@@ -79,9 +79,9 @@ dlg_draw_helpline(WINDOW *win, bool decorations)
const int *cols = dlg_index_columns(dialog_vars.help_line);
int other = decorations ? (ON_LEFT + ON_RIGHT) : 0;
int avail = (getmaxx(win) - other - 2);
- int limit = dlg_limit_columns(dialog_vars.help_line, avail, 0);
+ int limit = dlg_count_real_columns(dialog_vars.help_line) + 2;
- if (limit > 0) {
+ if (limit < avail) {
getyx(win, cur_y, cur_x);
other = decorations ? ON_LEFT : 0;
(void) wmove(win, bottom, other + (avail - limit) / 2);
@@ -107,13 +107,14 @@ dlg_draw_arrows2(WINDOW *win,
int cur_x, cur_y;
int limit_x = getmaxx(win);
bool draw_top = TRUE;
+ bool is_toplevel = (wgetparent(win) == stdscr);
getyx(win, cur_y, cur_x);
/*
* If we're drawing a centered title, do not overwrite with the arrows.
*/
- if (dialog_vars.title) {
+ if (dialog_vars.title && is_toplevel && (top - getbegy(win)) < MARGIN) {
int have = (limit_x - dlg_count_columns(dialog_vars.title)) / 2;
int need = x + 5;
if (need > have)
@@ -123,11 +124,11 @@ dlg_draw_arrows2(WINDOW *win,
if (draw_top) {
(void) wmove(win, top, x);
if (top_arrow) {
- wattrset(win, merge_colors(uarrow_attr, attr));
+ (void) wattrset(win, merge_colors(uarrow_attr, attr));
(void) add_acs(win, ACS_UARROW);
(void) waddstr(win, "(-)");
} else {
- wattrset(win, attr);
+ (void) wattrset(win, attr);
(void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
}
@@ -135,11 +136,11 @@ dlg_draw_arrows2(WINDOW *win,
(void) wmove(win, bottom, x);
if (bottom_arrow) {
- wattrset(win, merge_colors(darrow_attr, attr));
+ (void) wattrset(win, merge_colors(darrow_attr, borderattr));
(void) add_acs(win, ACS_DARROW);
(void) waddstr(win, "(+)");
} else {
- wattrset(win, borderattr);
+ (void) wattrset(win, borderattr);
(void) whline(win, dlg_boxchar(ACS_HLINE), ON_LEFT);
}
mouse_mkbutton(bottom, x - 1, 6, KEY_NPAGE);
@@ -147,7 +148,7 @@ dlg_draw_arrows2(WINDOW *win,
(void) wmove(win, cur_y, cur_x);
wrefresh(win);
- wattrset(win, save);
+ (void) wattrset(win, save);
}
void
@@ -166,14 +167,13 @@ dlg_draw_scrollbar(WINDOW *win,
char buffer[80];
int percent;
int len;
- int oldy, oldx, maxy, maxx;
+ int oldy, oldx;
chtype save = dlg_get_attrs(win);
int top_arrow = (first_data != 0);
int bottom_arrow = (next_data < total_data);
getyx(win, oldy, oldx);
- getmaxyx(win, maxy, maxx);
dlg_draw_helpline(win, TRUE);
if (bottom_arrow || top_arrow || dialog_state.use_scrollbar) {
@@ -187,43 +187,57 @@ dlg_draw_scrollbar(WINDOW *win,
else if (percent > 100)
percent = 100;
- wattrset(win, position_indicator_attr);
+ (void) wattrset(win, position_indicator_attr);
(void) sprintf(buffer, "%d%%", percent);
(void) wmove(win, bottom, right - 7);
(void) waddstr(win, buffer);
if ((len = dlg_count_columns(buffer)) < 4) {
- wattrset(win, border_attr);
+ (void) wattrset(win, border_attr);
whline(win, dlg_boxchar(ACS_HLINE), 4 - len);
}
}
-#define BARSIZE(num) (int) (((all_high * (num)) + all_high - 1) / total_data)
+#define BARSIZE(num) (int) (0.5 + (double) ((all_high * (int) (num)) / (double) total_data))
+#define ORDSIZE(num) (int) ((double) ((all_high * (int) (num)) / (double) all_diff))
if (dialog_state.use_scrollbar) {
int all_high = (bottom - top - 1);
+ this_data = MAX(0, this_data);
+
if (total_data > 0 && all_high > 0) {
+ int all_diff = (int) (total_data + 1);
+ int bar_diff = (int) (next_data + 1 - this_data);
int bar_high;
int bar_y;
- bar_high = BARSIZE(next_data - this_data);
+ bar_high = ORDSIZE(bar_diff);
if (bar_high <= 0)
bar_high = 1;
if (bar_high < all_high) {
+ int bar_last = BARSIZE(next_data);
+
wmove(win, top + 1, right);
- wattrset(win, save);
+ (void) wattrset(win, save);
wvline(win, ACS_VLINE | A_REVERSE, all_high);
- bar_y = BARSIZE(this_data);
- if (bar_y > all_high - bar_high)
- bar_y = all_high - bar_high;
+ bar_y = ORDSIZE(this_data);
+ if (bar_y >= bar_last && bar_y > 0)
+ bar_y = bar_last - 1;
+ if (bar_last - bar_y > bar_high && bar_high > 1)
+ ++bar_y;
+ bar_last = MIN(bar_last, all_high);
wmove(win, top + 1 + bar_y, right);
- wattrset(win, position_indicator_attr);
+ (void) wattrset(win, position_indicator_attr);
wattron(win, A_REVERSE);
- wvline(win, ACS_BLOCK, bar_high);
+#if defined(WACS_BLOCK) && defined(NCURSES_VERSION) && defined(USE_WIDE_CURSES)
+ wvline_set(win, WACS_BLOCK, bar_last - bar_y);
+#else
+ wvline(win, ACS_BLOCK, bar_last - bar_y);
+#endif
}
}
}
@@ -236,7 +250,7 @@ dlg_draw_scrollbar(WINDOW *win,
attr,
borderattr);
- wattrset(win, save);
+ (void) wattrset(win, save);
wmove(win, oldy, oldx);
}
@@ -255,6 +269,6 @@ dlg_draw_arrows(WINDOW *win,
x,
top,
bottom,
- menubox_attr,
+ menubox_border2_attr,
menubox_border_attr);
}
OpenPOWER on IntegriCloud