On Arch는 --enable-sigwinch
ncurses로 컴파일되지 않습니다. ~에 따르면이 포럼 게시물터미널 크기 조정을 감지하는 데 사용할 수 있습니다. 해당 옵션을 켜는 데 저항이 없는 것 같습니다. 터미널 크기 조정을 감지하는 또 다른 일반적인 방법이 있습니까 C
?
답변1
에서 인용INSTALL
:
--enable-sigwinch
Compile support for ncurses' SIGWINCH handler. If your application has
its own SIGWINCH handler, ncurses will not use its own. The ncurses
handler causes wgetch() to return KEY_RESIZE when the screen-size
changes. This option is the default, unless you have disabled the
extended functions.
존재하지 않으면 비활성화됩니다. 원칙적으로 최근 삭제된(오래 사용되지 않음) 섹션에 표시된 대로 CAN_RESIZE
수행 하면 됩니다.테스트/views.c문서. ncurses 라이브러리는 1995년 7월에 추가된 샘플보다 더 나은 기능을 제공합니다.논평SunOS 4를 참조합니다:
/*
* This uses functions that are "unsafe", but it seems to work on SunOS.
* Usually: the "unsafe" refers to the functions that POSIX lists which may be
* called from a signal handler. Those do not include buffered I/O, which is
* used for instance in wrefresh(). To be really portable, you should use the
* KEY_RESIZE return (which relies on ncurses' sigwinch handler).
*
* The 'wrefresh(curscr)' is needed to force the refresh to start from the top
* of the screen -- some xterms mangle the bitmap while resizing.
*/
현대의 등가물은 다음과 같이 신호 처리기에 플래그를 설정하는 것입니다.도서관:
#if USE_SIGWINCH
static void
handle_SIGWINCH(int sig GCC_UNUSED)
{
_nc_globals.have_sigwinch = 1;
# if USE_PTHREADS_EINTR
if (_nc_globals.read_thread) {
if (!pthread_equal(pthread_self(), _nc_globals.read_thread))
pthread_kill(_nc_globals.read_thread, SIGWINCH);
_nc_globals.read_thread = 0;
}
# endif
}
#endif /* USE_SIGWINCH */
그런데,패키징 스크립트기능이 비활성화되었음을 표시하지 않습니다.
./configure --prefix=/usr --mandir=/usr/share/man \
--with-pkg-config-libdir=/usr/lib/pkgconfig \
--with-static --with-normal --without-debug --without-ada \
--enable-widec --enable-pc-files --with-cxx-binding --with-cxx-static \
--with-shared --with-cxx-shared
다시 참조도서관SIGWINCH
, 신호에 기본값(설정되지 않음)이 있으면 해당 핸들러를 초기화합니다.
#if USE_SIGWINCH
CatchIfDefault(SIGWINCH, handle_SIGWINCH);
#endif
ncurses는 이미 핸들러가 있으면 SIGWINCH
아무 작업도 수행하지 않습니다 .