显示标签为“mozilla”的博文。显示所有博文
显示标签为“mozilla”的博文。显示所有博文

2008年11月16日星期日

用SciTE作为XUL的入门开发工具

开发XUL应该有这么几种情况:
  1. 开始学习XUL,试验各种控件、XPCOM,不会涉及到chrome包。这种情况下只需要编辑XUL 和JavaScript,并能够预览就差不多了,能支持调试更好
  2. 开发Firefox/Thunderbird扩展,这种情况下打包、部署、调试都是必须的,有用于创建扩展的向导更好
  3. 开发独立的XULRunner应用程序,当然也需要跟2差不多的功能,但模式有些不同
  4. 开发Remote XUL应用,这个比较少见,可以忽略
综合一下我们需要的功能:
  • XUL编辑器。基本的需求是一个XML编辑器,能够支持语法高亮、基本的well-formed检查(或者结构树、代码折叠等方式可以辅助发现XML错误)。高级一点的需求是能够提供XUL widget的代码完成,能够支持DTD entity自动完成,能够支持内嵌JavaScript的编辑
  • JavaScript编辑器。基本的需求也简单。高级的需求是能识别xpcom组件,从而显示里面的方法
  • 部署
  • XPCOM组件浏览器
  • JavaScript Debugger
  • DOM Inspector
  • Chrome包结构浏览器,能够查看有哪些包能加载进来了。如果能识别overlay就更好了。(chrome list)
目前我还在第一个阶段,试验了一些工具,觉得都不爽,最终还是用SciTE

2007年10月14日星期日

Mozilla XUL Links 2007-10-14

Mozilla 2早就提出来了,每个人都有很多想法,期望能够摆脱老版本中一些不太优雅的设计与实现。
到底thundirdbird后续会怎样,现在说法很多,闹不清楚。

2007年9月27日星期四

几个不错的Thunderbird扩展

用Thunderbird大半年了,也一直没怎么用扩展,除了Remove Duplicate Messages,因为我的邮件是几个地址汇总过来的,总存在重复。

