простенький пример индикатора прогресса:
#! /bin/bash
COUNTER=0
element_count=400
echo "log" > /tmp/yad-log.txt
while [[ "$COUNTER" -lt "$element_count" ]]; do
let COUNTER=COUNTER+1
let "perc=100*COUNTER/element_count"
sleep 0.002
echo $perc"%"
done | tee -a /tmp/yad-log.txt | \
yad --progress --image=gtk-execute --title="Выполнение сценария...." \
--width 500 --height 50 --auto-close --sticky --text="...." \
--center --no-buttons
Нельзя вывести кнопку с произвольной надписью и значком. Только из gtk-* набора.
Зато --geometry работает без сюрпризов ( в отличие от gtkdialog)
Для простых задач хорош. Для сложных gtkdialog вне конкуренции
131202
Вышла в.0.24.1. Добавлено
> --image-path=PATH Add path for search icons by name
128a130] --no-click Disable clickable column headers[/quote]
147a150,151 --auto-close Dismiss the dialog when 100% of all bars has been reached --auto-kill
В трее панели задач по прежнему не появляется
Пропатчил OK<->Cancel и скомпилил yad 0.33 - в шапке
Как скомпилить с ключом --enablr-html и что это даст не понял
Изменения (http://sourceforge.net/p/yad-dialog/code/HEAD/tree/trunk/NEWS)
Со старым не работал http://sourceforge.net/p/yad-dialog/wiki/FindFrontend/
Новые ключи
--help-paned Показывать параметры диалога с панелями
--help-picture Показывать параметры диалога отображения картинки
--help-filter Показывать параметры фильтров диалога выбора файлов
Пока пользы в них не нашел
Добавил в шапку yad-0.33.0_64.pfs
дописывать можно просто через стандартный ввод
Кстати, придумал пример с постоянным изменением данных:
while :
do
date
date -u
sleep 1
done | yad --list --width=400 --height=150 \
--column=a --column=b --limit=2 --print-all
Принцип в том, чтобы ограничить число строк, тогда новые данные просто вытесняют старые.
Еще пример для --form
while :
do
date
date -u
sleep 1
done | yad --form --cycle-read --field="местное время":RO --field="время UTC":RO
Но этот работает только на 33 версии yad, pfs в шапке темы есть.
Также в мануале 33 версии написано, что если в --form используется --field="надпись":FBTN '@команда'
то вывод команды разбирается и строки, начинающиеся с цифры, подставляются как значения соответствующих номеру --field
Это пока не пробовал.
По примерам - а как выйти из этого бесконечного цикла?
Да никак, я просто по ^C убивал. Это же только чтобы показать, как в yad можно окно не закрывая обновить.
Пример с обновлением полей формы запуском команды с кнопки
yad --width=300 --height=150 --form \
--field='местное':RO 'пусто' \
--field='UTC':RO 'тоже пусто' \
--field='gtk-refresh':FBTN '@bash -c "echo \"1:$(date)\"; echo \"2:$(date -u)\""'
Но тут кнопку каждый раз нажимать надо.
Я вот так боролся:
qp="file:///home/igor/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/%D0%AF%20%D0%BF%D0%BB%D1%8E%D1%8E%20%D0%BD%D0%B0%20%D0%B2%D0%B0%D1%88%D0%B8%20%D0%BC%D0%BE%D0%B3%D0%B8%D0%BB%D1%8B.jpg"
echo "$qp" |sed 's|%\([[:xdigit:]]\{2\}\)|\\\\x\1|g' |while read s; do echo -e "$s"; done
Не уверен, что это лучший метод, наверняка есть куча программ, конвертирующих quoted-printable, но по крайней мере
быстро делается и работает.
Принцип такой. sed своим страшным выражением преобразует всякие '%D0' в '\\xD0', потом read s их читает (при этом в s заносится уже '\xD0'), а такое выражение echo -e уже может вывести в виде символа. while там на случай, если на входе будет не одна строка, а несколько.
ПРА64 не работают оба варианта. Это новая фича в yad 0.33.1 ?
# yad --version
0.33.0 (GTK+ 2.24.28)
Из мануала:
--sep-column=NUMBER
Set the row separator column. If the cell value from this column equal to
specified row separator value such row will be draw as separator.
Separator value must be set.
--sep-value=TEXT
Set the TEXT as a row separator value. This feature highly depends on
your current GTK+ theme and may not work properly.
Пример:
echo 'aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
'|yad --list --width=150 --height=150 \
--column=a --column=b --column=c \
--sep-column=1 --sep-value="ddd"
Как видите, по идее там должно быть три строки, но поскольку в первой колонке второй строки значение совпало с sep-value, эта строка превратилась в сепаратор.
Работает только на 0.33, для чего можно применить, не знаю.
Вот еще вопрос, куда подевалась переменная $Y
#!/bin/bash
for X in 10 20 30 40 50 60 70 80 90 100
do
echo $X%
Y=$[$Y+1]
sleep 1
done | yad --progress
echo $Y
но если без " yad --progress" то все нормально
и еще, можно ли как нибудь сделать чтоб и " yad --progress" бало видно и исполнение скрипта
"echo $X% "
Пока копаюсь в сторону "tee"
Вот еще вопрос, куда подевалась переменная $Y
Это известный прикол, в мануале на bash ясно сказано, что конвейеры выполняются в подоболочке, то есть все переменные в них получаются локальными - конвейер закончился, они и пропали. Соответственно, использовать их можно только до выхода из конвейера. Например:
#!/bin/bash
{ for X in 10 20 30 40 50 60 70 80 90 100
do
echo $X%
echo $X% >&2
Y=$[$Y+1]
sleep 1
done
echo $Y >&2; } | yad --progress
Цикл вместе с последующим выводом Y заключен в блок, стандартный вывод блока перенаправлен в yad, а вывод Y делается в stderr, туда же можно отправить и копию X.
Экспортировать бесполезно, она все равно останется локальной.
Что вообще значит "экспорт переменной"? У каждого запущенного процесса есть свой набор переменных окружения. Запускаем мы из скрипта какую-нибудь программу - этой программе будет передана область памяти с копиями всех экспортированных переменных.
А что значит "выполняется в подоболочке"? Да почти то же самое. Запускается еще несколько экземпляров bash, и уже они выполняют каждый свою команду из конвейера. Но поскольку тут явного вызова нет, (fork без exec) то ему достаются копии всех переменных, не только экспортированных. Но именно копии переменных! Как только подоболочка завершилась, эти копии в любом случае потеряются.
А почему так делается? Да потому что для перенаправления вывода одной команды на ввод другой они должны выполняться одновременно, то есть выполняться они будут двумя разными копиями bash - подоболочками.
В вашем примере, запустил bash скрипт, а там сразу перенаправление. Тут же запустились еще две копии bash, первая пошла выполнять цикл, а вторая yad. Но после того, как подоболочка, выполняющая цикл, завершилась, все ее переменные, разумеется, пропали. Существуют они только до " | ", поэтому, когда я поставил echo $Y >&2 до " | ", то Y вывелся.
То есть, нужно сделать так, чтобы все использование переменной Y происходило в одной подоболочке, до перенаправления вывода конвейером.
Или есть еще такой метод (возможно, не во всех версиях сработает, у меня работает нормально):
#!/bin/bash
exec 3> >(yad --progress)
Y=0
for X in 10 20 30 40 50 60 70 80 90 100.
do
echo $X% >&3
Y=$[$Y+1]
sleep 1
done
echo Y=$Y
exec 3> >(yad --progress) означает "открыть в текущем интерпретаторе дескриптор 3 на запись и перенаправить его в отдельно запущенный процесс yad, где он будет стандартным вводом"
Довольно мудрено выглядит, но зато позволяет избавиться от конвейера, в результате все остальное будет выполняться в текущей оболочке и переменные не потеряются. Все, что нужно отправить в yad в этом случае надо писать в 3 дескриптор: echo $X% >&3
yad --notification --text="test" --command="gedit"
нужно при клике лкм запустить программу "gedit" и закрыть диалог оповещения "иконку в трее"
добавить нужно kill $YAD_PID
но лучше это дело оформить функцией и дергать уже ее, т.к. gedit надо запускать в фоне.
#! /bin/bash
function run_gedit {
gedit &
sleep 0.5
kill -USR1 $YAD_PID
}
export -f run_gedit
yad --notification --command='bash -c run_gedit'
Это ответ автора ↑
себе сделал без вызова функции:
yad --notification --text="test" --command='bash -c "gedit & kill $YAD_PID"'
в вики (http://wiki.puppyrus.org/programming/yad?&#%D0%B7%D0%BD%D0%B0%D1%87%D0%BE%D0%BA_%D0%B2_%D1%82%D1%80%D0%B5%D0%B5_%D1%81_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%BE%D0%BC_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B)
Pro, а если так?
... | tr '\b' '\n' | sed '/%/!d' | ...
Обновился до yad 4.1 Теперь только gtk3.22
В pra09 пытался использовать - на кнопках не работает
Т.е. вместо вывода иконки и текста "Добавить" - только текст gtk-add
Похоже фича , а не глюк
gtk stock items not used anymore. instead there are some yad predefined names. details can be found in man page (https://github.com/v1cont/yad/blob/master/NEWS)
-button=IBUTTON:IDP
Add the dialog button. May be used multiple times. IIDP is an exit code or a command.
\fIBUTTON\fP may be a yad stock item name for predefined buttons (like yad-close or yad-ok) or text in a form
\fILABEL[!ICON[!TOOLTIP]]\fP where `!' is an item separator.
Т.е. теперь надо вместо gtk-add - yad-add
yad-about@About@help-about
yad-add@Add@list-add
yad-apply@Apply@gtk-apply
yad-cancel@Cancel@gtk-cancel
yad-clear@Clear@document-clear
yad-close@Close@window-close
yad-edit@Edit@gtk-edit
yad-execute@Execute@system-run
yad-no@No@gtk-no
yad-ok@OK@gtk-ok
yad-open@Open@document-open
yad-print@Print@document-print
yad-quit@Quit@application-exit
yad-refresh@Refresh@view-refresh
yad-remove@Remove@list-remove
yad-save@Save@document-save
yad-search@Search@system-search
yad-settings@Settings@gtk-preferences
yad-yes@Yes@gtk-yes
По итогу чтения - новое :
--keep-icon-size Не масштабирует значки. Эта опция влияет на значки вне темы значков
Т.к. в gtk2 версии такое не работает - универсально надо писать
yad --button="Добавить!gtk-add"
Переписывать лениво. Пока посижу на 042
yad-gtk2-0.42.1-2-x86_64.pkg.tar.xz (ftp://ftp.yandex.ru/puppyrus/puppyrus-a64/pra64-07/pkg/pra6407extra/yad-gtk2-0.42.1-2-x86_64.pkg.tar.xz)
yad-gtk3-0.42.1-2-x86_64.pkg.tar.xz (ftp://ftp.yandex.ru/puppyrus/puppyrus-a64/pra64-07/pkg/pra6407extra/yad-gtk3-0.42.1-2-x86_64.pkg.tar.xz)
нужно при клике лкм запустить программу "gedit" и закрыть диалог оповещения "иконку в трее"
yad --notification --text="test" --command='bash -c "gedit & kill $YAD_PID"'
Пожалуй, так не совсем корректно
yad --notification --text="test" --command='bash -c "(gedit &) ; kill $YAD_PID"'
Если надо чтобы gedit запустился и yad в трее убился
'bash -c "gedit && kill $YAD_PID"' - чтобы yad в трее убился после закрытия gedit
Добавил в вики (http://wiki.puppyrus.org/programming/yad?&#%D0%B7%D0%BD%D0%B0%D1%87%D0%BE%D0%BA_%D0%B2_%D1%82%D1%80%D0%B5%D0%B5_%D1%81_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%BE%D0%BC_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B)
нигде не задано
$ grep -A4 allow_only_root /usr/local/bin/pfs
allow_only_root() {
if [ "0$UID" -ne 0 ]; then
exitmsg "Only root can run $0" -1
fi
}