ncurses a SIGWINCH

Míla Kuchta mila.kuchta na atlas.cz
Středa Listopad 8 23:51:06 CET 2000


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
handleru toho signalu tropi takove vylomeniny. Tedy, mam cyklus v kterem
prijimam stisky klaves a na jejich zaklade provadim s nimi sdruzene akce.

while ((key = getch()) != 'q') {
    switch (key) {
        case KEY_DOWN:
        case 'j':
            key_down();
            break;
        ....

void key_down()
{
    if (1 & LINES) {
        if (((screen_cur + 1) < ((LINES - 2) / 2)) || (pad_cur + screen_cur >= pad_lines - ((LINES + 2) / 2)))
            screen_cur++;
        else
            pad_cur++;
    } else {
        if (((screen_cur + 1) < ((LINES - 2) / 2)) || (pad_cur + screen_cur > pad_lines - ((LINES + 2) / 2)))
            screen_cur++;
        else
            pad_cur++;
    }
    if (screen_cur > LINES - 3)
        screen_cur = LINES - 3;
    prefresh(pad_ptr, pad_cur, 0, 1, 2, LINES - 2, COLS - 3);
    draw_cursor(pad_ptr, pad_cur, screen_cur);
}

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.

Nebo mi neco nedochazi?

Dekuji

S pozdravem

Mila Kuchta


Další informace o konferenci Linux