Настройка «раздачи» ICQ через Squid.

Задача: разрешить доступ к протоколу ICQ через прокси Squid. Конечно, можно сколько угодно говорить, что «аська» не нужна, а «жаббер» — наше всё и прочее, но тем не менее многим людям требуется (в том числе и мне), поэтому приступаем к решению (от дефолтного конфига).

$ sudo vi /etc/squid/squid.conf

В секции «acl» можно указать всех пользователей, IP которых прописаны в специальном файле:

acl localnet src "/etc/squid/users"

Добавляем в список разрешённых портов стандартный «асечный» порт:

acl ICQ_PORT port 5190

Далее запрещаем подсоединяться к портам, кроме разрешённых:

http_access deny CONNECT !SSL_ports !ICQ_PORT

Ну и разрешаем пользователям использовать прокси:

http_access allow localnet

Всё, перезапускаем squid.

$ sudo /etc/rc.d/squid restart

Переназначение клавиш.

Требуется переназначить в русской раскладке символ «№» на символ «#» из-за ненужности первого (по крайней мере мне). Возникла задача, когда я начал писать коментарии на русском языке к коду на питоне (как известно, они как раз начинаются с символа «диез») и мне поднадоело менять раскладку для набора одного символа. Решение проще, чем может показаться :)

$ sudo vi /usr/share/X11/xkb/symbols/ru

Далее ищем раздел «winkeys» (только если вы используете раскладку «ru(winkeys)»), где в свою очередь ищем строчку с «тройкой», в ней заменяем слово «numerosign» на «numbersign». Всё. Перезапускаем «иксы» и радуемся мелочи :)

P.S. Умные люди, наверное, уже подумали, что можно не ограничиваться этим и создать, к примеру, типографскую или «кодерскую» раскладку.

Powerpill.

Гуляя по официальному форуму, я случайно наткнулся на очень полезную утилиту для pacman’а, написанную одним из трастед-юзеров. Powerpill — враппер, ускоряющий загрузку пакетов, через aria2c.

В принципе, можно все зависимости для установки собирать руками через скачку тарболов с AUR’а и makepkg. Но проще использовать Йогурт.

$ yaourt -S powerpill

Многого тут не скажешь, могу только отметить, что прирост скорости скачки пакетов с зеркал у меня вырос почти в 6 раз (с ~200 kB/s до ~1.1 MB/s).

«Перегон» изображений в чёрно-белый стиль.

Вот сидел ночью читал отфотографированные мной лекции с помощью не самого лучшего фотоаппарата при отвратительнейшем грязно-голубом освещении. Глаза начали лопаться сразу…
Так как информация более-менее контрастна, я решил перегнать все изображения в чёрно-белый стиль (grayscale). Уже было подумал, что можно было бы использовать скрипт для GIMP’а… но тут я опять «открыл» Америку, то есть «ImageMagick». Эта утилита умеет множество извращений над изображениями, но я скромно воспользовался только двумя: «перегоном» и увеличением контраста.

$ convert colorful.jpg -contrast -colorspace Gray blackandwhite.jpg

или, если требуется перегнать множество изображений:

$ mkdir -p blackandwhite
$ for I in $(ls | grep -iG '.jpg$'); do convert $I -contrast -colorspace Gray blackandwhite/$I; done

Тем самым я спас себе глаза, нервы и прочие радости…

Compose.

«Кто владеет информацией — тот владеет миром.» — Уинстон Черчилль.

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

Добавьте в /etc/X11/xorg.conf (или, если вы перешли на новые рельсы, в конфигах HAL) в разделе настройки клавиатуры:

Option "XkbOptions" "grp:caps_toggle,grp_led:caps,compose:menu"

menu — на мой взгляд самая логичная клавиша, так как используется крайне редко, но вы можете забиндить compose, к примеру, на ralt

В принципе, всё готово. Посмотреть готовые комбинации можно в /usr/share/X11/locale/en_US.UTF-8/Compose. Но лично мне такое огромное количество просто не нужно, поэтому я выбрал для себя самые востребованные символы:

