ncurses a SIGWINCH

Karel Zak zakkr na zf.jcu.cz
Čtvrtek Listopad 9 08:58:25 CET 2000


On Wed, 8 Nov 2000, Míla Kuchta wrote:

> Karel Zak <zakkr na zf.jcu.cz> wrote:
> > 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.)
> 
> Tak toho jsem se bal:-(. Jen nemuzu pochopit proc uz samotna existence

Pokud pohne user z xtermem dostanete SIGWINCH. Cim a kdy chcete to
okno prekreslit? V tom handleru je to silenstvi stejne jako tam neco vice
nastavovat. Musi se to tedy prekreslit ve standardnim behu program. Pokud to 
ma byt plynule tak nesmite na necem tvrdnout (cteni klaves).

> handleru toho signalu tropi takove vylomeniny. Tedy, mam cyklus v kterem

Existence handleru tezko tropi hlouposti. Napr:

   void init_winch()
   {
      struct sigaction act, oldact;

      _D( " init_winch()");

      act.sa_handler    = winch_handler;
      sigemptyset (&act.sa_mask);
      act.sa_flags = 0;
   #ifdef SA_RESTART
        act.sa_flags |= SA_RESTART;
   #endif
      sigaction(SIGWINCH, &act, &oldact);
   }

 daleko vice zalezi na tom co delate po chyceni toho signalu.


> prijimam stisky klaves a na jejich zaklade provadim s nimi sdruzene akce.


> Tato funkce sama o sobe sajisti posun zapisniku a prekresleni okna,
> s tim, ze reflektuje soucasnou velikost okna. Jakmile vsak nekam
> na zacatek main pripisi: (void) signal(SIGWINCH, adjust);, prestoze
> funkce adjust nedela treba vubec nic, prestane to fungovat, coz
> znamena, ze promenne LINES a COLS uz neopisuji velikost okna.

 Podivejte se jeste jednou na ten priklad co jsem vam poslal. 
LINES / COLS si musite nastavit sam. Samotne chyceni signalu znamena:
"zmenila se velikost okna ... programe *zjisti* si jaka je a prekresli 
si to"

> Nebo mi neco nedochazi?

 Bohuzel tyto veci jsou spatne popsany i v ruznych how-to/faq ...


						Karel



Další informace o konferenci Linux