From 16074ac3f8f78bf7d9e34028d15b481a90f8649b Mon Sep 17 00:00:00 2001 From: Xuan Sang LE Date: Tue, 15 Aug 2017 02:56:04 +0200 Subject: [PATCH] add services --- Makefile | 13 +- src/antos.coffee | 5 +- src/core/gui/BaseApplication.coffee | 46 +- src/core/gui/BaseService.coffee | 40 + src/core/gui/gui.coffee | 112 +- src/core/gui/schemes/dm.html | 1 + src/core/gui/tags/afx-app-window.js | 5 +- src/core/gui/tags/afx-apps-dock.js | 7 +- src/core/gui/tags/afx-button.js | 4 - src/core/gui/tags/afx-grid-view.js | 1 - src/core/gui/tags/afx-hbox.js | 20 +- src/core/gui/tags/afx-list-view.js | 5 - src/core/gui/tags/afx-menu.js | 114 +- src/core/gui/tags/afx-service.js | 3 + src/core/gui/tags/afx-sys-panel.js | 41 +- src/core/gui/tags/afx-tree-view.js | 4 - src/core/gui/tags/afx-vbox.js | 21 +- src/core/gui/themes/antos/afx-menu.css | 22 +- src/core/processes.coffee | 17 +- src/define.coffee | 7 +- src/packages/ActivityMonitor/main.coffee | 9 +- src/packages/{Terminal => DummyApp}/Makefile | 2 +- .../{Terminal => DummyApp}/main.coffee | 17 +- src/packages/{Terminal => DummyApp}/main.css | 0 src/packages/DummyApp/package.json | 12 + .../{Terminal => DummyApp}/scheme.html | 0 src/packages/NotePad/main.coffee | 5 +- src/packages/NotePad/main.css | 11 +- src/packages/NotePad/scheme.html | 2 +- src/packages/wTerm/Makefile | 34 + src/packages/wTerm/main.coffee | 71 + src/packages/wTerm/main.css | 0 src/packages/{Terminal => wTerm}/package.json | 2 +- src/packages/wTerm/scheme.html | 5 + src/packages/wTerm/xterm.css | 2261 ++++++++ src/packages/wTerm/xterm.js | 5132 +++++++++++++++++ src/services/Calendar.coffee | 23 + src/services/PushNotification.coffee | 13 + src/services/Spotlight.coffee | 13 + 39 files changed, 7912 insertions(+), 188 deletions(-) create mode 100644 src/core/gui/BaseService.coffee create mode 100644 src/core/gui/tags/afx-service.js rename src/packages/{Terminal => DummyApp}/Makefile (91%) rename src/packages/{Terminal => DummyApp}/main.coffee (83%) rename src/packages/{Terminal => DummyApp}/main.css (100%) create mode 100644 src/packages/DummyApp/package.json rename src/packages/{Terminal => DummyApp}/scheme.html (100%) create mode 100644 src/packages/wTerm/Makefile create mode 100644 src/packages/wTerm/main.coffee create mode 100644 src/packages/wTerm/main.css rename src/packages/{Terminal => wTerm}/package.json (92%) create mode 100644 src/packages/wTerm/scheme.html create mode 100755 src/packages/wTerm/xterm.css create mode 100755 src/packages/wTerm/xterm.js create mode 100644 src/services/Calendar.coffee create mode 100644 src/services/PushNotification.coffee create mode 100644 src/services/Spotlight.coffee diff --git a/Makefile b/Makefile index d2ca833..79cc9e1 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ coffees= src/define.coffee\ src/core/handlers/InBrowserHandler.coffee\ src/core/gui/gui.coffee\ src/core/gui/BaseApplication.coffee\ + src/core/gui/BaseService.coffee\ src/core/gui/BaseEvent.coffee\ src/antos.coffee @@ -39,11 +40,13 @@ antos_themes = src/core/gui/themes/antos/font-awesome.css\ -packages = NotePad Terminal ActivityMonitor +packages = NotePad wTerm ActivityMonitor DummyApp +services = PushNotification Spotlight Calendar -main: clean build_coffee build_tag build_theme schemes libs build_packages +main: clean build_coffee build_tag build_theme schemes libs build_services build_packages - cp src/index.html $(BUILDDIR)/ +lite: build_coffee build_tag build_theme schemes build_services build_packages #%.js: %.coffee # coffee --compile $< @@ -84,8 +87,14 @@ antos_themes_build: cp src/core/gui/themes/antos/wallpaper.jpg $(BUILDDIR)/resources/themes/antos/ +build_services: + @echo "=======$(BLUE)Building services=======$(NC)" + -mkdir -p $(BUILDDIR)/services + -rm -rf $(BUILDDIR)/services/* + for f in $(services); do (coffee -cs < "src/services/$$f.coffee" >$(BUILDDIR)/services/"$$f.js");done build_packages: - mkdir $(BUILDDIR)/packages + - for d in $(packages); do ( test -d $(BUILDDIR)/packages/$$d && rm -rf $(BUILDDIR)/packages/$$d/* ); done for d in $(packages); do (cd src/packages/$$d; make);done for d in $(packages); do ( test -d $(BUILDDIR)/packages/$$d || mkdir -p $(BUILDDIR)/packages/$$d && cp -rf src/packages/$$d/build/* $(BUILDDIR)/packages/$$d/);done for d in $(packages); do ( test -d src/packages/$$d/build && rm -r src/packages/$$d/build ); done diff --git a/src/antos.coffee b/src/antos.coffee index 3642a8d..acceb26 100644 --- a/src/antos.coffee +++ b/src/antos.coffee @@ -1,7 +1,8 @@ -_GUI = self.OS.GUI -_API = self.OS.API +_GUI = self.OS.GUI +_API = self.OS.API _APP = self.OS.APP _PM = self.OS.PM +_courrier = self.OS.courrier this.onload = () -> console.log "Booting the os" self.OS.boot() \ No newline at end of file diff --git a/src/core/gui/BaseApplication.coffee b/src/core/gui/BaseApplication.coffee index f96e9c5..2733b0d 100644 --- a/src/core/gui/BaseApplication.coffee +++ b/src/core/gui/BaseApplication.coffee @@ -1,66 +1,67 @@ self = this _PM = self.OS.PM _APP = self.OS.APP -class BaseApplication +class BaseApplication constructor: (@name) -> @observable = riot.observable() @pid = 0 @_api = self.OS.API + init: -> me = @ # first register some base event to the app - @on "exit", ()-> me.quit() - @on "focus", () -> - me.sysdock.set "selectedApp", me + @on "exit", () -> me.quit() + @on "focus", () -> + me.sysdock.set "selectedApp", me me.appmenu.pid = me.pid me.appmenu.set "items", (me.baseMenu() || []) - me.appmenu.set "onmenuselect", (d)-> - me.trigger("menuselect",d) - @on "hide", ()-> + me.appmenu.set "onmenuselect", (d) -> + me.trigger("menuselect", d) + @on "hide", () -> me.sysdock.set "selectedApp", null - me.appmenu.set "items",[] + me.appmenu.set "items", [] @on "menuselect", (item) -> switch item.data.dataid when "#{me.name}-about" then alert "About " + me.pid + me.name when "#{me.name}-exit" then me.trigger "exit" #now load the scheme path = "packages/#{@name}/scheme.html" - _GUI.loadScheme path ,this + _GUI.loadScheme path , @ - on: (e,f) -> @observable.on e,f + on: (e, f) -> @observable.on e, f - trigger:(e,d) -> @observable.trigger e,d + trigger: (e, d) -> @observable.trigger e, d show: () -> @observable.trigger "focus" blur: () -> - @.appmenu.set "items",[] if @.appmenu and @.pid == @.appmenu.pid + @.appmenu.set "items", [] if @.appmenu and @.pid == @.appmenu.pid @observable.trigger "blur" hide: () -> @observable.trigger "hide" - toggle:() -> + toggle: () -> @observable.trigger "toggle" quit: () -> evt = new _GUI.BaseEvent("exit") @exit(evt) if not evt.prevent - @.appmenu.set "items",[] if @.pid == @.appmenu.pid - _PM.kill(@) + @.appmenu.set "items", [] if @.pid == @.appmenu.pid + _PM.kill @ ($ @scheme).remove() - find: (id) -> ($ "[data-id='#{id}']",@scheme)[0] + find: (id) -> ($ "[data-id='#{id}']", @scheme)[0] - baseMenu:-> + baseMenu: -> menu = [{ - text:_APP[@name].meta.name, - child:[ - {text:"About", dataid:"#{@name}-about"}, - {text:"Exit", dataid:"#{@name}-exit"} + text: _APP[@name].meta.name, + child: [ + { text: "About", dataid: "#{@name}-about" }, + { text: "Exit", dataid: "#{@name}-exit" } ] }] menu = menu.concat @menu() || [] @@ -85,4 +86,5 @@ class BaseApplication # to handle the exit event # use e.preventDefault() to # discard the quit command -this.OS.GUI.BaseApplication = BaseApplication \ No newline at end of file +BaseApplication.type = 1 +this.OS.GUI.BaseApplication = BaseApplication \ No newline at end of file diff --git a/src/core/gui/BaseService.coffee b/src/core/gui/BaseService.coffee new file mode 100644 index 0000000..4942208 --- /dev/null +++ b/src/core/gui/BaseService.coffee @@ -0,0 +1,40 @@ +MAIL = this.OS.courrier +_API = this.OS.API +_PM = this.OS.PM +class BaseService + constructor: (@name) -> + @icon = undefined + @iconclass = "fa-paper-plane-o" + @text = "" + @_api = _API + @timer = undefined + @holder = undefined + + init: ()-> + #implement by user + # event registe, etc + # scheme loader + + attach: (h) -> @holder = h + update: () -> @holder.update() if @holder + on: (e, f) -> MAIL.on e, f + trigger: (e, d) -> MAIL.trigger e, d + watch: ( t, f) -> + me = @ + func = () -> + f() + me.timer = setTimeout (() -> func()), t + func() + quit: ()-> + console.log "clean timer" if @timer + clearTimeout @timer if @timer + @cleanup() + _PM.kill @ + main: () -> + show: () -> + awake: () -> + #implement by user to tart the service + cleanup:() -> + #implemeted by user +BaseService.type = 2 +this.OS.GUI.BaseService = BaseService \ No newline at end of file diff --git a/src/core/gui/gui.coffee b/src/core/gui/gui.coffee index f8ff92f..a928d63 100644 --- a/src/core/gui/gui.coffee +++ b/src/core/gui/gui.coffee @@ -1,20 +1,20 @@ self.OS.GUI = init: () -> - query = + query = path: 'VFS/get' data: "#{_GUI.tagPath}/tags.json" self.OS.API.request query, ()-> - loadScheme: (path,app) -> - _API.get path, + loadScheme: (path, app) -> + _API.get path, (x) -> return null unless x scheme = $.parseHTML x ($ "#desktop").append scheme - riot.mount ($ scheme), {observable:app.observable} + riot.mount ($ scheme), { observable: app.observable } app.scheme = scheme[0] - app.show() app.main() + app.show() , (f) -> alert "cannot load scheme" @@ -23,29 +23,46 @@ self.OS.GUI = $ "head link#ostheme" .attr "href", path + pushService: (srv) -> + return _PM.createProcess srv, _APP[srv] if _APP[srv] + path = "services/#{srv}.js" + $.getScript path + .done (e, s) -> + _PM.createProcess srv, _APP[srv] + .fail (e, s) -> + _courrier.trigger "fail", + { m: "Cannot read service script: #{srv} ", + e: e, s: s } + launch: (app) -> if not _APP[app] # first load it path = "packages/#{app}/" $.getScript path + "main.js" - .done (e,s) -> + .done (e, s) -> #load css file $.get "#{path}main.css", () -> - $ '', {rel:'stylesheet', type:'text/css', 'href':"#{path}main.css"} + $ '', { rel: 'stylesheet', type: 'text/css', 'href': "#{path}main.css" } .appendTo 'head' #launch if _APP[app] # load app meta data _API.get "#{path}package.json", (data) -> - _APP[app].meta = data + _APP[app].meta = data _PM.createProcess app, _APP[app] - console.log "Fist time loading "+app - ,(e,s)-> - alert "cannot read application, meta-data" + console.log "Fist time loading " + app + , (e, s) -> + _courrier.trigger "fail", + { m: "Cannot read application metadata: #{app} ", + e: e, s: s } + alert "cannot read application, meta-data" .fail (e,s) -> #BUG report here - console.log "bug report" + _courrier.trigger "fail", + { m: "Cannot load application script: #{app}", + e: e, s:s } + console.log "bug report", e, s, path else # now launch it if _APP[app] @@ -53,57 +70,54 @@ self.OS.GUI = dock: (app,meta) -> # dock an application to a dock # create a data object - data = - icon:null - iconclass:meta.iconclass||"" + data = + icon: null + iconclass: meta.iconclass || "" app:app - onbtclick:() -> + onbtclick: () -> app.toggle() data.icon = "packages/#{meta.app}/#{meta.icon}" if meta.icon data.iconclass = "fa fa-cogs" if (not meta.icon) and (not meta.iconclass) dock = $ "#sysdock" dock.get(0).newapp data app.sysdock = dock.get(0) - app.appmenu = ($ "[data-id = 'appmenu']","#syspanel")[0] + app.appmenu = ($ "[data-id = 'appmenu']", "#syspanel")[0] app.init() #app.show() -- notwork, sice the scheme is not loaded yet undock: (app) -> ($ "#sysdock").get(0).removeapp app + attachservice: (srv) -> + ($ "#syspanel")[0].attachservice srv + srv.init() + detachservice: (srv) -> + ($ "#syspanel")[0].detachservice srv + bindContextMenu: (event) -> + handler = (e) -> + if e.contextmenuHandler + e.contextmenuHandler event, ($ "#contextmenu")[0] + else + #console.log ($ "#workspace").get(0), ($ e).parent().get(0) + p = $(e).parent().get(0) + handler p if p isnt ($ "#workspace").get(0) + handler event.target + event.preventDefault() initDM: -> _API.resource "schemes/dm.html", (x) -> return null unless x - scheme = $.parseHTML x + scheme = $.parseHTML x ($ "#wrapper").append scheme - ($ "#desktop").on "click", (e)-> - return if e.target isnt ($ "#desktop").get(0) - ($ "#sysdock").get(0).set "selectedApp",null - - osmenu = {child:[ - {text:"",iconclass:"fa fa-eercast", child:[ - {text:"About"}, - {text:"System Preferences", iconclass:"fa fa-commenting"}, - {text:"Applications",child:[ - {text:"Terminal",type:"app"}, - {text:"NotePad",type:"app", icon:"packages/NotePad/icon.png"}, - {text:"ActivityMonitor",type:"app"} - ]}, - {text:"Logout"} - ]} - ],onmenuselect: (item)-> - switch item.data.type - when "app" then _GUI.launch item.data.text - } - appmenu = {child:[]} - systray = {child:[ - {text:"Sun 22:57 6 August 2017"}, - {text:"",iconclass:"fa fa-search"}, - {text:"",iconclass:"fa fa-commenting"} - - ],onmenuselect: (item)-> - console.log item - } - - riot.mount ($ "#syspanel", $ "#wrapper"),{osmenu:osmenu,appmenu:appmenu,systray:systray} - riot.mount ($ "#sysdock", $ "#wrapper"), {items:[]} \ No newline at end of file + # context menu + riot.mount ($ "#contextmenu") + ($ "#workspace").contextmenu (e) -> _GUI.bindContextMenu e + #desktop + desktop = ($ "#desktop") + desktop.on "click", (e) -> + return if e.target isnt desktop.get(0) + ($ "#sysdock").get(0).set "selectedApp", null + desktop.get(0).contextmenuHandler = (e, m) -> + console.log "context menu handler for desktop" + # system menu + riot.mount ($ "#syspanel", $ "#wrapper") + riot.mount ($ "#sysdock", $ "#wrapper"), { items: [] } \ No newline at end of file diff --git a/src/core/gui/schemes/dm.html b/src/core/gui/schemes/dm.html index 0b74e0e..3a1f1bb 100644 --- a/src/core/gui/schemes/dm.html +++ b/src/core/gui/schemes/dm.html @@ -6,3 +6,4 @@
+ diff --git a/src/core/gui/tags/afx-app-window.js b/src/core/gui/tags/afx-app-window.js index 6651d39..0cc5c65 100644 --- a/src/core/gui/tags/afx-app-window.js +++ b/src/core/gui/tags/afx-app-window.js @@ -39,10 +39,6 @@ { return self[k] } - self.root.update = function() - { - self.update() - } minimize() { this.root.observable.trigger("hide") @@ -108,6 +104,7 @@ else self.root.observable.trigger("focus") }) + self.root.observable.trigger("loaded", self.root) }) var enable_dragging = function() { diff --git a/src/core/gui/tags/afx-apps-dock.js b/src/core/gui/tags/afx-apps-dock.js index a5d8989..e9add5a 100644 --- a/src/core/gui/tags/afx-apps-dock.js +++ b/src/core/gui/tags/afx-apps-dock.js @@ -51,10 +51,9 @@ { return self[k] } - self.root.update = function() - { - self.update() - } + this.on("mount", function(){ + window.OS.courrier.trigger("sysdockloaded") + }) \ No newline at end of file diff --git a/src/core/gui/tags/afx-button.js b/src/core/gui/tags/afx-button.js index 398a4ee..6b1ad63 100644 --- a/src/core/gui/tags/afx-button.js +++ b/src/core/gui/tags/afx-button.js @@ -23,10 +23,6 @@ { return self[k] } - self.root.update = function() - { - self.update() - } this._onbtclick = function(e) { if(typeof opts.onbtclick == 'string') diff --git a/src/core/gui/tags/afx-grid-view.js b/src/core/gui/tags/afx-grid-view.js index c6edf8a..2ebe125 100644 --- a/src/core/gui/tags/afx-grid-view.js +++ b/src/core/gui/tags/afx-grid-view.js @@ -82,7 +82,6 @@ data:event.item} if(opts.onlistselect) opts.onlistselect(data) - console.log(data) if(self.selidx != -1) self.rows[self.selidx].selected =false self.selidx = event.item.i diff --git a/src/core/gui/tags/afx-hbox.js b/src/core/gui/tags/afx-hbox.js index 956897a..91ec39e 100644 --- a/src/core/gui/tags/afx-hbox.js +++ b/src/core/gui/tags/afx-hbox.js @@ -4,23 +4,6 @@ \ No newline at end of file diff --git a/src/core/gui/tags/afx-list-view.js b/src/core/gui/tags/afx-list-view.js index 2ec0be1..6f40411 100644 --- a/src/core/gui/tags/afx-list-view.js +++ b/src/core/gui/tags/afx-list-view.js @@ -28,10 +28,6 @@ self[k] = v self.update() } - self.root.update = function() - { - self.update() - } self.root.get = function(k) { if(k == "selected") @@ -69,7 +65,6 @@ { var desktoph = $("#desktop").height() var off = $(self.root).offset().top + $(self.refs.mlist).height() - console.log(desktoph,off) if( off > desktoph ) $(self.refs.mlist) .css("top","-" + $(self.refs.mlist).outerHeight() + "px") diff --git a/src/core/gui/tags/afx-menu.js b/src/core/gui/tags/afx-menu.js index b552af2..2f98561 100644 --- a/src/core/gui/tags/afx-menu.js +++ b/src/core/gui/tags/afx-menu.js @@ -1,23 +1,30 @@ - -