LINUX.ORG.RU

Прокрутка текстового контента в виджете Awesome WM

 , , ,


0

1

Здравствуйте.

Обустроил у себя на панельке Awesome WM виджет с прокруткой:

textline = wibox.widget.textbox()
--
--
--
--
scrab = wibox.widget {
	layout = wibox.container.scroll.horizontal,
	step_function = wibox.container.scroll.step_functions .linear_increase,
	expand = false,
	speed = 90,
	fps = 0.5,
	textline,
}

Чтоб по панельке телетайпная лента ползла, вроде tickr'а, только средствами WM.

Затея на первый взгляд отрабатывает как надо: в переменную ТП пихается текстовая макаронина, делается

textline:set_markup(ТП)[], на панельке радостно начинает крутиться контент.

Проблема состоит в том, что контент прокручивается не полностью: после первых примерно 800 символов прокрутка начинается сначала, чего мне, естественно, категорически не надо.

Хотелось бы понять и побороть. Спасибо за внимание.

В процессе борьбы стало ясно, что дело в следующем: даже если задрать textline.forced_width, то при попытке запихать туда длинный текст он выведется не весь: через ~800 символов на виджете - троеточие и обрыв...

★★★★★

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

Ответ на: комментарий от vazgen05

--Посмотри в исходниках же

я не такого могущества колдун,чтоб понимать исходники, увы(

--Текст на русском и английском одинаково обрезает?

Английских букв влезает больше! Значит, это какое-то ограничение по объёму памяти, что ли...

piyavking ★★★★★
() автор топика
Ответ на: комментарий от mord0d
~ $ awesome --version
awesome v4.3 (Too long)
 • Compiled against Lua 5.3.6 (running with Lua 5.3)
 • D-Bus support: ✔
 • execinfo support: ✔
 • xcb-randr version: 1.6
 • LGI version: 0.9.2
piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 1)
Ответ на: комментарий от piyavking

Lua 5.3 поддерживает (ну, почти) мультибайтные кодировки, а вот релизная версия awesome, если мне память не изменяет, ещё нет. Это пофиксили, но я задолбаюсь искать в каком именно коммите. В любом случае накатить версию из master/HEAD будет правильнее.

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

Это, конечно, хорошо, но латинская простыня хоть и проматывается на побольше, чем кириллическая, но всё равно проматывается не вся - я проверил.

И потом, если б кириллица не поддерживалась, так она и не отображалась бы.

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

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

такую вещицу отловил: если я сделаю 'textline.forced_width = 5000', то проматываемый объект растянется по длине, но контент там будет показан не полностью: на середине контента троеточие и обрыв.

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

Это, конечно, хорошо, но латинская простыня хоть и проматывается на побольше, чем кириллическая, но всё равно проматывается не вся - я проверил.

Есть такое, виджет немного кривой и недоработанный. Я вообще не рекомендую использовать wibox.container.scroll: во-первых он очень жрёт ресурсы, во-вторых он очень ограничен в функционале (например, вложенные виджеты не примут клик по ним).

Ещё на версии 3.5 кто-то из ЛОРовцев делал более функциональный виджет скролла, но он вроде не был портирован на 4.x. А кто автор я не помню.

Но что это за ограничение, и как до него добраться?…

Там под капотом где-то в виджетах было какое-то ограничение, чтобы виджеты не были бесконечными, чтобы awesome не падал. Длина виджета может считаться не правильно (например, этим болеет systray и textbox в некоторых случаях). Надо дебажить и репортить.

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

Скролл тут ни при чём, ни expand, ни extra_space не помогут: если принудительно расширить textline, то он исправно его проматывает - длинный, но полупустой. То есть при попытке вбить в длинный текстбокс длинный же текст - он виден не весь - https://ibb.co/xmwnxrv

Интересный результат, копаю...

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

При помещении виджета в скролл он реарранжируется по сигналу, потому твоё утверждение в корне неверно. Даже forced_width/forced_height работают не всегда так, как должны работать.

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

Я даже не знаю. Попробую, наверно, прямоугольный виджет организовать на весь десктоп, и посмотрю, сколько на него текста влезет...

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

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

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

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

Код я не смотрел, но судя по описанию дело совсем не в размере виджета, а в ограниченности буфера для контента. Скорее всего там что-то вроде(на каком хоть языке написан виджет? я же код не смотрел):

size_t max_len = 800;
char buf[max_len];
snprintf(buf, max_len, content);

Вот и выходит 800(1600) символов ASCCII и 400(800) символов кириллицы(как двухбайтной).

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

--дело совсем не в размере виджета, а в ограниченности буфера для контента