前几天在它的扩展库里面逛了一下,发现以下几个不错:
ThunderBrowse: 在Thunderbird中直接浏览网页
Tag the Bird: 给邮件添加标签
MessageFaces: 显示Face/XFace头像
Colored Diffs: 采用彩色显示补丁,并且可以转换成unified, side-by-side等几种方式显示
Quote Colors: 邮件中引用的部分采用不同的风格来显示(不过好像不能象Claws Mail那样自己定义哪些字符是引文字符,虽然常用的是'>'和'|'
XNote: TB支持给邮件添加标签(tag),但如果想添加一些注释,就得需要XNote这类扩展了。虽然很多扩展都是这个功能,但好像只有XNote可用于TB2

2007年9月10日星期一

Mozilla/XUL Links 2007-09-10

  • CoScripter: 一个网页自动化工具(Firefox扩展),由IBM的人折腾出来的,
  • Penelope: 著名的老牌邮件客户端Eudora关闭之后,有人想将一些功能重新在Thunderbird上实现,并模拟Eudora的观感和操作方式。
  • Open Komono: ActiveState公司决定将Komodo的一部分开放,成为Open Komodo项目。Planet Mozilla上不少人觉得这对XUL IDE是个不错的消息(链接1, 2)。至少,俺一直想把Komodo里面的编辑器(基于scintilla做的浏览器插件)移植到XUL Explorer上来用。
  • XUL activities in France

2007年8月28日星期二

Mozilla/XUL Links 2007-08-28


Google Search (xul version)

在侧边栏打开这个地址效果不错

IBM developerWorks : Blogs : Bring information and collaboration into the context of your daily business processes using composite applications

一篇blog,讲述在Lotus Notes 8 (现在是基于Eclipse的了)中如何嵌入XULRunner来显示一个XUL应用,从而形成Composite Application

XUL Explorer 0.7
近来试验了一些XUL IDE的半成品,这个东西的主要长处在于可以预览XUL,而且支持简单调试。新版本0.7相对0.4改动不大,主要是为一个XUL文件可以提供一个chrome环境了(但这个功能很有用,因为一般xul文件都不是独立的,给定一个chrome环境后overlay和dtd都可以正常加载进来了,这样预览才比较接近最后的效果)。如果完全要手工编写xul以及js,我觉得Spket还不错,里面还有Firefox 1.5和2.0的XPCOM接口列表。


2007年8月26日星期日

XUL是如何传递事件源和参数的

代码这个东西就是这样,你一路看下来,挺好懂的,没啥稀奇,但一旦自己写起来,就觉得好多细节搞不清楚了。我在试验XUL的时候碰到一个典型的这样的问题:多个控件的onclick事件可以绑到同一个javascript函数,但它怎么识别是那个控件触发了这个事件呢? 怎么传递点击的位置呢?如果传递多个参数的话,控件触发事件的代码要分开写么?

查了一下DOM Level 2 Event Model规范(mozilla.org上说明),发现HTML/XUL里面是传递了一个event对象来解决这个问题,这个对象有很多属性,但不是每次这个对象里面所有属性都有所用:event.target表示触发事件的对象,event.clienX是点击事件中的点击位置,event.keyCode是按键事件中的键码。

2007年8月2日星期四

做了个xulplanet的镜像chm

最近研究Mozilla XUL, 发现老是要到Mozilla Developer Center, Mozilla Wiki, XULPlanet这几个网站查阅文档,今天干脆用Teleport Pro拉了它们的镜像下来。考虑到小文件比较占空间,而且没有索引,于是想把它们进一步做成CHM。

首先搞定的是XULPlanet:
http://bamanzi.inlsd.org/xul/xulplanet.chm



写了一个小的Python脚本(html2hhk.py),把所有的XUL Element属性/方法、XPCOM组件/接口都搜了出来转换为CHM的索引(其实这个脚本的功能是读出HTML的title和keywords meta tag作为关键字,改一改也可以输出devhelp的keyword列表)。

这个CHM文件还有些问题:
1. 目录还没有做,至少一些大的分类得列上去吧,这个东西好像没有什么简单方法;
2. 内容部分每页左边都有一个侧栏,供导航用的,这个东西在CHM里面没有作用,得用sed什么的批量处理一下。

2007年8月1日星期三

Google Talk in sidebar!


在网上搜索"Firefox sidebar"相关资料时,发现了这个。
  1. http://talkgadget.google.com/talkgadget/client 添加为书签,注意选中”在侧栏打开此书签“
  2. 点击此书签,当当!

2007年7月31日星期二

Rich Internet Application? Rich Client?

最近在网上查资料,被Rich Client(富客户端)和Rich Internet Application两个概念搞得头晕。虽然名词都是“相”,但大家约定清楚交流起来容易一些:-)。仔细研究一番之后,得出结论如下:
  • RIA在界面交互性上比简单的Web应用当然要强,界面表现能力也要丰富(这才所谓rich嘛)。但RIA强调“零安装”,界面和逻辑都是临时从服务器取得,已避免部署、升级方面的麻烦(从这个角度说,RIA更接近Thin Client)。但。大部分RIA技术都依托Web,在浏览器中实现(所以也常常被称为rich web application),但可能需要安装一个运行库/解释器。目前的选择大致有Ajax, XForms, Flash(Apollo, Flex或者Laszlo)、SilverLight(WPF/E),另外ActiveX和java applet好像也算。
  • Eclipse整天嚷嚷的副客户端(Rich Client),似乎跟以前说的胖客户端(fat client)并没有太大的不同,要求安装很大一堆东西。只是现在大家都更加注重用户体验、模块化和快速开发。目前的选择有Eclipse RCP, WPF(XAML), Mozilla XUL, JavaFX这些。这里出现的两个趋势是尽量简化界面的生成(比如用XML等结构化文件来描述界面)和采用脚本来编写逻辑(比如XAML, XUL, JavaFX等).
