LINUX.ORG.RU
ФорумTalks

Я старался. Честно-честно. Но...

 ,


0

1

У меня едет крыша.
Вот зачем-то приспичило мне поработать с терминалом напрямую...
Ну вот делов-то: запомнить позицию курсора, переставить его куда надо, написать что надо и вернуть всё как было.
Это убер-жесть. Нано-чугуний просто. Ну вот, например, кусочек кода:

char    code_move_cursor[100];
    memset(code_move_cursor, 0, 100);
    struct termios tty, orig_tty;

    tcgetattr( tty_fd, &tty );        
    orig_tty = tty;
    tty.c_lflag &= ~( ICANON | ECHO | ISIG );
    tty.c_cc[ VMIN ] = 1;
    tcsetattr( tty_fd, TCSAFLUSH, &tty ); 

    sprintf(code_move_cursor, "%c[%d;%dH", 27, row,  col);
    write(tty_fd, code_move_cursor, strlen(code_move_cursor));

    tcsetattr(tty_fd, TCSAFLUSH, &orig_tty);

И такого ужаса сотни строк набыдлокодил-накопипастил.
После подобных манипуляций терминал обычно превращается в тыкву. Причём что-то работает всегда, что-то иногда, а дебажить это вообще нереально.
Руки опускаются.
Думаю переходить на ncurces или что-то подобное...
Но это поломает саму идею, хотя может добавить кроссплатформенности чуток. Боюсь, что мой быдлокод кроме как из-под линукса нигде работать не будет.
Впрочем, на данный момент он и из-под линукса не работает.

Плак-плак.

★★☆

И такого ужаса сотни строк набыдлокодил-накопипастил.

Используй Функцию, Люк!

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

Это и есть тело функции установки позиции курсора.

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

Это сарказм такой?
Ну так подскажи, как узнать позицию курсора?
Установить курсор могу, узнать где он сейчас не могу.

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

Угу. Но вот ведь беда: echo -e «\033[6n» вместо нужных мне координат выводит ничего.
А у тебя?

Stahl ★★☆ ()
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от cdshines

Вот в этом-то и беда.
Других способов узнать позицию курсора я не знаю.

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

Других способов узнать позицию курсора я не знаю

Храни модель состояния экрана же, ну.

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

struct termios недостаточно.
А что ещё можно сохранить?

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

Ну Esc6n не работает, а что сделает 7 и 8 вообще не ясно. Во всяком случае просто в эмуляторе терминала ничего не делает.

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

7 и 8 сохраняют/загружают позицию курсора и аттрибуты.

У меня в gnome-terminal, urxvt и linux tty работают.

echo -e '[\e7ABCD]\e81234' # выводит [1234]
nexeuse ()
Ответ на: комментарий от nexeuse

Гм. Я туплю.
Раскрой мысль.

выводит [1234]

Я не понимаю, что это значит и как я это могу использовать.

Stahl ★★☆ ()

Думаю переходить на ncurces или что-то подобное...
Но это поломает саму идею

А что за идея такая, если не секрет, что даже ncurses ломает её?

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

Это значит, что работает.

Выводи так:

printf("\e7" "\e[%d;%dH" "%s" "\e8", row, col, str);

Где str - твой текст.

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

О! Ну разумеется всё не работает, но направление правильное!
Данке тебе бардзо!
Правда он как запомнил позицию, так упорно её и вспоминает, но это я уж как-то поборю...

Stahl ★★☆ ()

а что плохого в curses? вроде всё сравнительно просто. и «вернуть как было» - это изкоробки. или я не о том «вернуть как было» подумал?

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

Ну вот смотри: У меня есть десяток дескрипторов, указывающих на различные терминалы и мне надо во всех терминалах что-то напечатать.
Справится тут curses?

Впрочем это уже не так важно, поскольку задача решена и с помощью ESC-последовательностей и работает удовлетворительно.

Stahl ★★☆ ()

ncurces

Лучшее решение. Остальное нафиг.

CYB3R ★★★★★ ()

Юзай же curses, ну зачем ты так себя мучаешь?

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