--enable-sigwinch를 사용하여 컴파일하지 않고 터미널 크기 조정 ncurses 감지

--enable-sigwinch를 사용하여 컴파일하지 않고 터미널 크기 조정 ncurses 감지

On Arch는 --enable-sigwinchncurses로 컴파일되지 않습니다. ~에 따르면이 포럼 게시물터미널 크기 조정을 감지하는 데 사용할 수 있습니다. 해당 옵션을 켜는 데 저항이 없는 것 같습니다. 터미널 크기 조정을 감지하는 또 다른 일반적인 방법이 있습니까 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아무 작업도 수행하지 않습니다 .

관련 정보