LINUX.ORG.RU

xtermcontrol 3.11

 , , xtermcontrol, ,

xtermcontrol 3.11

0

1

После более полутора лет затишья состоялся выпуск 3.11 консольной утилиты xtermcontrol для просмотра и динамического управления свойствами xterm: цветами, заголовком, шрифтом и размером.

Поддерживаются сворачивание и разворачивание окна, перемещение на передний или задний план, максимизация размера и восстановление в прежний вид, а также сброс настроек.

А опытным пользователям xtermcontrol позволяет вводить любые последовательности команд управления xterm.

Проект написан на языке C и распространяется по лицензиям GNU GPL 2+.

Изменения:

  • исправлена проблема с пропусканием OSC-последовательностей в tmux, возникшая после перехода на ST-терминаторы в версии 3.5; настройка цветов и заголовка снова работает в tmux;
  • исправлены зависания и падение при получении усечённых или некорректных ответов на запросы; вместо этого выдаётся сообщение об ошибке. Контрольные символы удаляются из полученных значений для предотвращения внедрения злонамеренных экранирующих последовательностей;
  • теперь --get-title принимает ответы, завершающиеся BEL;
  • выход с ненулевым кодом ошибки при сбое запроса и сообщение о недопустимых аргументах --geometry вместо их игнорирования;
  • теперь опции применяются в том порядке, в котором они указаны в командной строке, например --reset --bg=red сначала сбрасывает настройки, а затем устанавливает цвет;
  • опции --force и --verbose, используемые отдельно, больше не подавляют использование файла конфигурации;
  • при проверке TERM принимаются значения TERM из tmux или TMUX;
  • при использовании --file ~ раскрывается только в путях ~/; также сообщение об отсутствии переменной HOME вместо некорректного поведения;
  • открытие /dev/tty для управления терминалом, что обеспечивает перенаправление всех потоков stdin/stdout/stderr. Восстановление настроек терминала при завершении работы сигналом;
  • удаление конечных пробелов из значений конфигурации и выдача предупреждения при пустых значениях. Сообщение об ошибках в конфигурационном файле с указанием фактической причины, а не всегда с кодом ENOENT.

>>> Видео

>>> Исходный код на GitHub

>>> Подробности на GitHub

★★★★★

Проверено: cetjs2 ()

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

В xterm можно выводить изображения без sixel, задавая фону пробела цвет, и уменьшая размер шрифта до 1 пикселя, затем выводить пробелы разного цвета в соответствии с пикселем изображения. Все терминалы либо встают колом нахер, либо ваще падают xterm бодро выводит 1920x1080 true color разноцветных пробелов.

Вот например i-rinat в терминале (справа) без sixel, тупо пробелами


Вопрос! А можно, выставить шрифт в 1 пиксель вывести текст, вернуть обычный размер шрифта, но чтобы предыдущий текст не увеличился, ну тот что ранее был выведен в однопиксельной форме?

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

В xterm можно выводить изображения без sixel, задавая фону пробела цвет, и уменьшая размер шрифта до 1 пикселя

Скрипт давай! :)

Все терминалы либо встают колом

Огласите весь список, пжлста. :)

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

Скрипт давай! :)

Ща, гляну, если не удалил, яж игрался просто. Ща пороюсь

Огласите весь список, пжлста. :)

Ну tilix лагал, остальное уже не помню, надо перепроверять

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

помимо sixel есть ещё kitty terminal graphics protocol

И в юникоде есть квадратики в полклетки и четверть клетки, так что наверное можно в одну «ячейку» ужать 4 пикселя(хотя конечно тут будет «округление» цвета, да).

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

Во, только сначала convert image.формат image.tga
Затем

