1 utils = require 'utils'
2 { getCommand } = require 'commands'
3 { Vim } = require 'vim'
4 { getPref } = require 'prefs'
6 { interfaces: Ci } = Components
8 vimBucket = new utils.Bucket utils.getWindowId, (obj) -> new Vim obj
10 suppressEvent = (event) ->
11 event.preventDefault()
12 event.stopPropagation()
14 # The following handlers are installed on every top level DOM window
21 isEditable = utils.isElementEditable event.originalTarget
22 keyStr = utils.keyboardEventKeyString event
24 # We only handle the key if there is no focused editable element
25 # or if it's the *Esc* key, which will remote the focus from
26 # the currently focused element
27 if keyStr and (keyStr == 'Esc' or not isEditable)
28 if window = utils.getCurrentTabWindow event
29 if vimBucket.get(window)?.pushKey keyStr
34 'keypress': (event) ->
39 # Try to execute keys that were accumulated so far.
40 # Suppress event if there is a matching command.
41 if window = utils.getCurrentTabWindow event
42 if vimBucket.get(window)?.execKeys()
47 'TabClose': (event) ->
48 if gBrowser = utils.getEventTabBrowser event
49 if browser = gBrowser.getBrowserForTab event.originalTarget
50 vimBucket.forget browser.contentWindow.wrappedJSObject
52 # When the top level window closes we should release all Vims that were
53 # associated with tabs in this window
54 'DOMWindowClose': (event) ->
55 if gBrowser = event.originalTarget.gBrowser
56 for tab in gBrowser.tabs
57 if browser = gBrowser.getBrowserForTab tab
58 vimBucket.forget browser.contentWindow.wrappedJSObject
60 addEventListeners = (window) ->
61 for name, handler of handlers
62 window.addEventListener name, handler, true
64 removeEventListeners = ->
65 for name, handler of handlers
66 window.removeEventListener name, handler, true
68 unload -> removeEventListeners window
70 exports.addEventListeners = addEventListeners