Re: из консоли вернуть разрешение 80х25

Автор v4567, 02 апреля 2019, 16:42:29

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

v4567

Без графики в консоли загружается фреймбуфер.


uname -a
Linux 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux


Может ошибаюсь, но выгрузить фреймбуфер и вернуть буквенно-цифровой режим 80х25 нельзя, если можно то как? Если нельзя, то как из консоли, не при загрузке через grub!, а из самой консоли поменять разрешение этого фреймбуфера, или поменять количество строк и столбцов?
Установлен пакет kbd, при помощи утилиты resizecons поменять количество столбцов и строк не получается. Например:


resizecons 80x25
resizecons: resizecons: не удалось найти файл видеорежима 80х25


Ранее в гугле находил информацию, что resizecons написана с ошибкой и менять при помощи её количество строк и столбцов бесполезно, надо пользоваться - сейчас не помню уже чем, но тогда с этой другой утилитой то же были проблемы и изменить количество строк и столбцов так и не удалось. Сейчас эту информацию не могу найти в гугле. Если кто знает подскажите пожалуйста.

symon2014


v4567


sudo dpkg-reconfigure console-setup


Попробовал. При помощи этой команды можно шрифт выбрать, например Terminus32x16 и тогда разрешение измениться. Этот шрифт можно загрузить и при помощи setfont, тогда разрешение то же измениться.

Вспомнил, что советовали менять разрешение командой fbset.
Попробовал поменять размеры но когда посмотрел, у меня 1024х768, удалось выставить и реальные и виртуальные размеры 640х400, но сам размер знакоместа не изменился, в результате стало использоваться приблизительно пол экрана и размерами знакоместа такими какими они были ранее при 1024х768. Мне нужно именно увеличить размер знакоместа. Может это и можно сделать как то при помощи шрифтов, но как? У меня не получилось загрузить какие нибудь графические шрифты в фреймбуфее.
Немного прояснилось.
Я очень давно на ассемблере писал программу которая записывала шрифт в знакогенератор и потом выводила символы.
Разрешение там никак не зависело от шрифта, разрешение выставлялось некоторым кодом на порт ввода, могло быть 40х25 или 80х25 и т. д. и под эти разрешения надо было делать шрифты, если при разрешении 40х25 загрузить шрифт 8х16 то вторая половина буквы была бы всё время пустая, или наоборот при 80х25 загрузить (кстати не знаю может шрифт и не загрузился бы) шрифт 16х16 то всё время будет пол буквы.
В нашем случае - при linux-е когда мы загружаем шрифт то операционная система смотрит что за шрифт и в начале выставляет нужное разрешение, а потом грузит шрифт в знакогенератор.
Сейчас я загрузился в буквеноцифровом режиме без фреймбуфера и поэксперементировал с загрузкой разных шрифтов:
8х8 даёт режим 80х50
8х16 80х25
8х14 80х28 удивительно что он загрузился
latarcyrheb-sun32 оказался шрифтом 16х32 с количеством смволов 512 и в чистой буквенноцифровой консоли он не загрузился выдав ошибку - putfont: KDFONTOP недопустимый аргумент, а вот в фрейм буфере он отлично загрузился уменьшив количество столбцов и строк, скорее всего в фреймбуфере свой виртуальный (не аппаратный) знакогенератор, в который можно грузить и такие шрифты.
Не нашёл пока шрифт 16х16 он должен дать разрешение 40х25, попробую сделать сам и загрузить, посмотрю поменяется ли разрешение на 40х25.

Сделал сам шрифт 16х16 но в чистой буквенноцифровой консоли он не загрузился выдав ошибку - putfont: KDFONTOP недопустимый аргумент.


v4567

Извиняюсь за надоедливость.
В чистой (не эмулятор терминала, загрузился передав ядру параметр nomodeset) буквенноцифровай консоли 80х25 (без фреймбуфера!) загрузил командой setfont шрифты, в ascii первый символ идёт NUL, потом SOH и т. д.
В моих же шрифтах первым идёт символ копирайта - "С" в кружке, далее идут то же вполне печатные символы.
По команде showconsolefont они все прекрасно выводятся на консоль, все 256 символов.
Далее попытался вывести первый символ копирайта командой echo:

echo -e "\x00"