$ cat .XCompose
<Multi_key> <bar> <bar>          : "¦" brokenbar
<Multi_key> <exclam> <equal>     : "≠" U2260
<Multi_key> <asciitilde> <equal> : "≈" U2248
<Multi_key> <plus> <minus>       : "±" plusminus
<Multi_key> <x> <x>              : "×" multiply
<Multi_key> <less> <minus>       : "←" U2190
<Multi_key> <minus> <greater>    : "→" U2192
<Multi_key> <less> <greater>     : "↔" U2194
<Multi_key> <less> <equal>       : "≤" U2264
<Multi_key> <greater> <equal>    : "≥" U2265
<Multi_key> <e> <less>           : "∈" U2208
<Multi_key> <exclam> <e> <less>  : "∉" U2209
<Multi_key> <c> <less> <less>    : "⊂" U2282
<Multi_key> <c> <less> <equal>   : "⊆" U2286
<Multi_key> <exclam> <c> <less>  : "⊄" U2284
<Multi_key> <o> <o>              : "°" degree
<Multi_key> <minus> <minus>      : "—" U2014
<Multi_key> <space> <space>      : " " nobreakspace
<Multi_key> <period> <period>    : "…" ellipsis
<Multi_key> <o> <c>              : "©" copyright
<Multi_key> <o> <r>              : "®" registered
<Multi_key> <t> <m>              : "™" U2122
<Multi_key> <less> <less>        : "«" guillemotleft
<Multi_key> <greater> <greater>  : "»" guillemotright
<Multi_key> <s> <o>              : "§" section
<Multi_key> <question> <question>  : "¿" questiondown
<Multi_key> <exclam> <exclam>      : "¡" exclamdown
<Multi_key> <less> <3>             : "♥" U2665 # <3
<Multi_key> <asterisk>             : "★" U2605 # star
<Multi_key> <colon> <parenright>   : "☺" U263A # :)
<Multi_key> <C> <C> <C> <P>        : "☭" U262D # USSR
<Multi_key> <1> : " :)"
<Multi_key> <2> : " :("
<Multi_key> <3> : " ;)"
<Multi_key> <4> : " :|"
<Multi_key> <5> : " :/"
<Multi_key> <6> : " :D"
<Multi_key> <7> : " O.o"

Осталось позволить графическим приложениям использовать compose. Нужно экспотнуть переменную:

$ cat .xinitrc | grep export
export GTK_IM_MODULE=xim

Теперь можно перезапускать «иксы». Как видите, всё очень просто :)
Скопировав конфиг полностью, вы можете обнаружить, что стандартные комбинации не работают. Если требуется их включить — добавьте следующую строчку в конфиг:

include "/usr/share/X11/locale/en_US.UTF-8/Compose"

Еще пару слов о кодировке: все символы из секции «оформление текста» (кроме ‘™’) есть и в KOI8-R и в CP1251 — так, что можете не бояться что вас не поймут в физическом смысле :)

P.S. Огромное спасибо x3al с #archlinux-ru@freenode.org за раскрытие моих глаз и помощь в настройке.

Tcsh.

Перед прочтением статьи подумайте нужен ли вам tcsh? Более того, здесь вы можете увидеть 10 причин, почему не стоит использовать его. Он не POSIX-совместимый. Но я всё же на этом шелле… Почему же..? Конфигурабельность и скорость, плюс некоторые фичи, к примеру, коррекция ввода. Да, иногда не-POSIX’нутость бесит, но всё же этот шелл наиболее удобен для повседневного использования (но не для написания скриптов!). Задача статьи не перевести man tcsh, а настроить удобную работу в терминале.

$ sudo pacman -Sy tcsh
$ tcsh
>

Запустив, вы увидите, что шелл почти ничего не умеет кроме пускания исполняемых файлов, в отличии от баша, который удобен “из коробки”. На самом деле слово “удобен” тоже стоит взять в кавычки, ведь за вас решили, что вам нужно! По-моему, хотя бы для осознания ваших потребностей стоит взглянуть на данный шелл. Начнем с создания конфига.

$ touch ~/.tcshrc
$ vi ~/.tcshrc

Пишем в файл следущее:

set prompt    = "%{33[32m%}%B%# "
set path      = (/sbin /bin /usr/sbin /usr/bin $HOME/bin)
set correct   = cmd
set autolist  = ambiguous
set complete  = enhance
set rmstar
set history   = 100
set savehist  = 100
set listjobs  = long
set inputmode = insert
set noclobber
set histdup   = prev
set listmax   = 100
set implicitcd
set pushdsilent
set dunique
set dextract
set dirstack
set nobeep
set color
set printexitvalue
set autoexpand

