]> git.gir.st - VimFx.git/blob - extension/packages/events.coffee
Merge branch 'release-0.4.4'
[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 # *************************
17 # NB! TODO! All this shit needs to be redone!!
18 # *************************
19
20 keyStrFromEvent = (event) ->
21
22 { ctrlKey: ctrl, metaKey: meta, altKey: alt, shiftKey: shift } = event
23
24 if !meta and !alt
25 if keyChar = keyUtils.keyCharFromCode(event.keyCode, shift)
26 keyStr = keyUtils.applyModifiers(keyChar, ctrl, alt, meta)
27
28 return keyStr
29
30 # The following listeners are installed on every top level Chrome window
31 windowsListener =
32 'keydown': (event) ->
33
34 if getPref 'disabled'
35 return
36
37 try
38 isEditable = utils.isElementEditable event.originalTarget
39
40 keyStr = keyStrFromEvent(event)
41
42 # We only handle the key if it's recognized by `keyCharFromCode`
43 # and if there is no focused editable element # or if it's the *Esc* key,
44 # which will remove the focus from the currently focused element
45 if keyStr and (not isEditable or keyStr == 'Esc')
46 if window = utils.getCurrentTabWindow event
47 if vim = vimBucket.get(window)
48 # No action if blacklisted
49 if vim.blacklisted
50 return
51
52 if vim.handleKeyDown(event, keyStr) and keyStr != 'Esc'
53 suppressEvent event
54 catch err
55 console.log err, 'keydown'
56 console.stacktrace()
57
58 'keypress': (event) ->
59
60 if getPref 'disabled'
61 return
62
63 try
64 isEditable = utils.isElementEditable event.originalTarget
65
66 # Try to execute keys that were accumulated so far.
67 # Suppress event if there is a matching command.
68 if window = utils.getCurrentTabWindow event
69 if vim = vimBucket.get(window)
70
71 # No action on blacklisted locations
72 if vim.blacklisted
73 return
74
75 # Blur from any active element on Esc. Calling before `handleKeyPress`
76 # because `vim.keys` will be reset afterwards`
77 blur_on_esc = vim.lastKeyStr == 'Esc' and getPref 'blur_on_esc'
78
79 # Process event if there is no editable element in focus
80 # Or last key was Esc key
81 if not isEditable or vim.lastKeyStr == 'Esc'
82 result = vim.handleKeyPress event
83
84 # If there was some processing done then suppress the eveng
85 # unless it's the Esc key
86 if result and vim.lastKeyStr != 'Esc'
87 suppressEvent event
88
89 # Calling after the command has been executed
90 if blur_on_esc
91 cb = -> event.originalTarget?.ownerDocument?.activeElement?.blur()
92 window.setTimeout cb, 0
93
94 catch err
95 console.log err, 'keypress'
96 console.stacktrace()
97
98 'keyup': (event) ->
99 if window = utils.getCurrentTabWindow event
100 if vim = vimBucket.get(window)
101 if vim.lastKeyStr and vim.lastKeyStr != 'Esc'
102 suppressEvent event
103
104 vim.lastKeyStr = null
105
106 # When the top level window closes we should release all Vims that were
107 # associated with tabs in this window
108 'DOMWindowClose': (event) ->
109 if gBrowser = event.originalTarget.gBrowser
110 for tab in gBrowser.tabs
111 if browser = gBrowser.getBrowserForTab tab
112 vimBucket.forget browser.contentWindow
113
114 'TabClose': (event) ->
115 if gBrowser = utils.getEventTabBrowser event
116 if browser = gBrowser.getBrowserForTab event.originalTarget
117 vimBucket.forget browser.contentWindow
118
119 # Update the toolbar button icon to reflect the blacklisted state
120 'TabSelect': (event) ->
121 if vim = vimBucket.get event.originalTarget?.linkedBrowser?.contentDocument?.defaultView
122 if rootWindow = utils.getRootWindow vim.window
123 setWindowBlacklisted rootWindow, vim.blacklisted
124
125 # This listener works on individual tabs within Chrome Window
126 # User for: listening for location changes and disabling the extension
127 # on black listed urls
128 tabsListener =
129 onLocationChange: (browser, webProgress, request, location) ->
130 blacklisted = utils.isBlacklisted location.spec, getPref 'black_list'
131 if vim = vimBucket.get(browser.contentWindow)
132 vim.blacklisted = blacklisted
133 if rootWindow = utils.getRootWindow vim.window
134 setWindowBlacklisted rootWindow, vim.blacklisted
135
136 addEventListeners = (window) ->
137 for name, listener of windowsListener
138 window.addEventListener name, listener, true
139
140 # Install onLocationChange listener
141 window.gBrowser.addTabsProgressListener tabsListener
142
143 removeEventListeners = ->
144 for name, listener of windowsListener
145 window.removeEventListener name, listener, true
146
147 unload ->
148 removeEventListeners window
149 window.gBrowser.removeTabsProgressListener tabsListener
150
151 exports.addEventListeners = addEventListeners
Imprint / Impressum