]> git.gir.st - VimFx.git/blob - packages/event-handlers.coffee
Hint markers fixed: backspacing works fine now, markers are also properly hid when...
[VimFx.git] / packages / event-handlers.coffee
1 utils = require 'utils'
2 { getCommand } = require 'commands'
3 { Vim } = require 'vim'
4 { WindowTracker,
5 isBrowserWindow } = require 'window-utils'
6
7 { interfaces: Ci } = Components
8
9 vimBucket = new utils.Bucket utils.getWindowId, (obj) -> new Vim obj
10
11 suppressEvent = (event) ->
12 event.preventDefault()
13 event.stopPropagation()
14
15 # The following handlers are installed on every top level DOM window
16 handlers =
17 'keypress': (event) ->
18 try
19 isEditable = utils.isElementEditable event.originalTarget
20 key = utils.keyboardEventKey event
21
22 # We only handle the key if there is no focused editable element
23 # or if it's the *Esc* key, which will remote the focus from
24 # the currently focused element
25 if key and (key == 'Esc' or not isEditable)
26 if window = utils.getEventTabWindow event
27 if vimBucket.get(window)?.keypress key
28 suppressEvent event
29 catch err
30 console.log err
31
32 'TabClose': (event) ->
33 if gBrowser = utils.getEventTabBrowser event
34 if browser = gBrowser.getBrowserForTab event.originalTarget
35 vimBucket.forget browser.contentWindow.wrappedJSObject
36
37 'DOMWindowClose': (event) ->
38 if gBrowser = event.originalTarget.gBrowser
39 for tab in gBrowser.tabs
40 if browser = gBrowser.getBrowserForTab tab
41 vimBucket.forget browser.contentWindow.wrappedJSObject
42
43 # Delegate for WindowTracker that will add and remove event handlers
44 # to the each window that goes through the tracker
45 delegate =
46 track: (window) ->
47 if isBrowserWindow window
48 for name, handler of handlers
49 window.addEventListener name, handler, true
50
51 untrack: (window) ->
52 if isBrowserWindow window
53 for name, handler of handlers
54 window.removeEventListener name, handler, true
55
56 # Creates and returns an instance of WindowTracker
57 # that will attach the passed event handlers to
58 # each opened top level window.
59 createWindowEventTracker = -> new WindowTracker delegate
60
61 exports.createWindowEventTracker = createWindowEventTracker
Imprint / Impressum