complete which    'p/1/c/'
complete where    'p/1/c/'
complete man      'p/1/c/'
complete sudo     'p/1/c/'
complete kill     'c/-/S/' 'p/*/`ps -A | awk \{print\ \$1\} | tail -n +2`/'
complete killall  'c/-/S/' 'p/*/`ps -A | awk \{print\ \$4\} | tail -n +2 | sort | uniq`/'
complete m        'p/1/c/'
complete s        'p/1/c/'

complete chgrp    'p/1/g/'
complete chown    'p/1/u/'

complete alias    'p/1/a/'
complete unalias  'p/1/a/'

complete set      'p/1/s/'
complete unset    'p/1/s/'

complete limit    'p/1/l/'
complete bindkey  'C/*/b/'

setenv LS_COLORS    'no=01;37:fi=01;37:di=01;35:ln=01;36:pi=01;32:so=01;35:do=01;35:bd=01;33:cd=01;33:ex=01;32:mi=00;05;37:or=00;05;37:'
setenv PAGER        'less'
setenv EDITOR       'vi'

alias s     'sudo'
alias e     '$EDITOR'
alias p     '$PAGER'
alias c     'cat'
alias g     'grep'
alias j     'jobs -l'
alias m     'man'
alias h     'history'

alias se    'sudo $EDITOR'
alias sc    'sudo cat'
alias gi    'grep -i'
alias cl    'clear'

alias pu    'pushd'
alias po    'popd'

alias ds    'dirs -v'
alias dss   'dirs -S'
alias dsl   'dirs -L'
alias dsc   'dirs -c'

alias mak   'make'
alias m2    'man 2'
alias m3    'man 3'
alias pac   'pacman'
alias spac  'sudo pacman'
alias ls    'ls --color=auto -F'
alias grep  'grep --color=always'
alias pingt 'ping -i 0.2 -c 100'
alias octave 'octave -q'

bindkey "^[[3~" delete-char
bindkey "^W"    backward-delete-word

Теперь углубимся в матчасть.

Опции:

prompt — ставит строку "приветствия", мне достаточно ">", но вы можете поставить, к примеру, "%{33[30m%}%m:%{33[37m%} %B%~ %{33[32m%}%B%# " и получите "myhost: ~/path > " в разных цветах.

path — очевидно, пути поиска исполняемых файлов

correct — коррекция ввода: cmd правит только команду, all правит команды по всей строке, complete автоматически дополняет команды.

> pacmn -Syu
CORRECT>pacman -Syu (y|n|e|a)

autolist — показывает возможные значения при неоднозначном дополнении, ambiguous показывает значения если были введены новые символы.

complete — если поставлен enhance, игнорирует регистр при дополнении и считает '-', '.' и '_' одинаковыми.

rmstar — спрашивает пользователя, если rm * введено.

> rm *
Do you really want to delete all files? [n/y]

history — сохраняемое количество команд в истории, так же можно изменить формат истории
savehist — сохраняемое количество команд в файл истории (стандартно ~/.history).

listjobs — показывает все задачи, если одна из них завершилась, long — показывает информацию о задачах более подробно

inputmode — способ ввода: insert или overwrite — вроде все понятно.

noclobber — запрещает перезапись существующих файлов

> touch 1
> echo "hello!" > 1
1: File exists.
> echo "hello!" >! 1
> cat 1
hello!

histdup — управляет повторяющимися значениями в истории, prev не вносит в историю одинаковые записи, если они созданы подряд, all не вносит запись, если она уже существует, erase вносит запись в историю, удалив старую.

listmax — максимальное количество элементов, показываемое без вопроса при дополнении.

> ls /dev/[^I]
There are 188 items, list them anyway? [n/y]

implicitcd — переход к директории без набора cd, если присвоено verbose, то будет каждый раз выводить смену пути в stdout.

> pwd
/home/ferhiord
> ~/programming/
> pwd
/home/ferhiord/programming

pushdsilent — отключает вывод pushd и popd.

dunique — перед занесением нового значения в стек директорий pushd удаляет предыдущее повторение.

dextract — позволяет извлекать n-ую директорию из стека, посредством pushd +n.

dirstack — позволяет получать доступ к элементам стека директорий, посредством $dirstack[номер].

nobeep — отключение "пищалки"

color — включает цвет для ls-F и добавляет --color=auto для ls, может ставится отдельно для обеих команд.

printexitvalue — выводит возвращаемое значение приложения, если оно не равно 0.

> ls /qwe
ls: cannot access /qwe: No such file or directory
Exit 2

