Материал из Tkabber Wiki
Содержание
- 1 Добавление новых (внешних) комплектов
- 2 Улучшение поддержки анимированных GIF
- 3 Настройка высоты окна смайликов
- 4 Полное искоренение смайликов
Добавление новых (внешних) комплектов
В двух словах расскажем здесь, как добавлять смайл-паки. Скачайте нужный вам архив и распакуйте его куда-нибудь. Лучше всего — в домашний директорий, где уже лежит файл конфигурации и должен находиться каталог emoticons-tkabber. Можете распаковать архив прямо в этот каталог, но лучше создать для него свой собственный, чтобы при желании можно было включать разные наборы смайликов.
Затем отредактируйте файл ~/.tkabber/config.tcl, подправив следующую строчку:
emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set
где new_emoticon_set — название каталога нового смайл-пака. Если такой строки в конфиге нет, то допишите её, причём она должна быть "обрамлена" таким вот хуком (естественно, если этот хук прописан, надо просто добавить эту строку куда-нибудь между фигурными скобками):
hook::add finload_hook {
emoteicons::load_dir ~/.tkabber/emoticons-tkabber/new_emoticon_set
}
При новом запуске Ткаббер "подцепит" этот набор, и вы сможете им пользоваться.
Ознакомьтесь также с этой статьёй. Там описано почти то же самое (правда, по-английски), а также даны ссылки на некоторые смайл-паки.
Улучшение поддержки анимированных GIF
За отображение анимированных gif в Tkabber отвечает файл tkabber\aniemoteicons\anigif.tcl. Если сравнивать реализацию со спецификацией формата GIF89a (это как раз и есть нужные нам анимированные gif-картинки), то обнаруживаем отсутствие поддержки вывода с возвратом к предыдущему изображению. Чтобы было понятно, чем это грозит, можно провести эксперимент.
В пустой каталог помещаем три файла:
- файл tkabber\aniemoteicons\anigif.tcl из состава дистрибутива Ткаббера,
- вот этот анимированный gif:
и скрипт showgif.tcl следующего содержания:
source anigif.tcl foreach f [glob -nocomplain *.gif] { label .[file rootname $f] -image [::anigif::anigif $f] pack .[file rootname $f] }
При запуске этого скрипта мы увидим вот такую исчезающую улыбку Чеширского кота © Льюис Кэррол. Кстати, закиньте в эту папку штуки 4 экземпляра приведённой картинки и посмотрите на загрузку процессора при воспроизведении.
Как оказалось, это лечится лёгким движением руки. В файле anigif.tcl ищем строчки:
# Restore to previous - not supported
# As recommended, since this is not supported, it is set to blank
[set ::anigif::${img}(curimage)] blank
и смело комментируем команду
# Restore to previous - not supported
# As recommended, since this is not supported, it is set to blank
# [set ::anigif::${img}(curimage)] blank
Люди, знающие английский язык, сильно нервничают, ломают руки, кусают ногти, но тоже комментируют эту команду, хоть и не так смело.
Снова запускаем скрипт showgif.tcl и наслаждаемся нормальной анимацией.
P.S. В заголовке файла anigif.tcl написано, что при формировании изображений используются опции -zoom и -subsample для сохранения прозрачности изображений. Практика показала, что прозрачность сохраняется и без этого трюка. Вероятно, с тех пор, когда писался код anigif.tcl, поддержка прозрачности в Tk была доработана. Поэтому меняем строки в anigif.tcl
[set ::anigif::${img}(curimage)] copy [lindex $list $idx] -subsample 2 2
· · ·
pic$n$img copy xpic$n$img -zoom 2 2
· · ·
[set ::anigif::${img}(curimage)] copy pic0${img} -subsample 2 2
на
[set ::anigif::${img}(curimage)] copy [lindex $list $idx] ;#-subsample 2 2
· · ·
pic$n$img copy xpic$n$img ;#-zoom 2 2
· · ·
[set ::anigif::${img}(curimage)] copy pic0${img} ;#-subsample 2 2
Такие изменения должны положительно сказаться на производительности. Запустите снова скрипт showgif.tcl и проверьте загрузку процессора.
Пожелания и замечания направляйте по адресу xmpp:archimed@jabber.ru.
Настройка высоты окна смайликов
Для начала отредактируем файл /usr/lib/tkabber/emoticons.tcl — вам потребуется войти рутом по команде su.
Примечание: в svn-версии Ткаббера файл этот поменял своё местоположение, теперь он находится тут: /path/to/your/svn_tkabber/plugins/richtext/emoticons.tcl и вообще весьма поменялся внутренне, так что предлагаемый патч работает лишь для стабильной версии 0.9.9 и младше.
В самом начале его идёт процедура namespace eval emoteicons
:
namespace eval emoteicons {
array set emoteicons {}
variable lasttext ""
variable lastX
variable lastY
}
Добавляем в неё две строчки (до закрывающей фигурной скобки!):
variable lk_iconsrows
set emoteicons::lk_iconsrows 0
Затем в том же файле ищем процедуру proc emoteicons::show_menu {iw}
и после строчки
set rows [expr {floor(sqrt([llength $imgs]))}]
вставляем следующий текст:
#if user sets up the variable - use it!
if {$emoteicons::lk_iconsrows > 0} {
set rows [expr {$emoteicons::lk_iconsrows}]
}
Правка файла закончена, сохраняем его. Теперь, выйдя из аккаунта суперпользователя, отредактируйте файл ~/.tkabber/config.tcl:
Если у вас где-то уже прописан путь к новому смайл-паку, добавьте рядом такую строчку:
set emoteicons::lk_iconsrows 8
При следующей загрузке Ткаббера удостоверьтесь, что всё правильно: при нажатии Alt-E должно вывестись окно со смайликами высотой в 8 строчек. Если оно вас не устраивает, попробуйте увеличить или уменьшить число в конфиге. Зная количество смайликов в наборе, можно легко подобрать нужную высоту окна, чтобы оно целиком помещалось на экране.
Автор патча — LKnight
Полное искоренение смайликов
Это не проблема — добавьте в config.tcl следующее:
hook::add finload_hook {
array unset emoteicons::emoteicons
}
Если в вашем конфиге уже есть установка этого хука, то можете прописать
array unset emoteicons::emoteicons
прямо туда.
Убивец смайликов — Kostix
Массовое клонирование эмоциконок
В конце-концов, config.tcl представляет собой полноценную программу на Tcl, и ничто серьёзное ему, следовательно, не чуждо.
Для примера реализуем поддержку ROTFL/LOL-смайлов — таких, которые собеседник использует, когда ему ну очень смешно:
hook::add finload_hook {
namespace eval ::emoteicons {
variable emoteicons
set orig :-)
set dest :-)))))))))))
for {set i [expr [string first ) $dest] + 1]} \
{$i < [string length $dest]} \
{incr i} {
set emoteicons([string range $dest 0 $i]) $emoteicons($orig)
}
}
}
Данное заклинание связывает картинку от :-)
с со смайликами: :-)), :-))), :-)))
и так
далее, включая тот, который помещён в переменную dest
.
Тикль очень "прозрачен" — постарайтесь разобраться в том, как работает это заклинание самостоятельно. Если после достижения успеха на этом поприще вы всё ещё будете думать, что Ткаббер это не ваш выбор, — смело стреляйтесь. (Если вы не достигли успеха, — смело учитесь.)
Смайлики клонировал Kostix.