ncurses `doupdate`에서 터미널 크기를 조정하면 어떻게 되나요?

ncurses `doupdate`에서 터미널 크기를 조정하면 어떻게 되나요?

ncurses의 함수는 doupdate필요한 경우 화면 크기를 업데이트하려고 시도합니다.

ncurses/tty/tty_update.c:

if ((SP_PARM->_endwin == ewSuspend)
|| _nc_handle_sigwinch(SP_PARM)) {
/*
 * This is a transparent extension:  XSI does not address it,
 * and applications need not know that ncurses can do it.
 *
 * Check if the terminal size has changed while curses was off
 * (this can happen in an xterm, for example), and resize the
 * ncurses data structures accordingly.
 */
_nc_update_screensize(SP_PARM);
}

내 질문은 다음과 같습니다

터미널 크기를 조정하면 어떻게 되나요?뒤쪽에점검은 완료되었으나앞으로실제로 터미널에 기록된 내용이 있습니까? 함수가 새 크기로 터미널에 기록하지만 이전 크기를 신뢰하는 경우 프로그램이 중단되거나 정의되지 않은 다른 동작이 발생합니까?

_nc_flush표시된 텍스트와 터미널 제어 문자를 출력 파일 설명자로 플러시하는 것 같습니다 . 하지만 크기 문제가 있을 경우 발생할 수 있는 최악의 상황이 무엇인지는 아직도 모르겠습니다. 항상 복구 가능합니까? 즉, 라이브러리가 올바른 터미널 크기를 찾으면 충돌이 발생하지 않고 모든 것이 다시 제대로 작동합니까?

답변1

의견에 동의하십시오. ncurses가 새롭거나 향상된 크기를 얻기 전에 터미널 크기를 조정하면 많은 일이 발생하지 않습니다. 일부 문자는 "잘못된" 위치에 기록될 수 있지만 ncurses는 실제 위치를 결정할 수 없습니다.존재하다터미널 화면에서는 화면 내용을 기록하는 배열의 한계를 넘어 이 정보를 오용(예:)할 수 없습니다.

처리된 문제는 SIGWINCHncurses가 실행되는지 확인하는 것입니다."위험한"신호 처리기 외부의 작업. 신호 처리기는 ncurses가 (안전하게) 확인할 수 있는 변수만 설정합니다.

애플리케이션은 반환 SIGWINCH시기 를 감지할 수 있습니다 . 복귀의 부작용으로 (참조wgetchKEY_RESIZEKEY_RESIZE노트매뉴얼 페이지에서) ncurses는 통과할 것입니다.기내 통화 장치도착하다clearok(사용자가 새로 고침을 강제하기 위해 일부 특수 키를 누를 필요성이 줄어듭니다):

만약에clearok라고TRUE매개변수로 다음 호출 wrefresh 이 창을 사용하면 화면이 완전히 지워지고 전체 화면이 처음부터 다시 그려집니다. 화면 내용이 다음과 같을 때 불확실한, 또는 어떤 경우에는 더 즐거운 시각 효과를 위해. 만약에win논쟁clearok전역 변수입니다 curscr, 다음 전화 wrefresh 어떤 창에서든 작업하면 화면이 지워지고 처음부터 다시 그려집니다.

실제로는 이것만으로도 충분합니다( KEY_RESIZEncurses가 할 수 없는 작업을 다시 그리도록 상기시키도록 설계된 프로그램의 경우). 이것dialog예를 들어, 프로그램이 바로 그런 일을 합니다(참조:소스 코드)

애플리케이션 개발자는 여전히 시스템 메시지를 처리하기 위해 다시 그리기 키를 원할 수 있습니다.wall(화면이 복잡해질 수 있습니다.)

관련 정보