autoexpand — включает дополнение из истории

> cd /bin
> history
1  23:21    cd /bin
2  23:21    history
> !c[^I]

Хотите большего? Вам сюда ну или в man tcsh.

Об алиасах говорить нечего, в принципе, и так понятно: всё сделано для того, чтобы было быстро и удобно обращаться с шеллом; сравните:

> sudo cat /root/.tcshrc | grep -i bind
и
> sc /root/.tcshrc | gi bind

Описания bindkey позволяют "навешивать" действия на сочетания клавиш.

Важная часть — это дополнения. Их можно настраивать как душе угодно: для sudo дополнение команд, для chown дополнение пользователей, для kill дополнение сигналов и номеров процессов... всё зависит от вашей фантазии и потребностей. Быть может, когда-нибудь у меня дойдут руки до написания дополнения пакетов для pacman'а.

Конечно, до совершенства далеко. Я понимаю, что могу улучшить работу с шеллом посредством дополнительных опций и других подходов (до tcsh я не знал, что такое стек директорий и, конечно, его не использовал). Но tcsh реально охватить мозгом, осмыслить и познать, в отличии от монстра zsh, который умеет гораздо больше (но, надо сказать, является жутким тормозом). И пока я не планирую расширять конфиг.

Пару слов о MOC (music on console).

Данная статья всего лишь повествует о прекрасном клиент-серверном музыкальном плеере MOC. Чем же он выделяется? Клиент-серверность, удобный доступ к музыке из терминала, легкость: не нужны сотни мегабайт мегабайт либ/зависимостей, управление по-одному-нажатию™… Если вас заинтресовало, то сразу предупреждаю: в moc нет коллекции, то есть надо иметь порядок на винчестере (хотя бы исходя из уважения к музыкальной культуре).

Лично мне нравится moc именно своим управлением (информацию о котором можно посмотреть нажав h). В крадце самое важное (на мой взгляд):
p — пауза/игра
s — остановка игры
b — предыдущий трек
n — следующий трек

m — переход в директорию с музыкальной коллекцией
a — добавление файла в плейлист
A — добавление директории в плейлист
C — очистка плейлиста
d — удаление элемента из плейлиста
/ — поиск
T — выбор темы
q — отсоединения клиента от сервера
Q — выход

Shift + 1..0 — переход в “быструю директорию”, удобно если у вас несколько директорий с музыкой, к примеру, две основные и с неотсортированной музыкой, скаченной с торрентов.

Можно приступить к установке и конфигурации:

$ sudo pacman -Sy moc
$ cp /usr/share/doc/moc/config.example ~/.moc/config
$ vi ~/.moc/config

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

$ mocp

Если вы обладаете клавиатурой с медиа-клавишами, то можно настроить их, прописав в конфиг вашего любимого WM (в моём случае Openbox) что-то вроде:

<keyboard>
.........
<!-- moc control -->
<keybind key="XF86AudioPlay">
<action name="execute">
<execute>mocp -G</execute>
</action>
</keybind>
<keybind key="XF86AudioPrev">
<action name="execute">
<execute>mocp -r</execute>
</action>
</keybind>
<keybind key="XF86AudioNext">
<action name="execute">
<execute>mocp -f</execute>
</action>
</keybind>
</keyboard>

(описания клавиш XF86… должны быть прописаны в ~/.Xmodmap)

MOC

MOC

Запись на HFS+

На днях игрался с MacOS X (точнее с OSx86) в Qemu и потребовалось перенести достаточно большой файл на образ, но, смонтировав, я обнаружил, что не имею rw-доступа, то есть не могу писать в него. Оказывается драйвер HFS+ в Linux не поддерживает запись в журналируемую файловую систему. Проблема решается просто :)

В MacOS X:

mac $ sudo diskutil list
/dev/disk0
....  /dev/disk0s1
mac $ sudo diskutil disableJournal /dev/disk0s1

Выключаем машину.

$ sudo mount -o loop,offset=32256 <имя_образа> /mnt/qemu

или

$ sudo mount -t hfsplus <раздел> /mnt/disk
$ ls, cp, rm ...
$ sudo umount /mnt/disk

После не забудьте включить журнал обратно.

mac $ sudo diskutil enableJournal /dev/disk0s1

Conky.

Conky, он же “коньки” в народе, – утилита для вывода системной (и не только) информации на десктоп или в отдельное окно. Приступим…

