Art, games, linux and anime

#956
dwm
#959
>>956
Чтобы конфигурировать в сорсах? Нафиг.
#960
>>959
Тогда awesome. Хотя ничего плохого в конфигурировании через правку исходников я в данном случе по большому счёту не вижу, помимо необходимости установки компилятора и отсутствия в большинстве дистрибутивов средств для пользовательской установки софта.
#962
>>956
Он же для арча? Крут, но у меня не арч дебиан.
#963
>>962
А написать «apt-cache show dwm» тебе религия не позволила?
Вот он, во всех выпусках есть: https://packages.debian.org/search?keywords=dwm&exact=1
Правда, если ты гуями любишь обмазываться больше чем терминалами, то он тебе не очень подойдёт: для многих гуевых программ, особенно многооконных, тайлинг бесполезен и только мешает.
#1932
> Правда, если ты гуями любишь обмазываться больше чем терминалами, то он тебе не очень подойдёт: для многих гуевых программ, особенно многооконных, тайлинг бесполезен и только мешает.
Но в нём же можно задать правила для новых окон:
https://dwm.suckless.org/customisation/rules
 
static Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
{ "Firefox", NULL, NULL, 1 << 8, True, -1 },
};
 

, чтобы они по умолчанию были парящими.
#1933
Поясните мне-идиоту, что это такое на оп-пике. Вижу, что какая-то тайловая хрень, но выглядит на удивление современно.
#1934
>>1933
bspwm или 2bwm, наверное.
#2042
Бамп.

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

Есть bspwm. Есть полибар.
Проблема: все флоатинг-окна первого перекрывают последний, хотя state=above для него установлено. Запускается из конфига самого менеджера, то есть стартует вместе с ним (sleep 1 и прочую хуйню пробовал). Установлено, что killall polybar && polybar panelName & без изменения правил в конфиге решает проблему, но очевидно не вариант, поскольку требует дополнительных ручных действий.
Проблема номер два: появляется после решения первой проблемы вышеописанным способом и заключается в том, что полибар висит поверх фуллскрин-окон.
Надо сделать: полибар находится НАД флоатинг-окнами и ПОД фуллскрин-окнами. Опционально – прячется при наличии фуллскрин-окон и возвращается при их отсутствии. Всё это работает именно так как только бспвм запускается и не ломается в процессе работы.
С опенбоксом, например, подобного не наблюдалось, всё работало заебись.
Нигде ничего полезного не нашёл, все только выёбываются своими десктопами.

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

. . .
sxhkd &
. . .

И вот, иногда кнопки... прилипают. Например, до того, как это случится, я могу зажать комбо "перейти на воркспейс вправо" (Win+] в моём случае) и воркспейсы начнут быстро меняться друг за другом. Дошёл до последнего -- опять первый, и так пока не отпустишь кнопки.
После того, как это случится, я перейду на один вокрспейс вправо и на этом всё, пока не отпустишь кнопку и не нажмёшь ещё раз.
Аналогично с ресайзами окна стрелочками и всей остальной залупой.
У меня есть однострочник на баше для вставки дменю в текущее окно, если то не терминал:


#!/bin/bash

currentWinId=$(xdotool getwindowfocus)
currentWinName=$(xdotool getwindowfocus getwindowname)
appendix=""

[[ ! $currentWinName =~ \\[?.+@.+:?\\]?($PWD|~) ]] && appendix="-w $currentWinId"

dmenu_run $appendix

И соответствующие строчки в конфиге sxhkd:


super + @space
exec $HOME/.local/bin/dmenu-embedded

И после того, как происходит описанное выше, эта хуйня тоже перестаёт работать.
"Решается" по аналогии с проблемой полибара -- перезапуском: killall sxhkd && sxhkd &, однако, в отличие от, решение временное.

Если sdelat-zaebis для моего случая ещё не изобрели, как это всё хотя бы отдебажить?
#2043
>>2042
Что-то я сомневаюсь, что ты здесь найдёшь других пользователей этого дела. Сейчас модно использовать awesome.
#2045
>>2043
По-моему, ты что-то путаешь. Бспвм самый "современный" тайловый вм и потому самый популярный у разного рода айтишьников и прочих хипстеров из ДЕСКТОП-ТРЕДОВ и реддитов. Популярнее только i3, и то только потому что изначально заточен под совсем казуалов и намного проще в настройке. Хотя "свой формат конфига" -- это всегда говно и даже сраный джейсон предпочтительнее, но так справится даже совсем убунтёнок. Овсом -- другая крайность: непонятная хрень с конфигом на ебучем люа в 3 000 строк. Хотя он из коробки полностью настроен, пусть и по-уебански, но ковырять там что-то с референсом по люа под рукой -- в пизду. Поэтому пользуется им полтора красноглазика, ну или я просто чего-то не знаю. Нечасто вижу пользователей овсома. Совсем.
#2046
>>2042
Сочувствую, однажды я поставил себе bspwm и столкнулся с теми же проблемами. Забил и поставил всё как было.
Не очень понимаю, как этим пользоваться и зачем. Вместо пользования проводишь время за вылизыванием конфигов и решением каких-то проблем, возникающих из-за кривой реализации.
Короче, wm для "сделать скриншот".
#2047
>>2046
Так-то он удобен довольно, не считая вышеперечисленной хуйни. Ну и выглядит красиво, да.
На чём сейчас сидишь?
#2048
>>2047
Сейчас у меня вообще xfce. Уж не знаю, что удобного ты нашёл в bspwm. Там много странных решений.
#2049
>>2045
> ковырять там что-то с референсом по люа под рукой -- в пизду.
Рефренс овса обычно нужен только в случае запила чего-то нестандартного (вроде кастомных виждетов), а в остальных случаях дефолтный конфиг прост и понятен.
Конфиг на полноценном языке программирования даёт огромное преимущество в гибкости, после такой практики в wm с прибитым гвоздями функционалом ощущаешь себя как со связанными руками.

