1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-13 13:41:01 +02:00

40726: add "zcurses resize" for sane terminal size change

This commit is contained in:
Sebastian Gniazdowski 2017-03-05 11:25:38 -08:00 committed by Barton E. Schaefer
parent 8522e996ec
commit 23275fc8db
4 changed files with 92 additions and 2 deletions

View file

@ -1,3 +1,8 @@
2017-03-05 Barton E. Schaefer <schaefer@zsh.org>
* Sebastian: 40726: Doc/Zsh/mod_curses.yo, Src/Modules/curses.c,
configure.ac: add "zcurses resize" for sane terminal size change
2017-03-04 Barton E. Schaefer <schaefer@zsh.org>
* Sebastian: 40781: Src/params.c, Test/A06assign.ztst: optimize

View file

@ -27,7 +27,8 @@ xitem(tt(zcurses) tt(scroll) var(targetwin) [ tt(on) | tt(off) | [tt(+)|tt(-)]va
xitem(tt(zcurses) tt(input) var(targetwin) [ var(param) [ var(kparam) [ var(mparam) ] ] ])
xitem(tt(zcurses) tt(mouse) [ tt(delay) var(num) | [tt(+)|tt(-)]tt(motion) ])
xitem(tt(zcurses) tt(timeout) var(targetwin) var(intval))
item(tt(zcurses) tt(querychar) var(targetwin) [ var(param) ])(
xitem(tt(zcurses) tt(querychar) var(targetwin) [ var(param) ])
item(tt(zcurses) tt(resize) var(height) var(width) [ tt(endwin) | tt(nosave) | tt(endwin_nosave) ])(
Manipulate curses windows. All uses of this command should be
bracketed by `tt(zcurses init)' to initialise use of curses, and
`tt(zcurses end)' to end it; omitting `tt(zcurses end)' can cause
@ -211,6 +212,21 @@ second is the color pair in the usual var(fg_col)tt(/)var(bg_col)
notation, or tt(0) if color is not supported. Any attributes other than
color that apply to the character, as set with the subcommand tt(attr),
appear as additional elements.
The subcommand tt(resize) resizes tt(stdscr) and all windows to given
dimensions (windows that stick out from the new dimensions are resized
down). The underlying curses extension (tt(resize_term call)) can be
unavailable. To verify, zeroes can be used for var(height) and
var(width). If the result of the subcommand is tt(0), resize_term is
available (tt(2) otherwise). Tests show that resizing can be normally
accomplished by calling tt(zcurses end) and tt(zcurses refresh). The
tt(resize) subcommand is provided for versatility. Multiple system
configurations have been checked and tt(zcurses end) and tt(zcurses
refresh) are still needed for correct terminal state after resize. To
invoke them with tt(resize), use var(endwin) argument. Using
var(nosave) argument will cause new terminal state to not be saved
internally by tt(zcurses). This is also provided for versatility and
should normally be not needed.
)
enditem()

View file

@ -1490,6 +1490,74 @@ zccmd_touch(const char *nam, char **args)
return ret;
}
static int
zccmd_resize(const char *nam, char **args)
{
#ifdef HAVE_RESIZE_TERM
int y, x, do_endwin=0, do_save=1;
LinkNode stdscr_win = zcurses_getwindowbyname("stdscr");
if (stdscr_win) {
y = atoi(args[0]);
x = atoi(args[1]);
if (args[2]) {
if (0 == strcmp(args[2], "endwin")) {
do_endwin=1;
} else if (0 == strcmp(args[2], "endwin_nosave")) {
do_endwin=1;
do_save=0;
} else if (0 == strcmp(args[2], "nosave")) {
do_save=0;
} else {
zwarnnam(nam, "`resize' expects `endwin', `nosave' or `endwin_nosave' for third argument, if given");
}
}
if (y == 0 && x == 0 && args[2] == NULL) {
// Special case to just test that curses has resize_term. #ifdef
// HAVE_RESIZE_TERM will result in return value 2 if resize_term
// is not available.
return 0;
} else {
// Without this call some window moves are innacurate. Tested on
// OS X ncurses 5.4, Homebrew ncursesw 6.0-2, Arch Linux ncursesw
// 6.0, Ubuntu 14.04 ncurses 5.9, FreeBSD ncursesw.so.8
//
// On the other hand, the whole resize goal can be (from tests)
// accomplished by calling endwin and refresh. But to secure any
// future problems, resize_term is provided, and it is featured
// with endwin, so that users have multiple options.
if (do_endwin) {
endwin();
}
if( resize_term( y, x ) == OK ) {
// Things work without this, but we need to get out from
// endwin (i.e. call refresh), and in theory store new
// curses state (the resize might have changed it), which
// should be presented to terminal only after refresh.
if (do_endwin || do_save) {
ZCWin w;
w = (ZCWin)getdata(stdscr_win);
wnoutrefresh(w->win);
doupdate();
}
if (do_save) {
gettyinfo(&curses_tty_state);
}
return 0;
} else {
return 1;
}
}
} else {
return 1;
}
#else
return 2;
#endif
}
/*********************
Main builtin handler
@ -1523,6 +1591,7 @@ bin_zcurses(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
{"mouse", zccmd_mouse, 0, -1},
{"querychar", zccmd_querychar, 1, 2},
{"touch", zccmd_touch, 1, -1},
{"resize", zccmd_resize, 2, 3},
{NULL, (zccmd_t)0, 0, 0}
};

View file

@ -1309,7 +1309,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \
putenv getenv setenv unsetenv xw\
brk sbrk \
pathconf sysconf \
tgetent tigetflag tigetnum tigetstr setupterm initscr \
tgetent tigetflag tigetnum tigetstr setupterm initscr resize_term \
getcchar setcchar waddwstr wget_wch win_wch use_default_colors \
pcre_compile pcre_study pcre_exec \
nl_langinfo \