Интервалы обновления статически указываются в исходном коде расширения Lightning, но код расширения Thunderbird полностью представлен на Javascript, а диалект XML используется Gecko для определения пользовательских интерфейсов, поэтому добавить особые интервалы вам не составит особого труда. Вот как вы это делаете:
Во-первых, если у вас его еще нет, вам необходимо загрузить копию установочного пакета Lightning. (Далее предполагается, что Lightning 1.9.1; интересующие объекты, вероятно, не сильно изменились в нескольких версиях, но для достижения наилучших результатов убедитесь, что это версия, с которой вы работаете.)
Когда у вас есть файл .xpi, найдите удобный, в противном случае пустой каталог, в который его можно разархивировать - установщик XPI - это просто переименованный файл zip, поэтому unzip
, WinZip, WinRar и т.д. Можно все справляются. (Возможно, вам придется сначала переименовать его в «.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=
выглядит как атрибут label для элемента управления пользовательского интерфейса, что должно означать, что мы нашли код для диалога Edit Calendar. Раскрывающийся выпадающий список появляется незадолго до флажка "Показать напоминания" в диалоговом окне, поэтому можно с уверенностью сказать, что они будут аналогичным образом сопоставлены в источнике - и, действительно, когда мы посмотрим на 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, содержащую модификации, описанные в этом посте, здесь !