$ sudo pacman -Sy conky

Далее можно сразу набирать в консоли “conky” и убедиться, что конфигурационного файла нет.

$ conky
Conky: no readable personal or system-wide config file found

Действительно, вы не обнаружите конфигурационного файла в домашней папке (~). Он лежит в /etc/xdg/conky/. Поэтому берем его…

$ cp /etc/xdg/conky/conky.conf ~/.conkyrc

Запустив “conky”, вы увидите, что появилось появилось окно, в котором выводятся осмысленные циферки и буковки. Если вас это устроило, можете дальше не читать.
Нужно настроить коньки так, чтобы они выглядели стильно и хорошо сочетались с окружением.

$ vi .conkyrc

Далее меняем/добавляем/оставляем параметры, а можете начать новый файл:

override_utf8_locale yes      # форсируем UFT-8 локаль (нужно для xft)
use_xft yes                   # используем xft
xftfont DejaVu Sans:size=8    # хороший шрифт, требуется ttf-dejavu
xftalpha 1                    # коэффциент прозрачности
update_interval 1.0           # частота обновления (на самом деле период)
own_window yes                # в отдельном окне
own_window_type desktop       # на десктопе (так же может быть normal или override)
own_window_colour 000000      # цвет фона
double_buffer yes             # двойной буфер
minimum_size 1276 5           # минимальный размер
draw_shades no                # отключаем тень
alignment top_left            # расположение сверху слева
gap_x 0                       # начальные координаты: X
gap_y 0                       # начальные координаты: Y
TEXT                          # выводимая информация

${voffset 2} ${color grey}Core 1: ${color white}${cpu cpu1}% ${hwmon 0 temp 1}°C ${color red}| ${color grey}Core 2: ${color white}${cpu cpu2}% ${hwmon 1 temp 1}°C ${color red}| ${color grey}RAM: ${color white}${mem}/${memmax} ${color grey}↓: ${color white}${downspeed eth0} kiB/s (${totaldown eth0}) ${color red}| ${color grey}↑: ${color white}${upspeed eth0} kiB/s (${totalup eth0})${alignr}${color grey}${color white}${time %H:%M} ${color red}| ${color grey}${color white}${time %a, %d %B %Y}

Вид десктопа

Вид десктопа

Стоит сказать, что для полноценной работы данной конфигурации, нужно иметь настроенным lm_sensors, a также иметь 2 ядра :)

Если вам мало данного конфига, и выхотите знать о большем, стоит взлянуть сюда.

Еще один хинт: если вы хотите все время выдеть данную панельку (ведь conky не позволяет быть “сверху всего”, так чтобы и новые появляющиеся окна были ни под ним, ни над ним) и вы используете openbox (какое совпадение!) стоит указать в настройках (например через obconf) отступ (margin) 16 пикселей сверху.

Конфигурационный файл PyPanel.

Наконец-то я пришел к выводу, что панель задач не нужна. Действительно, фактически, она у меня использовалась только для отображения трея и часов, ну, может быть, еще номера десктопа. Часы теперь выводятся в перенастроенный conky, а за трей отвечает stalonetray. Но если мне она не нужна, это не значит, что другие того же мнения, поэтому я выкладываю готовый конфиг PyPanel, достаточно гибко настраиваемой панели. Конфиг, кстати, почти дефолтный.

$ cat .pypanelrc
#------------------------------------------------------------------------------
#
#                         PyPanel v2.4 Configuration
#
# This configuration file is a Python script that will be executed when
# PyPanel is started.  In order for PyPanel to start properly, make sure that
# this file contains proper Python formatting and no syntax errors.
#------------------------------------------------------------------------------
VERSION         = 2.4           # Config file version

#------------------------------------------------------------------------------
# Colors: Format is hex triplet - 0xrrggbb
#------------------------------------------------------------------------------
BG_COLOR        = "0x000000"    # Panel background and tinting color
TASK_COLOR      = "0x505050"    # Normal task name color
FOCUSED_COLOR   = "0xffffff"    # Focused task name color
SHADED_COLOR    = "0x505050"    # Shaded task name color
MINIMIZED_COLOR = "0x505050"    # Minimized task name color
DESKTOP_COLOR   = "0xff9e9e"    # Desktop name color
CLOCK_COLOR     = "0xff9e9e"    # Clock text color
LINE_COLOR      = "0x606060"    # Vertical line color

