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