不过网上很多文章谈到rich client时,可能还是关注在“用户体验”的丰富性上。所以才会有“OpenLaszlo 是一种富客户机应用程序架构"、“Flash成web浏览器标准, 富客户端指日可待”这样一些说法。

其实Mozilla XUL完全满足两方面的要求,大家常用的Firefox, Thunderbird等可以类比为rich client, 而网站上直接提供XUL则就是RIA了。
例如: Mozilla Amazon Browser, 如果你把它安装为一个Firefox插件或者独立程序,它可能又算一个rich client了。
再例如htmlhelp.dotsrc.org提供的API浏览器, 左边是一个XUL编写的导航栏,比如Python, GTK+

链接:

2007年7月30日星期一

Document Map in Firefox

浏览网站碰到比较长的网页时,总是想起dillo里面那个文档结构图菜单,它会把网页中的h1 - h6等heading搜索出来列在菜单上,你选一个就跳过去了,不必要网页作者在网页上自己做一个"目录"。

在Firefox Add-ons里面搜索了一下,找到了 Document Map这个插件(screenshot),它提供类似的功能,只不过是采用sidebar来做的。

2007年7月4日星期三

Firefox扩展实例分析: IETab (2)

接下来的问题就是: Firefox里面的每个Tab页都是一个browser对象,里面显示网页,是调用Gecko来显示的,XUL的overlay对这个没有作用,怎么把这个object标签塞进去?即使想用xbl,也得有个可以让我们重新绑定的tag啊。

IETab是这样解决这个问题的: 将这个object标签写入一个HTML文件 chrome://ietab/content/reloaded.html, Tab中加载这个网页(其实XUL里面也是可以直接采用HTML标签的,因为都是Gecko来进行显示,所以这个browser显示一个XUL或者HTML都可以)。

如果采用IETab浏览http://www.microsoft.com,对于Firefox而言这个Tab页面的URL实际 是: chrome://ietab/content/reloaded.html?url=http://www.microsoft.com。前面那个 reloaded.html这个中又有一段脚本,在window.onpageshow中将上述网址中的url参数解析出来,传给里面嵌入的IE object:
function init() {
  var m=/(\?url=)(\S+)$/.exec(document.location.href);
if(m) document.getElementById("IETab").navigate(decodeURI(m[2]));
}

window.onpageshow=function(e){if(e.persisted)window.setTimeout(init,0);}
也许有朋友会问: 怎么在Firefox地址栏显示的是http://www.microsoft.com而不是前面说的那个chrome://...呢?看看ietabOverlay.js就 明白了: 它把browser的currentURI属性的获取方法给动态替换了(见 hookBrowserGetter和getCurrentIeTabURI函数),为了完备还把urlbar的value属性获取方法、browser 的sessionHistory等给替换了。这种用法以前俺倒是没有见过,算是又学了一招,不过IETab的这种做法不是很可靠,很容易失效。

2007年7月1日星期日

Firefox扩展实例分析: IETab (1)

IETab是大家在Windows下常用的Firefox扩展之一,用它可以浏览那些费用IE不可的网页。

大概浏览了一下IETab扩展的文件列表,没几个文件,以为这个插件比较简单,也就是嵌入了一个IE的ActiveX进来,再处理一下对应的命令等。

但仔细琢磨一下就发现没有那么简单,怎么嵌入一个IE进去?看了这么久的XUL相关资料,都没有看到哪里讲解当“控件”不够用时应该怎么办,得改Gecko的源代码?