# Text Shadow Colors
TASK_SHADOW_COLOR      = "0xffffff"
FOCUSED_SHADOW_COLOR   = "0xffffff"
SHADED_SHADOW_COLOR    = "0xffffff"
MINIMIZED_SHADOW_COLOR = "0xffffff"
DESKTOP_SHADOW_COLOR   = "0xffffff"
CLOCK_SHADOW_COLOR     = "0xffffff"

#------------------------------------------------------------------------------
# Panel Spacing and Location Options: Measured in pixels
#------------------------------------------------------------------------------
P_LOCATION      = 1             # Panel placement: 0 = top, 1 = bottom
P_WIDTH         = 0             # Panel width: 0 = Use full screen width
P_START         = 0             # Starting X coordinate of the panel
P_SPACER        = 6             # Spacing between panel objects
P_HEIGHT        = 24            # Panel height

#------------------------------------------------------------------------------
# Icon Size Options: Measured in pixels
#------------------------------------------------------------------------------
I_HEIGHT        = 16            # Panel application icon height
I_WIDTH         = 16            # Panel application icon Width
APPL_I_HEIGHT   = 24            # Application launcher icon height
APPL_I_WIDTH    = 24            # Application launcher icon width
TRAY_I_HEIGHT   = 24            # System tray icon height (usually 16 or 24)
TRAY_I_WIDTH    = 24            # System tray icon width  (usually 16 or 24)
                                # If TRAY_I_WIDTH is set to 0, then the
                                # width specified by the tray app will be used

#------------------------------------------------------------------------------
# Panel Clock Format: 'man strftime' for detailed formatting options and help
#------------------------------------------------------------------------------
CLOCK_FORMAT    = "[ %H:%M ]"    # Ex: 2004-09-25 17:45 

#------------------------------------------------------------------------------
# Clock Delay: Seconds between each clock update during periods of inactivity
#------------------------------------------------------------------------------
CLOCK_DELAY     = 20

#------------------------------------------------------------------------------
# Hidden Application List: Apps listed here will not be display on the panel
# The application name is its WM_CLASS name, use 'xprop' to find WM_CLASS
# Ex: ["xmms", "xine", "gDesklets"]
#------------------------------------------------------------------------------
HIDE_LIST       = ["conky"]            

#------------------------------------------------------------------------------
# Hidden Panel Size: Size of the panel when it's hidden/minimized
#------------------------------------------------------------------------------
HIDDEN_SIZE     = 2

#------------------------------------------------------------------------------
# Panel Text Font: This option takes either a traditional or Xft font string
# Ex: "-schumacher-clean-medium-r-normal-*-12-*-*-*-*-*-*-*"
#     "aquafont-8"
#------------------------------------------------------------------------------
FONT            = "dejavu sans-8"

#------------------------------------------------------------------------------
# Show All Applications: Show apps from all desktops or just the current
# 0: Disabled - Only applications on the current desktop will be displayed
# 1: Enabled  - Selected apps are moved to the current desktop
# 2: Enabled  - Current desktop is changed to the selected apps desktop
#------------------------------------------------------------------------------
SHOWALL         = 0             # 0, 1 or 2 - see descriptions above

#------------------------------------------------------------------------------
# Show Minimized/Iconified Applications: Show only minimized apps or all apps
# 0: Disabled - Show all applications on the panel
# 1: Enabled  - Show only minimized apps on the panel
#------------------------------------------------------------------------------
SHOWMINIMIZED   = 0

#------------------------------------------------------------------------------
# Application Icon List: List of custom icons for specific applications
# The application name is its WM_CLASS name, use 'xprop' to find WM_CLASS
#
# The "default" entry is used for applications with no icon.  If left "",
# PyPanel will use the default icon distributed with the source.
#
# Add entries using the following format -
#     "" : "",
#------------------------------------------------------------------------------
ICON_LIST       = {
                   "default" : "",
                   "example" : "/usr/share/imlib2/data/images/audio.png",
                  }

#------------------------------------------------------------------------------
# Application Launch List: Ordered list of icons and applications for the
#                          application launcher.
#
# Add entries using the following format -
#     ("", "")
#------------------------------------------------------------------------------
LAUNCH_LIST     = [
                   ("gimp-2.2", "/usr/share/imlib2/data/images/paper.png"),
                  ]

#------------------------------------------------------------------------------
# Background Alpha/Shade Level: 0 (Fully Translucent) -> 255 (Fully Opaque)
# BG_COLOR is used for tinting
#------------------------------------------------------------------------------
SHADE           = 150

