Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 1 | /* |
Brian O'Connor | a09fe5b | 2017-08-03 21:12:30 -0700 | [diff] [blame] | 2 | * Copyright 2014-present Open Networking Foundation |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | /* |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 18 | ONOS GUI -- Util -- Key Handler Service |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 19 | */ |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 20 | (function () { |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 21 | 'use strict'; |
| 22 | |
| 23 | // references to injected services |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 24 | var $log, fs, ts, ns, ee, qhs, ls; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 25 | |
| 26 | // internal state |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 27 | var enabled = true, |
Simon Hunt | d557925 | 2015-10-06 15:09:14 -0700 | [diff] [blame] | 28 | globalEnabled = true, |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 29 | keyHandler = { |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 30 | globalKeys: {}, |
| 31 | maskedKeys: {}, |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 32 | dialogKeys: {}, |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 33 | viewKeys: {}, |
| 34 | viewFn: null, |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 35 | viewGestures: [], |
Simon Hunt | 9f5e97d | 2015-12-11 10:32:09 -0800 | [diff] [blame] | 36 | }, |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 37 | seq = {}, |
| 38 | matching = false, |
| 39 | matched = '', |
| 40 | lookup; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 41 | |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 42 | function matchSeq(key) { |
Simon Hunt | d189b92 | 2016-09-29 10:35:29 -0700 | [diff] [blame] | 43 | if (!matching && key === 'shift-shift') { |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 44 | matching = true; |
Thomas Vachuska | fe1f01a | 2015-12-10 23:56:02 -0800 | [diff] [blame] | 45 | return true; |
Simon Hunt | 9f5e97d | 2015-12-11 10:32:09 -0800 | [diff] [blame] | 46 | } |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 47 | if (matching) { |
| 48 | matched += key; |
| 49 | lookup = fs.trieLookup(seq, matched); |
| 50 | if (lookup === -1) { |
| 51 | return true; |
| 52 | } |
| 53 | matching = false; |
| 54 | matched = ''; |
| 55 | if (!lookup) { |
| 56 | return; |
| 57 | } |
| 58 | ee.cluck(lookup); |
| 59 | return true; |
Thomas Vachuska | fe1f01a | 2015-12-10 23:56:02 -0800 | [diff] [blame] | 60 | } |
Thomas Vachuska | fe1f01a | 2015-12-10 23:56:02 -0800 | [diff] [blame] | 61 | } |
| 62 | |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 63 | function whatKey(code) { |
| 64 | switch (code) { |
Simon Hunt | 18d4bc8 | 2016-01-08 14:09:35 -0800 | [diff] [blame] | 65 | case 8: return 'delete'; |
| 66 | case 9: return 'tab'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 67 | case 13: return 'enter'; |
Simon Hunt | d189b92 | 2016-09-29 10:35:29 -0700 | [diff] [blame] | 68 | case 16: return 'shift'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 69 | case 27: return 'esc'; |
| 70 | case 32: return 'space'; |
| 71 | case 37: return 'leftArrow'; |
| 72 | case 38: return 'upArrow'; |
| 73 | case 39: return 'rightArrow'; |
| 74 | case 40: return 'downArrow'; |
Simon Hunt | 18d4bc8 | 2016-01-08 14:09:35 -0800 | [diff] [blame] | 75 | case 186: return 'semicolon'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 76 | case 187: return 'equals'; |
Simon Hunt | 90dcc3e | 2015-03-25 15:01:27 -0700 | [diff] [blame] | 77 | case 188: return 'comma'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 78 | case 189: return 'dash'; |
Simon Hunt | 90dcc3e | 2015-03-25 15:01:27 -0700 | [diff] [blame] | 79 | case 190: return 'dot'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 80 | case 191: return 'slash'; |
| 81 | case 192: return 'backQuote'; |
Simon Hunt | 18d4bc8 | 2016-01-08 14:09:35 -0800 | [diff] [blame] | 82 | case 219: return 'openBracket'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 83 | case 220: return 'backSlash'; |
Simon Hunt | 18d4bc8 | 2016-01-08 14:09:35 -0800 | [diff] [blame] | 84 | case 221: return 'closeBracket'; |
| 85 | case 222: return 'quote'; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 86 | default: |
| 87 | if ((code >= 48 && code <= 57) || |
| 88 | (code >= 65 && code <= 90)) { |
| 89 | return String.fromCharCode(code); |
| 90 | } else if (code >= 112 && code <= 123) { |
| 91 | return 'F' + (code - 111); |
| 92 | } |
Steven Burrows | 8dab1c7 | 2016-09-27 11:17:36 -0700 | [diff] [blame] | 93 | return null; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 94 | } |
| 95 | } |
| 96 | |
Simon Hunt | 120904e | 2016-06-23 14:26:26 -0700 | [diff] [blame] | 97 | var textFieldDoesNotBlock = { |
| 98 | enter: 1, |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 99 | esc: 1, |
Simon Hunt | 120904e | 2016-06-23 14:26:26 -0700 | [diff] [blame] | 100 | }; |
| 101 | |
Fan Cheng | 12ed9af | 2016-06-17 15:04:27 +0800 | [diff] [blame] | 102 | function textFieldInput() { |
| 103 | var t = d3.event.target.tagName.toLowerCase(); |
| 104 | return t === 'input' || t === 'textarea'; |
| 105 | } |
| 106 | |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 107 | function keyIn() { |
| 108 | var event = d3.event, |
| 109 | keyCode = event.keyCode, |
| 110 | key = whatKey(keyCode), |
Steven Burrows | 8dab1c7 | 2016-09-27 11:17:36 -0700 | [diff] [blame] | 111 | textBlockable = !textFieldDoesNotBlock[key], |
| 112 | modifiers = []; |
| 113 | |
| 114 | event.metaKey && modifiers.push('cmd'); |
| 115 | event.altKey && modifiers.push('alt'); |
| 116 | event.shiftKey && modifiers.push('shift'); |
| 117 | |
| 118 | if (!key) { |
| 119 | return; |
| 120 | } |
| 121 | |
| 122 | modifiers.push(key); |
| 123 | key = modifiers.join('-'); |
Simon Hunt | 120904e | 2016-06-23 14:26:26 -0700 | [diff] [blame] | 124 | |
| 125 | if (textBlockable && textFieldInput()) { |
| 126 | return; |
| 127 | } |
| 128 | |
| 129 | var kh = keyHandler, |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 130 | gk = kh.globalKeys[key], |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 131 | gcb = fs.isF(gk) || (fs.isA(gk) && fs.isF(gk[0])), |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 132 | dk = kh.dialogKeys[key], |
| 133 | dcb = fs.isF(dk), |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 134 | vk = kh.viewKeys[key], |
Simon Hunt | 0906014 | 2015-03-18 20:23:32 -0700 | [diff] [blame] | 135 | kl = fs.isF(kh.viewKeys._keyListener), |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 136 | vcb = fs.isF(vk) || (fs.isA(vk) && fs.isF(vk[0])) || fs.isF(kh.viewFn), |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 137 | token = 'keyev'; // indicate this was a key-pressed event |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 138 | |
Simon Hunt | 120904e | 2016-06-23 14:26:26 -0700 | [diff] [blame] | 139 | event.stopPropagation(); |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 140 | |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 141 | if (enabled) { |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 142 | if (matchSeq(key)) return; |
Thomas Vachuska | fe1f01a | 2015-12-10 23:56:02 -0800 | [diff] [blame] | 143 | |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 144 | // global callback? |
| 145 | if (gcb && gcb(token, key, keyCode, event)) { |
| 146 | // if the event was 'handled', we are done |
| 147 | return; |
| 148 | } |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 149 | // dialog callback? |
| 150 | if (dcb) { |
| 151 | dcb(token, key, keyCode, event); |
| 152 | // assume dialog handled the event |
| 153 | return; |
| 154 | } |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 155 | // otherwise, let the view callback have a shot |
| 156 | if (vcb) { |
| 157 | vcb(token, key, keyCode, event); |
| 158 | } |
Simon Hunt | 0906014 | 2015-03-18 20:23:32 -0700 | [diff] [blame] | 159 | if (kl) { |
| 160 | kl(key); |
| 161 | } |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 162 | } |
| 163 | } |
| 164 | |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 165 | // functions to obtain localized strings deferred from the setup of the |
| 166 | // global key data structures. |
| 167 | function qhlion() { |
| 168 | return ls.bundle('core.fw.QuickHelp'); |
| 169 | } |
Simon Hunt | caed041 | 2017-08-12 13:49:17 -0700 | [diff] [blame] | 170 | function qhlionShowHide() { |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 171 | return qhlion()('qh_hint_show_hide_qh'); |
| 172 | } |
| 173 | |
Simon Hunt | caed041 | 2017-08-12 13:49:17 -0700 | [diff] [blame] | 174 | function qhlionHintEsc() { |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 175 | return qhlion()('qh_hint_esc'); |
| 176 | } |
| 177 | |
Simon Hunt | caed041 | 2017-08-12 13:49:17 -0700 | [diff] [blame] | 178 | function qhlionHintT() { |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 179 | return qhlion()('qh_hint_t'); |
| 180 | } |
| 181 | |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 182 | function setupGlobalKeys() { |
Simon Hunt | 404f6b2 | 2015-01-21 14:00:56 -0800 | [diff] [blame] | 183 | angular.extend(keyHandler, { |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 184 | globalKeys: { |
Simon Hunt | caed041 | 2017-08-12 13:49:17 -0700 | [diff] [blame] | 185 | backSlash: [quickHelp, qhlionShowHide], |
| 186 | slash: [quickHelp, qhlionShowHide], |
| 187 | esc: [escapeKey, qhlionHintEsc], |
| 188 | T: [toggleTheme, qhlionHintT], |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 189 | }, |
| 190 | globalFormat: ['backSlash', 'slash', 'esc', 'T'], |
| 191 | |
| 192 | // Masked keys are global key handlers that always return true. |
| 193 | // That is, the view will never see the event for that key. |
| 194 | maskedKeys: { |
Simon Hunt | 120904e | 2016-06-23 14:26:26 -0700 | [diff] [blame] | 195 | slash: 1, |
| 196 | backSlash: 1, |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 197 | T: 1, |
| 198 | }, |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 199 | }); |
| 200 | } |
| 201 | |
| 202 | function quickHelp(view, key, code, ev) { |
Simon Hunt | d557925 | 2015-10-06 15:09:14 -0700 | [diff] [blame] | 203 | if (!globalEnabled) { |
| 204 | return false; |
| 205 | } |
Simon Hunt | 639dc66 | 2015-02-18 14:19:20 -0800 | [diff] [blame] | 206 | qhs.showQuickHelp(keyHandler); |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 207 | return true; |
| 208 | } |
| 209 | |
Simon Hunt | a0eb0a8 | 2015-02-11 12:30:06 -0800 | [diff] [blame] | 210 | // returns true if we 'consumed' the ESC keypress, false otherwise |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 211 | function escapeKey(view, key, code, ev) { |
Simon Hunt | 9d28656 | 2015-03-09 13:53:50 -0700 | [diff] [blame] | 212 | return ns.hideIfShown() || qhs.hideQuickHelp(); |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 213 | } |
| 214 | |
| 215 | function toggleTheme(view, key, code, ev) { |
Simon Hunt | d557925 | 2015-10-06 15:09:14 -0700 | [diff] [blame] | 216 | if (!globalEnabled) { |
| 217 | return false; |
| 218 | } |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 219 | ts.toggleTheme(); |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 220 | return true; |
| 221 | } |
| 222 | |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 223 | function filterMaskedKeys(map, caller, remove) { |
| 224 | var masked = [], |
| 225 | msgs = []; |
Simon Hunt | 59df0b2 | 2014-12-17 10:32:25 -0800 | [diff] [blame] | 226 | |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 227 | d3.map(map).keys().forEach(function (key) { |
| 228 | if (keyHandler.maskedKeys[key]) { |
| 229 | masked.push(key); |
| 230 | msgs.push(caller, ': Key "' + key + '" is reserved'); |
Simon Hunt | 59df0b2 | 2014-12-17 10:32:25 -0800 | [diff] [blame] | 231 | } |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 232 | }); |
| 233 | |
| 234 | if (msgs.length) { |
| 235 | $log.warn(msgs.join('\n')); |
| 236 | } |
| 237 | |
| 238 | if (remove) { |
| 239 | masked.forEach(function (k) { |
| 240 | delete map[k]; |
| 241 | }); |
| 242 | } |
| 243 | return masked; |
| 244 | } |
| 245 | |
| 246 | function unexParam(fname, x) { |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 247 | $log.warn(fname, ': unexpected parameter-- ', x); |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 248 | } |
| 249 | |
| 250 | function setKeyBindings(keyArg) { |
| 251 | var fname = 'setKeyBindings()', |
| 252 | kFunc = fs.isF(keyArg), |
| 253 | kMap = fs.isO(keyArg); |
| 254 | |
| 255 | if (kFunc) { |
| 256 | // set general key handler callback |
| 257 | keyHandler.viewFn = kFunc; |
| 258 | } else if (kMap) { |
| 259 | filterMaskedKeys(kMap, fname, true); |
| 260 | keyHandler.viewKeys = kMap; |
| 261 | } else { |
| 262 | unexParam(fname, keyArg); |
Simon Hunt | 59df0b2 | 2014-12-17 10:32:25 -0800 | [diff] [blame] | 263 | } |
| 264 | } |
| 265 | |
| 266 | function getKeyBindings() { |
| 267 | var gkeys = d3.map(keyHandler.globalKeys).keys(), |
| 268 | masked = d3.map(keyHandler.maskedKeys).keys(), |
| 269 | vkeys = d3.map(keyHandler.viewKeys).keys(), |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 270 | vfn = !!fs.isF(keyHandler.viewFn); |
Simon Hunt | 59df0b2 | 2014-12-17 10:32:25 -0800 | [diff] [blame] | 271 | |
| 272 | return { |
| 273 | globalKeys: gkeys, |
| 274 | maskedKeys: masked, |
| 275 | viewKeys: vkeys, |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 276 | viewFunction: vfn, |
Simon Hunt | 59df0b2 | 2014-12-17 10:32:25 -0800 | [diff] [blame] | 277 | }; |
| 278 | } |
| 279 | |
Bri Prebilic Cole | 9dcaea5 | 2015-07-21 14:39:48 -0700 | [diff] [blame] | 280 | function unbindKeys() { |
| 281 | keyHandler.viewKeys = {}; |
| 282 | keyHandler.viewFn = null; |
| 283 | keyHandler.viewGestures = []; |
| 284 | } |
| 285 | |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 286 | function bindDialogKeys(map) { |
| 287 | var fname = 'bindDialogKeys()', |
| 288 | kMap = fs.isO(map); |
| 289 | |
| 290 | if (kMap) { |
| 291 | filterMaskedKeys(map, fname, true); |
| 292 | keyHandler.dialogKeys = kMap; |
| 293 | } else { |
| 294 | unexParam(fname, map); |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | function unbindDialogKeys() { |
| 299 | keyHandler.dialogKeys = {}; |
| 300 | } |
| 301 | |
Simon Hunt | 7189222 | 2015-09-29 13:39:40 -0700 | [diff] [blame] | 302 | function checkNotGlobal(o) { |
| 303 | var oops = []; |
| 304 | if (fs.isO(o)) { |
| 305 | angular.forEach(o, function (val, key) { |
| 306 | if (keyHandler.globalKeys[key]) { |
| 307 | oops.push(key); |
| 308 | } |
| 309 | }); |
| 310 | if (oops.length) { |
| 311 | $log.warn('Ignoring reserved global key(s):', oops.join(',')); |
| 312 | oops.forEach(function (key) { |
| 313 | delete o[key]; |
| 314 | }); |
| 315 | } |
| 316 | } |
| 317 | } |
| 318 | |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 319 | angular.module('onosUtil') |
Simon Hunt | 639dc66 | 2015-02-18 14:19:20 -0800 | [diff] [blame] | 320 | .factory('KeyService', |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 321 | ['$log', 'FnService', 'ThemeService', 'NavService', |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 322 | 'EeService', 'LionService', |
Simon Hunt | 639dc66 | 2015-02-18 14:19:20 -0800 | [diff] [blame] | 323 | |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 324 | function (_$log_, _fs_, _ts_, _ns_, _ee_, _ls_) { |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 325 | $log = _$log_; |
| 326 | fs = _fs_; |
| 327 | ts = _ts_; |
Simon Hunt | 9d28656 | 2015-03-09 13:53:50 -0700 | [diff] [blame] | 328 | ns = _ns_; |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 329 | ee = _ee_; |
Simon Hunt | a6ab9f0 | 2017-07-11 11:45:50 -0700 | [diff] [blame] | 330 | ls = _ls_; |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 331 | |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 332 | return { |
Simon Hunt | 639dc66 | 2015-02-18 14:19:20 -0800 | [diff] [blame] | 333 | bindQhs: function (_qhs_) { |
| 334 | qhs = _qhs_; |
| 335 | }, |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 336 | installOn: function (elem) { |
| 337 | elem.on('keydown', keyIn); |
| 338 | setupGlobalKeys(); |
| 339 | }, |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 340 | keyBindings: function (x) { |
| 341 | if (x === undefined) { |
| 342 | return getKeyBindings(); |
| 343 | } else { |
| 344 | setKeyBindings(x); |
| 345 | } |
| 346 | }, |
Bri Prebilic Cole | 9dcaea5 | 2015-07-21 14:39:48 -0700 | [diff] [blame] | 347 | unbindKeys: unbindKeys, |
Simon Hunt | 5198f08 | 2016-02-04 13:41:17 -0800 | [diff] [blame] | 348 | dialogKeys: function (x) { |
| 349 | if (x === undefined) { |
| 350 | unbindDialogKeys(); |
| 351 | } else { |
| 352 | bindDialogKeys(x); |
| 353 | } |
| 354 | }, |
Simon Hunt | f4ef6dd | 2016-02-03 17:05:14 -0800 | [diff] [blame] | 355 | addSeq: function (word, data) { |
| 356 | fs.addToTrie(seq, word, data); |
| 357 | }, |
| 358 | remSeq: function (word) { |
| 359 | fs.removeFromTrie(seq, word); |
| 360 | }, |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 361 | gestureNotes: function (g) { |
| 362 | if (g === undefined) { |
| 363 | return keyHandler.viewGestures; |
| 364 | } else { |
Yuta HIGUCHI | 4f39bcd | 2014-12-18 20:46:14 -0800 | [diff] [blame] | 365 | keyHandler.viewGestures = fs.isA(g) || []; |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 366 | } |
Simon Hunt | 36fc15c | 2015-02-12 17:02:58 -0800 | [diff] [blame] | 367 | }, |
| 368 | enableKeys: function (b) { |
| 369 | enabled = b; |
Simon Hunt | 7189222 | 2015-09-29 13:39:40 -0700 | [diff] [blame] | 370 | }, |
Simon Hunt | d557925 | 2015-10-06 15:09:14 -0700 | [diff] [blame] | 371 | enableGlobalKeys: function (b) { |
| 372 | globalEnabled = b; |
| 373 | }, |
Steven Burrows | 1c2a968 | 2017-07-14 16:52:46 +0100 | [diff] [blame] | 374 | checkNotGlobal: checkNotGlobal, |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 375 | }; |
Simon Hunt | 1eecfa2 | 2014-12-16 14:46:29 -0800 | [diff] [blame] | 376 | }]); |
| 377 | |
Simon Hunt | dc6362a | 2014-12-18 19:55:23 -0800 | [diff] [blame] | 378 | }()); |