Sync xdialog_menu() implementation with sade.

This commit is contained in:
Max Khon 2011-12-01 09:02:57 +00:00
parent 0f94127a5b
commit fcc050e759

View File

@ -72,6 +72,38 @@ typedef struct dialogMenuItem {
void *data;
} dialogMenuItem;
static int
xdialog_count_rows(const char *p)
{
int rows = 0;
while ((p = strchr(p, '\n')) != NULL) {
p++;
if (*p == '\0')
break;
rows++;
}
return rows ? rows : 1;
}
static int
xdialog_count_columns(const char *p)
{
int len;
int max_len = 0;
const char *q;
for (; (q = strchr(p, '\n')) != NULL; p = q + 1) {
len = q - p;
max_len = MAX(max_len, len);
}
len = strlen(p);
max_len = MAX(max_len, len);
return max_len;
}
static int
xdialog_menu(const char *title, const char *cprompt, int height, int width,
int menu_height, int item_no, dialogMenuItem *ditems)
@ -90,6 +122,12 @@ xdialog_menu(const char *title, const char *cprompt, int height, int width,
listitems[i].text = ditems[i].title;
}
/* calculate height */
if (height < 0)
height = xdialog_count_rows(cprompt) + menu_height + 4 + 2;
if (height > LINES)
height = LINES;
/* calculate width */
if (width < 0) {
int tag_x = 0;
@ -103,7 +141,7 @@ xdialog_menu(const char *title, const char *cprompt, int height, int width,
tag_x = MAX(tag_x, l + k + 2);
}
}
width = MAX(dlg_count_columns(cprompt), title != NULL ? dlg_count_columns(title) : 0);
width = MAX(xdialog_count_columns(cprompt), title != NULL ? xdialog_count_columns(title) : 0);
width = MAX(width, tag_x + 4) + 4;
}
width = MAX(width, 24);