桌面应用框架 OneRing
框架目标
OneRing是一个跨平台的桌面应用框架。和Adobe AIR类似,它支持用html/js/css制作用户界面,与之不同的是,它的应用为本地程序,可以直接访问操作系统的数据。
架构
一个OneRing应用程序分为两个部分:框架部分和应用部分。
框架部分
框架部分为通用框架,各应用都一样。其提供各操作系统上的界面展现,为本地窗口内嵌一个WebKit浏览器,并提供一致的js接口让应用和操作系统功能进行交互。
框架以运行时库的形式提供。
框架以系统原生语言编写,提供其他语言的绑定。
应用部分
应用部分为一个web server,负责应用逻辑,用html/css描述界面,用js提供用户交互。
运行流程
- 应用启动时,会加载框架的运行时库,注册应用url的访问方法(如WSGI),并调用框架的loop函数。
- loop函数会访问应用的 /init URL,得到一个json数据,描述初始应用窗口的相关参数,如位置、大小、窗口属性、初始页面url等。
- 框架根据该数据创建窗口,并让该窗口内的浏览器访问初始页面url,渲染用户界面,然后等待UI事件。
- 用户在界面上操作时,可以通过超链接改变整个窗口内容,也可以使用AJAX技术更新窗口内部分内容。
- 应用可以让浏览器调用ONERING名字空间下的js函数,和操作系统进行交互,该名字空间由url onering://onering/onering.js 加载。
- 应用通过 bind(event, function) 函数监听窗口更改大小、移动等操作系统UI事件。
- 可以使用pub/sub机制主动推送消息给浏览器。
- 调用 ONERING.exit() 可以退出应用;所有窗口都关闭后也会退出应用。
Python应用示例
#!/usr/bin/env python
import json
import web
import onering urls =(
'/init','init',
'/','index',
) class init:
def GET(self):
web.header('Content-Type','application/json')
return json.dumps({'width':400,'height':300,'url':'/'}) class index:
def GET(self):
web.header('Content-Type','text/html')
return"""<html>
<head><script type="text/javascript" src="onering://onering/onering.js"></script></head>
<body>
<p>Hello, world!</p>
<button onclick="javascript:ONERING.exit()">Exit</button>
</body></html>""" app = web.application(urls, globals()) if __name__ == '__main__':
onering.register_wsgi_app("demo", app.wsgifunc())
onering.loop("demo")
各组件之间的交互
一个OneRing应用中,存在三个需要互相通讯的组件:
- 操作系统 OS ,控制窗口行为(如最小化窗口),及操作系统相关界面元素(如系统通知图标)
- 运行在WebKit内的javascript,控制界面内元素(如程序界面里的按钮)
- WSGI应用,控制HTML/JS的生成逻辑,以及应用相关的后台逻辑
js -> os
当js需要通知os对js所在窗口做某个行为(如最小化),通过调用 onering.js 中的get_current_window()返回值(为Window对象)的相应方法实现:
var current_window = ONERING.get_current_window();
current_window.minimize();
当js需要os执行整个应用层面的操作时(如结束应用),通过调用 onering.js 中的函数实现:
ONERING.exit();
当js需要os创建一个新窗口时,通过调用createWindow函数实现,并获得新建窗体的句柄实例:
new_window = ONERING.createWindow('/a_dialog',400,300);
当js需要向另一个窗口做某个os行为时(如隐藏另一个窗口),通过调用窗体的句柄实例的方法实现:
new_window.hide();
os -> js
js可以通过bind机制,关注操作系统发生的时间(如窗口大小改变):
current_window.bind('resize',function(event){
if(event.width <300){
$('#sidebar').hide();
}
});
js -> app
js可以通过类AJAX调用,从app获取数据。
ONERING.getJSON('/userdata.json',function(data){
...
});
app -> js
app希望向窗体内的js主动推送消息时,可以采用pub/sub机制。
首先js通知框架自己关注的事件:
current_window.subscribe("a_file_scanned",function(fileinfo){
...
});
然后当app希望发送消息时,调用onering框架提供的publish方法:
for fileinfo in scan_files():
onering.publish("a_file_scanned", fileinfo);
其中的fileinfo为可以转化为JSON的python对象(即 json.dumps(fileinfo) 不会抛出异常)。
桌面应用框架 OneRing的更多相关文章
- Web桌面应用框架2:著名的WEB桌面应用分析
前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是 ...
- Web桌面应用框架3:Web桌面应用开发的N种Style
研究Web桌面应用开发有一段时间了,总结了Web桌面应用开发的一些主流方式. 一.前端Style 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效.著名的框架就是Electr ...
- 跨平台桌面程序框架Electron
https://www.npmjs.com/ js库
- 用Web技术开发客户端(一)
http://www.cnblogs.com/lefan/archive/2012/12/27/2836400.html 范怀宇(@duguguiyu)分享了<豌豆荚2.0重构时遇到的坑> ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- web桌面程序之图标拖动排序的分析
在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...
- HTML5和Web Apps框架和方法
单页: 1jQuery Mobile 该框架以其基于AJAX的导航系统和可使用主题的ThemeRoller设计而闻名.支持Android,ios,Windows Phone,webOs等.编程模式为C ...
- 桌面环境与桌面搜索Desktop Search tools
最近一段时间工作重心都将放在Linux下Desktop search(桌面搜索)框架的研发上.因此对desktop search进行了初步的调研.本文将从下面三个方面展开: Linux桌面环境(Des ...
随机推荐
- Qt核心剖析:信息隐藏(三篇)
http://devbean.blog.51cto.com/448512/335550 http://devbean.blog.51cto.com/448512/325581 http://devbe ...
- 实战 iTextSharp
原文 实战 iTextSharp iTextSharp 是用来生成 PDF 的一个组件,在 1998 年夏天的时候,Bruno Lowagie ,iText 的创作者,参与了学校的一个项目,当时使用 ...
- 解决yum升级的问题“There was a problem importing one of the Python modules”
yum命令升级的时候,报出这个错误. There was a problem importing one of the Python modules required to run yum. The ...
- SSH框架之Hibernate(1)——映射关系
ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想 ...
- 宽屏手机显示9.png的图片拉伸不均衡
制作的一个.9的背景图片,在一般的480宽的手机上显示没有问题,正常拉伸,用三星的一个宽屏手机测试时,没有完全拉伸,一边拉伸多一点,一边拉伸少一点 决绝办法:就是在制作.9的时候,我在横向拉伸的地方, ...
- PHP - Windows安装Pear
1. 打开命令窗口,切换到php的安装目录,执行以下命令(你也可以添加一个php的环境变量,就不用如此麻烦的切换目录,但是我安装了多个版本的php,所以就没有添加环境变量). 2. 当出现下面这句话时 ...
- 在MySql中实现MemberShip的权限管理
步骤: 1.在MySql种创建一个数据库,名称任意取,我们只是要得到一个空的数据库,我们假设这个数据库的名称为authentication. 2.在VS种创建一个Web应用程序,File——new—— ...
- []: secureCRT连接ubuntu问题- The remote system refused the connection
secureCRT连接ubuntu问题- The remote system refused the connection http://jxyang.iteye.com/blog/1484915 解 ...
- Oracle 当前时间加减
当我们用 select sysdate+number from dual ;我们得到的是,当前的时间加上number天后的时间.从这里我们也可以看出,使用这种方式进行时间计算的时候,计算的单位是天, ...
- Android UI 之WaterFall瀑布流效果
所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容. 语言描述比较抽象,具体效果看下面的截图: ...