ans*_*ung 5 thunderbird calendar lightning
Thunderbird/Lightning 提供 5 种不同的时间间隔来刷新远程日历,介于“每分钟”和“每 60 分钟”之间。
但是,我的工作需要我有十多个远程日历,其中大多数不会超过每周一两次。结果是,即使在最长的刷新间隔内,Thunderbird 也会花费大量时间重新下载和更新不需要更新的日历数据,并且在执行此操作时会缓慢爬行。
是否可以调整/调整 Lightning 以获得比默认允许的更长的刷新时间(例如每天一次)?

刷新间隔在 Lightning 扩展源代码中静态指定,但 Thunderbird 扩展代码全部使用 Javascript 和 XML 方言 Gecko 用于指定用户界面,因此添加您需要的任何间隔并不是特别困难。这样做的方法如下:
首先,如果您手头没有,则需要下载Lightning 安装包的副本。(以下假设为 Lightning 1.9.1;一些版本中的兴趣点可能没有太大变化,但为了获得最佳结果,请确保这是您正在使用的版本。)
一旦你拿到了 .xpi 文件,找到一个方便的空目录来解压它——XPI 安装程序只是一个重命名的 zip 文件,所以unzip,WinZip,WinRar,&c.,&c.,都可以处理它。(您可能必须先将其重命名为“.xpi.zip”,或者右键单击并“打开方式...”,具体取决于。)提取您在其中找到的所有文件,保留目录。
通常,您通常可以通过搜索出现在其中的字符串来找到处理给定对话框或其他 UI 功能的代码。在这种情况下,我搜索了“显示提醒”:
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">
Run Code Online (Sandbox Code Playgroud)
这告诉我们,除了本地化之外,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;"
Run Code Online (Sandbox Code Playgroud)
啊哈!这是在一个 .xul 文件中,所以我们知道它定义了一大块用户界面;在label=看起来像一个UI控件的标签属性,它应该意味着我们已经找到了编辑日历对话框的代码。我们所追求的下拉列表出现在对话框中“显示提醒”复选框之前不久,因此可以肯定的是,它们将同样并列在源代码中——事实上,当我们查看 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>
Run Code Online (Sandbox Code Playgroud)
呵呵。我们不是很自在和干燥,因为这里不存在间隔规范。如果该评论准确地提到哪个源文件包含负责填充下拉选项的代码,那就太好了,但也许这是一个经验丰富的 XUL 黑客不需要被告知的事情。也就是说,它不应该造成太多的复杂性。我们现在有了下拉菜单的 ID,几乎肯定会在填充下拉菜单的任何代码中引用它,因此:
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"
Run Code Online (Sandbox Code Playgroud)
第三个匹配点指向我们已经知道的 .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;
}
}
Run Code Online (Sandbox Code Playgroud)
我们来了!一组值,以分钟表示,与您在“编辑日历”下拉列表中看到的值相对应。
现在,看看这些菜单项的设置方式,整个过程似乎假设它们只会以分钟为单位表示(例如createMenuItem函数,第 137-146 行。)如果我们要向上游贡献此更改,我们肯定希望修改该函数,以便它可以以任意时间单位生成带有标签的下拉元素,例如“每 4 小时”、“每 1 天”等。我们仍然可以在几分钟内离开底层表示,但我们希望清理显示代码,使其看起来不难看。
但是,由于您真正追求的只是功能本身,因此我们将把让它变得漂亮作为练习,供感兴趣的读者使用。只需将您想要的间隔添加到第 154 行的数组末尾,例如:
for each (let min in [1, 5, 15, 30, 60, (60*4), (60*8), (60*12), (60*24)]) {
Run Code Online (Sandbox Code Playgroud)
(当然,您可以将它们添加为 240、480、720 和 1440,但为什么不让解释器来完成这项工作呢?花 CPU 时间来节省程序员的时间。这只会在您打开新日历和编辑日历时进行评估对话框,所以你并没有真正为计算机做很多工作。)
保存更改并关闭文件后,剩下的就是重新打包更新的 Lightning 代码并将其安装在 Thunderbird 中。这很简单:
me@box [lightning] $ zip -r lightning-1.9.1-me.xpi *
Run Code Online (Sandbox Code Playgroud)
(或者使用 WinZip、WinRAR 等,无论你有什么。重点是完成的 ZIP 文件必须保留目录结构,并且它的文件名必须以 .xpi 结尾——就像在解包步骤中一样,它可以是如果需要,在创建后重命名。)
然后像安装任何 Thunderbird 附加组件一样安装新创建的 XPI 文件。完成此操作并重新启动 Tbird 后,打开“编辑日历”下拉列表将生成以下内容:

为了完整起见,我必须提到我还没有实际测试以确认日历实际上按照给定的间隔刷新,因为我还没有修复的一些事情是当我选择扩展选项卡时,我的 Thunderbird 抛出异常附加组件管理器——我通过创建一个新的 Tbird 配置文件并在那里安装修改后的 Lightning 附加组件来生成上面的屏幕截图。
也就是说,我没有理由怀疑会有问题,因为代码中只有一个地方指定了间隔长度选项;一旦在对话框中设置,它们就会与 Thunderbird 配置数据一起存储。
这提出了一个观点:如果您知道要自定义其刷新间隔的日历的 GUID,您可以在 Thunderbird 的“首选项”对话框的“高级”选项卡中提供的“配置编辑器”(即 about:config)中执行此操作;将 的值更改为calendar.registry.[guid].refreshinterval您喜欢的分钟数。
为此,您确实需要能够将日历 GUID 映射到名称,这可以在 about:config 中非常简单地完成。如果你.name在搜索框中输入,会出现很多结果,但只有少数属于该calendar.registry组,所有这些都应该加粗,因为它们在 Thunderbird 中默认不存在;这些值中的每一个都是日历名称,并且每个结果在属性名称中包含日历 GUID,您可以轻松地构建名称和 GUID 之间的映射。然后.[guid].refreshinterval在搜索框中键入,自定义值,然后就完成了。
但是,如果您有许多日历要处理,那么这会让人头疼,并且根据屏幕截图背景中列表的可见内容来判断,您有相当数量的日历可以应用此更改 - 即在这种情况下,我认为对话更改可能会让您更轻松。
特别是因为您可以下载一个版本的 Lightning,其中包含本文中描述的修改,请点击此处!
| 归档时间: |
|
| 查看次数: |
3555 次 |
| 最近记录: |