Package: dialog
Version: 1.3-20190211-1
Severity: normal
Tags: patch
When dialog is invoked with the --backtitle option and the window displaying the
widget is resized, the window will be redrawn but the title will disappear.
Example command: dialog --backtitle 'Back Title' --msgbox Text 0 0
The attached patch fixes this (originally developed for Ubuntu14 and QA-tested
for the widgets we use there).
-- System Information:
Debian Release: 10.3
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 4.19.0-8-amd64 (SMP w/24 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8),
LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages dialog depends on:
ii debianutils 4.8.6.1
ii libc6 2.28-10
ii libncursesw6 6.1+20181013-2+deb10u2
ii libtinfo6 6.1+20181013-2+deb10u2
dialog recommends no packages.
dialog suggests no packages.
-- no debconf information
--- a/buildlist.c
+++ b/buildlist.c
@@ -1097,9 +1097,7 @@ dlg_buildlist(const char *title,
height = old_height;
width = old_width;
free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
/* repaint */
first = TRUE;
goto retry;
diff --git a/calendar.c b/calendar.c
index 497533b..5fd2f7a 100644
--- a/calendar.c
+++ b/calendar.c
@@ -920,9 +920,7 @@ dialog_calendar(const char *title,
height = old_height;
width = old_width;
free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
/* repaint */
goto retry;
#endif
diff --git a/checklist.c b/checklist.c
index 778c4bb..175737c 100644
--- a/checklist.c
+++ b/checklist.c
@@ -577,9 +577,7 @@ dlg_checklist(const char *title,
height = old_height;
width = old_width;
free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
/* repaint */
goto retry;
#endif
diff --git a/debian/changelog b/debian/changelog
index 738a0a0..d568a15 100644
--- a/dialog.h
+++ b/dialog.h
@@ -843,6 +843,10 @@ extern void dlg_trim_string(char * /*src*/);
extern void end_dialog(void);
extern void init_dialog(FILE * /*input*/, FILE * /*output*/);
+extern void dlg_redraw_clear(void);
+extern void dlg_redraw_prep(WINDOW *);
+extern void dlg_redraw_refresh(WINDOW *);
+
extern void dlg_exiterr(const char *, ...) GCC_NORETURN GCC_PRINTFLIKE(1,2);
#ifdef HAVE_COLOR
diff --git a/editbox.c b/editbox.c
index db0620d..710510f 100644
--- a/editbox.c
+++ b/editbox.c
@@ -699,7 +699,7 @@ dlg_editbox(const char *title,
/* reset data */
height = old_height;
width = old_width;
- dlg_clear();
+ dlg_redraw_clear();
dlg_unregister_window(editing);
dlg_del_window(editing);
dlg_del_window(dialog);
diff --git a/formbox.c b/formbox.c
index a5de876..a6c1fab 100644
--- a/formbox.c
+++ b/formbox.c
@@ -780,10 +780,8 @@ dlg_form(const char *title,
height = old_height;
width = old_width;
free(prompt);
- dlg_clear();
+ dlg_redraw_prep(dialog);
dlg_unregister_window(form);
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
/* repaint */
goto retry;
#endif
diff --git a/fselect.c b/fselect.c
index a8e5d7e..6432d05 100644
--- a/fselect.c
+++ b/fselect.c
@@ -861,10 +861,7 @@ dlg_fselect(const char *title, const char *path, int height, int width, int dsel
*current = 0;
resized = TRUE;
/* repaint */
- dlg_clear();
- dlg_del_window(dialog);
- refresh();
- dlg_mouse_free_regions();
+ dlg_redraw_refresh(dialog);
goto retry;
#endif
default:
diff --git a/guage.c b/guage.c
index 95664b0..9d240dd 100644
--- a/guage.c
+++ b/guage.c
@@ -436,7 +436,7 @@ dialog_gauge(const char *title,
oldobj->obj.keep_win = FALSE;
/* remove the old version of the gauge */
- dlg_clear();
+ dlg_redraw_clear();
dlg_remove_callback(&(oldobj->obj));
refresh();
diff --git a/inputbox.c b/inputbox.c
index a627e7a..206b50a 100644
--- a/inputbox.c
+++ b/inputbox.c
@@ -243,10 +243,7 @@ dialog_inputbox(const char *title, const char *cprompt, int height, int width,
height = old_height;
width = old_width;
/* repaint */
- dlg_clear();
- dlg_del_window(dialog);
- refresh();
- dlg_mouse_free_regions();
+ dlg_redraw_refresh(dialog);
goto retry;
#endif
default:
diff --git a/menubox.c b/menubox.c
index abbe11c..efc531c 100644
--- a/menubox.c
+++ b/menubox.c
@@ -730,9 +730,7 @@ dlg_menu(const char *title,
resizeit(height, LINES);
resizeit(width, COLS);
free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
/* repaint */
goto retry;
#endif
diff --git a/msgbox.c b/msgbox.c
index d9a2eb1..154f329 100644
--- a/msgbox.c
+++ b/msgbox.c
@@ -137,7 +137,7 @@ dialog_msgbox(const char *title, const char *cprompt, int height, int width,
#ifdef KEY_RESIZE
case KEY_RESIZE:
dlg_will_resize(dialog);
- dlg_clear();
+ dlg_redraw_clear();
free(prompt);
height = req_high;
width = req_wide;
diff --git a/pause.c b/pause.c
index eeff0fe..469224d 100644
--- a/pause.c
+++ b/pause.c
@@ -203,7 +203,7 @@ dialog_pause(const char *title,
#ifdef KEY_RESIZE
case KEY_RESIZE:
dlg_will_resize(dialog);
- dlg_clear(); /* fill the background */
+ dlg_redraw_clear(); /* fill the background */
dlg_del_window(dialog); /* delete this window */
height = old_height;
width = old_width;
diff --git a/po/makefile.in b/po/makefile.in
index b8d89fa..007ea6a 100644
--- a/rangebox.c
+++ b/rangebox.c
@@ -392,9 +392,7 @@ dialog_rangebox(const char *title,
width = old_width;
/* repaint */
free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
goto retry;
#endif
case DLGK_MOUSE('i'):
diff --git a/tailbox.c b/tailbox.c
index 137355b..b836302 100644
--- a/tailbox.c
+++ b/tailbox.c
@@ -409,10 +409,7 @@ dialog_tailbox(const char *title,
height = old_height;
width = old_width;
/* repaint */
- dlg_clear();
- dlg_del_window(dialog);
- refresh();
- dlg_mouse_free_regions();
+ dlg_redraw_refresh(dialog);
dlg_button_layout(buttons, &min_width);
goto retry;
}
diff --git a/textbox.c b/textbox.c
index eb06eec..b4caccc 100644
--- a/textbox.c
+++ b/textbox.c
@@ -954,9 +954,7 @@ dialog_textbox(const char *title, const char *filename, int height, int width)
width = old_width;
back_lines(&obj, obj.page_length);
/* repaint */
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
goto retry;
#endif
}
diff --git a/timebox.c b/timebox.c
index 288e767..1688f6f 100644
--- a/timebox.c
+++ b/timebox.c
@@ -360,10 +360,7 @@ dialog_timebox(const char *title,
minute = mn_box.value;
second = sc_box.value;
/* repaint */
- free(prompt);
- dlg_clear();
- dlg_del_window(dialog);
- dlg_mouse_free_regions();
+ dlg_redraw_prep(dialog);
goto retry;
#endif
default:
diff --git a/treeview.c b/treeview.c
index 934761e..b9bbec3 100644
--- a/treeview.c
+++ b/treeview.c
@@ -537,10 +537,7 @@ dlg_treeview(const char *title,
height = old_height;
width = old_width;
/* repaint */
- dlg_clear();
- dlg_del_window(dialog);
- refresh();
- dlg_mouse_free_regions();
+ dlg_redraw_refresh(dialog);
goto retry;
#endif
default:
diff --git a/util.c b/util.c
index 5b0efb7..6fa917e 100644
--- a/util.c
+++ b/util.c
@@ -230,6 +230,26 @@ dlg_clear(void)
dlg_attr_clear(stdscr, LINES, COLS, screen_attr);
}
+void
+dlg_redraw_clear(void)
+{
+ dlg_clear();
+ dlg_put_backtitle();
+}
+
+void dlg_redraw_prep(WINDOW *w)
+{
+ dlg_redraw_clear();
+ dlg_del_window(w);
+ dlg_mouse_free_regions();
+}
+
+void dlg_redraw_refresh(WINDOW *w)
+{
+ dlg_redraw_prep(w);
+ refresh();
+}
+
#define isprivate(s) ((s) != 0 && strstr(s, "\033[?") != 0)
#define TTY_DEVICE "/dev/tty"
diff --git a/yesno.c b/yesno.c
index 3605f67..25de979 100644
--- a/yesno.c
+++ b/yesno.c
@@ -143,6 +143,7 @@ dialog_yesno(const char *title, const char *cprompt, int height, int width)
#ifdef KEY_RESIZE
case KEY_RESIZE:
dlg_will_resize(dialog);
+ dlg_redraw_clear();
dlg_clear();
free(prompt);
height = req_high;