> Нечасто вижу пользователей овсома.
На бордах я их видел чаще, чем пользователей других тайловых WM.
#2050
>>2049
> На бордах я их видел чаще, чем пользователей других тайловых WM.
Они чаще постят скриншоты, остальным их постить чаще незачем.
#2051
>>2049
>полноценном языке программирования
>люа
Мало того, что работает как говно и выглядит как говно (хуже могут быть только питон с руби), так его ещё и нет из коробки (зачем он там), что выльется в установку 9000 зависимостей, половину которых придётся собирать из аура.
Я не айтишьник и наверное спрашиваю сейчас хуйню, но почему нельзя было сделать конфиг на перле, например, который есть на любой микроволновке? Понятно, что внутри оно там написано на крестах или на чём оно там, а наружу выплёвывается именно люапонятное апи (для чего люа и делался), но почему именно он? Захотелось так?
Вообще даже не то что нельзя заучить основы его синтаксиса и высрать кривой конфиг, просто ну совсем не хочется тратить время и силы, которые есть куда потратить. Остальные вм не заставляют меня учить бесполезный яп и хуярить на нём сотни строк ради того, чтобы окошечко вот такого типа спаунилось сразу плавающим вон на том воркспейсе. Оно точно того стоит? Чего овсом такого умеет, чего не умеют i3 или bspwm?

>На бордах
Я смотрел посты на форчане и реддите в основном. На парашах этой страны эта тема, судя по всему, вообще не популярна, намного популярнее обсуждение айтишьных пуков очередного парашевода и прочей хуиты. На нульчке был /s/, пока его не смыло нахуй вайпом, но там сидели убунтята с гномами да спермобляди, а немногочисленные скрины десктопов с тайловыми вм в большинстве своём демонстрировали как раз таки bspwm.
#2052
>>2051
> его ещё и нет из коробки
Define свою коробку.
> что выльется в установку 9000 зависимостей
Единственная зависимость для сборки Lua, кроме компилятора C — libtool. У luajit и того нет. Lua — это не питон и не php, чтобы иметь в своём составе библиотеку с кучей всякой хуйни, а умещающийся в 200кб встраиваемый интерпретатор.
> почему нельзя было сделать конфиг на перле, например,
Я ебал перл с его закорючками, например. Да и его интерпретатор весит целых 2 метра.
> который есть на любой микроволновке?
Не на каждой.
> Вообще даже не то что нельзя заучить основы его синтаксиса и высрать кривой конфиг, просто ну совсем не хочется тратить время и силы, которые есть куда потратить.
В отличие от перла, луа имеет очень лаконичный синтаксис и учится на раз.
> Чего овсом такого умеет, чего не умеют i3 или bspwm?
Всё он умеет, было бы желание написать в конфиге. Как бонус, есть весьма удобное API для запила виджетов на панель.
Минус — API меняется от версии к версии, и конфиги с виджетами приходится периодически перепиливать.
#2053
>>2052
Блядь, это говно и правда есть в репах. Я немного удивлён.
Короче, анстейбл-хуйня без видимых преимуществ, тянущая за собой мусор. Понял, спасибо.

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

И сразу вопрос: как убрать ёбаные фреймы у окошек? Не покрасить в альфу, а именно убрать к хуям саму геометрию. Они занимают место и выглядят отвратительно. Вместо того хочу бордер вокруг сфокусированного окна.
Ещё хочу сделать марджин между окнами. Мне обязательно нужен именно i3-gaps?
Вот ещё. Где у этой хуйни лежит файл с автостартами? Надо же композиторы запускать и всё такое. Тоже через костыли?
#2054
>>2053
> анстейбл-хуйня
Анстэйбл только API. Работает же оно как часы.
> тянущая за собой мусор
Какой ещё мусор? Это liblua5.2 на 200кб — мусор?
> без видимых преимуществ
Отсутствие необходимости писать генератор конфига — не преимущество?
> как убрать ёбаные фреймы у окошек?
Отключить их добавление, отредактировав этот кусок кода:

-- Add titlebars to normal clients and dialogs
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = true }
},

Я бы удалил из него
"normal",.
> марджин между окнами

useless_gap=15 в конфиге темы, либо параметр
gap функции
awful.tag.add().
Но это всё про awesome.

> Где у этой хуйни лежит файл с автостартами?
Автостарты — не функционал оконного менеджера. Обычно wm запускается скриптом инициализации сеанса, который до этого дёргает
.Xprofile и/или
.xsessionrc. Если привязать автостарты к wm, то они будут дёргаться при каждом его перезапуске, что вряд ли тебе нужно.
#2057
>>2054
> — не преимущество?
Не преимущество. Генератор конфига я могу написать на чём хочу, хоть на сраном баше или вообще на жс, что в любом случае лучше чем жрать люа и всё равно выйдет намного меньше в плане объёма кода.

>этот кусок кода
вообще не имеет отношения к моему вопросу, потому что это понос на люа. Зачем ты это запостил?
i3 тоже использует люаконфиг помимо известного мне .config/i3/config? Тогда извиняюсь.

