]> git.gir.st - VimFx.git/blob - extension/packages/events.coffee
bumped version and updated change log
[VimFx.git] / extension / packages / events.coffee
1 utils = require 'utils'
2 keyUtils = require 'key-utils'
3 { getCommand } = require 'commands'
4 { Vim } = require 'vim'
5 { getPref } = require 'prefs'
6 { setWindowBlacklisted } = require 'button'
7
8 { interfaces: Ci } = Components
9
10 vimBucket = new utils.Bucket utils.getWindowId, (obj) -> new Vim obj
11
12 suppressEvent = (event) ->
13 event.preventDefault()
14 event.stopPropagation()
15
16 # The following listeners are installed on every top level Chrome window
17 windowsListener =
18 'keydown': (event) ->
19
20 if getPref 'disabled'
21 return
22
23 try
24 isEditable = utils.isElementEditable event.originalTarget
25
26 { ctrlKey: ctrl, metaKey: meta, altKey: alt, shiftKey: shift } = event
27
28 # any keys modified with meta or alt should be ignored
29 if meta or alt
30 return
31
32 # Extract keyChar from keyCode and apply modifiers
33 if keyChar = keyUtils.keyCharFromCode(event.keyCode, shift)
34 keyStr = keyUtils.applyModifiers(keyChar, ctrl, alt, meta)
35
36 # We only handle the key if it's recognized by `keyCharFromCode`
37 # and if there is no focused editable element # or if it's the *Esc* key,
38 # which will remove the focus from the currently focused element
39 if keyStr and (not isEditable or keyStr == 'Esc')
40 if window = utils.getCurrentTabWindow event
41 if vim = vimBucket.get(window)
42 # No action if blacklisted
43 if vim.blacklisted
44 return
45
46 if vim.handleKeyDown(event, keyStr)
47 if keyStr != 'Esc'
48 suppressEvent event
49 catch err
50 console.log err, 'keydown'
51
52 'keypress': (event) ->
53 if getPref 'disabled'
54 return
55
56 try
57 # Try to execute keys that were accumulated so far.
58 # Suppress event if there is a matching command.
59 if window = utils.getCurrentTabWindow event
60 if vim = vimBucket.get(window)
61 # No action on blacklisted locations
62 if vim.blacklisted
63 return
64
65 lastKeyStr = vim.keys[vim.keys.length - 1]
66
67 # Blur from any active element on Esc. Calling before `handleKeyPress`
68 # because `vim.keys` will be reset afterwards`
69 blur_on_esc = lastKeyStr == 'Esc' and getPref 'blur_on_esc'
70
71 if vim.handleKeyPress event
72 if lastKeyStr != 'Esc'
73 suppressEvent event
74
75 # Calling after the command has been executed
76 if blur_on_esc
77 event.originalTarget?.ownerDocument?.activeElement?.blur()
78
79 catch err
80 console.log err, 'keypress'
81
82 # When the top level window closes we should release all Vims that were
83 # associated with tabs in this window
84 'DOMWindowClose': (event) ->
85 if gBrowser = event.originalTarget.gBrowser
86 for tab in gBrowser.tabs
87 if browser = gBrowser.getBrowserForTab tab
88 vimBucket.forget browser.contentWindow
89
90 'TabClose': (event) ->
91 if gBrowser = utils.getEventTabBrowser event
92 if browser = gBrowser.getBrowserForTab event.originalTarget
93 vimBucket.forget browser.contentWindow
94
95 # Update the toolbar button icon to reflect the blacklisted state
96 'TabSelect': (event) ->
97 if vim = vimBucket.get event.originalTarget?.linkedBrowser?.contentDocument?.defaultView
98 if rootWindow = utils.getRootWindow vim.window
99 setWindowBlacklisted rootWindow, vim.blacklisted
100
101 # This listener works on individual tabs within Chrome Window
102 # User for: listening for location changes and disabling the extension
103 # on black listed urls
104 tabsListener =
105 onLocationChange: (browser, webProgress, request, location) ->
106 blacklisted = utils.isBlacklisted location.spec, getPref 'black_list'
107 if vim = vimBucket.get(browser.contentWindow)
108 vim.blacklisted = blacklisted
109 if rootWindow = utils.getRootWindow vim.window
110 setWindowBlacklisted rootWindow, vim.blacklisted
111
112 addEventListeners = (window) ->
113 for name, listener of windowsListener
114 window.addEventListener name, listener, true
115
116 # Install onLocationChange listener
117 window.gBrowser.addTabsProgressListener tabsListener
118
119 removeEventListeners = ->
120 for name, listener of windowsListener
121 window.removeEventListener name, listener, true
122
123 unload ->
124 removeEventListeners window
125 window.gBrowser.removeTabsProgressListener tabsListener
126
127 exports.addEventListeners = addEventListeners
Imprint / Impressum