LINUX.ORG.RU

Проблемы curses && gnu screen

 , ,


0

0

Привет, ЛОР! У меня curses неправильно определяет размеры окна: https://i.imgur.com/AdbX5lp.png.
Запускаю программу через screen: screen -dm ....
Если запускать без флага -d, то конечно же все хорошо. Как решить можно проблемку?



Последнее исправление: cadogan (всего исправлений: 1)

Нет обработки изменения размера терминала? Можно обрабатывать специальную «клавишу» KEY_RESIZE, а можно сигнал SIGWINCH. Не знаю как оно там в питоне делается.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Нет обработки изменения размера терминала?

Лично я изменения размеров окна не обрабатываю.

Допустим я повешу обработчик на SIGWINCH, как мне узнать «нужные» размеры окна?
Уже повесил обработчик на SIGWINCH, но мне не понятно как заставить curses полностью перерисовать окно в новые размеры.

cadogan
() автор топика
Последнее исправление: cadogan (всего исправлений: 4)
Ответ на: комментарий от cadogan

Ох, я на раздел внимания не обратил. Это твоё приложение, получается не обрабатывает.

vvn_black ★★★★★
()
Ответ на: комментарий от cadogan

Видимо надо изменить размеры окна (wresize) и сделать перерисовку (werase + wrefresh). Я просто Python API для curses не видел и не знаю насколько оно от оригинального отличается.

xaizek ★★★★★
()
Ответ на: комментарий от Novator

Сейчас глянул код, вобщем есть функция «do_main_loop»,
в ней выполняется кусок:

    Ncurses.init_screen
    begin
      Ncurses.cbreak
      Ncurses.noecho
      Ncurses.raw

      Ncurses.start_color
      Ncurses.curs_set(0)
      Ncurses.nonl
      Ncurses.timeout=1000

      stdscr = Ncurses.stdscr
      ##stdscr.intrflush(false)
      stdscr.keypad(true)

      Ncurses.mousemask2(Ncurses::BUTTON1_CLICKED)
      #Ncurses.mousemask2(Ncurses::ALL_MOUSE_EVENTS | Ncurses::REPORT_MOUSE_POSITION)

      Ncurses.init_pair(1, Ncurses::COLOR_GREEN, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(2, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(3, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(4, Ncurses::COLOR_MAGENTA, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(5, Ncurses::COLOR_BLUE, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(6, Ncurses::COLOR_GREEN, Ncurses::COLOR_BLACK)
      Ncurses.init_pair(7, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK)
      stdscr.bkgd(Ncurses.color_pair(0))
      Ncurses.refresh
      recreate_windows do
        yield if block_given?
      end
      stdscr.bkgd(0)
      Ncurses.clear
      Ncurses.refresh
    ensure
      Ncurses.curs_set(1)
      Ncurses.echo
      Ncurses.nocbreak
      Ncurses.nl
      Ncurses.close_screen
    end

Внутри, как видишь, вызывается функция recreate_windows().
Внутри recreate_windows из переменной chg = Ncurses.getch хитро вычленяется событие ch, и если оно равно Ncurses::KEY_RESIZE, то идёт повторный вызов recreate_windows() и перерисовка:

          case ch
            when Ncurses::KEY_RESIZE  #resize terminal
              is_resized = true
              break

Обращай внимание на остальные команды, в (n)curses много недокументированного нелогичного геморроя.

Novator ★★★★★
()
Ответ на: комментарий от cadogan

Да, причем пересоздание идёт внутри функции recreate_windows():
1) сначала в цикле вызывается del_windows(), которая вызывает Ncurses.delwin(win) на каждом существующем Ncurces-окне из списка curse_windows, затем список очищается
2) потом окна заново пересоздаются через create_win(), внутри к-й вызываются два Ncurses.newwin() (первое для рамки с заголовком, второе для содержимого), и каждое окно добавляется в curse_windows
3) а потом внутренние окна заполняются содержимым (fill_left_win и fill_right_win), при переполнении рамка не сдвигается, т.к. она во внешнем окне.

Novator ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.