]> git.gir.st - VimFx.git/blob - packages/event-handlers.coffee
wont enter hints mode when there are no hintable elements within visible range
[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 'keydown': (event) ->
18 try
19 isEditable = utils.isElementEditable event.originalTarget
20 keyStr = utils.keyboardEventKeyString 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 keyStr and (keyStr == 'Esc' or not isEditable)
26 if window = utils.getEventTabWindow event
27 if vimBucket.get(window)?.pushKey keyStr
28 suppressEvent event
29 catch err
30 console.log err
31
32 'keypress': (event) ->
33 try
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()
38 suppressEvent event
39 catch err
40 console.log err
41
42 'TabClose': (event) ->
43 if gBrowser = utils.getEventTabBrowser event
44 if browser = gBrowser.getBrowserForTab event.originalTarget
45 vimBucket.forget browser.contentWindow.wrappedJSObject
46
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
54
55 # Delegate for WindowTracker that will add and remove event handlers
56 # to the each window that goes through the tracker
57 delegate =
58 track: (window) ->
59 if isBrowserWindow window
60 for name, handler of handlers
61 window.addEventListener name, handler, true
62
63 untrack: (window) ->
64 if isBrowserWindow window
65 for name, handler of handlers
66 window.removeEventListener name, handler, true
67
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
72
73 exports.createWindowEventTracker = createWindowEventTracker
Imprint / Impressum