--скорее всего там что-то вроде

ну да, это я уж понял

--Решил погуглить и вот что нашел может с этим как-то связано?

Нет, это wibox.container.constraint - ограничивающая обёртка, а у меня wibox.container.scroll - ограничивающая обёртка с автопромоткой. Увы, но поводу буферов я ни там, ни там ничего не нашёл.

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

--остальное за кодом реализации конкретной задачи

боюсь, что я не осилю эти дебри(

тут приплыло удивившее: как и хотел, впилил прямоугольный виджет на весь десктоп, туда запихал скроллбокс с текстлайном (текстлайн тот же, содержимое - то же, только скроллбокс поменял с горизонтального на вертикальный), и он крутится полностью - https://ibb.co/4sC6MPX (пустая строка в прямоугольном виджете - это момент полной промотки, и он соответствует тому тексту, который я засунул в текстбокс)!

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

боюсь, что я не осилю эти дебри(

А придётся. Релизной версии уже почти четыре года, портировать в неё новые фичи никто в здравом уме не станет, потому что проще выкатить новый релиз, но так как он ещё не готов, у тебя три варианта:

  • Оставить awesome как есть и терпеть старые баги;
  • Установить awesome из HEAD и искать новые баги.

тут приплыло удивившее: как и хотел, впилил прямоугольный виджет на весь десктоп, туда запихал скроллбокс с текстлайном (текстлайн тот же, содержимое - то же, только скроллбокс поменял с горизонтального на вертикальный), и он крутится полностью - https://ibb.co/4sC6MPX (пустая строка в прямоугольном виджете - это момент полной промотки, и он соответствует тому тексту, который я засунул в текстбокс)!

Это из-за того, что для вертикального и горизонтального скролла вычисление размера доступного пространства для отрисовки происходит по-разному.

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

Есть ещё парочка вариантов: перепилить прокрутку на вертикальную, подобрав скорость и дискретизацию, чтоб единственная видимая строка каждый раз была на старом месте, и царь-вариант: закопать стюардессу и пустить поверх панели tickr, в котором уже всё сделано)))

Если б всё дело было в utf, то тогда с чисто латинским текстом траблов бы не было, я попробовал чистую латиницу гнать - всё равно горизонтальная прокрутка срывается. А вертикальная прекрасно мотает и латиницу, и кириллицу! Скандалы, интриги, расследования ©...

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 3)
Ответ на: комментарий от mord0d

для вертикального и горизонтального скролла вычисление размера доступного пространства для отрисовки происходит по-разному

- ещё один вариант, кстати - скопировать scroll.lua к себе в конфиг и влезть туда шаловливыми ручками. С этого надо было, наверно, начинать)

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 2)
Ответ на: комментарий от mord0d

Это из-за того, что для вертикального и горизонтального скролла вычисление размера доступного пространства для отрисовки происходит по-разному.

Кстати, не думаю. Просто у вертикального скролла гораздо меньше линейные размеры. Опытным путём пришёл к выводу, что принудительно назначить textline.forced_width больше 7000000 (примерно) не получается. И это как бы и наверно оправдано и захардкодено. Уверен, что, стянув виджет вертикальной промотки в одну букву шириной, я получил бы аналогичный глюк по высоте.

Можно, конечно, было бы попытаться организовать массив из текстбоксов, разложить туда текст по частям, и запихнуть в скроллбокс layout из этого массива. Можно вообще послать скроллбар лесом и по таймеру прогонять по текстбоксу последовательность равных по длине подстрок, предварительно разбитых каким-нибудь awk'ом. Можно много ещё чего, но исходная тема, по-моему, исчерпана. Спасибо за наводочки.

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

утром на свежую голову колхознул башскриптик на десять строчечек, таймер в конфиг прописал, и обрёл что хотел без умножения печали)

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

Да я уж и решил, вон лоровское эрэсэс уж с обеда в панельке прекрасно мотается, лишние сущности типа скроллбара плодить не надо, ресурс не жрёт, диск не дёргает, оцениваю даже лучше «родного» скроллбара, ультрафэпээс которого мне вот совершенно не нужен)

Куда уж прямее, по-моему, чем неизвестно на что в гит-версии нарываться и потом горестно бубном греметь, и уж точно быстрее)

Ну не жрёт штатная промотка ультрадлинный контент, ну и шайтан с ней, лентяй я и лоботряс, мне очень стыдно, бггг)

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

неизвестно на что в гит-версии нарываться и потом горестно бубном греметь

После релиза 4.0 огрести в рандомный момент времени стало невозможно.

mord0d ★★★★★
()