Но вывелось пустое место, при помощи такого вывода, выводятся: латиница, кириллица, цифры, а вот символы псевдографики вывести не удалось, вместо символов псевдографики выводится ромбик.
Я не пойму почему так?
И как можно вывести символы из командной строки, которые есть в шрифте.
Некоторые спросят меня, зачем мне это когда есть графика, отвечаю. Хотел написать небольшую игру на баше и в шрифтах сделать некоторые изображения, комбинируя которые можно кое что нарисовать. Я понимаю что в эмуляторе, да и во фреймбуфере это работать не будет, но я просто хотел попробовать как у меня это получится в чистой консоли. Ведь линукс для людей, всё можно настроить, подправить исходники и вот тут сразу споткнулся казалось бы в простом. А теперь уже даже интересно почему echo не выводить некоторые символы из шрифта, при этом showconsolefont прекрасно выводит все символы которые есть в шрифте.
И ещё, если при изменении шрифта не записать таблицу перекодировки для юникода, то кириллица не выведется, вместо неё будут вопросительные знаки. Ну откуда в чистой консоли может фигурировать юникод?
Последний момент, неужели нет никакого способа как можно поменять количество столбцов и строк во фреймбуфере, уменьшив их количество при этом увеличив размеры знакоместа, кроме как записывая в виртуальный знакогенератор шрифт размерами 16х32? Команда fbset меняет разрешение, например с 1024х768 на 640х400 но при этом размер знакоместа не меняется, он как был маленьким так и останется, в результате начинает использоваться пол экрана, а вторая половина не используется.

qupl

За дубли тем в следующий раз будет предупреждение.

qupl

Цитата: qupl от 06 апреля 2019, 06:33:51Ну откуда в чистой консоли может фигурировать юникод?
Вы это серьезно?

v4567

Цитировать
Вы это серьезно?

Немного спорол чепуху.
На другом форуме подсказали, надо вот так писать:

echo -e "\ua9"


По логике вещей можно предположить следующее, echo передаёт в ядро число, а ядро воспринимает это как число-код юникода, так как локаль установлена в utf8,  потом по таблице перекодировке (которая расположена в файле шрифта) ищет соответствие и выводит соответствующий символ.
В таблице перекодировки, которая расположена в файле шрифта, в первой строке, получается для первого символа - первого знакоместа:

0x000 U+00a9

В шрифте это символ копирайта.
Непонятно вот что, я ведь для echo явно в шестнадцатиричном виде указывал на него - x00, но почему то так не работает. Получается что x00 воспринимается как юникод....?

v4567

Кое что прояснилось:
Все символы можно посмотреть командой:

showconsolefont

Или раскрыть файл шрифта:

gunzip font.psf.gz   # разархивирую файл со шрифтом
psfgettable font.psf font.table  # вынимаю из него таблицу перекодировки, если локаль utf8 то таблица перекодировки будет для юникода
psf2txt font.psf font.txt  # преобразовываю файл шрифта в текстовый вид, этот файл можно редактировать в текстовом редакторе, что именно редактировать можно догадаться по содержимому этого файла


Если кому интересно, то после редактирования шрифта можно всё собрать в обратном порядке:


txt2psf newfont.txt newfont.psf  # создаём новый файл шрифта
mv newfont.psf newfont1.psf  # переименовываем файл шрифта
psfaddtable newfont1.psf font.table newfont.psf  # записываем таблицу перекодировки в новый фал шрифта, таблицу перекодировки то же можно отредактировать - это текстовый файл
gzip newfont.psf  # архивируем файл шрифта
setfont newfont.psf.gz  # записываем наш новый шрифт в знакогенератор, теперь будет работать этот шрифт


Там где в шрифте элементы псевдографики, (имеются ввиду ячейки знакогенератора  в диапазоне 0xB0-0xDF) наверное сам знакогенератор продолжает изображение копируя последний столбец, поэтому символы псевдографики изображаются непрерывными. Остальные символы будут разделены полоской шириной в один столбец. Поэтому если нужно создать свои символы псевдографики или какие нибудь изображения, то в файле шрифта менять нужно именно эти ячейки.

И выводить, как подсказали на другом форуме, можно так:

echo -e "\u......"


где:

\u......


код юникода, можно посмотреть в вынутом файле таблицы перекодировки, например:


echo -e "\ua9"


выведет первый символ - копирайт, это в шрифте которые у меня, в другом шрифте может быть и другой символ.

Остались невыясненными следующие вопросы:

Как изменить в чистой текстовой консоли количество выводимых строк и столбцов, без перезагрузки, из самой консоли?
Ведь есть режимы 40х25, 160х50 и т.д.
Для этого есть команда:

resizecons 160x50
resizecons: resizecons: не удалось найти файл видеорежима 160х50


Вроде как надо - поставить svgalib, который принесет restoretextmode, который сгенерит файл 80x25, который...

Дистрибутив у меня devuan - это ветка от debian без systemd.
В нём в репозиториях svgalib нет. Скачал deb пакет и попытался из него использовать restoretextmode, но оказалось что нет библиотеки svgalib, её поставить так и не удалось.
Может этот файл можно создать вручную в текстовом редакторе?

Второй вопрос как изменить количество выводимых столбцов и строк в фреймбуфере, не прибегая к загрузке шрифта разрешением 16х32
fbset не подходит, так как:
например  у меня 1024х768, удалось выставить и реальные и виртуальные размеры 640х400, но сам размер знакоместа не изменился, в результате стало использоваться приблизительно пол экрана с размерами знакоместа такими какими они были ранее при 1024х768.