Tkabber Wiki

Патчи
Login

Патчи

Материал из Tkabber Wiki

Здесь мы "замахнёмся" на исходные коды самой программы, а точнее — её модулей :)

Содержание

Отправка сообщений по нажатию Ctrl-Enter

Внимание! Существует решение, не требующее патча — настройка в конфиг. Поскольку она потенциально значительно надёжнее патча, рекомендуется использовать её.

Многие IM-программы отсылают сообщения по нажатию Ctrl-Enter, а сам Enter используют для перевода строки, вместо или вместе с Shift-Enter. В Ткаббере сообщения отсылаются по нажатию Enter, что и само по себе не очень удобно (если вам хочется сделать в сообщении несколько абзацев, придётся нажать несколько раз Shift-Enter и только один раз — Enter). А уж если вы пересаживаетесь на Ткаббер с другой программы, то эта разница в простых вроде бы действиях и вовсе может свести с ума. К счастью, проблема решается буквально за 5 минут.

Откройте файл chats.tcl, что лежит в главной директории, в вашем любимом текстовом редакторе и найдите строку:

bind $cw.input <Shift-Key-Return> { }

Видите, сразу за ней идёт блок:

   bind $cw.input <Key-Return> [double% "
       chat::send_message [list $cw] [list $chatid] [list $type]
       break"]

Теперь вам нужно немного всё поменять :) Вместо этих двух биндов сделайте так:

   bind $cw.input <Shift-Key-Return> { }

   bind $cw.input <Key-Return> { }

   bind $cw.input <Control-Key-Return> [double% "
	   chat::send_message [list $cw] [list $chatid] [list $type]
	   break"]

Фактически вы сделали просто перевод каретки (переход на следующую строку) как по нажатию на Enter, так и по нажатию на Shift-Enter, а привычный для многих Ctrl-Enter теперь будет отсылать сообщения.

P.S. Лучшая документация — это исходники.

была тут галерея, но глюк случился.

Автор патча — lknight.

Ispell в Windows, правка

Сделав всё в соответствии с документацией от xmpp:sgolovan@nes.ru (teo), мы получаем в $rootdir\PLUGINS\WINDOWS\_ файл ispell.tcl, который на Windows-системах даёт странные эффекты — первое проверяемое слово вызывает ошибку, которую нужно пропустить, и только потом всё будет тип-топ. Простейший вариант правки: в строке №15 руками прописать вместо _/usr/bin/ispell абсолютный путь к ispell на вашей системе. Но! Этим вы не только добавите себе работы при следующем апдейте с CVS (а её и так немало у тех, кто активно балуется ковырянием), но и сделаете необходимым менять пути и в опциях, и в коде. Есть вариант другой.

Строки с 14 по 16

    #set options(executable) /usr/bin/ispell
    custom::defvar options(executable) /usr/bin/ispell \
	[::msgcat::mc "Path to the ispell executable."] -group Ispell

заменяем на следующий код:

#<PATCHED>
  if {![info exists ::plugins::ispell::options(executable)] \
      || [cequal $::plugins::ispell::options(executable)  ""]} {
        custom::defvar options(executable) /usr/bin/ispell \
        [::msgcat::mc "Path to the ispell executable."] -group Ispell
        } else {
        custom::defvar options(executable) $::plugins::ispell::options(executable) \
        [::msgcat::mc "Path to the ispell executable."] -group Ispell
        }
#</PATCHED>

Всё работает как надо — берёт настройки из конфига и больше не ругается ;)

Автор патча — lknight.

Нумерация закладок

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

Что хотелось получить? Возможно быстро (а не по одному) переключаться между относительно большим количеством табов без использования мышки.

Как это должно выглядеть? Вот пример: Tkabber
num1.jpg


Текущее (ужасное своей малой переносимостью, имхо) состояние системы. Приводятся данные для версии ткаббера из цвс, за "2005-10-12 Alexey Shchepin xmpp:alexey@sevcom.net". Нам потребуется внести свои правки в 2 файла:

Находим 555-ю строку, с хуком:

hook::run close_chat_post_hook $chatid

И вставляем после неё вызов функции

ifacetk::lk_update_chat_titles

Всё, с этим файлом мы всё сделали. Теперь пора идти дальше.

Открываем это файл и находим в самом начале объявление namespace'а.

namespace eval ifacetk {

Идём в самый его конец и дописываем туда нашу переменную:

variable lk_index

К слову сказать, префикс lk_ имеют практически все переменные и функции, чтобы их было легко потом найти ;)

