ncurses a SIGWINCH

Karel Zak zakkr na zf.jcu.cz
Středa Listopad 8 11:34:57 CET 2000


On Tue, 7 Nov 2000, Míla Kuchta wrote:

> Zdravim,
> 
> Mam obrazovkovy program, ktery prijima klavesy (:-)) a nasledne vykonava
> urcite akce na jejimz konci je vzdy prekresleni obrazovky. Pokud ho
> pustim v xtermu a nasledne zmenim velikost terminalu, nestane se nic,
> ale po stisku klavesy se mi program prekresli spravne do jeho velikosti.
> Jelikoz chci aby to fungovalo automaticky po zmene okna odchytavam signal
> SIGWINCH, ktery mi ale implicitne zmrazi COLS a LINES a program si
> zachovava velikost povodniho terminalu. Mohu sice pouzit resizeterm,
> ale docela by me zajimalo nejjednodussi, nebo nejspravnejsi reseni
> a proc ten handler i kdyz pousti stejny kod jako stisk te klavesy dela
> neco jineho.

S SIGWINCH jsem si pred lety take uzil, podivejte se na 

ftp://ftp2.zf.jcu.cz/users/zakkr/kim/kim-1.2.2 ve zdojacich najdete reseni
v knihovne (libaca) ktera je uvnitr toho programu. Je tam funkce
screen_resizer() ktera ten screen neni. Pochopitelne, ze handler signalu
nedela nic jineho nez, ze nastavi nejakou globalno promennou 
(GL_winch_flag) na true a ta se pak testuje nekde kde je prostor na takove
razantni zmeny. Obsluha signalu by nemela delat temer nic.

(Je to udelano tak, ze je zde timeout na cekani na klavesu po jeho vyprseni
se testuje neprisel-li SIGWING a pokud ani tak se zavola screen_resizer().
Ten timeout je maly (80 usec) a z pohledu uzivatele  je to pak temer
plynule.)

Jinak:

   void screen_resizer()
   {
      struct winsize size;

      _D( " screen_resizer()");

      size.ws_row = size.ws_col = 0;

      ioctl(0, TIOCGWINSZ, &size);
      if (size.ws_row && size.ws_col) {
         LINES  = size.ws_row;
         COLS   = size.ws_col;
         resizeterm(size.ws_row, size.ws_col);
         clearok(stdscr,TRUE);
      }
      touchwin(stdscr);
      refresh();

      if (aca.extra_resize) {
        _D("CALL EXTRA RESIZE FUNC.");
        /* volani funkce ktera to prekresli... */
	aca.extra_resize_call_fn( aca.extra_resize_data );
      }
   }


					Karel



Další informace o konferenci Linux