xterm -fa 'Default' -fs 1 -geometry 1000x1000 -e "lua5.4 tga.lua image.tga; sleep 500"`

Тока чёта оно не так шустро отрисовало… Может я как по другому что-то делал, короче играться надо.

local tga =
{
   IMAGE_TYPE_EMPTY = 0;
   IMAGE_TYPE_PALETTE = 1;
   IMAGE_TYPE_TRUECOLOR = 2;
   IMAGE_TYPE_MONOCHROME = 3;
   IMAGE_TYPE_PALETTE_RLE = 9;
   IMAGE_TYPE_TRUECOLOR_RLE = 10;
   IMAGE_TYPE_MONOCHROME_RLE = 11;
}
-------------------------------------------------------------------------------
local function tga_read_header(file_handler)
      local header = { colormap = { } }
      header.identificator_len,
      header.colormap_type    ,
      header.type             ,
      header.colormap.position,
      header.colormap.numelems,
      header.colormap.bitselem,
      header.pose_x           ,
      header.pose_y           ,
      header.width            ,
      header.height           ,
      header.bits             ,
      header.properties = ('BBBI2I2BI2I2I2I2BB'):unpack(header)
      header.channels = math.max(1,math.floor(image.bits / 8))
      return header
end
-------------------------------------------------------------------------------
local function tga_read_pallete(file_handler,header)

end
-------------------------------------------------------------------------------
local function tga_read_colormap(file_handler,header)

end
-------------------------------------------------------------------------------
local function tga_read_colordata(file_handler,header)

end
-------------------------------------------------------------------------------
local function tga_read_rle_colormap(file_handler,header)

end
-------------------------------------------------------------------------------
local function tga_read_rle_colordata(file_handler,header)

end
-------------------------------------------------------------------------------
function tga.load(filename)
    if type(filename) ~= 'string' then
       return nil,"[ERROR] Bad filename argument"
    end
    ---
    local file = io.open(filename,"rb")
    ---
    if io.type(file) ~= 'file' then
       return nil,"[ERROR] Failed open "..filename
    end
    ---
    local header = file:read(18)
    if type(header) ~= 'string' then
       return nil,"[ERROR] Failed read "..filename
    end
    ---
    local image = { colormap = { } }
    ---
    image.identificator_len,
    image.colormap_type    ,
    image.type             ,
    image.colormap.position,
    image.colormap.numelems,
    image.colormap.bitselem,
    image.pose_x           ,
    image.pose_y           ,
    image.width            ,
    image.height           ,
    image.bits             ,
    image.properties = ('BBBI2I2BI2I2I2I2BB'):unpack(header)
    image.channels = math.floor(image.bits / 8)
    ---
    image.data = {}
    ---
    if image.type == tga.IMAGE_TYPE_EMPTY then
       return image
    end
    ---
    if image.type == tga.IMAGE_TYPE_PALETTE then
       local colormap = { }
       local colormap_channels = image.colormap.bitselem / 8
       image.channels = colormap_channels
       local image_size = (image.height * image.width)
       local colormap_data = file:read(colormap_channels * image.colormap.numelems)
       ---
       if type(colormap_data) ~= 'string' then
          return nil,"[ERROR] Failed read colormap in "..filename
       end
       ---
       for i=1,#colormap_data, colormap_channels do
           if colormap_channels == 1 then
              colormap[#colormap+1] =
              {
                  (colormap_data:sub(i+0,i+0)):byte(),
              }
           elseif colormap_channels == 2 then
              colormap[#colormap+1] =
              {
                  (colormap_data:sub(i+0,i+0)):byte(),
                  (colormap_data:sub(i+1,i+1)):byte(),
              }
           elseif colormap_channels == 3 then
              colormap[#colormap+1] =
              {
                  (colormap_data:sub(i+0,i+0)):byte(),
                  (colormap_data:sub(i+1,i+1)):byte(),
                  (colormap_data:sub(i+2,i+2)):byte(),
              }
           elseif colormap_channels == 4 then
              colormap[#colormap+1] =
              {
                  (colormap_data:sub(i+0,i+0)):byte(),
                  (colormap_data:sub(i+1,i+1)):byte(),
                  (colormap_data:sub(i+2,i+2)):byte(),
                  (colormap_data:sub(i+3,i+3)):byte(),
              }
           end
       end
       ---
       local data = file:read(image_size)
       ---
       if type(data) ~= 'string' then
          return nil,"[ERROR] Failed read colorcodes in "..filename
       end
       ---
       for i=1,image_size do
           local color_code = data:sub(i,i):byte()+1
           --io.write(color_code,' ' )
           for j=1,colormap_channels do
               image.data[#image.data+1] = colormap[color_code][j]
               for p=1,image.channels-colormap_channels do
                   image.data[#image.data+1] = 0
               end
           end
       end
       return image
    end
    ---
    local image_size = (image.height * image.width) * (image.channels)
    local data = file:read(image_size)
    ---
    ---
    if type(data) ~= 'string' then
       return nil,"[ERROR] Failed read "..filename
    end
    ---
    file:close()
    ---
    image.data = {}
    for i=1,#data do
        image.data[i] = string.byte(data:sub(i,i))
    end

    return image
end

function tga.ascii_print(image,style)
    local c = 0
    for i=1,#image.data,image.channels do
        c = c + 1
        if style == 'rgb' then
           io.write('\27[48;2;',image.data[i+2],';',
                                image.data[i+1],';',
                                image.data[i+0],'m','   ','\27[0m')
        elseif style == 'ascii' then
           io.write(string.char((33 + (image.data[i+0] +
                                       image.data[i+1] +
                                       image.data[i+2] /3)) % 125))
        end

        if c % image.width == 0 then print() end
    end
end



local image,err = assert(tga.load(({...})[1]))

tga.ascii_print(image,'rgb')

print(
image.identificator_len,
image.colormap_type    ,
image.type             ,
image.colormap.position,
image.colormap.numelems,
image.colormap.bitselem,
image.pose_x ,
image.pose_y ,
image.width,
image.height,
image.bits,
image.properties)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

И в юникоде

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

Только вот сейчас взяв снова потыкав, вспомнил почему забросил, реально пиксель получить не удалось. Оно больше, а я думал можно будет задать 0,1 размер шрифта тем самым масштабировать типа получится. Базовая идея чтобы никаких протоколов было не надо пробел да эскейп цвет и всё

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.