Далее находим proc ifacetk::on_open_chat_window {chatid type} { И делаем так, чтобы она и следующая дальше ifacetk::on_close_chat_window выглядели так:

proc ifacetk::on_open_chat_window {chatid type} {
   variable number_msg
   variable personal_msg
   variable lk_index

   set number_msg($chatid) 0
   set personal_msg($chatid) 0
   set lk_index($chatid) 0
}

proc ifacetk::on_close_chat_window {chatid} {
   variable number_msg
   variable personal_msg
   variable lk_index

   unset number_msg($chatid)
   unset personal_msg($chatid)
   unset lk_index($chatid)
}

Далее proc ifacetk::update_chat_title {chatid} { Нужно привести в виду:

proc ifacetk::update_chat_title {chatid} {
   global usetabbar
   variable options
   variable number_msg
   variable personal_msg
   variable lk_index

   set cw $chat::opened($chatid)

   if {$usetabbar} {
	set tabtitle $chat::chats(tabtitlename,$chatid)
	if {$options(message_numbers_in_tabs) && ($number_msg($chatid) > 0)} {
	    append tabtitle " ($number_msg($chatid))"
	}
    set tabtitle [format [::msgcat::mc "\[%s\] %s" $lk_index($chatid) $tabtitle]]
	.nb itemconfigure [nbpage $cw] -text $tabtitle
   } else {
	if {$personal_msg($chatid)} {
	    set star "*"
	} else {
	    set star ""
	}
	if {$number_msg($chatid) > 0} {
	    set title "($number_msg($chatid)$star) $chat::chats(titlename,$chatid)"
	} else {
	    set title $chat::chats(titlename,$chatid)
	}
	wm title $cw $title
	wm iconname $cw $title
   }
}

И сразу после неё вставить:

proc ifacetk::lk_update_chat_titles {} {
    global usetabbar
    variable lk_index

    if {!$usetabbar} return
		foreach tab [.nb pages] {
           if {[set path $tab] != ""} {
		    set page [nbpage $path]
		    if {[.nb index $page] < 0} {
			set page $path
			set path [pack slaves [.nb getframe $page]]
		    }
               if {[.nb index $page] < 0} {
              return
              }
                set lk_var [expr [.nb index $page] +1]
		      if {[info exists chat::chat_id($path)]} {
		 	  if {!$updated || ($lvlnum == 0)} {
			    set chatid $chat::chat_id($path)
			    set lk_index($chatid) $lk_var
			    update_chat_title $chatid
               }
             }
         }
}

И наконец, находим строку proc ifacetk::tab_set_updated {path {updated 0} {level ""}} { Добавляем после 6-й строки этой функции (variable personal_msg)

variable lk_index

Находим в этой же функции строку if {[info exists chat::chat_id($path)]} { Приводим этот абзац к виду:

   set lk_var [expr [.nb index $page] + 1]
   if {[info exists chat::chat_id($path)]} {
	if {!$updated || ($lvlnum == 0)} {
	    set chatid $chat::chat_id($path)
	    set number_msg($chatid) 0
	    set personal_msg($chatid) 0
	    set lk_index($chatid) $lk_var
	    update_chat_title $chatid
	    update_main_window_title
	}
   }

Автор патча — lknight.

Добавление аватары в окно чата (старый хак Badlop'а)

Если ваш собеседник имеет подключённую аватару, вы можете видеть её не только на соответствующей вкладке в персональной информации, но и в окошке чата в правом нижнем углу — непосредственно во время разговора. Добиться этого, как оказывается, очень просто. Откройте файл C:\Program Files\Tkabber\tkabber\chats.tcl (/usr/lib/tkabber/chats.tcl), найдите строку:

pack $cw.isw -fill both -expand yes -side bottom -in $dow

закомментируйте её и вставьте следующие четыре строки (для версий 0.9.8 - 0.11.0 (включительно)):

pack $cw.isw -expand yes -fill both -side left -in $dow
set avatar_img [avatar::get_image $connid [get_jid_of_user $connid $jid]]
label $cw.avatar -image $avatar_img
pack $cw.avatar -side right -in $dow

для версий больше 0.11.0:

pack $cw.isw -expand yes -fill both -side left -in $dow
set avatar_img [avatar::get_image $xlib [get_jid_of_user $xlib $jid]]
label $cw.avatar -image $avatar_img
pack $cw.avatar -side right -in $dow

Если вы используете версию 0.9.7, надо вставить другие четыре строчки, вот эти:

pack $cw.isw -expand yes -fill both -side left -in $dow
set avatar_img [avatar::get_image [get_jid_of_user $connid $jid]]
label $cw.avatar -image $avatar_img
pack $cw.avatar -side right -in $dow

Обратите внимание — вся разница между версиями во второй строке, точнее даже буквально в одном слове.

Чтобы не приходилось каждый раз лезть в код, когда захочется включить аватару или выключить (через Настройки, к примеру, или по нажатию горячей клавиши), можете скачать специально заточенную под это дело версию Старпака от xmpp:archimed@jabber.ru.

Информация о хаке взята с испанского сайта, посвящённого Ткабберу — http://tkabber.redlibre.org

Расширенная поддержка аватар в окне чата

Основные расширения:

  1. анимированные аватары;
  2. прозрачность в аватарах;
  3. масштабирование аватар к размеру видимой области.

В этом файле находятся изменённые файлы chat.tcl и anigif.tcl. Замените ими соответствующие файлы в Ткаббере (не забудьте сделать резервную копию). По умолчанию опция показа аватары в окне чата выключена. Включить можно в настройках в разделе Chat.

Также в архиве найдёте пример анимированного gif. Напоминаю, что Ткаббер поддерживает только аватары в формате gif.

Если вы подключите анимированную аватару в качестве своей, то Ткаббер без этого патча покажет лишь первый кадр анимации. Но покажет! Так что, не бойтесь экспериментировать.

С благодарностью или негодованием обращаться к Archimed (xmpp:archimed@jabber.ru).

Показ времени "ухода в эвей" в статусе auto-away

Внимание! Патч уже не прикладывается без ошибок к версии 0.11.0. Править его всем лень.

Патч тут. Как накладывать, читайте в самом начале данной страницы (перед "Содержанием").

На заметку: после установки пропишите путь до каталога, в который вы поставили patch, + "\bin" в переменную окружения PATH. Например, если ставили в

C:\Program Files\GnuWin32

то путь должен быть

C:\Program Files\GnuWin32\bin

Тогда можно будет запускать patch как написано выше — не указывая полный путь до неё.

Дополнительные настройки AutoAway

::plugins::autoaway::options(status)

Теперь специальный токен %T в этой строке раскрывается в значение времени, которое было на момент начала ухода в эвей.

::plugins::autoaway::options(time_format)

Задаёт формат времени для "раскрытия" токена %T.

Это — формат для команды тикля [clock format]. За описанием — сюда.

К примеру, "%H:%M:%S" (оно же "%T") раскрывается в нечто вроде "15:30:25".

::plugins::autoaway::options(time_is_gmt)

Указывает, что время будет форматироваться в формате GMT (Greenwich Mean Time). Если опция выключена (false), то время форматируется согласно локальной временной зоне.

Предложения и вопросы — к kostix.

Транспортные иконки для гейта MRIM и его контактов

Kostix 03:28, 11 сентября 2006 (MSD) Иконки гейта MRIM — в транке начиная со вчерашнего дня, так что патч практически неактуален. Кроме того, работа с транспортными иконками была сильно доработана — они теперь выясняются не на основе имени хоста гейта, а на основе ответа на запрос disco#info от него. Также исправлен баг с исчезающими транспортными иконками в окне чата при смене статуса контакта. Короче, всем желающим MRIM-иконок лучше заиметь себе последнюю версию из Subversion.

Патч добавляет в основной (он же "дефолтный", он же "по умолчанию") пакет иконок "транспортные" иконки для гейта MRIM (Mail.RU Instant Messenger) и контактов на нём. То есть вместо стандартных иконок "enlightened feather" (лампочка с пером) будет майлрушное "калисо" (по меткому выражению zenith, — автора MRIM-гейта).

Поддерживаются и отображаются состояния "доступен", "отошёл" и "недоступен"; состояния "не беспокоить" и "отошёл давно" не поддерживаются Mail.RU IM'ом и отображаются гейтом на "отошёл", зато его состояние "invisible" не поддерживается Джаббером и отображается гейтом на "недоступен".

Выглядит так: Mrim.png Mrim-away.png

Патч — тут.

Прикладывать так.

Во-первых, распаковать; в месте распаковки появится такая структура:

roster.diff
pixmaps/
 default/
  icondef.diff
  services/
   mrim_*.gif

Она соответствует расположению файлов в каталоге Ткаббера, поэтому дальнейшие действия такие:

  1. Скопировать все файлы mrim_*.gif из pixmaps/default/services в такой же каталог Ткаббера.
  2. Приложть патч icondef.diff на pixmaps/default/icondef.xml в каталоге Ткаббера.
  3. Приложить патч roster.diff на roster.tcl в каталоге Ткаббера.

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

Процесс наложения патча описан в самом верху этой страницы (перед "Содержанием").

Перезапустить Ткаббер, убедиться, что включены опции

::ifacetk::roster::show_transport_icons

(для самого гейта) и

::ifacetk::roster::show_transport_user_icons

(для контактов на нём) по желанию.

Предложения и вопросы — к kostix.

Расширенное управление приоритетами для auto-away и auto-xa

Данный патч наделяет плагин AutoAway следующими возможностями:

Патч предназначен для тестирования идеи об автоматическом изменении приоритетов различных копий Ткаббера (к примеру, одна запущена на работе, другая — дома). Суть идеи: сконфигурировать такую систему приоритетов, которая позволит максимально "осмысленно" направлять сообщения на различные копии Ткабберов по мере того, как хозяин последних перемещается между ними. Понятно? Мне тоже непонятно...

Подробно о зависимости поведении сервера от приоритетов нескольких подключений к одному аккаунту читайте здесь (поищите по слову "priority").

Патчить нужно файл plugins/general/autoaway.tcl. Процесс наложения патча описан в самом верху этой страницы (перед "Содержанием").

Предложения и вопросы — к kostix.

NB: патч создан против версии 0.9.9-1.2 (CVS).

Примечание: эти изменения приоритетов работают только при автоматическом изменении статуса (т.е. когда статус пользователя меняется плагином AutoAway); при смене статуса вручную никакого изменения приоритета не происходит.

Поиск в Дискавери

Версия первая, наколенная. Патч не предназначен для использования, хотя и работает. Это так, пусть пока полежит :) Смотреть тут.

Kostix 03:21, 11 сентября 2006 (MSD) — поиск в дискавери уже месяц как в транке. так что этот патч уже совершенно неактуален и будет удалён.

Kostix 21:09, 18 сентября 2006 (MSD) — с другой стороны, этот патч содержит код для прозрачной привязки виртуальных событий к топлевелам (в no-tabbed mode) или к единственному топлевелу + передача события в активный фрейм ноутбука (в tabbed mode), который надо бы отодрать и присовокупить к транку.

Подтверждение при закрытии табов

Патч: Confirm.patch

Неактуально. Есть плагин.

Выборочное управление посылкой уведомлений о событиях чата

Внимание! Этот патч был сделан для борьбы с кривизной ICQ-гейта "JIT", который посылал ошибку в ответ на события чата; и эта ошибка показывалась в окне чата, как относящаяся к нему. Начиная с версии 0.10.0 Ткаббер содержит код, который устаняет подобную проблему другим способом.

Этот патч (+ плагин) позволяет выключать/включать посылку уведомлений о событиях чата (chat state notifications) для любого окна чата (т.е. для любого контакта, с которым открыт сеанс чата).

Управление настройкой — флаг "Enable chat state notifications" в меню окна чата.

Новая настройка "перекрывает" глобальную опцию ::plugins::chatstate::options(enable). Значение локальной настройки инициализируется значением глобальной опции при открытии окна чата.

Цель данной функциональности — обход багов, возникающих при работе с некоторыми "ненативными" IM-сетями через соответствующие гейты. В основном, проблемы возникают с различными ICQ-клиентами (печально знаменитое сообщение "400 (Empty SMS messages are forbidden)" в качестве реакции на любую активность в окне чата и его закрытие).

Архив содержит каталог с плагином, который требуется положить в ~/.tkabber/plugins, и патч chatstate.tcl.diff, который следует положить в tkabber/plugins/chat и запустить

patch <chatstate.tcl.diff

После перезапуска Ткаббера в меню окна чата становится доступен флаг "Enable chat state notifications".

Вопросы и пожелания слать Kostix.

Примечание: возможно сделать авто-запрещение посылки нотификаций для выбранных JID'ов, например, вот так можно запретить нотификации для всех контактов на ICQ-гейте:

Впишите в свой config.tcl вне хуков вот этот кусок кода:

proc icq_must_die {w connid jid} {
  if {[regexp {@icq\.} $jid]} {
    set ::plugins::chatstate::options(enable,$jid) 0
  }
}

hook::add chat_create_user_menu_hook icq_must_die

Он отключает нотификации для любого джида, содержащего подстроку "@icq.", то есть, к примеру 666777@icq.jabber.ru и так далее.

Поддержка ссылок в окне истории

Данный патч добавляет поддержку ссылок (которая присутствует в окне чата) в окно истории. С вопросами и пожеланиями к eXire.

Выбор между старым и новым видом окна userinfo

Справедливо для svn-версии.

Патч. Настройки в Customize → Main Interface.

Звуки в играх

Патчи к играм. Так же нужно накатить патч, который тоже находится в этом архиве, на файл plugins/general/sound.tcl.

В транке с 27.09.06.

Улучшенная поддержка XHTML

Данный патч предназначен для улучшения отображения XHTML сообщений. Протестирован с Gaim (Pidgin) и Adium и (частично) XEP-0071. Накладывать заплатку нужно на файл tkabber/plugins/chat/draw_xhtml_message.tcl

--- draw_xhtml_message.orig.tcl	2007-05-25 13:05:18.000000000 +0400
+++ draw_xhtml_message.tcl	2007-06-05 12:31:32.000000000 +0400
@@ -336,6 +336,32 @@
 	    color {
 		set state(color) $val
 	    }
+	    font-style {
+		if {$val=="italic"} {set state(slant) 1}
+	    }
+	    font-weight {
+		if {$val=="bold"} {set state(weight) 1}
+	    }
+	    font-size {
+		switch -- $val {
+	            large {
+			incr state(size) 4
+	            }
+	            xx-large {
+			incr state(size) 6
+	            }
+	            small {
+			incr state(size) -1
+	            }
+	            xx-small {
+			incr state(size) -2
+	            }
+	        }
+	    }
+	    margin-left {
+			incr state(lmargin1) 32
+			incr state(lmargin2) 32
+	    }
 	}
     }
 }

Публикация проигрываемой мелодии при помощи запуска Ткаббера с ключом -pep

Реализация того, что описано в ТЗ по управлению через параметры командной строки.

Патч позволяет публиковать информацию о мелодии (pep:tune) при помощи вызова из командной строки (shell-скрипта, батника; также есть встроенная возможность медиаплееров запускать скрипт при смене трека).

Cинтаксис:

tkabber -pep "tune:artist=Исполнитель,title=Название,track=номер_песни,
length=продолжительность,source=источник,uri=ссылка,rating=оценка"

В примере сделан перенос строки, потому что она получилась слишком длинной. При запуске весь текст должен идти подряд, без пробелов после запятых. Кавычки нужны на случай, если в названии песни или исполнителя будет пробел. Любое из полей (artist, title, ...) может быть опущено. Порядок указания полей роли не играет.

А вот и сам патч.

Патч накладывается командой

$patch -p0 <pepswitch.diff

из корневой папки исходных текстов Ткаббера.

--Nicktian 17:10, 3 марта 2009 (MSK)

Отображение доступных контактов сверху списка

Реализация возможности, описанной тут.

Сам патч: iroster.zip

Jet

Звук на установленные к наблюдению в Шпионе jid'ы

В архиве сам патч и звуковой файл, который проигрывается при появлении указанного в шпионе jid. В настройках плагина будет соответствующее поле для замены/удаления звукового оповещения.

Brennender

Отключение смены значка в трее при получени прочих сообщений в конференции

Патч добавляет чекбокс в Main Interface → Systray, снятие флажка с которого отключит уведомления в трее об обычных, не подсвеченных сообщениях в конференции.

Файл: Systray.zip

Brennender

Группы-исключения для показа в них сообщений сервера, когда соответствующая опция выключена

Когда вам надоедает лицезреть в комнатах, кто зашёл, кто вышел, кто сменил ник и прочее, вы выключаете опцию options(gen_enter_exit_msgs) в Настройках → Chat. Но бывает так, что вам хотелось бы мониторить пару конференций, если там требуется усиленное модерирование. Этот патч как раз после вышеупомянутой опции добавляет поле, куда можно вписать необходимые конференции, разделяя их пробелом. Теперь, отключив генерацию сообщений сервера, вы будете продолжать видеть всю необходимую для модератора информацию в нужных вам комнатах.

Файл Muc_exception_groups4gen_enter_exit_msgs.zip

ycbl

Включение подсветки (highlight) всего сообщения при обращении к вам в конференции

ВНИМАНИЕ: Патч содержит недоработки. К тому же уже есть реализация в виде плагина.

В настройках: Plugins → Rich Text будет соответствующая опция для включения. Патч накатывать по адресу ~tkabber/plugins/richtext. За цвет хайлайта отвечает опция, которую можно добавить в ваш .*xrdb-файл в виде hex-хначения

*Chat.highlightforeground:   #ff0000

либо:

*Chat.highlightforeground:   red

Или же добавлением в config.tcl такой строчки:

option add *Chat.highlightforeground:   #ff0000

Автор ancestor

Кнопка очистки фильтра ростера

Патч добавляет кнопку, при нажатии на которую фильтр ростера очищается, примерно как в фильтре Skype.

den_po