#------------------------------------------------------------------------------
# Misc. Options: 1 = Enabled/Yes, 0 = Disabled/No
#------------------------------------------------------------------------------
ABOVE           = 1             # Panel is always above other apps
APPICONS        = 0             # Show application icons
AUTOHIDE        = 0             # Autohide uses the CLOCK_DELAY timer above
SHADOWS         = 0             # Show text shadows
SHOWLINES       = 0             # Show object seperation lines
SHOWBORDER      = 0             # Show a border around the panel

#------------------------------------------------------------------------------
# Desktop Names: Configure the names of your desktops
# If the option is [], PyPanel will attempt to use the desktop name specified
# by the XServer, if that fails it will use the desktop number as its name
# Ex. ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"]
#------------------------------------------------------------------------------
DESKTOP_NAMES   = [" d1 |", " d2 |", " d3 |", " d4 |"]

#------------------------------------------------------------------------------
# Panel Layout:       -----------------------------------
#                     [  1  ][  2  ][  3  ][  4  ][  5  ]
#                     -----------------------------------
#
# The panel layout is split into 5 sections numbered 1, 2, 3, 4 or 5 as shown
# in the diagram above.  Each of the following objects can be enabled by
# assigning it a section number or disabled by assigning it 0:
#------------------------------------------------------------------------------
DESKTOP         = 1             # Desktop name section
TASKS           = 2             # Task names section
TRAY            = 3             # System tray section
CLOCK           = 4             # Clock section
LAUNCHER        = 0             # Application launcher section

#------------------------------------------------------------------------------
#                       Button Event Function Definitions
#------------------------------------------------------------------------------
# Left click   - button 1
# Middle click - button 2
# Right click  - button 3
# Wheel up     - button 4
# Wheel down   - button 5
#
# changeDesktop(x)
# - Change Desktop: Increase or decrease the current desktop by 'x' amount
#
# toggleShade(task)
# - Shade or Unshade an application
#
# toggleHidden()
# - Minimize the panel to the top or bottom depending on its start location
#
# toggleMinimize(task, traise=1)
# - Minimize or Unminimize an application and optionally raise it
#
# taskRaise(task, focus=1)
# - Raise an application to the top of the window list and optionally focus it
#
# taskLower(task, focus=0)
# - Lower an app to the bottom of the window list and optionally focus it
#
# taskFocus(task)
# - Give focus to the selected application, if it has focus then minimize it
#
# showDesktop()
# - Toggle between hiding and unhiding ALL applications
#------------------------------------------------------------------------------

#----------------------------------
def desktopButtonEvent(pp, button):
#----------------------------------
    """ Button event handler for the panel's desktop object """

    if button == 1:
        pp.changeDesktop(1)
    elif button == 2:
        pp.changeDesktop(2)
    elif button == 3:
        pp.changeDesktop(-1)
    elif button == 4:
        pp.changeDesktop(1)
    elif button == 5:
        pp.changeDesktop(-1)

#--------------------------------
def clockButtonEvent(pp, button):
#--------------------------------
    """ Button event handler for the panel's clock object """

    if button == 1:
        os.system("xclock &")
    elif button == 2:
        pass
    elif button == 3:
        pp.toggleHidden()
    elif button == 4:
        pp.showDesktop()
    elif button == 5:
        pp.showDesktop()

#--------------------------------
def panelButtonEvent(pp, button):
#--------------------------------
    """ Button event handler for the panel with no active tasks """

    if button == 1:
        pass
    elif button == 2:
        pass
    elif button == 3:
        pass
    elif button == 4:
        pass
    elif button == 5:
        pass

#-------------------------------------
def taskButtonEvent(pp, button, task):
#-------------------------------------
    """ Button event handler for the panel's tasks """

    if button == 1:
        pp.taskFocus(task)
    elif button == 2:
        # Destroy the application
        task.obj.destroy()
    elif button == 3:
        # Ex. - XMMS doesn't shade, so we want to minimize it instead and
        #       still use button 3 to shade other applications
        #       task.tclass is the tasks class name (WM_CLASS)
        if "xmms" in task.tclass:
            pp.toggleMinimize(task)
        else:
            pp.toggleShade(task)
    elif button == 4:
        pp.taskRaise(task, focus=1)
    elif button == 5:
        pp.taskLower(task, focus=0)