Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ну раз уж на венду завязался, поюзай виндовые апишки. Там и очистка экрана и перемещение курсора есть и цвета. Всё лучше, чем процесс поднимать на каждый фрейм.
а почему винда не умеет esc последовательности и termcap/terminfo? (причем дос умел, ansi.sys же)
а почему она не умеет сигналы? а почему winsock отличается в некоторых местах от berkely sockets?
Потому что винду создали анскильные менеджеры для ещё более анскильных юзверей, а линукс — программисты для чуть более продвинутых юзеров и других программистов
Вообще Мелкомягкие хотели сделать то ли DOS, то ли Винду на основе UNIX. Но им помешал тогда еще большой брат IBM, для компьютеров которых и делали ось. Помешал потому, что UNIX была осью конкурентов.
DOS был уже куплен -- его никто не делал изначально, а сделан он был на основе cp/m (ну в стилистике её во всяк случае).
Windows NT делалось под сильным влияниекм VMS (Дейв Калтер бывший VMSовец).
С IBM они делали OS/2, но та была просрана (потому что IBM всё просирает).
А Unix, кмк, в ту пору на фоне unix wars не выглядел привлекательно, и не пах деньгами (В отличие от VMS) отсюда и вот.
У NT и OS/2 было сильное влияние друг на друга. Вроде альфа-версия NT изначально даже называлась типа «OS/2 NT», т. е. новая технология для OS/2.
Про «Unix»: мелкомягкие делали платный юниксоподобный «Xenix» (ты даже где-то писал, что в нём не было виртуальной памяти, что с позиции нашего времени звучит как очередная порнуха на порнхабе).
Деталь реализации. У курсесов один хрен есть внутренний буфер, через который они оптимизацию вывода в терминал делают. Высрать этот же буфер в виндовую консоль через виндовое апи никаких проблем не будет.
> В винде ты просто отдашь этот буфер в винапишную функцию и она его нарисует.
Кстати, с десятки винда поддерживает стандартные ANSI коды, так что теперь можно даже винапишными функциями не заморачиваться.
Да, там какие-то затруднения есть, кажется. То ли только в новых версиях работает, то ли компонент какой-то включать надо, не помню. Но лично у меня всё работает искаропки.
> А зачем тебе управляющие коды?
Ну ncurses, как и любая Linux программа с цветным выводом и передает эти цвета уже буфер вместе с управляющими кодами в TTY.
То есть подходы совершенно разные. И в винде совершенно другие абстракции.
Можно, конечно, сделать функцию которая на основе этих управляющих кодов TTY будет переключать виндовую консоль в разные режимы и выводить, и будет совместимость ncurses с виндой.
> This function affects text written after the function call.
То есть тоже подставляет туда коды.
Странно, противоречит примерам со второй ссылки.
Хотя никакого буфера туда не надо передавать.
Значит меняется текст непосредственно абстракцией консоли.
В винде действительно нет TTY, но она тут не причем. Обрабатывать ESC последовательности можно и без TTY. Никто же не ждет от винды понятия foreground/background, session leader, istty, итд..
Ну вот эту проверку таки стоит сэмулировать. А то получится как с некоторыми тулами от майкрософта, у которых stdout не редиректится (всё рисуется напрямую в сосноль).
а как ты с ним свяжешься, кстати? нужно запустить в нем новый процесс, или можно тупо открыть псевдотерминал? кажется, что нет красивого способа.
Да и xtermа нет без иксов, где нить на севере. Из демона ты ничего не запустишь бо нет $DISPLAY
А на винде можешь создать консоль из сервиса, но так как сервис живет в своей сессии, то твою консоль никто не увидит кмк. но писать в нее ты можешь наверное
Ну самый простой способ - перезапустить себя через xterm, наверное.
Или пойти и нагло открыть нужную сосноль в /dev. Это даже для сервиса прокатит. Но х.з. как выбрать нужную. Да и висящий в ней процесс как-то надо заткнуть.
Ну я проверил сейчас, открыл pts'ку - и пишется и читается. Причём новый процесс даже приоритетнее для чтения оказался, старый убивать не пришлось (но возможно это UB и рандом).
> уведомили
read и write ошибку возвращают, когда pts'ка удалена. Так что всё норм.
А вообще, у меня как-то матрица в лабе не влезала в сосноль. Делать гуйню было влом, поэтому я просто попросил винду сделать буфер сосноли побольше. В прыщах так тоже нельзя.
да, опсать такое капабилити в termcap/terminfo было бы круто.
В конце концов статус лайн тоже не все умеют: виртуальный терминал на консоли же не умеет
И так-то да, если мне путти начнет само ресайзица -- я охуею
Pig # 0
> return 0;}
Какая экономия )))
BelCodeMonkey # 0 ⇈
bormand # 0
Ну раз уж на венду завязался, поюзай виндовые апишки. Там и очистка экрана и перемещение курсора есть и цвета. Всё лучше, чем процесс поднимать на каждый фрейм.
oaoaoammm # 0 ⇈
MAKAKA # 0 ⇈
но лучше конечно сделать это через ConsoleApi на винде и через ncruses напрямую на Linux: последнее будет совместимо с любым униксом
Правда я вот не уверен про переносимость
<conio.h> азаза
bormand # 0 ⇈
MAKAKA # 0 ⇈
а в досе был cls?
bormand # 0 ⇈
З.Ы. Но в старом конио и clrscr() был. Просрали все полимеры.
MAKAKA # 0 ⇈
а туда он из CP/M небось?
Кстати, почему в паскале conio назывался crt?
bormand # 0 ⇈
MAKAKA # 0 ⇈
3.14159265 # 0 ⇈
bormand # 0 ⇈
bormand # 0 ⇈
MAKAKA # 0 ⇈
а почему она не умеет сигналы? а почему winsock отличается в некоторых местах от berkely sockets?
на то и щука, чтоб карась не скучал
oaoaoammm # 0 ⇈
Потому что винду создали анскильные менеджеры для ещё более анскильных юзверей, а линукс — программисты для чуть более продвинутых юзеров и других программистов
YpaHeLI_ # 0 ⇈
MAKAKA # 0 ⇈
DOS был уже куплен -- его никто не делал изначально, а сделан он был на основе cp/m (ну в стилистике её во всяк случае).
Windows NT делалось под сильным влияниекм VMS (Дейв Калтер бывший VMSовец).
С IBM они делали OS/2, но та была просрана (потому что IBM всё просирает).
А Unix, кмк, в ту пору на фоне unix wars не выглядел привлекательно, и не пах деньгами (В отличие от VMS) отсюда и вот.
Myxa # 0 ⇈
Про «Unix»: мелкомягкие делали платный юниксоподобный «Xenix» (ты даже где-то писал, что в нём не было виртуальной памяти, что с позиции нашего времени звучит как очередная порнуха на порнхабе).
MAKAKA # 0 ⇈
YpaHeLI_ # 0 ⇈
bormand # 0 ⇈
YpaHeLI_ # 0 ⇈
bormand # 0 ⇈
В винде ты просто отдашь этот буфер в винапишную функцию и она его нарисует.
gost # 0 ⇈
Кстати, с десятки винда поддерживает стандартные ANSI коды, так что теперь можно даже винапишными функциями не заморачиваться.
bormand # 0 ⇈
А как же Сёма?
gost # 0 ⇈
bormand # 0 ⇈
gost # 0 ⇈
bormand # 0 ⇈
Обновись, перестанет.
Они вроде в какой-то версии изкоробки включили. А потом задумались над совместимостью и теперь надо явно звать апишку для включения.
Не то чтобы ее сложно было позвать. Один фиг надо тест на терминал делать, даже в прыщах.
gost # 0 ⇈
И тут мы возвращаемся к тому, о чём я уже говорил…
> над совместимостью
А что там с совместимостью? Кто-то случайно введёт «\x1b[30;1m» и получит багор?
guest # 0 ⇈
guest # 0 ⇈
MAKAKA # 0 ⇈
в какой из восьми используемых версий?:)
YpaHeLI_ # 0 ⇈
Ну ncurses, как и любая Linux программа с цветным выводом и передает эти цвета уже буфер вместе с управляющими кодами в TTY.
В винде же, как я нагуглил, сначала переключают консоль в нужный цветовой режим, а потом выводят через printf\cout.
https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute
https://coderoad.ru/9262270/Цветной-консольный-вывод-с-C-в-Windows
То есть подходы совершенно разные. И в винде совершенно другие абстракции.
Можно, конечно, сделать функцию которая на основе этих управляющих кодов TTY будет переключать виндовую консоль в разные режимы и выводить, и будет совместимость ncurses с виндой.
YpaHeLI_ # 0 ⇈
То есть тоже подставляет туда коды.
Странно, противоречит примерам со второй ссылки.
Хотя никакого буфера туда не надо передавать.
Значит меняется текст непосредственно абстракцией консоли.
bormand # 0 ⇈
Сука, зачем они названия функций то переводят...
YpaHeLI_ # 0 ⇈
То бишь та же самая ncurses, которая тоже позволяет рассматривать вывод как двумерное полотно.
Тогда в ncurses и отпадает нужда. Разве что только если нужна кроссплатформенность.
MAKAKA # 0 ⇈
Структура курд
да
Вертикальная координата или значение строки. Единицы зависят от вызова функции.
филлконсолеаутпутаттрибуте
филлконсолеаутпутчарактер
жетконсолефонтсизе
жетларжестконсолевиндовсизе
bormand # 0 ⇈
Только полный и качественный перевод.
З.Ы. Хотя вместо "слева" должны быть "оставленные" для полной аутентичности.
YpaHeLI_ # 0 ⇈
guest # 0 ⇈
Оставленный
Лучший
Правильно
Последние
Винконтипес. h (через Винкон. h, включение Windows. h)
сука
YpaHeLI_ # 0 ⇈
> филлконсолеаутпутчарактер
> жетконсолефонтсизе
> жетларжестконсолевиндовсизе
Если бы WinAPI писали на 1С.
MAKAKA # 0 ⇈
bormand # 0 ⇈
Ну вот эту проверку таки стоит сэмулировать. А то получится как с некоторыми тулами от майкрософта, у которых stdout не редиректится (всё рисуется напрямую в сосноль).
MAKAKA # 0 ⇈
алсо, можно прверить, что к тебе приаттачена консоль вообще.
bormand # 0 ⇈
А на аттач плохо проверять, вдруг ты приаттачен, но один из потоков редиректнули?
MAKAKA # 0 ⇈
а сам факт приаттачености конечно ни о чем не говорит. Да, у тебя есть консоль, но ты в нее не пишешь.
Точно так же как в прыще у тебя есть tty, но твой аутпут редиректунт
вроде бы так
bormand # 0 ⇈
MAKAKA # 0 ⇈
bormand # 0 ⇈
MAKAKA # 0 ⇈
Да и xtermа нет без иксов, где нить на севере. Из демона ты ничего не запустишь бо нет $DISPLAY
А на винде можешь создать консоль из сервиса, но так как сервис живет в своей сессии, то твою консоль никто не увидит кмк. но писать в нее ты можешь наверное
bormand # 0 ⇈
Или пойти и нагло открыть нужную сосноль в /dev. Это даже для сервиса прокатит. Но х.з. как выбрать нужную. Да и висящий в ней процесс как-то надо заткнуть.
MAKAKA # 0 ⇈
И уж точно ты не станешь там сешн лидером или как там его, чтоб тебя уведомили о закрытии tty
bormand # 0 ⇈
> уведомили
read и write ошибку возвращают, когда pts'ка удалена. Так что всё норм.
MAKAKA # 0 ⇈
>read ошибку возвращает,
а сигнал ты получаешь, когда tty закрывают?
Кстати, я погуглив
https://www.win.tue.nl/~aeb/linux/lk/lk-10.html
Getting a controlling tty
How does one get a controlling terminal? Nobody knows, this is a great mystery.
The System V approach is that the first tty opened by the process becomes its controlling tty.
The BSD approach is that one has to explicitly call
ioctl(fd, TIOCSCTTY, ...);
Linux tries to be compatible with both, as always, and this results in a very obscure complex of conditions.
ну и дальше расписывается как
прыщебляди соснули малость
bormand # 0 ⇈
MAKAKA # 0 ⇈
тогда это всё таки не совсем твоя tty.
Сешн лидер же должен получать сообщение о хенгапе, не?
bormand # 0 ⇈
bormand # 0 ⇈
MAKAKA # 0 ⇈
FAR например умеет ресайзить окошко например. А в никсах терминал может быть какой угодно (да хоть железный!) и как бы ты хотел его ресайзить?
bormand # 0 ⇈
Ну с другой стороны для юзера такой ресайз почти бесполезен. Наоборот даже мешаться будет.
MAKAKA # 0 ⇈
В конце концов статус лайн тоже не все умеют: виртуальный терминал на консоли же не умеет
И так-то да, если мне путти начнет само ресайзица -- я охуею
guest # 0 ⇈
bormand # 0 ⇈
А то может проще высрать пачку \n вместо очистки и не париться.
BelCodeMonkey # 0 ⇈