1 utils = require 'utils'
2 { getCommand } = require 'commands'
3 { Vim } = require 'vim'
5 isBrowserWindow } = require 'window-utils'
7 { interfaces: Ci } = Components
9 vimBucket = new utils.Bucket utils.getWindowId, (obj) -> new Vim obj
11 suppressEvent = (event) ->
12 event.preventDefault()
13 event.stopPropagation()
15 # The following handlers are installed on every top level DOM window
19 isEditable = utils.isElementEditable event.originalTarget
20 keyStr = utils.keyboardEventKeyString event
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 keyStr and (keyStr == 'Esc' or not isEditable)
26 if window = utils.getEventTabWindow event
27 if vimBucket.get(window)?.pushKey keyStr
32 'keypress': (event) ->
34 # Try to execute keys that were accumulated so far.
35 # Suppress event if there is a matching command.
36 if window = utils.getEventTabWindow event
37 if vimBucket.get(window)?.execKeys()
42 'TabClose': (event) ->
43 if gBrowser = utils.getEventTabBrowser event
44 if browser = gBrowser.getBrowserForTab event.originalTarget
45 vimBucket.forget browser.contentWindow.wrappedJSObject
47 # When the top level window closes we should release all Vims that were
48 # associated with tabs in this window
49 'DOMWindowClose': (event) ->
50 if gBrowser = event.originalTarget.gBrowser
51 for tab in gBrowser.tabs
52 if browser = gBrowser.getBrowserForTab tab
53 vimBucket.forget browser.contentWindow.wrappedJSObject
55 # Delegate for WindowTracker that will add and remove event handlers
56 # to the each window that goes through the tracker
59 if isBrowserWindow window
60 for name, handler of handlers
61 window.addEventListener name, handler, true
64 if isBrowserWindow window
65 for name, handler of handlers
66 window.removeEventListener name, handler, true
68 # Creates and returns an instance of WindowTracker
69 # that will attach the passed event handlers to
70 # each opened top level window.
71 createWindowEventTracker = -> new WindowTracker delegate
73 exports.createWindowEventTracker = createWindowEventTracker