LINUX.ORG.RU

fvwm получить размер экрана по горизонтали

 ,


1

1

Не получается никак вживить в конфиг простую переменную. Отдельным скриптом в терминале всё путем, выводит размер экрана по горизонтали, а в самом конфиге .fvwm2rc отказывается работать, сам сабж вот:

PipeRead "echo SetEnv getresolutionx $(xrandr | grep -Po '\d+(?=\s*x.*\*.*)' | head -n 1 | tail -n 1)"
пробовал экранировать, всё равно ничего не возвращает... знающие люди ткните куда копать?

★★★

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

отдельным скриптом как у тебя работает, а в самом конфиге нет

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

эта строка пробегает по ширине каждого монитора и возвращает ширину например первого в переменную getresolutionx

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

ткни если знаешь в конкретную опцию, как получить ширину экрана второго или третьего монитора, может я правда занимаюсь велосипедами

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

смотри если в терминале попробуешь:

xrandr | grep -Po '\d+(?=\s*x.*\*.*)' | head -n 1 | tail -n 1
то получишь ширину первого монитора

xrandr | grep -Po '\d+(?=\s*x.*\*.*)' | head -n 2 | tail -n 1

то получишь ширину второго монитора

Это для fvwmbutton, чтобу вывести его внизу на конкретном мониторе во всю ширину. Если как у тебя:

xdpyinfo | awk '/dimensions/ {sub(/x.*/, "", $2); print $2}'
то мы получаем суммарную для всех мониторов ширину, это не совсем то что нужно

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

Да несколько, я не сказал с самого начала. Поэтому и попросил помощи, с одним монитором всё просто. Универсальный fvwmbutton решил сделать, если один монитор то панель выводится на первом, если несколько, например если три - то на втором посередине.

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

Не суть важно, условие ведь сам можешь задать куда его выводить. Так можно узнать средствами fvwm на каком мониторе какое разрешение или нет? Я болван или всётаки сторонними, типа этой строки прийдется выцеплять?

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

в случае нескольких мониторов их физическое разрешение средствами самого fvwm ты узнать не сможешь.

почему я упомянул четное количество мониторов - в этом случае нет среднего. куда в этом случае ты собираешься помещать свою панель?

и может проще будет при старте скриптом генерить Geometry для FvwmButton в отдельный файл, и читать его через *FvwmButtons: File

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

Спасибо, хоть однозначно получил ответ на вопрос, что не лисапедю.

при старте скриптом генерить Geometry для FvwmButton

Да, так можно, НО есть xrdp и подобные. Там в отдельной сессии со своим разрешением работаешь и лучше когда оно налету берет параметры и без скидывания в файл и отдельно для каждой сессии.

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

куда в этом случае ты собираешься помещать свою панель?

сделаю вывод на первый монитор

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

Как это правильно экранировать?:

'\d+(?=\s*x.*\*.*)'
Из за этой регулярки не проходит. Я пробовал частями чуть ли не каждый символ в экран \\ взять, но ничего не получается.

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

Даже не из за всей регулярки, а только из за спецсимвола «\». Fvwm не хочет его проталкивать в консоль, даже экранированным.

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

и возможно, вместо пайпа grep | head | tail имеет смысл использовать один awk

ananas ★★★★★ ()

Короче получилось, если интересно вот рабочий код в конфиге fvwm:

PipeRead "echo SetEnv getresolution $(xrandr | awk '/ connected/ {print $$3}' | head -n 2 | tail -n 1 | grep -o '^[^x]*')"

Одним awk знания не дали воспользоваться, не знаю как это сделать. Зато работает и без внешних скриптов, может и тебе пригодится. head -n 2 меняешь и узнаешь на каком мониторе какая ширина.

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

Вот спасибо тебе! попробовал-работает, финальная для конфига:

PipeRead "echo SetEnv getresolution $(xrandr | awk -v 'cnt=0' '/ connected/ {if (cnt == 1) {gsub(\"x.*\",\"\", $$3); print $$3}; cnt++}')"

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

и совсем финальный вариант в конфиге fvwm, который работает как локально так и при подключении xrdp, (т.к. xrand в случае xrdp выводит другую информацию):

PipeRead "echo SetEnv getresolution_local $(sudo xrandr | awk -v 'cna=0' '/ connected/ {if (cna == 1) {gsub(\"x.*\",\"\", $$3); a=$$3; if(a > 100){print a} else {print \"none\"};} cna++;}')"
PipeRead "echo SetEnv getresolution_xrdp $(sudo xrandr | awk -v 'cna=0' '/0/ {if (cna == 0) {gsub(\"x.*\",\"\", $$2); a=$$2; if(a > 100){print a} else {print \"none\"};} cna++;}')"
Test (!EnvMatch getresolution_local "none") PipeRead "echo SetEnv getresolution \"$[getresolution_local]\""
Test (!EnvMatch getresolution_xrdp "none") PipeRead "echo SetEnv getresolution \"$[getresolution_xrdp]\""
я добил его, работает как надо

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

но этот вариант невозможно экранировать в fvwm, он не будет работать в конфиге, я выше писал что из за спецсимвола «\», вся задача сводилась избавиться от него

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

Минуточку, я не убунтоид. И как по твоему запустить это в скрипте fvwm под xrdp, задать права на выполнение xrandr на каждой машине?

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

Я серьёзно спросил. Варианты: например пользователей в группы и каждому задать то что он может запускать. Отдельно для каждого пользователя задать права именно тех программ которые необходимы (если пользователей не много, в моём случае) что такойто такойто может запускать xrandr.

Или какой правильный способ ты предложил бы? Как ты с этим живешь в Slackware? :)

Frost ★★★ ()
Последнее исправление: Frost (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.