Журнал LinuxFormat - перейти на главную

LXF98:KDE

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: ==<font color=darkred>KDE:</font> Галерея на рабочем столе== ''Маэстро '''Дэвид Фили''' покажет, как легко превратить ва...)
 
м (восстановление кавычек в коде AWB)
 
(не показаны 10 промежуточных версий 1 участника)
Строка 9: Строка 9:
 
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:
 
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:
  
*Смену обоев, перемещением вперед/назад по списку изображений.
+
#Смену обоев, перемещением вперед/назад по списку изображений.
 
+
#Вывод всплывающей информации по конкретной картинке.
*Вывод всплывающей информации по конкретной картинке.
+
#Добавление / редактирование / сохранение этой информации.
 
+
#Переключение между категориями изображений.
*Добавление / редактирование / сохранение этой информации.
+
*Переключение между категориями изображений.
+
  
 
В большинстве случаев мы постараемся делать это прямо из командной строки, а в завершение сведем все вместе в один скрипт. Итак, откройте командную строку терминала, и вперед, к созданию шедевра! Сперва создадим каталог для хранения изображений:
 
В большинстве случаев мы постараемся делать это прямо из командной строки, а в завершение сведем все вместе в один скрипт. Итак, откройте командную строку терминала, и вперед, к созданию шедевра! Сперва создадим каталог для хранения изображений:
Строка 27: Строка 25:
 
  2
 
  2
  
Вывод гласит, что в данный момент я на Рабочем столе 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:
+
Вывод гласит, что в данный момент я на <font color=darkblue>Рабочем столе</font> 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:
  
 
  $ dcop kdesktop KBackgroundIface currentWallpaper 2
 
  $ dcop kdesktop KBackgroundIface currentWallpaper 2
Строка 34: Строка 32:
 
Имеем путь и имя файла фонового изображения. Если мы хотим двигаться взад-вперед по списку изображений, надо где-то хранить этот список, чтобы мы могли:
 
Имеем путь и имя файла фонового изображения. Если мы хотим двигаться взад-вперед по списку изображений, надо где-то хранить этот список, чтобы мы могли:
  
*выяснить, где именно мы сейчас находимся в этом списке, и
+
#выяснить, где именно мы сейчас находимся в этом списке, и
 
+
#перейти к следующему или предыдущему изображению, когда захочется пользователю.
*перейти к следующему или предыдущему изображению, когда захочется пользователю.
+
  
 
Создадим список изображений:
 
