diff --git a/src/core/BaseApplication.coffee b/src/core/BaseApplication.coffee
index d1a39a6..3f47808 100644
--- a/src/core/BaseApplication.coffee
+++ b/src/core/BaseApplication.coffee
@@ -3,6 +3,11 @@ class BaseApplication extends this.OS.GUI.BaseModel
super name, args
_OS.setting.applications[@name] = {} if not _OS.setting.applications[@name]
@setting = _OS.setting.applications[@name]
+ @keycomb =
+ ALT: {}
+ CTRL: {}
+ SHIFT: {}
+ META: {}
init: ->
me = @
# first register some base event to the app
@@ -29,6 +34,20 @@ class BaseApplication extends this.OS.GUI.BaseModel
path = "#{@meta().path}/scheme.html"
@.render path
+ bindKey: (k, f) ->
+ arr = k.split "-"
+ return unless arr.length is 2
+ fnk = arr[0].toUpperCase()
+ c = arr[1].toUpperCase()
+ return unless @keycomb[fnk]
+ @keycomb[fnk][c] = f
+
+ shortcut: (fnk, c) ->
+ return true unless @keycomb[fnk]
+ return true unless @keycomb[fnk][c]
+ @keycomb[fnk][c]()
+ return false
+
applySetting: (k) ->
registry: (k, v) ->
@setting[k] = v
diff --git a/src/core/gui.coffee b/src/core/gui.coffee
index b2e9ed9..4ed865f 100644
--- a/src/core/gui.coffee
+++ b/src/core/gui.coffee
@@ -183,6 +183,24 @@ self.OS.GUI =
initDM: ->
# check login first
+ ($ window).bind 'keydown', (event) ->
+ app = ($ "#sysdock")[0].get "selectedApp"
+ return true unless app
+ c = String.fromCharCode(event.which).toUpperCase()
+ fnk = undefined
+ if event.ctrlKey
+ fnk = "CTRL"
+ else if event.metaKey
+ fnk = "META"
+ else if event.shiftKey
+ fnk = "SHIFT"
+ else if event.altKey
+ fnk = "ALT"
+
+ return unless fnk
+ r = app.shortcut fnk, c
+ event.preventDefault() if not r
+
_API.resource "schemes/dm.html", (x) ->
return null unless x
scheme = $.parseHTML x
diff --git a/src/core/tags/afx-file-view.js b/src/core/tags/afx-file-view.js
index 27b1bcb..edc4c3b 100644
--- a/src/core/tags/afx-file-view.js
+++ b/src/core/tags/afx-file-view.js
@@ -16,6 +16,7 @@
this.status = opts.status == undefined?true:opts.status
this.selectedFile = undefined
this.showhidden = opts.showhidden
+ this.preventUpdate = false
this.fetch = opts.fetch
this.chdir = opts.chdir
this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1
@@ -32,7 +33,8 @@
switchView()
if(k == "data")
self.selectedFile = undefined
- self.update()
+ if(k != "preventUpdate")
+ self.update()
}
self.root.get = function(k)
{
@@ -141,7 +143,12 @@
calibre_size()
}
self.on("updated", function(){
- refreshData()
+ if(self.preventUpdate)
+ {
+ self.preventUpdate = false
+ }
+ else
+ refreshData()
//calibre_size()
})
self.on("mount", function(){
diff --git a/src/core/tags/afx-menu.js b/src/core/tags/afx-menu.js
index e6c4e89..d98ca03 100644
--- a/src/core/tags/afx-menu.js
+++ b/src/core/tags/afx-menu.js
@@ -5,6 +5,7 @@
+ {data.shortcut}
0} child={data.child} onmenuselect = {data.onmenuselect} observable = {parent.root.observable} rootid = {parent.rid}>
diff --git a/src/core/tags/afx-switch.js b/src/core/tags/afx-switch.js
index 54a6133..1cc93d3 100644
--- a/src/core/tags/afx-switch.js
+++ b/src/core/tags/afx-switch.js
@@ -1,10 +1,16 @@