查看IETab发现它采用的是另外一条思路: 将IE的ActiveX控件包装成一个插件,跟Flash等插件一样,采用HTML的object标签嵌入。
object id="IETab" type="application/ietab" style="width: 100%; height: 100%;"
跟IE里面广泛使用的ActiveX不一样,这里这种插件是采用原来netscape定义的NPAPI接口与浏览器打交道的,这个API接口是cross-browser的(倒是IE 5.5之后似乎不再支持这个API接口,你得用另一个ActiveX控件来增加NSAPI支持,这跟Firefox上的npActiveXPlugin恰好相反,后者是用NPAPI包装了一个ActiveX容器,使得ActiveX控件可以在Firefox中使用)。

这个npietab.dll插件对外提供了navigate(), goBack()/goForward(), refresh(), stop(), saveAs()等方法和title, url等属性(详见nsIIeTabPlugin.idl),基本上都是原来IE控件相应功能的一个包装(详见nsScriptablePeer.cpp文件),只是为了可以在Firefox中可以再访问这些接口(那么npActiveXPlugin对外提供那些接口呢?不同的ActiveX有不同的功能接口,npActiveXPlugin怎么就能通用于各个ActiveX呢?难道它目前没有提供可脚本化scriptability的能力? 没源代码就是不一样,琢磨起来比较费劲)

2007年6月30日星期六

ActiveState出了个Komodo Edit


估计是为了给Komodo IDE增加一些影响力,ActiveState又推出了一个Komodo Edit,是免费的,但只有代码编辑(带calltip、语法检查)和工程管理功能,没有IDE里面调试、版本管理集成、交互Shell等功能。

但这个Komodo Edit的功能点上来说,没有太大吸引力,现在有很多功能比它强的编辑器,并且不需要30多M的安装包。

我对这个东西有兴趣只是因为通过装一个来看看它是怎么通过扩展Mozilla来实现这些功能的,比如ActiveState开发了PyXPCOM,使得大家也可以采用Python来编写XPCOM Components了。

2007年5月30日星期三

Eclipse 里面集成Mozilla


(本图片摘自Ajax Toolkit Framework Tools in Eclipse幻灯片, 作者Philippe Ombredanne)

