框架目标

OneRing是一个跨平台的桌面应用框架。和Adobe AIR类似,它支持用html/js/css制作用户界面,与之不同的是,它的应用为本地程序,可以直接访问操作系统的数据。

架构

一个OneRing应用程序分为两个部分:框架部分和应用部分。

框架部分

框架部分为通用框架,各应用都一样。其提供各操作系统上的界面展现,为本地窗口内嵌一个WebKit浏览器,并提供一致的js接口让应用和操作系统功能进行交互。

框架以运行时库的形式提供。

框架以系统原生语言编写,提供其他语言的绑定。

应用部分

应用部分为一个web server,负责应用逻辑,用html/css描述界面,用js提供用户交互。

运行流程

  1. 应用启动时,会加载框架的运行时库,注册应用url的访问方法(如WSGI),并调用框架的loop函数。
  2. loop函数会访问应用的 /init URL,得到一个json数据,描述初始应用窗口的相关参数,如位置、大小、窗口属性、初始页面url等。
  3. 框架根据该数据创建窗口,并让该窗口内的浏览器访问初始页面url,渲染用户界面,然后等待UI事件。
  4. 用户在界面上操作时,可以通过超链接改变整个窗口内容,也可以使用AJAX技术更新窗口内部分内容。
  5. 应用可以让浏览器调用ONERING名字空间下的js函数,和操作系统进行交互,该名字空间由url onering://onering/onering.js 加载。
  6. 应用通过 bind(event, function) 函数监听窗口更改大小、移动等操作系统UI事件。
  7. 可以使用pub/sub机制主动推送消息给浏览器。
  8. 调用 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应用中,存在三个需要互相通讯的组件:

  1. 操作系统 OS ,控制窗口行为(如最小化窗口),及操作系统相关界面元素(如系统通知图标)
  2. 运行在WebKit内的javascript,控制界面内元素(如程序界面里的按钮)
  3. 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) 不会抛出异常)。

参考:https://code.google.com/p/onering-desktop/wiki/OneRing

桌面应用框架 OneRing的更多相关文章

  1. Web桌面应用框架2:著名的WEB桌面应用分析

    前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是 ...

  2. Web桌面应用框架3:Web桌面应用开发的N种Style

    研究Web桌面应用开发有一段时间了,总结了Web桌面应用开发的一些主流方式. 一.前端Style 这种方式的就是直接实现一个Web程序,再封装一个浏览器展示,相当粗暴和有效.著名的框架就是Electr ...

  3. 跨平台桌面程序框架Electron

    https://www.npmjs.com/ js库

  4. 用Web技术开发客户端(一)

    http://www.cnblogs.com/lefan/archive/2012/12/27/2836400.html 范怀宇(@duguguiyu)分享了<豌豆荚2.0重构时遇到的坑> ...

  5. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  6. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  7. web桌面程序之图标拖动排序的分析

    在web桌面程序里,图标拖动并重新排序是个比较常见的功能.这个功能我之前反复修改了好几遍,现在终于整理出了比较理想的解决思路,决定拿出来分享下. 这一功能主要有哪些难点呢?我总结了一下一共有2处难点: ...

  8. HTML5和Web Apps框架和方法

    单页: 1jQuery Mobile 该框架以其基于AJAX的导航系统和可使用主题的ThemeRoller设计而闻名.支持Android,ios,Windows Phone,webOs等.编程模式为C ...

  9. 桌面环境与桌面搜索Desktop Search tools

    最近一段时间工作重心都将放在Linux下Desktop search(桌面搜索)框架的研发上.因此对desktop search进行了初步的调研.本文将从下面三个方面展开: Linux桌面环境(Des ...

随机推荐

  1. [HTML5游戏开发]简单的《找不同汉字版》,来考考你的眼力吧

    本次 游戏 开发需要用到lufylegend.js开源游戏引擎,版本我用的是1.5.2(现在最新的版本是1.6.0).    引擎下载的位置: http://lufylegend.googlecode ...

  2. 巧用test判断来写shell脚本

    感觉最近很忙啊,阿里巴巴和百度马上就要笔试了,算法神马的还没有看..还是安心学习linux吧,决定在接下来的一周里,每天写一个shell script #!/bin/bash #输出提示语句,请输入一 ...

  3. Troubleshooting(updating...)

    记录了工作和学习中一些杂碎的问题. 问题:RDP一直处于连接状态,除非重启 描述:表面看上去是应该在一定时间还连接不上,就让它断开.深层问题是,初次连接一个新的IP地址,Win7以上的系统,会有个CA ...

  4. JAVA UTF-8字符转换为GBK

    String t = "\u53d6"; try { String gbk=URLEncoder.encode(t,"GBK"); System.out.pri ...

  5. php连接oracle及简单操作

    使你的php支持oracle,按照以下步骤即可: 1.安装php环境,找一下appserv或者xampp,一键安装,很方便 2.把php的ext目录下的php_oci8.dll拷到system32目录 ...

  6. HDU3572_Task Schedule(网络流最大流)

    解题报告 题意: 工厂有m台机器,须要做n个任务.对于一个任务i.你须要花费一个机器Pi天,并且,開始做这个任务的时间要>=Si,完毕这个任务的时间<=Ei. 对于一个任务,仅仅能由一个机 ...

  7. MongoDB---性能优化---(1)

    MONGODB数据架构 升级解决.计划 发现问题  应用server用户数的突然涌入,创建server反应慢  检查server,我发现,每次反应非常慢,至30ops  检查过程  .发现数据库查询缓 ...

  8. Qt5.2 android 环境搭建及其测试

    1.<安装> 软件: qt-windows-opensource-5.2.0-android-x86-win32-offline //Qt开发环境 adt-bundle-windows-x ...

  9. 文本面板——axure线框图部件库介绍

    文本部件用于在页面中显示文字,对于文字的格式可以随意的更改,设定不同的字体.尺寸和颜色. 特别注意:文本面板的高度无法直接调整,它的高度是随着字体的大小自动变化的 在6.5版本中,对文本的排版都有2个 ...

  10. shell 调用mysql 存储过程判断真假

    mysql> create table TBL_STUDENT(id int,name char(10),CLASSNO int,BIRTH datetime); Query OK, 0 row ...