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