Интервалы обновления статически указываются в исходном коде расширения Lightning, но код расширения Thunderbird полностью представлен на Javascript, а диалект XML используется Gecko для определения пользовательских интерфейсов, поэтому добавить особые интервалы вам не составит особого труда. Вот как вы это делаете:
Во-первых, если у вас его еще нет, вам необходимо загрузить копию установочного пакета Lightning. (Далее предполагается, что Lightning 1.9.1; интересующие объекты, вероятно, не сильно изменились в нескольких версиях, но для достижения наилучших результатов убедитесь, что это версия, с которой вы работаете.)
Когда у вас есть файл .xpi, найдите удобный, в противном случае пустой каталог, в который его можно распаковать - установщик XPI - это просто переименованный zip-файл, поэтому unzip
WinZip, WinRar, & c., & C. Могут все справиться. (Возможно, вам придется сначала переименовать его в «.xpi.zip» или щелкнуть правой кнопкой мыши и «Открыть с помощью…», в зависимости от.) Извлеките все файлы, которые вы найдете внутри, сохранив каталоги.
Как правило, вы можете найти код, который обрабатывает данное диалоговое окно или другую часть пользовательского интерфейса, отыскивая строки, которые в нем появляются. В этом случае я искал «Показать напоминания»:
me@box [lightning] $ find -exec grep -nH "Show Reminders" {} \; Binary file ./chrome/calendar-en-GB.jar matches Binary file ./chrome/calendar-en-US.jar matches me@box [lightning] $ grep -a 'Show Reminders' chrome/calendar-en-US.jar <!ENTITY calendarproperties.firealarms.label "Show Reminders">
Это говорит нам о том, что, за исключением локализации, код Lightning внутренне ссылается на строку, за которой мы охотимся calendarproperties.firealarms.label
. Это удобно, потому что теперь мы знаем, что искать в реальном коде; мы найдем там, по крайней мере, один экземпляр этой ссылки, и этот экземпляр будет очень близок к тому, что связано с интересующим нас выпадающим списком. Итак:
me@box [lightning] $ find -exec grep -nH 'calendarproperties.firealarms.label' {} \; [many matches on i18n dialect files elided...] ./chrome/calendar/content/calendar/calendar-properties-dialog.xul:102: label="&calendarproperties.firealarms.label;"
Ах-ха! Это файл .xul, поэтому мы знаем, что он определяет часть пользовательского интерфейса; что label=
выглядит как атрибут этикетки для управления пользовательского интерфейса, который должен сказать, что мы нашли код для диалога редактирования календаря. Раскрывающийся выпадающий список появляется незадолго до флажка «Показать напоминания» в диалоговом окне, поэтому можно с уверенностью сказать, что они будут аналогичным образом сопоставлены в источнике - и, действительно, когда мы посмотрим на calendar-properties-dialog.xul мы видим это в строках 79-89:
<menulist id="calendar-refreshInterval-menulist" disable-with-calendar="true" label="&calendarproperties.refreshInterval.label;"> <menupopup id="calendar-refreshInterval-menupopup"> <!-- This will be filled programatically to reduce the number of needed strings --> <menuseparator id="calendar-refreshInterval-manual-separator"/> <menuitem id="calendar-refreshInterval-manual" value="0" label="&calendarproperties.refreshInterval.manual.label;"/> </menupopup> </menulist>
Да. Мы не совсем дома и сухо, потому что спецификации интервала здесь не живут. Было бы неплохо, если бы в этом комментарии было точно указано, какой исходный файл содержал код, отвечающий за заполнение параметров раскрывающегося списка, но, возможно, это что-то закаленное XUL-хакер, не нужно было бы говорить. Тем не менее, это не должно создавать слишком много осложнений; Теперь у нас есть идентификатор выпадающего меню, на которое почти наверняка будет ссылаться любой код, заполняющий выпадающий список, поэтому:
me@box [lightning] $ find -exec grep -nH 'calendar-refreshInterval-menulist' {} \; ./chrome/calendar/content/calendar/calendar-properties-dialog.js:91: let value = getElementValue("calendar-refreshInterval-menulist"); ./chrome/calendar/content/calendar/calendar-properties-dialog.js:153: let menulist = document.getElementById("calendar-refreshInterval-menulist"); ./chrome/calendar/content/calendar/calendar-properties-dialog.xul:79: <menulist id="calendar-refreshInterval-menulist"
Третье совпадение указывает на файл .xul, о котором мы уже знаем, и мы можем его игнорировать. Первое совпадение указывает на некоторый код, который получает текущее выбранное значение раскрывающегося списка, и мы можем игнорировать это. Второй матч, с другой стороны, принимает ссылку на выпадающее меню в целом, и это, наверное, то, что нам нужно. И действительно, если мы рассмотрим calendar-properties-dialog.js, в строках 154-162 мы найдем:
for each (let min in [1, 5, 15, 30, 60]) { let menuitem = createMenuItem(min); separator.parentNode.insertBefore(menuitem, separator); if (refreshInterval == min) { menulist.selectedItem = menuitem; foundValue = true; } }
И вот мы здесь! Массив значений, выраженных в минутах, которые соответствуют значениям, которые вы видите в раскрывающемся меню «Изменить календарь».
Теперь, глядя на то, как настроены эти пункты меню, кажется, что весь процесс предполагает, что они будут выражаться только в минутах (например, createMenuItem
функция, строки 137-146). Если бы мы собирались внести это изменение вверх по течению, мы определенно хотели бы изменить эту функцию, чтобы она могла создавать выпадающие элементы с метками в произвольные единицы времени, такие как «Каждые 4 часа», «Каждые 1 день» и т. д. Мы все еще можем оставить базовое представление в считанные минуты, но мы бы хотели очистить отображаемый код, чтобы он не выглядел уродливо.
Однако, поскольку все, что вам действительно нужно, - это сама функциональность, мы оставим ее привлекательной в качестве упражнения для заинтересованного читателя. Просто добавьте нужные интервалы в конец массива в строке 154, например:
for each (let min in [1, 5, 15, 30, 60, (60*4), (60*8), (60*12), (60*24)]) {
(Конечно, вы можете добавить их как 240, 480, 720 и 1440, но почему бы не позволить интерпретатору выполнить работу? Потратьте процессорное время, чтобы сэкономить время программиста. Это будет оцениваться только при открытии нового календаря и редактировании календаря диалогов, так что вы на самом деле не делаете много работы для компьютера.)
После того, как вы сохранили свои изменения и закрыли файл, остается только упаковать обновленный код Lightning и установить его в Thunderbird. Это довольно просто:
me@box [lightning] $ zip -r lightning-1.9.1-me.xpi *
(Или используйте WinZip, WinRAR и т. Д., Что у вас есть. Существенные моменты заключаются в том, что готовый ZIP-файл должен сохранять структуру каталогов и что его имя файла должно заканчиваться на .xpi - как на этапе распаковки, это может быть переименован после создания, если это необходимо.)
Затем установите только что созданный файл XPI, как и любое дополнение Thunderbird. Как только вы это сделаете и перезапустите Tbird, открытие выпадающего меню Edit Calendar приведет к следующему:
Для полноты картины я должен упомянуть, что я на самом деле не проверял, чтобы подтвердить, что календарь действительно обновляется с указанными интервалами, потому что то, что я еще не исправил, заставляет мой Thunderbird выдавать исключение, когда я выбираю вкладку Расширения в Менеджер дополнений - я создал приведенный выше снимок экрана, создав новый профиль Tbird и установив туда модифицированное дополнение Lightning.
Тем не менее, у меня нет оснований подозревать, что возникнет проблема, поскольку в коде есть только одно место, где указаны параметры длины интервала; после установки в диалоговом окне они сохраняются с данными конфигурации Thunderbird.
В связи с этим возникает вопрос: если вы знаете GUID для календарей, интервалы обновления которых вы хотите настроить, вы можете сделать это в «Редакторе конфигурации» (т.е. about: config), предлагаемом на вкладке «Дополнительно» диалогового окна «Установки» Thunderbird; измените значение calendar.registry.[guid].refreshinterval
на сколько угодно минут.
Для этого вам нужно иметь возможность привязать GUID календаря к именам, что довольно просто сделать в about: config. Если вы введете .name
в поле поиска, появится много результатов, но только некоторые из них будут принадлежать calendar.registry
группе, и все они должны быть выделены жирным шрифтом, так как они не представлены по умолчанию в Thunderbird; каждое из этих значений является именем календаря, и каждый результат, содержащий GUID календаря в имени свойства, можно тривиально сопоставить между именем и GUID. Затем введите .[guid].refreshinterval
в поле поиска, настройте значение, и все готово.
Но это неприятно, если у вас есть много календарей, и, судя по тому, что видно из списка на фоне скриншота, у вас есть значительное количество календарей, к которым можно применить это изменение - В этом случае, я думаю, что изменение диалога может облегчить вам процесс.
Тем более что вы можете скачать версию Lightning, содержащую модификации, описанные в этом посте, здесь !