在公司论坛上看见有人又再问有没有新版本的Eclipse,也总有热心的人共享出来,俺对这个东西不太感冒,虽然这个东西被称为RCP的热门首选,但考虑到Java程序的内存占用,俺还是觉得不太适合我们。不过还是翻了一下3.3版本的新功能说明,里面倒是有一点吸引了我(后来发现该说明不是官方的,而是来自“Eclipse在做什么"这篇网上日志):
忘了提Eclipse 3.3的又一大特性了,叫做“Moziila Everywhere”,是指在任何平台上都可以创建一个Browser控件但是使用Mozilla内核(及时该平台上没有安装Firefox)。这是怎 么实现的呢?其实很简单,它要求你必须安装一个xulrunner,后者是Mozilla的全部内核,包括Gecko布局引擎、Javascript解析 引擎、XUL解析引擎和XPCOM,其中每样东西都足够写一本书,有了这些,仅用XUL+Javascript就可以写出一个Firefox来, Eclipse洽是利用了这个特性,用Java连接XPCOM所以创建了一个Mozilla的Browser,但是没有任何行为,包括右键菜单。

这 个Browser控件和缺省的Browser控件是不一样的,我们平时见到的缺省Browser控件,在Windows上用的是IE内核,在MacOSX 上用的是Safari,在Linux上。。。不知道,所以它是最最简单的浏览器,不具备任何可以定制的功能,除了显示一张HTML页面外,没有任何用处。 (你该不会想用Eclipse写一个傲游出来吧)

但是Mozilla内核的浏览器控件就不同了,它意味着如果程序员平时为Firefox 写插件的形式,也可以被应用到RCP应用程序上来,设想一下我们拥有一个RCP+xulrunner的平台吧,RCP接收Java扩展, xulrunner接收xul和javascript扩展,那我们的平台——要么叫Fireclipse,要么叫Eclifox——就所向披靡了。即使不 利用它的可扩展性,单单就是能保证在不同平台上提供对Web应用程序的一致性展现一条,就足够臭美的了,更可以用写Eclipse插件的形式来限定浏览器 的行为。。。。。。唉,刚才是不是说过一个NetBeans in Eclipse啊?把那玩意扔了吧~~
如果现在整个Mozilla能嵌进去,并且能够通过JavaXPCOM交互,那就非常爽了:我们的用户很期望将他们开发的工具集成起来,一直也期望我们这边能够提供一个平台,毕竟现在我们已经有数据管理这一部分了,但我们一直没有一个好的思路,Mozilla XUL/XPCOM是近期考虑的一个方向;另外一些用户又期望将平台搭建到Eclipse平台,毕竟现在这上面的东西已经有非常多了,可以很好地利用一下。

现在既然这两块能够集成到一起,那么我们这边用Mozilla XUL/XPCOM来构建,他们想用Eclipse的就用,不想用的也可以直接用XUL和XPCOM。哈哈。

BTW: 晚上试验了一下,可以将Mozilla(具体说是XUL Runner)嵌入到一个SWT程序中去,成为一个Web Browser, 但还没试验成功如何显示一个XUL界面(也许是我没搞对chrome地址)。

参考:

2007年5月27日星期日

Mozilla XUL IDE?

在学习研究Mozilla XUL的过程中,觉得对于开发人员而言,最大的麻烦就是一切都得手工进行,缺乏一个集成开发环境。也许这是Mozilla XUL技术目前相对SilverLight(WPF/E), Apollo而言最大的一个障碍(微软总结经验说:你得先抓住开发人员的心)。

但我们也不是啥都没有:
  • 如何知道每个XUL element有哪些属性、哪些事件? XUL Element Reference已经有了,不过这只是文档,查起来效率也够差的。 DOM Inspector可以提供一些信息,但还不是一个好的设计工具(对比GTK+ Glade或者Delphi的Object Inspector看看);
  • 如何知道目前有哪些XPCOM组件可用? 每个组件又都有哪些接口?XPCOM Component Viewer(mozilla版本, firefox版本)可以部分解决这个问题,只是目前没法看到接口中每个方法/属性的说明(好像也没有看到一个类似的reference文档);
  • 如何调试程序? JavaScript Debugger和JavaScript Console倒基本可以满足需要;
  • 对于网页内容部分,Web Developer够强了
  • 所见即所得(WYGWYS)的UI设计器?嗯,这块还没有。
前面一段时间Mozilla社区一直在争论XULRunner的发展方向, 是只需要满足Firefox 3的需要呢,还是尽力将其发展成为一个通用的应用程序运行环境?现在似乎大家达成一致了:当然是后者。(其实这个目标是大家都渴望的,争论的中心在于做一个通用的运行环境的话,就得保证XULRunner对多个程序的兼容性,这涉及到向前兼容性、API冻结等等,势必拖累Firefox 3对XPFE的改造。于是有人又担心错过目前这个时机,Firefox的风头又被IE8抢过,那有可能我们什么都没有了)

目标一致了,那就开始努力吧。今天在mozpad上看到了关于Mozilla IDE的计划:
Gather initial requirements for a Mozilla IDE. A future goal might be to form a project for specifying and then developing the IDE. This should probably be based on the work being done by Paul Rouget (Codeeditor), Alex Vincent (Verbosio) and/or Mark Finkle (XULExplorer).
这三个工具都很有特色,如果把它们结合到一起(XUL Explorer现在已经把DOM Inspector和Verkman JavaScript Debugger结合进去了),前景很不错。看来Mozilla IDE离我们不远了。

2007年5月20日星期日

Firefox扩展实例分析: Paste and Go 2(续)

* 命令与事件
mozilla里面的事件处理完全采用了生产 者-消费者(广播-观察)模型,这使得一个事件发生时(一个命令被执行,或者一个控件的某种状态发生改变),响应可以有多个。

比如这个插件里pg2-go-command和pg2-search- command两个命令是否disabled,是由被观察 (observes)的pg2-pastable-broadcaster来决定的,而这个broadcaster的状态改变又是检查cmd_paste 这个内置命令的状态来改变的,这个检查的时机是在地址栏(urlbar)的右键菜单显示或者隐藏时(见content/pasteandgo2.js):

 const CmdBroadcasterId = "pg2-pastable-broadcaster";

this.pgUrlbar = document.getElementById("urlbar");

this.pgUrlbar.addEventListener("popupshowing", pgInstallGo, false);
this.pgUrlbar.addEventListener("popuphiding", this.enableCmds, false);

this.nativePasteCmd = document.getElementById("cmd_paste");
this.cmdBroadcaster = document.getElementById(CmdBroadcasterId);

var isPasteDisabled = pgPrefsObserver.nativePasteCmd.getAttribute('disabled');
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', isPasteDisabled);

enableCmds: function(event) {
pgPrefsObserver.cmdBroadcaster.setAttribute('disabled', 'false');
}
* 偏好(preference)
与简单的GUI toolkit不同的是,Mozilla/XUL平台对于偏好(preference)数据考虑比较周全,比如偏好如何存储,如何处理用户设置与系统默认值,扩展如何扩充偏好项目,偏好数据改变(比如直接修改)如何让界面得到相应改变等等。

在Paste and Go 2的代码content/options.xul中, 我们还可以看到另一方面支持: 将一个偏好选项绑定到一个界面控件上,界面初始化时,可自动从偏好数据设置控件的值; 界面控件的值改变时,偏好数据也就变了,不用自己再费很多劲自己写脚本读写数据(想想我们很多时候写程序非常不情愿写个”选项“对话框,这算其中一个主要 原因)。



怎么样,很省事吧?MFC里面的DDX跟这个有点类似,但只能变量与控件值绑定这一步,缺乏将数据持久化 (persistence)功能。

Firefox扩展实例分析: Paste and Go 2

先看一个简单的插件Paste and Go 2,它的功能是:如果剪贴板有一个URL,那么它允许我们只通过一个操作直接转到那个网站去,而不是先在地址栏目粘贴再点击Go按钮; 对于搜索栏也有类似的功能。

它的源代码可以直接通过网页查看: http://www.mozdev.org/source/browse/pasteandgo2/src/

* Overlay
一般而言,XUL overlay文件是个不错的入口,通过它我们可以比较容易知道这个插件扩展了哪些界面元素,然后再根据界面元素去看其对应的代码。

于是我们先看content/pasteandgo2Overlay.xul


这里定义了这个插件的stringbundle, key, command, broadcaster以及firefox特有的toolbarpalette配置。快捷键、命令这些都不是界面控件,但却是一个GUI程序所不可缺少的元素,mozilla/xul把这些功能都拆分了,可以通过overlay来添加和扩展,相当方便。

* 通过脚本动态创建界面元素
但这里没有见到右键点击地址栏时出现的那个Paste and Go菜单项,它是通过脚本content/pasteandgo2.js动态添加的(因为有个添加到"粘贴"后面还是菜单最后的选项):
 function pgInstallMenuItem(e, aID, aLabel, aCommand, aAccesskey) {

item = document.createElement("menuitem");
item.setAttribute("id", aID);
item.setAttribute("label", aLabel);
item.setAttribute("command", aCommand);
item.setAttribute("accesskey", aAccesskey);

if (pgPrefsObserver.pgPlaceAtBottom) { // place at bottom
menu.appendChild(item);
} else { // else place next to paste
var items = menu.childNodes;
for (var i=items.length-1; i >= 0; i--) {
var targetCmd = items[i].getAttribute("cmd");
if(targetCmd == "cmd_paste") { // find out paste
menu.insertBefore(item, items[i+1]);
break;
}
}
}
}

这就是mozilla/xul相当方便的一个地方: 通过脚本可以动态地创建、删除界面元素或者设置它们的属性,并且代码相当简洁直观。

2007年5月18日星期五

Mozilla的可扩展性(开篇?)

本来我是很少买《程序员》杂志的,主要是能力有限,大都看不懂:-(,所以一向只是在书店里站着翻翻,免得买回去占地方。不过第五期上面居然有一篇《Mozilla的架构设计》,Mozilla的中文文章向来比较少,难得有人肯研究这个啊。于是就买了一本,没想到文章看完,发现居然是absurd写的,呵呵,也是,还能有谁。

开始是被firefox的扩展所吸引,加上工作上也需要类似地扩展能力,于是从去年底开始看一些mozilla/xul方面的资料,慢慢地发现了xul, xbl, xpcom的魅力,于是打算系统地学习一下。
  • 春节前后把Creating Applications With Mozilla这本书草草看了一遍,有了大致的了解;
  • 通过limodou的学习笔记将XUL Tutorial看了一遍(英文原文在MDCXUL Planet上都有),好在有他的帖子啊,否则RDF这个东西看英文还真头大;
  • Rapid Application Development with Mozilla 是第二本关于Mozilla开发的书,曾在amazon上获得五颗星的评价(可惜作者过世了,再也没有第二版)。我看了几章,感觉细节讲得比较多,而且很多地方会用类比的方式来讲解为什么要这样设计,不是太适合初学,尤其是英文不太好的朋友很难抓住重点。这本书的PDF版本可以从这里下载到。
absurd是从mozilla的核心代码角度入手来分析的,但我的习惯是从功能应用的角度来入手,可能是跟我的阅读代码的能力比较差有关:-(。而且我目前主要关心的是这个平台怎么就能够方便地扩充功能。我打算近期从一些Firefox扩展入手,来分析一下mozilla/xul的可扩展性。尽量选取一些在扩展性上有代表性的扩展。

先概括地介绍一下mozilla/xul的扩展能力:
  • 通过overlay技术可以对一个已有界面进行重新定义,这也使得对于一个界面可以先写一个框架,再用overlay来逐步细化;
  • 每个窗口的界面元素也有一个DOM结构,完全可以通过脚本来操纵它,修改其属性,甚至动态地创建和删除控件;
  • 可以用XBL来绑定一组XUL元素组成,对行为和风格也可以包装,更方便复用;
  • 可以自己来写xpcom组件(components)来扩展一些功能,尤其是与操作系统或者外部程序交互的地方,这些控件注册后就可以在脚本中使用;甚至可以用javascript来写组件

2007年4月24日星期二

firefox两个设置问题

Browser.backspace_action
0: Backspace历史记录中前一网页, Shift-Backspace后一网页
1: Backspace向上一页 Shift-Backspace向下一页

Browser.tabs.closeButtons
0: 只在激活的tab上有关闭按钮
1: 在所有tab上有关闭按钮
2: 没有关闭按钮
3: 只在最后有一个关闭按钮,用于关闭当前激活tab (firefox 1.x行为)

2006年12月27日星期三

claws-mail vs thunderbird(3): 快捷键设置

claws-mail/sylpheed-claws利用了gtk提供的一个很好的特性: 将焦点移动到一个菜单项上,按下一个键,这个键就成了这个菜单项的快捷键(accelerator)。按Del键就可以删除这个快捷键

gtk程序可以设置~/.gtkrc-2.0文件获得这个功能:
gtk-can-change-accels = 1

GNOME程序可在gconf-editor中钩选如下选项
/desktop/gnome/interface/can-change-accels

但有些应用程序(比如claws-mail)不想依赖这些设置,自己打开了这个功能:
   gtk_settings_set_long_property(gtk_settings_get_default(),
"gtk-can-change-accels",
(glong)TRUE, "XProperty");

可惜thunderbird/icedove没有这个功能,也没有其它的设置快捷键的功能:-(