Detectar ncurses de redimensionamento de terminal, sem compilar com --enable-sigwinch

0

No Arch --enable-sigwinch não é compilado em ncurses. De acordo com esta postagem no fórum pode ser usado para detectar um redimensionamento de terminal. Fazer com que eles ativem essa opção não parece estar disponível sem alguma resistência. Há outros meios para fins gerais de detecção de um redimensionamento de terminal para C ?

    
por ZeroPhase 24.10.2017 / 00:04

1 resposta

1

Citações de 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.

Se não estiver lá, foi desativado. Em princípio, você poderia fazer como mostrado na seção removida (long-obsolete) CAN_RESIZE recentemente removida do teste / view.c arquivo. A biblioteca ncurses faz um trabalho melhor que isso; o exemplo foi adicionado em julho de 1995. O comentário se refere ao 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.
 */

Um equivalente contemporâneo apenas definiria um sinalizador no manipulador de sinal, como feito no biblioteca :

#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 */

A propósito, o script de pacote não é exibido que o recurso está desativado:

  ./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

Voltando à biblioteca , ela inicializa SIGWINCH handler se o sinal for o valor padrão (não definido):

#if USE_SIGWINCH
        CatchIfDefault(SIGWINCH, handle_SIGWINCH);
#endif

Se já houver um manipulador SIGWINCH , o ncurses não fará nada.

    
por 24.10.2017 / 00:24