У меня тут нет возможности по-человечески запускать икссессию из консоли/слима через xinit и писать юзероспецифические конфиги, приходится жрать всякие лайт ди эм, которые работают ПО-СВОЕМУ и игнорируют .xinitrc, портянку на баше там просто некуда вставить -- это ёбаная монолитная говнина. Мне руками создавать дополнительный мусор в xsessions?
В случае с бспвм это решается легко, потому что там конфиг -- шеллскрипт. В i3 всё не так просто.
>они будут дёргаться при каждом его перезапуске
Имеешь в виду перезапуск на лету? В i3 он по-моему ничего не дёргает, перезапускает только сам i3. Если же вообще завершать сессию, они сами умирают вместе с ней вне зависимости от того, куда они там привязаны.
#2058
>>2057
> Генератор конфига я могу написать на чём хочу
И всё равно он будет генерировать статичный конфиг, в котором не будет возможности написания динамической логики. Если в i3 нет какой-то фичи, то ты отправляешься сосать кегли или ставить компилятор и править код на C (который, к слову, во многих случаях куда более жидкий понос, нежели lua), в то время как в awesome достаточно нарисовать её в конфиге.
> всё равно выйдет намного меньше в плане объёма кода.
Не обязательно. Просто в дефолтном конфиге awesome кишки намеренно выернуты на лицо пользователю чтобы он с ними разбирался и допиливал произвольную логику.
> понос на люа
Ты предвзят.
> У меня тут нет возможности по-человечески запускать икссессию из консоли/слима
Прикрути скрипт /etc/X11/Xsession вместо прямого запуска wm.
> В i3 всё не так просто.
А документацию ты по нему открывал вообще? Я почему-то сразу нашёл раздел 4.17 в https://i3wm.org/docs/userguide.html#configuring. И там есть обработка событий как первого запуска, так и перезапуска wm.
#2059
>>2058
Эээ...
Блядь, ладно, ты почти подебил. Люапонос, несмотря на всю его мразотность, учится за полчаса, где я найду документацию к апи? На официальный сайт меня не пускает клаудфлара (тор, который я не буду отключать), у них есть тор-зеркало?
#2060
>>2059
> где я найду документацию к апи?
В пакете с самим awesome.
file:///usr/share/doc/awesome/doc/index.html
#2061
>>2060
Только что почитал и натурально охуел.


Хуйня лютая. Как и ожидалось.

Что мы имеем:
Раз. НА ЛЮА
Два. Про обратную совместимость здесь не слышали
Три. Апи уёбищно само по себе.

Можно там не так много как хотелось бы, кстати. Если что и можно, для этого придётся городить жуткие костыли и конкретно вникать в люа и уёбищное апи, меняющееся с каждым минорным апдейтом, как я понял.

Говно. Никому не рекомендуется.
#2062
Чем бесплодно сраться, сказали бы, как в этом же Awesome заставить окно feh'а всегда центрироваться при листании картинок. В гуглах ничего подходящего.

Чую, надо менять геометрию окна. Когда и как отлавливать это событие – не знаю.

Версия 3.4.15.
#2065
>>2062
> как в этом же Awesome заставить окно feh'а всегда центрироваться при листании картинок.
{ rule = { class = "feh" },
properties = { floating = true },
callback = function(c)
  c:connect_signal("property::width", function(c) awful.placement.centered(c) end)
end
},

Работает в 4.0. Если в 3.4 нет callback'а в правилах, воткни в обработку сигнала manage по условию соответствия c.class.

> Версия 3.4.15.
Зачем? Чтобы потом портировать код на более новые? 3.4 уже даже из gentoo выкинули.
#2070
Awesome. Хочу панель с тегами в как на оп-пике (которая внизу по центру). Можно сделать?
#2071
>>2070
Можно. Выпиливаешь всё кроме taglist'а из mywibox'а и ставишь ему выравнивание по центру и положение снизу. После этого заменяешь глифы тегов в стиле на кружочки. Всё.

