XUL窗口创建和事件处理
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
窗口创建
1. 对于提示窗口,像javascript中的alert/confirm等函数所打开的。其过程如下:nsPromptService::DoDialog->nsWindowWatcher::OpenWindow->nsXULWindow::ShowModal。如果想要定制提示窗口的行为,比如在命令行下提示,可以重新实现nsIPromptService2/nsPIPromptService接口。
2. 对于正常窗口,其创建过程如下:nsWindowWatcher::OpenWindow->WindowCreator::CreateChromeWindow2->nsWindowConstructor。
窗口关闭
1. 在javascript中调用close函数关闭窗口。
2. 经XPConnect调用nsGlobalWindow::Close。
3. nsGlobalWindow::Close调用nsGlobalWindow::ReallyCloseWindow去关闭窗口。
事件注册
1. 在XUL文档解析完成之后,nsXULDocument::PrepareToWalk去创建所有的nsXULElement。
2. nsXULElement::Create调用nsXULElement::AddScriptEventListener去注册事件处理函数。
3. nsXULElement::AddScriptEventListener调用nsEventListenerManager:: AddScriptEventListener去注册事件处理函数。
4. nsEventListenerManager::AddScriptEventListener经nsJSContext,最终调用NS_NewJSEventListener去把javascript事件处理函数包装成nsIDOMEventListener,并注册到nsEventListenerManager中。
事件分发
1. nsWindow.cpp 中的xxx_event_cb之类的函数把GTK+的事件转发给nsWindow::OnXxxEvent函数。
2. nsCommonWidget::DispatchEvent把事件转发View注册的回调函数HandleEvent。
3. nsView.cpp: HandleEvent通过事件的Widget找到当前的View,再找到对应的ViewManager,然后通过nsViewManager::DispatchEvent分发消息。
4. nsViewManager通过PresShell把消息转发到对应的nsXULElement。
5. nsXULElement通过nsEventListenerManager把消息转发到nsJSEventListener。
6. nsJSEventListener::HandleEvent再经javascript解释器调用javascript的事件处理函数。
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=891