Создадим список изображений:
Строка 42: Строка 39:
 
  $ ls ~/BackgroundArt/* > ~/BackgroundArt/.index.txt
 
  $ ls ~/BackgroundArt/* > ~/BackgroundArt/.index.txt
  
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды ls в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:
+
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды <font color=darkred>ls</font> в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:
  
 
  $ more ~/BackgroundArt/.index.txt
 
  $ more ~/BackgroundArt/.index.txt
 
  /home/dave/BackgroundArt/Botticelli-Venus.jpg
 
  /home/dave/BackgroundArt/Botticelli-Venus.jpg
 
  /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg
 
  /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg
  /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_
+
  /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg
baptist.jpg
+
 
  /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
 
  /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
  /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.
+
  /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg
jpg
+
 
  /home/dave/BackgroundArt/caravaggio-st_thomas.jpg
 
  /home/dave/BackgroundArt/caravaggio-st_thomas.jpg
 
  /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg
 
  /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg
  
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду grep. Применение флажка -n добавит номер строки в вывод, показывающий позицию текущего изображения в файле.
+
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду <font color=darkred>grep</font>. Применение флажка <font color=darkred>-n </font>добавит номер строки в вывод, показывающий позицию текущего изображения в файле.
  
  grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/
+
  grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt
BackgroundArt/.index.txt
+
 
  4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
 
  4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
  
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду cut, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – |, обычно он находится в верхнем регистре (т.е. получается при нажатом Shift) над клавишей Enter:
+
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду <font color=darkred>cut</font>, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – <font color=darkred>|</font>, обычно он находится в верхнем регистре (т.е. получается при нажатом <font color=darkblue>Shift</font>) над клавишей <font color=darkblue>Enter</font>:
  
  $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/
+
  $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d':' -f1
BackgroundArt/.index.txt | cut -d’:-f1
+
 
  4
 
  4
  
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд head и tail:
+
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд <font color=darkred>head</font> и <font color=darkred>tail</font>:
  
 
  $ head -5 ~/BackgroundArt/.index.txt | tail -1
 
  $ head -5 ~/BackgroundArt/.index.txt | tail -1
 
  /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg
 
  /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg
  
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды wc; перенаправив ее в cut, выделим необходимую информацию (число строк).
+
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды <font color=darkred>wc</font>; перенаправив ее в <font color=darkred>cut</font>, выделим необходимую информацию (число строк).
  
  $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1
+
  $ wc -l ~/BackgroundArt/.index.txt | cut -d ' ' -f 1
 
  9
 
  9
  
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова dcop:
+
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова <font color=darkred>dcop</font>:
  
  $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/
+
  $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4
BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4
+
  
 
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы
 
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы
Строка 87: Строка 79:
 
===Вспомнить то время...===
 
===Вспомнить то время...===
  
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл MonaLisa.jpg; давайте хранить заметки по его поводу в файле MonaLisa.jpg.txt, и держать все файлы в одном месте, разместив их в подкаталоге info каталога BackgroundArt. Префикс «точка» опять-таки позволит .info не попадать в список изображений по команде ls.
+
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде <font color=darkred>ls</font>.
  
 
  $ mkdir ~/BackgroundArt/.info
 
  $ mkdir ~/BackgroundArt/.info
  $ echo “Artist: Caravaggio, blah blah” > /home/dave/BackgroundArt/.info/
+
  $ echo "Artist: Caravaggio, blah blah" > /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt
Caravaggio-Emmaus.jpg.txt
+
  
Для показа всплывающих сообщений над фоновыми картинками используем утилиту kdialog, имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.
+
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.
  
  $ kdialog --passivepopup “Немного интересной информации” 60
+
  $ kdialog --passivepopup "Немного интересной информации" 60
  
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в info-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.
+
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.
  
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь kdialog:
+
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':
  
  $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода”
+
  $ kdialog --textinputbox "Это заголовок" "Немного интересных фактов для ввода"
  
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в kdialog.
+
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.
  
Возвращаемое kdialog значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.
+
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.
  
 
===А теперь все вместе===
 
===А теперь все вместе===
  
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт wallpaper. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.
+
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт <font color=darkred>wallpaper</font>. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.
  
 
Скрипт будет вызываться следующим образом:
 
Скрипт будет вызываться следующим образом:
Строка 115: Строка 106:
 
  wallpaper < флажки опций >
 
  wallpaper < флажки опций >
  
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. <флажок опции> может быть таким:
+
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. <font color=darkred><флажок опции></font> может быть таким:
  
*-p перейти к предыдущему изображению.
+
#<font color=darkred>-p</font> перейти к предыдущему изображению.
*-i показать всплывающее окно с информацией о текущем изображении.
+
#<font color=darkred>-i</font> показать всплывающее окно с информацией о текущем изображении.
*-e отобразить окно Редактировать для текущего изображения.
+
#<font color=darkred>-e</font> отобразить окно Редактировать для текущего изображения.
*-h показать справку.
+
#<font color=darkred>-h</font> показать справку.
  
 
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.
 
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.
  
Применим полезный модуль Perl Getopt::Std для обработки параметров, передаваемых в скрипт. В строке
+
Применим полезный модуль <font color=darkred>Perl Getopt::Std</font> для обработки параметров, передаваемых в скрипт. В строке
 
   
 
   
  getopts(‘pieh’, \my %opts);
+
  getopts('pieh', \my %opts);
  
мы перечисляем разрешенные флажки и сохраняем их значения в переменной %opts для дальнейшего использования.
+
мы перечисляем разрешенные флажки и сохраняем их значения в переменной <font color=darkred>%opts</font> для дальнейшего использования.
  
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия Info() и Edit() аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:
+
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия <font color=darkred>Info()</font> и <font color=darkred>Edit()</font> аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:
  
 
  my $infofile = getInfoFile($currentImage);
 
  my $infofile = getInfoFile($currentImage);
  
Подпрограмма getInfoFile использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg процедура вернет следующий путь к ассоциированному информационному файлу:
+
Подпрограмма <font color=darkred>getInfoFile</font> использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения
 +
 
 +
/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
 +
 
 +
процедура вернет следующий путь к ассоциированному информационному файлу:
  
 
  /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt
 
  /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt
  
Процедура getInfoFile делает это с помощью регулярного выражения
+
Процедура <font color=darkred>getInfoFile</font> делает это с помощью регулярного выражения
  
 
  $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;
 
  $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;
  
Определив имя infofile, процедуры readFile и writeFile позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).
+
Определив имя <font color=darkred>infofile</font>, процедуры <font color=darkred>readFile</font> и <font color=darkred>writeFile</font> позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).
  
 
===Горячие клавиши===
 
===Горячие клавиши===
  
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому Alt+B для меня будет означать группу операций над обоями, а Alt+B в сочетании с еще одной клавишей уже выполнят конкретное действие: например, Alt+B,N выведет следующее изображение, а Alt+B,P вернет нас к предыдущему.
+
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому <font color=darkblue>Alt+B</font> для меня будет означать группу операций над обоями, а <font color=darkblue>Alt+B</font> в сочетании с еще одной клавишей уже выполнят конкретное действие: например, <font color=darkblue>Alt+B,N</font> выведет следующее изображение, а <font color=darkblue>Alt+B,P</font> вернет нас к предыдущему.
  
В порядке иллюстрации создадим одну такую комбинацию. В Input Actions [Ввод] KDE (обычно расположенном в меню Regional and Accessibilty [Региональные настройки и специальные возможности] в KDE Control Center [Центр управления KDE]), создайте новую группу ‘Wallpaper Actions’. Нажмите на группу и создайте новое действие. Назовите его WallpaperNext, установите тип действия Action > Command(url) [Комбинация клавиш -> команда/URL]. Установите комбинацию клавиш (многоклавишный режим) Alt+B,N, и параметры команды /home/dave/bin/wallpaper (или путь, где вы сохранили свой скрипт). Нажмите ОК, и пробуйте. Нажатие Alt+B,N должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.
+
В порядке иллюстрации создадим одну такую комбинацию. В <font color=darkblue>Input Actions [Ввод]</font> KDE (обычно расположенном в меню <font color=darkblue>Regional and Accessibilty [Региональные настройки и специальные возможности]</font> в <font color=darkblue>KDE Control Center [Центр управления KDE]</font>), создайте новую группу <font color=darkblue>'Wallpaper Actions'</font>. Нажмите на группу и создайте новое действие. Назовите его <font color=darkblue>WallpaperNext</font>, установите тип действия <font color=darkblue>Action > Command(url)</font> [<font color=darkblue>Комбинация клавиш -> команда/URL</font>]. Установите комбинацию клавиш (многоклавишный режим) <font color=darkblue>Alt+B,N</font>, и параметры команды <font color=darkblue>/home/dave/bin/wallpaper</font> (или путь, где вы сохранили свой скрипт). Нажмите <font color=darkblue>ОК</font>, и пробуйте. Нажатие <font color=darkblue>Alt+B,N</font> должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.
  
 
===Примочки===
 
===Примочки===
  
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание cron, чтобы это происходило раз в день:
+
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:
  
 
  crontab -e
 
  crontab -e
 
  05 12 * * * ls /home/dave/BackgroundArt/* > /home/dave/BackgroundArt/.index.txt
 
  05 12 * * * ls /home/dave/BackgroundArt/* > /home/dave/BackgroundArt/.index.txt
  
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, Art. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.
+
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, <font color=darkblue>Art</font>. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.
 +
 
 +
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию <font color=darkred>–combobox</font> утилиты ''kdialog''). Также
 +
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.
 +
 
 +
==Врезки==
 +
 
 +
===Горячие клавиши===
 +
 
 +
====Смена изображений====
 +
 
 +
{| align=center border=1
 +
|<center><font color=darkred>Горячие клавиши</font></center>
 +
|<center><font color=darkred>Действие</font></center>
 +
|<center><font color=darkred>Команда</font></center>
 +
|-
 +
|<center>ALT-B, N</center>
 +
|Перейти к следующему изображению
 +
|wallpaper
 +
|-
 +
|<center>ALT-B, P</center>
 +
|Перейти к предыдущему изображению
 +
|walpaper -p
 +
|-
 +
|<center>ALT-B, I</center>
 +
|Отобразить информацию о текущем изображении
 +
|wallpaper -e
 +
|-
 +
|<center>ALT-B, E</center>
 +
|Изменить информацию о текущем изображении
 +
|wallpaper -e
 +
|}
 +
 
 +
====Навигация====
  
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию –combobox утилиты kdialog). Также
+
{| align=center border=1
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через cron и изменять фон ежедневно.
+
|<center><font color=darkred>Горячие клавиши</font></center>
 +
|<center><font color=darkred>Действие</font></center>
 +
|<center><font color=darkred>Команда</font></center>
 +
|-
 +
|<center>ALT-B, A</center>
 +
|Переход к категории Art
 +
|wallpaper -c Art
 +
|-
 +
|<center>ALT-B, H</center>
 +
|Переход к категории Holiday
 +
|walpaper -c Holiday
 +
|-
 +
|<center>ALT-B, M</center>
 +
|Переход к категории Movie
 +
|wallpaper -c Movie
 +
|}

Текущая версия на 17:47, 27 апреля 2008

Содержание

[править] KDE: Галерея на рабочем столе

Маэстро Дэвид Фили покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.

Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.

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

В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:

  1. Смену обоев, перемещением вперед/назад по списку изображений.
  2. Вывод всплывающей информации по конкретной картинке.
  3. Добавление / редактирование / сохранение этой информации.
  4. Переключение между категориями изображений.

В большинстве случаев мы постараемся делать это прямо из командной строки, а в завершение сведем все вместе в один скрипт. Итак, откройте командную строку терминала, и вперед, к созданию шедевра! Сперва создадим каталог для хранения изображений:

$ mkdir ~/BackgroundArt

и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.

В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:

$ dcop kwin KWinInterface currentDesktop
2

Вывод гласит, что в данный момент я на Рабочем столе 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:

$ dcop kdesktop KBackgroundIface currentWallpaper 2
/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg

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

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

Создадим список изображений:

$ ls ~/BackgroundArt/* > ~/BackgroundArt/.index.txt

Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды ls в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:

$ more ~/BackgroundArt/.index.txt
/home/dave/BackgroundArt/Botticelli-Venus.jpg
/home/dave/BackgroundArt/Caravaggio-David_goliath.jpg
/home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg
/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg
/home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg
/home/dave/BackgroundArt/caravaggio-st_thomas.jpg
/home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg

Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду grep. Применение флажка -n добавит номер строки в вывод, показывающий позицию текущего изображения в файле.

grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt
4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg

Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду cut, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – |, обычно он находится в верхнем регистре (т.е. получается при нажатом Shift) над клавишей Enter:

$ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d':' -f1
4

Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд head и tail:

$ head -5 ~/BackgroundArt/.index.txt | tail -1
/home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg

Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды wc; перенаправив ее в cut, выделим необходимую информацию (число строк).

$ wc -l ~/BackgroundArt/.index.txt | cut -d ' ' -f 1
9

Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова dcop:

$ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4

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

[править] Вспомнить то время...

Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл MonaLisa.jpg; давайте хранить заметки по его поводу в файле MonaLisa.jpg.txt, и держать все файлы в одном месте, разместив их в подкаталоге info каталога BackgroundArt. Префикс «точка» опять-таки позволит .info не попадать в список изображений по команде ls.

$ mkdir ~/BackgroundArt/.info
$ echo "Artist: Caravaggio, blah blah" > /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt

Для показа всплывающих сообщений над фоновыми картинками используем утилиту kdialog, имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.

$ kdialog --passivepopup "Немного интересной информации" 60

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

Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь kdialog:

$ kdialog --textinputbox "Это заголовок" "Немного интересных фактов для ввода" 

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

Возвращаемое kdialog значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.

[править] А теперь все вместе

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

Скрипт будет вызываться следующим образом:

wallpaper < флажки опций >

Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. <флажок опции> может быть таким:

  1. -p перейти к предыдущему изображению.
  2. -i показать всплывающее окно с информацией о текущем изображении.
  3. -e отобразить окно Редактировать для текущего изображения.
  4. -h показать справку.

Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.

Применим полезный модуль Perl Getopt::Std для обработки параметров, передаваемых в скрипт. В строке

getopts('pieh', \my %opts);

мы перечисляем разрешенные флажки и сохраняем их значения в переменной %opts для дальнейшего использования.

Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия Info() и Edit() аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:

my $infofile = getInfoFile($currentImage);

Подпрограмма getInfoFile использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения

/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg

процедура вернет следующий путь к ассоциированному информационному файлу:

/home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt

Процедура getInfoFile делает это с помощью регулярного выражения

$infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;

Определив имя infofile, процедуры readFile и writeFile позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).

[править] Горячие клавиши

Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому Alt+B для меня будет означать группу операций над обоями, а Alt+B в сочетании с еще одной клавишей уже выполнят конкретное действие: например, Alt+B,N выведет следующее изображение, а Alt+B,P вернет нас к предыдущему.

В порядке иллюстрации создадим одну такую комбинацию. В Input Actions [Ввод] KDE (обычно расположенном в меню Regional and Accessibilty [Региональные настройки и специальные возможности] в KDE Control Center [Центр управления KDE]), создайте новую группу 'Wallpaper Actions'. Нажмите на группу и создайте новое действие. Назовите его WallpaperNext, установите тип действия Action > Command(url) [Комбинация клавиш -> команда/URL]. Установите комбинацию клавиш (многоклавишный режим) Alt+B,N, и параметры команды /home/dave/bin/wallpaper (или путь, где вы сохранили свой скрипт). Нажмите ОК, и пробуйте. Нажатие Alt+B,N должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.

[править] Примочки

Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание cron, чтобы это происходило раз в день:

crontab -e
05 12 * * * ls /home/dave/BackgroundArt/* > /home/dave/BackgroundArt/.index.txt

Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, Art. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.

Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию –combobox утилиты kdialog). Также можно случайным образом выбирать картину из галереи. Это можно автоматизировать через cron и изменять фон ежедневно.

[править] Врезки

[править] Горячие клавиши

[править] Смена изображений

Горячие клавиши
Действие
Команда
ALT-B, N
Перейти к следующему изображению wallpaper
ALT-B, P
Перейти к предыдущему изображению walpaper -p
ALT-B, I
Отобразить информацию о текущем изображении wallpaper -e
ALT-B, E
Изменить информацию о текущем изображении wallpaper -e

[править] Навигация

Горячие клавиши
Действие
Команда
ALT-B, A
Переход к категории Art wallpaper -c Art
ALT-B, H
Переход к категории Holiday walpaper -c Holiday
ALT-B, M
Переход к категории Movie wallpaper -c Movie
Персональные инструменты
купить
подписаться
Яндекс.Метрика