Через появившиеся в четрвёртом овсе директивы стиля taglist_shape_* кружочки можно сделать векторными, см. gears.shape.
#2072
Ох, пиздос. Из луа 5.3 выпилили директиву module(), предложив взамен изъёбываться с самостоятельным впихиванием экспортируемых переменных в список и их возвращением любым доступным способом (http://lua-users.org/wiki/ModulesTutorial). Сижу у разбитого конфига.

Я, конечно, понимал, что луа — это про синтаксический минимализм и изъёбства с изображением крутых фич минимальным функционалом (вроде игры в классы при помощи списков), но чтоб так насрать на обратную совместимость… Мне ж теперь все виджеты переписывать!

Захотел wibox.container.place и обновился себе на голову.
#2074
>>2073
>говниме
Ссу тебе на лицо, быдло.
#2076
>>2075
> говнимеопущенка МАНЕВРИРУЕТ
Можешь даже не пытаться, петухан опущенный. Все знают что ты обоссан и обосран, мейнстирмный поедатель японского говна.
#2077
>>2076
Аниме — говно, луа — говно, api awesome — говно, да. И быдло кругом, заполонило все интернеты и ещё в автобусе хватает за ухо и заставляет уступать место старушкам! Образованное быдло, необразованное быдло, культурное и безкультурное, кругом быдло!

Расскажи нам, как ты живёшь в этом мире весь такой необосранный.
#2078
>>2077
Ещё раз ссу тебе на лицо, петуханя шизоидная.
#2079
>>2078
Но ссышь-то ты только себе на монитор максимум, проснись. И говно — оно не где-то, а у тебя в голове, откуда ты его зачем-то размазываешь по бордам своими постами.

Проблема в том, что твоё говно здесь никому не нужно. Катись с миром отсюда, ня. И приложи там себе что-нибудь холодное чтобы не пригорело.
#2080
>>2079
>бордам
ССАЧЕР, твоя вонючая ПАРАША к бордам никакого отношения не имеет, не спеши зазнаваться.

Но это так, напоминание. Что хотел сказать — не делай вид, что не понял, за что тебя на самом деле обоссали.
А аниме говно, да. Просто говно, каргокультируемое уже много лет. Типа потому что так нада, как на том самом. Запостил анимцо — и сразу стал олдфажнее лет на десять в глазах аноньчиков. Ну ты и сам знаешь.
#2081
>>2080
Ну давай, покажи нам, что к БОРДАМ имеет отношение, и чем оно отличается от тех ресурсов, где ты сейчас срёшь и зазнаёшься, «небыдло».

И не надо делать вид, что ты ссышь на кого-то, а не на свой монитор или на себя. То, что ты посмотрел какое-то говно или, подобно типичному быдлу, счёл говном то, что не смотрел вообще, тебя никак не оправдывает.
#2082
>>2071
А сделать панель прозрачной как? Или частично прозрачной. opacity для вибокса делает прозрачным всё окно, включая форграунд, а цвета в теме понимают только хекс, ксс типа rgba() туда не засунешь.
#2084
>>2081
Могу показать только свой хуй твоей рваной пасти.
> подобно типичному быдлу
Я тебе, говнимеопущенному позёру-каргокультисту, не подобен.
#2086
>>2085
Двачую, даун только кукарекать может, алсо алсо орнул с нево с подливой, кек))) пацаны я битард хикка двачь мем, ыыыы пацаны))) аниме рулит как на том самом))) борды битарды аниме, php, ыыыы)))
#2087
Выдержки из документации к апи awesome.
client:geometry (geo)
Return or set client geometry.

geo: (table or nil) A table with new coordinates, or nil.

Returns:

(table) A table with client geometry and coordinates.

Это пиздец. "Ну бля эта функция чё та там делает, принимает какую-то таблицу с координатами, что в ней должно быть - угадай сам, чё как лох ёпта))". Поскольку жрать это невозможно, вопрос: где нормальная документация (с полным описанием таких вещей как структура принимаемых функциями таблиц и возвращаемые функциями значения и примерами использования всего этого), если таковая существует? Вопрос два: хочу, чтобы окна, вытащенные с тайлового слоя в плавающий, а также окна, спавнящиеся плавающими изначально, спавнились не в 0,0 (слева вверху), а по центру экрана вне зависимости от разрешения последнего и геометрии окна. Как? Вопрос три: почему все окна, кроме находящегося под фокусом, затемняются? Для всего normal focus в теме одинаковые значения.
#2088
>>2087
> Это пиздец.
https://awesomewm.org/doc/api/libraries/gears.geometry.html:
> When this module refer to a geometry table, this assume a table with at least an x, y, width and height keys and numeric values.

> где нормальная документация
Её никогда не было. Раньше была mediawiki с некоторым количеством читаемых доков, но кого-то заебало её поддерживать и теперь сайт по большей части перелез в соцсети вроде github. То, что ты читаешь, автоматически генерируется из комментариев в коде. Читай код модулей на lua, там всё просто и понятно.
> хочу, чтобы окна, вытащенные с тайлового слоя в плавающий, а также окна, спавнящиеся плавающими изначально, спавнились не в 0,0 (слева вверху), а по центру экрана вне зависимости от разрешения последнего и геометрии окна.
Для вытащенных окон:
client.connect_signal("property::floating", function(c)
  return c.floating and awful.placement.centered(c)
end)

Для появляющихся добавь properties = { placement = awful.placement.centered } в рулеза.

> почему все окна, кроме находящегося под фокусом, затемняются?
Овёс — не композитный менеджер, чтобы он мог затемнять окна. Он может влиять на вид только рамки и заголовка окна.
#2089
>>2088
>https://awesomewm.org.
Этого я и ждал, но
>Attention required!
нахуй, спасибо.

>на lua, там всё просто и понятно.
Люа вообще не самый понятный язык.
Кстати, как там перебрать хеш-таблицу через цикл? Типа for (k in o) в жаваскрипте или форич по keys в пердле, ну ты понел. Понятно, что встроенных аналогов нет и писать придётся самому, но спать хочу сука. Как сделать максимально оптимально? Наверняка ты давно сделал.
Тебе же тоже копипаста типа 30
(awful.key({} function {})) мозолила глаза?
#2090
>>2089
Блядь, прекрасная разметка. Извиняюсь.
#2091
>>2089
По ссылке та же выжимка комментариев ldoc'ом, что и в /usr/share/doc/awesome/. Правда, модуля gears в 3.x могло и не быть.

> Люа вообще не самый понятный язык.
За счёт минимализма синтаксиса он намного проще большинства остальных.

> как там перебрать хеш-таблицу через цикл?
for k, v in ipairs(t) do … end, где k и v — ключ и значение, а t — таблица. Ты рефренс по lua вообще открывал? Это ж основы.

