GUI-диалог для программы scrot
Есть такая "всемирно известная" программа для "фотографирования" экрана или его частей - scrot
Есть и многие другие подобные программы, но это интересна тем, что она:
1. маленькая по размеру и зависимостям
2. присутствует в репозиториях всех маленьких Линуксов
3. имеет достаточное для практики количество ключей
4. легко интегрируется с программами позволяющими реализовать графический интерфейс с пользователем, т.е. окно.
Есть еще одна программа, компактная по коду и зависимостям, также доступная из самых разных репозиториев: gtkdialog
gtkdialog позволяет вызывать его из скриптов bash/sh и иже с ними, и даже из кода написанного на СИ (например gcc & GTK+).
Вот что из этого получилось:
-----------------------------------------
Программа scrot создает файл - снимок экрана в том каталоге, откуда она вызывается.
Включение в код скрипта chooser'а было бы бессмысленным, если бы созданный программой scrot файл не перемещался туда, куда указал пользователь.
Help смотри в конце поста, или еще проще: scrot --help
Но команда перемещения, указанная в help'е scrot вида:
scrot operation.png -e 'mv $f /home/kurt/Desktop/'
работает только из командной строки терминала и не работает из скрипта, если имя файла задает сам scrot.
Поясняю:
1. если задавать имя файла явно, то премещение происходит,
2. если создание имени файла доверить scrot'у, то премещение не происходит,
3. создание имени файла scrot'ом предпочтительно потому, что он включает в него дату и время до секунд - это не создает конфликта имен файлов, если делается более одного снимка за сеанс.
Поэтому процесс создания и перемещения скриншота/скриншотов решается в 2 приема:
scrot "$COMMANDSTRING"
- в этой строке параметры захвата экрана и время задержки снимка
mv `echo *_scrot.png` "$FILE"
- а в этой строке получение имени файла, созданного scrot'ом и адрес, куда переместить этот файл.
Команда нахождения имени файла обязательно берется в обратные (или косые) кавычки - тогда то, что в них интерпретируется именно как КОМАНДА.
Каталог назначения $FILE берется в двойные кавычки на тот случай, если в нем окажется нечто типа <Рабочий стол>, то есть в имени есть пробелы.
Иначе до команды mv дойдет только <стол> и она не сработает.
Таким образом команда mv получает правильное имя файла и правильный каталог назначения.
Нет в компьютерном мире совершенства: если в каталоге со скриптом будут файлы, с окончанием на _scrot.png то перемещения снимка не получится и снимок осядет в этом ТЕКУЩЕМ каталоге.
Значит надо "следить за чистотой рядов".
Если кто-то знает более изящное решение вопроса, с удовольствием поучусь.
#!/bin/bash
## or /bin/sh
funccommand () {
if [ "$COMBOBOX1" == "All" ]; then
COMMAND1="-m"
else COMMAND1="-s"
fi
## !!! Attention: This works in scrot ver. >= 0.8 only !!!
if [ "$COMBOBOX1" == "Window" ]; then
COMMAND1="-u"
fi
COMMAND2="$COMBOBOX2"
COMMANDSTRING="$COMMAND1-b-d $COMMAND2"
##echo "COMMANDSTRING= $COMMANDSTRING"
##echo "COMBOBOX1= $COMBOBOX1"
##echo "COMBOBOX2= $COMBOBOX2"
##echo "FILE= $FILE"
scrot "$COMMANDSTRING"
mv `echo *_scrot.png` "$FILE"
}
export MAIN_DIALOG="
<window>
<vbox>
<text>
<label>SCReenshOT screen-grabber</label>
</text>
<frame Command button EXIT>
<hbox>
<button cancel></button>
</hbox>
</frame>
<frame User-settings>
<hbox>
<vbox>
<text>
<label>Select grab-mode</label>
</text>
<combobox>
<variable>COMBOBOX1</variable>
<item>All</item>
<item>Window</item>
<item>Area</item>
<action>save:COMBOBOX1</action>
</combobox>
</vbox>
<vbox>
<text>
<label>Time-delay-sec</label>
</text>
<combobox>
<variable>COMBOBOX2</variable>
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>5</item>
<item>10</item>
<item>20</item>
<action>save:COMBOBOX2</action>
</combobox>
</vbox>
<button>
<label>ACCEPT</label>
<action>$0 func</action>
</button>
</hbox>
</frame>
<frame Select DIR for save screenshot>
<chooser>
<height>200</height>
<width>200</width>
<variable>FILE</variable>
<default>/home/</default>
<action>save:FILE</action>
<action>$2= $FILE</action>
</chooser>
</frame>
</vbox>
</window>
"
case $1 in
func) funccommand $2 ;;
*) gtkdialog --program=MAIN_DIALOG ;;
esacСсылки по теме:
http://ru.wikibooks.org/wiki/UNIX
http://en.wikipedia.org/wiki/Scrot
http://linuxandfriends.com/2008/10/25/t … ith-scrot/
http://www.itnewb.com/tutorial/Using-Sc … -for-Linux
P.S. Закомментированные строки вида: ##echo ... ...
были нужны только для отладки, их можно смело удалить.
В строке mv `echo *_scrot.png` "$FILE" обязательно заключается в одинарные обратные (или косые) кавычки echo *_scrot.png.
Это буква Ё - но в латинской раскладке
обратите на это внимание, то есть: ОБРАТНАЯ_КАВЫЧКАecho *_scrot.pngОБРАТНАЯ_КАВЫЧКА