А лес из awful.key() я по большей части оставил как есть ради минимизации диффа относительно дефолтного конфига, так проще переезжать на новые версии API.
#2092
>>2091
>for k, v in ipairs(t) do … end
Как и ожидалось, это говно не работает при ключах отличных от тупого 1 2 3.
for k, val in ipairs({a=1,b=2,c=3}) do print(k,val) end => нихуя не происходит. Убрать все а равно - всё заработает. Ну или я опять не так делаю.
#2093
>>2092
Это я плохо читал рефренс: `ipairs` предназначен для последовательной итерации по целочисленным ключам, тогда как с произвольными ключами работает `pairs`.
#2094
>>2093
А уже и не надо: оказывается, глупое люа не позволяет держать ключи в таблицах строками, { \'a\' = \'test\' } => синтакс эррор.
#2095
>>2094
Чини разметку, кстати, я кавычки не экранировал.
#2096
>>2094
Они и без кавычек получаются строками. Если нужно взять ключ из переменной, юзай
table[key] = value
#2097
>>2096
» lua
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> a={}
> a["b c d"] = "e"
> print(a["b c d"])
e
#2098
>>2071
>ставишь ему выравнивание по центру
Не ставится. Где писать алайн сентер и какой из тысячи лэйаутов мне нужен на первом уровне вложенности а какой на втором? И почему часть из них работает везде, а другая только со второго уровня вложенности в массив, передаваемый в сетап? Без документации тяжело.
#2099
>>2097
Пошёл бы ты нахуй со своей остротой, клоун.
table = {
ключ = 1448,
другойключ = 1337,
sosixyi = 777,
[тут ещё тыща таких же ключей...]
}

for key, val in pairs(table) do function(key, val)
#2100
>>2096
Нет, нужно перебрать их через цикл. У меня гигантская таблица с гигантскими уровнями вложенности, присваивать там что-то отдельно извне - проще будет переделать нахуй под обычный массив с индексами (что я и сделал). В похапе, жс и где угодно ещё это не представляет трудностей, только не в уёбищном люа.
#2101
>>2098
> Где писать алайн сентер
В разных версиях по-разному. В 4.0, где только-только завезли declarative layout system, у меня вообще это не получилось, пришлось обновляться до 4.2, где завезли wibox.container.place.
#2103
>>2101
4.2. Спасибо, но уже разобрался.
Всё ещё непонятно Как запихать в wibox.container.place несколько виджетов (никак)? Можно ли запихивать контейнеры в контейнеры? Идея: запихать в какой-нибудь .margin два виджета, а уже его, в свою очередь - непосредственно в .place.
>wibox.container.place:set_children (children) Replace the layout children This layout only accept one children, all others will be ignored
Или взять другой контейнер с возможностью выравнивания по краям центру, прнимающий несколько чайлдов, чтобы обойтись без изъёбств. Такой есть?
Если ставить align вместо fixed самой панели, на первом уровне вложенности, то вроде как первый виджет/{блок} слева и последний справа, но второй липнет к первому, в итоге вместо ожидаемого left center right получаем left left right. Задавать им align бесполезно, по-моему даже конфиг падает от такого.
#2104
>>2103
{
  {
    widget1,
    widget2,
    layout = wibox.layout.flex.horizontal -- любой лэйаут на выбор
  },
  layout = wibox.container.place
}

> Если ставить align вместо fixed самой панели, на первом уровне вложенности, то вроде как первый виджет/{блок} слева и последний справа, но второй липнет к первому
Тоже пытался сделать через него. По ходу, его сломали в какой-то из версий до 4.0, либо центровка вообще никогда не работала.
#2105
>>2104
Получилось заставить работать wibox.layout.align. Оказывается, надо было отключить растягивание дочерних виджетов параметром expand = "none".
mywibox.setup{
  nil,
  widget_to_be_centered,
  expand=\'none\',
  layout = wibox.layout.align.horizontal,
}
#2106
>>2104
>>2105
Это какой-то неправильный CSS.
#2107
>>2104
Не любой, с флексом индикатор раскладки клавиатуры пидорасит.

Вопрос по шейпам: как ими рисовать бэкграунды для тегов? Сфокусированных, пустых, etc. Хочу >>2073, но все примеры шейпов в недодокументации имеют вид
gears.shape.rounded_rect(cr, 20, 20, 10)
и я не понимаю, что передавать первым аргументом. Очевидно, cairo.Context(картинка), где картинка - результат вызова cairo.ImageSurface.create( ... ), но откуда эту картинку брать не ебу. Она уже есть или нужно создавать? Что ставить в taglist_shape_focus - контекст или картинку или что-то ещё? Самое логичное, до чего додумался:


------------------ theme.lua ----------------------
. . .
local cairo = require("lgi").cairo
local img = cairo.ImageSurface.create(cairo.Format.ARGB32, 28, 28)
local ctx = cairo.Context(img)

ctx:set_source( gears.color("#ff0000") )
gears.shape.circle(ctx, 20, 20)
ctx:fill()

theme.taglist_shape_focus = img
. . .


Результат - пропадает квадратик слева вверху на сфокусированном теге вместо ожидаемого появления там же закрашенного красного кружочка 20x20. Если написать = "сосихуй" вместо = img - будет то же самое, из чего понятно, что я делаю совсем не то что нужно.
#2108
>>2106
Тогда уж HTML: там представлены не только визуальные параметры, но и сами элементы.

>>2107
На скрине >>2073 сразу несколько примеров же. Четвёртый аргумент awful.widget.taglist() — это аналог того, что передаётся через тему в свойствах theme.taglist_*.
Свойствам theme.taglist_shape_* следует скармливать функции, которые на вход принимают аргументы cr, width, height. В cr передаётся инициализированный cairo context, в котором можно с ходу рисовать.
#2109
>>2108
Так бы и сказал, что нужен каллбэк, принимающий контекст первым аргументом.
#2110
Как разбить эту ебанину на модули, не копируя все либы овса в конфиг дир и не указывая полные /usr/share/blablabla пути до них из модулей?
#2111
>>2110
Смотри содержимое переменной package.path. Там по умолчанию ~/.config/awesome, /etc/xdg/awesome и /usr/share/awesome/lib, так что непонятно, откуда ты взял необходимость прописывания полных путей.
http://lua-users.org/wiki/ModulesTutorial
#2112
Как заставить панели находиться под максимизированными окнами, но поверх всех остальных? С бордерами вроде разобрался, с панелями пока пытаюсь. ontop = true - есть, дальше вот это:

listenAll(client, {\'focus\', \'property::maximized\'}, function(c)
if c.maximized then
c.border_width = 0
forEach(panelsList, function(item) awful.screen.focused()[item].visible = false end) -- здесь
else
c.border_width = beautiful.border_width
forEach(panelsList, function(item) awful.screen.focused()[item].visible = true end) -- и здесь
end
end)

panelsList - глобальный массив с названиями. Очевидно, что при таком раскладе панель прячется на всех тегах, если хотя бы на одном окно максимизировано. Как сделать панель невидимой для конкретного тега? А возможно, есть более здравые решения, чем лапша выше?
#2113
>>2112
> forEach(panelsList, function(item) awful.screen.focused()[item].visible = true end)
Эти штуки надо не на максимайзед, а на фуллскрин, я уже понял, да. Впрочем, проблему это не решает.
#2114
>>2112
> Как заставить панели находиться под максимизированными окнами, но поверх всех остальных?
Только костылями вроде твоего: насколько я понял, панели не могут находиться между окнами.
#2115
У меня так: единственная панель на экране — wibox, ontop = true.
По modkey+w скрывается/возвращается.

Не то, что тебе нужно, но тоже удобно.
#2116
Блядь, пока я не забыл свою охуенную идею, напишу её сюда.

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

Что-то забыл, что-то с проверками остальных тегов. Потом снова само дойдёт.

>По modkey+w скрывается/возвращается.
Это пиздец. Много ручных действий. Хотя может быть и полезнее в некоторых случаях, если например ты увлекаешься игропоносом и в процессе наслаждения очередным калом оф дьюти тебе вдруг понадобилось посмотреть время или загрузку цпу.
#2117
Не нашёл в документации нужных мне эвентов у тегов. Плохо искал или их действительно нет?
#2118
>>2117
doc/api/classes/tag.html#Signals:
> request::select
doc/api/classes/screen.html#Signals:
> tag::history::update
#2119
>>2118
Я догадывался, но не понял, как ими пользоваться.
>request::select
awful.tag.connect_signal( ... ) => бла бла рц.люа ошибка: вы пытаетесь вызвать пустое поле.
тег.connect_signal(\'request::select\', function() ... end) => бла бла рц.люа ошибка: плохой аргумент #2 для коннект сигнал, ожидалась строка, получена функция.
тег.connect_signal(\'request::select\', \'fucking string\', function() ... end) => краш.

Почему, блядь, нельзя было по-человечески сделать эвенты типа focus или blur, почему это говно? Уёбки, блядь.
#2120
>>2119
На втором то же самое, кстати. Что за строку он от меня хочет, блядь? У меня всё ещё огромные трудности с пониманием того, через какую хитро закрученную жопу это работает, но connect_signal же только два аргумента принимает (имя эвента и каллбэк), он специально для тегов и скринов какой-то особенный?
#2121
>>2120
Методы инстансов вызываются как тег:connect_signal() — в этом случае первым аргументом функции идёт инстанс.
#2122
>>2121
Спасибо.
Эта штука с хистори апдейтом срабатывает даже при перезапуске, неплохо. С эвентами тегов разобрались, осталась вторая часть: проверка, есть ли внутри тега фуллскрин-окна. Есть мысли, как сделать нормально? Хотелось бы возможность увидеть детишек конкретного тега, а не всего скрина, так будет проще и меньше лапши.
#2123
Вот ещё такое: как заставить каллбэк удалять самого себя? Типа этого,
button.addEventListener(\'click\', function callback(){
doSomething();
button.removeEventListener(\'click\', callback);
})

только в наших суровых реалиях люа и овсом.
Я уже нашёл disconnect_for_each_screen для скринов, но это не подходит.
#2124
>>2123
Уже не нужно, но знание не помешает.

Тем временем:
https://pst.moe/paste/gxnxac
Что работает криво:
1. Если убить фуллскриннутое окно, панель не появляется обратно. Впрочем, при смене тега она возвращается на место.
2. На момент написания (пять минут назад) я не знал, что в люа есть тернарная запись.
Пока других багов не обнаружено, но это будет переписано, как только будет найдено... а похуй, это не будет переписано.
#2125
>>2124
> тернарная запись
А вообще да, togglePanelVisibility(item, not hasMaximized).
Но это уже косметические детали, конфиг на недоязыке - не то место, где они сильно важны. Работает же.
#2126
> Хотелось бы возможность увидеть детишек конкретного тега
tag:clients()
> как заставить каллбэк удалять самого себя?
signals:disconnect_signal (name, func)
Функцию придётся именовать.
> Если убить фуллскриннутое окно, панель не появляется обратно.
client.connect_signal("unmanage", function(c) if c.fullscreen …
#2127
>>2126
> client.connect_signal("unmanage", function(c) if c.fullscreen …
А то я не пробовал. Не работает оно.

У тебя виджета звука не найдётся? Простенький самый, чтобы выводил громкость мастера в процентах в реальном времени. Уже есть всякая хуйня типа vicious, но документация в ней не идёт в пакете с овсом и искать её мне лень, у них там клаудфлара везде. И по-моему, там всё равно нет из коробки того что мне надо.
#2129
>>2127
Простенького нет, есть функциональный, с управлением разными крутилками: https://www.twitch.tv/traviktox.
Вследствие портирования методом исправления ошибок через все версии овса начиная с 3.2 код выглядит не лучшим образом, но работает, в т.ч. на awesome 4.2 с lua 5.3. Для прикручивания:
local mixer = require("mixer")

clientbuttons(gears.table.join(

awful.button({ }, 11, mixer.up),
awful.button({ }, 12, mixer.down)
)) -- боковые кнопки мыши
globalkeys = gears.table.join(

awful.key({ modkey, }, "a", mixer.up, {description = "Raise volume", group = "multimedia"}),
awful.key({ modkey, }, "z", mixer.down, {description = "Lower volume", group = "multimedia"}),
awful.key({ }, "XF86AudioRaiseVolume", mixer.up, {description = "Raise volume", group = "multimedia"}),
awful.key({ }, "XF86AudioLowerVolume", mixer.down, {description = "Lower volume", group = "multimedia"})
)

Изменение громкости другими микшерами не обрабатывается.
#2130
>>2129
Забыл, ещё на панель надо воткнуть mixer.widget. Желательно в конец, тогда можно крутить громкость колесом швырнув курсор в угол экрана.
#2131
>>2128
Я тоже хочу такой десктоп. Но почему это всё так сложно, нет ни одного решения уровня "накати и вбей пару команд в консоль и настрой под себя с помощью удобных и понятных параметров" без надобности лезть куда-то в дебри дремучих скриптов на луа, выяснять, почему не работает пятый аргумент третьего вызова на пятьдесят третьей строке, качать и собирать какой-то хлам...
#2133
>>2129
Слишком навороченное говно, быстрее будет самому напердолить то что надо, чем вырезать отсюда то, что не надо.

У меня рисуются какие-то уродливые красные рамки в 10 пикселей и с таким же бордер-радиусом, когда флоатинг-окно тащится к границе экрана. Сама фича хороша: не позволяет мне засунуть окно куда-то в самую жопу, из которой его потом проблематично будет достать, но видно, что аппиренс никого не ебал, когда это делали, и теперь я хочу его перекроить. В дефолтном конфиге по данному вопросу абсолютное нихуя, так что оно если не захардкожено, то как минимум использует дефолтные настройки. Как сделать?
#2136
>>2133
Что поделаешь, очень хотелось рулить тембром и переключать выходы звуковухи. Впрочем, ради прикола можно будет попробовать что-то сообразить минимальное.

>>2131
Зато, настроив, можно швырять конфиги на другие машины и прикручивать там минимумом усилий. Надо будет собраться с силами, причесать это дело и выложить архивом.
#2137
Готово.
mysimplemixer = wibox.widget{
  max_value = 100,
  widget = wibox.container.arcchart
}
local function volume(v)
  local fd = io.popen(\'amixer sset Master \' .. v)
  mysimplemixer:set_value(string.match(fd:read(\'*all\'), \'%[(%d+)%%%]\'))
  fd:close()
end

mysimplemixer:buttons(gears.table.join(
  awful.button({ }, 4, function () volume(\'5%+\') end),
  awful.button({ }, 5, function () volume(\'5%-\') end)
))
#2174
>>2137
local mysimplemixer = wibox.widget{
  max_value = 100,
  widget = wibox.container.arcchart
}
mysimplemixer:connect_signal("button::release", function(widget, x, y, button)
  if button ~= 4 and button ~= 5 then return end
  local fd = io.popen("amixer sset Master 5%" .. (button == 4 and "+" or "-"))
  widget:set_value(string.match(fd:read("*all"), "%[(%d+)%%%]"))
  fd:close()
end)
#2176
>>2135
Ссу на пониговно.
#2189
>>2137
Да я давно напердолил что хотел:

local awful = require(\'awful\')
local wibox = require("wibox")

local function getCurrentVolume()
local f = io.popen(os.getenv(\'XDG_CONFIG_HOME\')..\'/awesome/amixerLevel.pl\')
local mixer = f:read("*all")
f:close()

return mixer
end

local contents = wibox.widget.textbox(getCurrentVolume())
local function update()
local c = getCurrentVolume()
contents:set_text(c)
end

local function widget(prefix, postfix, forcedWidth, margins)
return {
{
{
wibox.widget.textbox(prefix), wibox.widget.textbox(\' \'),
contents,
wibox.widget.textbox(postfix),
layout = wibox.layout.fixed.horizontal
},

forced_width = forcedWidth,
layout = wibox.container.margin,
},

layout = wibox.container.margin,
right = margins.right,
left = margins.left
}
end

return { [\'widget\'] = widget, [\'update\'] = update }

Быдлокод, да, ну и похуй. С возложенной на него задачей справляется, а ещё он на люа.
Для регулярок, правда, пришлось писать целый отдельный однострочник, потому что регулярки в люа (как и само люа) - невыносимый понос, а человеческие pcre надо ставить отдельно. Нахуй там процентики вместо бэкслэшей?
Вообще это надо бы всё-таки переписать, потому что сейчас оно умеет создавать сотню одинаковых виджетов показывающих одно и то же и с апдейтом одним и тем же вызовом, а нужен только один. Или хотя бы, блядь, конструктор асинхронных (не нужно). В первом случае возвращать конкретный объект, но я не хочу хардкодить иконки и префиксы постфиксы и тем более не хочу писать понос вида widget[1][2].blabla = blabla четыре раза подряд. Голова слишком болит и/или хочет спать, чтобы сходу сообразить хорошо, а целенаправленно делать хорошо ради конфига в люа мне лень, это не доставляет эстетического удовольствия. Работает и похуй.
Осталось напердолить показ количества {мастер-окон,колонок} для каждого тега. Хотелось бы, конечно, бинарное дерево, как было в bspwm, или ручной преселект геометрии окна оттуда же, но пердолить это долго и нельзя (второе), а больше четырёх тайловых окон на одном теге редко бывает и при таком количестве разница заметна никак.
#2190

2
4
Tab
#2191
>>2189
> С возложенной на него задачей справляется
А как его крутить-то? Он у тебя что, по таймеру обновляется?
> Нахуй там процентики вместо бэкслэшей?
Видимо, чтобы ты не спутал регулярки lua с pcre и прочими видами регулярок. А свои регулярки там чтобы не тянуть зависимости от внешних библиотек (единственная зависимость Lua — ANSI C) и не включать в состав языка громоздкие велосипеды.
> сейчас оно умеет создавать сотню одинаковых виджетов показывающих одно и то же
Посмотри реализацию wibox.widget.textclock.
> Осталось напердолить показ количества {мастер-окон,колонок} для каждого тега.
Интересная идея, подумаю.
#2193
>>2191
>А как его крутить-то?
У меня вот такое вот говно. Наверное, можно сделать красива, но я слепил за три минуты и похуй.
local ds = {\'-\', \'+\'}
local changeVolume = function(direction)
awful.util.spawn("amixer -c 0 set Master 5%" .. direction, false)
soundWidget.update()
end

globalkeys = gears.table.join(globalkeys,
awful.key({}, \'XF86AudioMute\', function()
awful.util.spawn("amixer -c 0 set Master toggle", false)
soundWidget.update()
end)
)

forEach({\'XF86AudioLowerVolume\', \'XF86AudioRaiseVolume\'}, function(item, i)
globalkeys = gears.table.join( globalkeys, awful.key({}, item, function() changeVolume(ds[i]) end) )
end)

Мышкой крутить никак, да. Но мне и не надо, у меня на клавиатуре удобные кнопки справа.

Почему у тебя пробелы не вырезаются? Newfags can't triforce?
Копипаста прямо из редактора дальнейшую обработку перед отправкой поста не проходит. Ctrl+V;Tab;Enter
#2194
>>2193
Т.е. у тебя на каждое изменение громкости запускается amixer для собственно изменения (вывод зачему-то идёт в .xsession-errors), потом запускается перлоскрипт, второй раз запускает amixer и парсит его вывод?
Возьми лучше вариант >>2137, он привинчивается к кнопкам. Разве что мьюта в нём нет.

Кстати, насчёт регулярок:
488K /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.4.0
204K /usr/lib/x86_64-linux-gnu/liblua5.2.so.0.0.0

— libpcre более чем в 2 раза превышает по размеру всю реализацию lua, включающую среди прочего и легковесный аналог регулярок (https://www.lua.org/manual/5.2/manual.html#6.4.1).

> Newfags can't triforce?
Именно.
#2195
>>2194
>вывод зачему-то идёт в .xsession-errors
Не идёт, там только -c (card, которое на самом деле не нужно, поскольку карта одна) и, собственно, сеты. Хотя может и проглядел чего, кажется, я не трогал функции дефолтного конфига за исключением вставки в них soundWidget.update(). Покажи где.
>второй раз запускает amixer и парсит его вывод?
Да, всё так. Я забыл про sset, когда делал это говно, ты очень кстати напомнил.

Как под прыщями спецсимволы набирать? Помню, что надо вводить юникод, но нужно зажимать какую-то комбинацию кнопок, я забыл. Ctrl+Shift на en раскладке из коробки работает только в гномах и хуюнити, то есть она не зарезервирована и я должен сам её сделать. Как сделать?
#2196
>>2195
> Не идёт
Наверно, у тебя stdout графической сессии не перенаправлен в .xsession-errors. Это при её инициализации делается, в /etc/X11/Sessions/Xsession где-нибудь.

> Как под прыщями спецсимволы набирать?
setxkbmap -option compose:ralt
  compose, space, space
less /usr/share/X11/locale/en_US.UTF-8/Compose
#2197
>>2196
>не перенаправлен
Это да. Непонятно, всё же, про какой вывод ты говорил выше, с чего взял, что он идёт в .xsession-errors, и почему тебя это удивило.
#2198
>>2197
> Непонятно, всё же, про какой вывод ты говорил выше
Запусти из терминала amixer с теми параметрами, которые используются у тебя в биндах на клавиши. Меня это не удивило, я счёл это (вывод непонятно куда + потерю полезной информации с дальнейшим её получением повторно) недоработкой.
#2199
>>2198
>с теми параметрами, которые используются у тебя в биндах на клавиши.
-c 0? Других там нет. По-моему, это просто эксплицит указание номера звуковой карты, которую использовать, которое в принципе не нужно, если карта одна, о чём писал выше. Я просто скопипастил как было в дефолтном конфиге и забил хуй.
Остальное поправил, спасибо.
#2205
>>2199
-c 0
> По-моему, это просто эксплицит указание номера звуковой карты
Да, именно.
А вот так:
amixer -q -c 0 set "Auto-Mute Mode" Disabled && amixer -q -c 0 set Speaker unmute
Можно заставить звук выводиться из динамика, когда к ноутбуку подключены наушники. Хрен знает, зачем, но прикольно.
#2419
>>2418
Говно какое-то навороченное. Выёбываться в десктоп-тредах если только.