|
6 | 6 | const toggle_combo = options.toggleKeyCombo?.toLowerCase().split('-');
|
7 | 7 | const nav_keys = Object.values(options.navKeys).map((k) => k.toLowerCase());
|
8 | 8 | let enabled = false;
|
9 |
| - let hasOpened = false; |
| 9 | + let has_opened = false; |
10 | 10 |
|
11 | 11 | const icon = `data:image/svg+xml;base64,${btoa(
|
12 | 12 | `
|
|
27 | 27 |
|
28 | 28 | let active_el;
|
29 | 29 |
|
30 |
| - let enabled_ts; |
| 30 | + let hold_start_ts; |
31 | 31 |
|
32 | 32 | $: show_toggle =
|
33 | 33 | options.showToggleButton === 'always' || (options.showToggleButton === 'active' && enabled);
|
|
125 | 125 | if (file_loc) {
|
126 | 126 | stop(event);
|
127 | 127 | fetch(`${options.__internal.base}/__open-in-editor?file=${encodeURIComponent(file_loc)}`);
|
128 |
| - hasOpened = true; |
| 128 | + has_opened = true; |
129 | 129 | if (options.holdMode && is_holding()) {
|
130 | 130 | disable();
|
131 | 131 | }
|
|
145 | 145 | }
|
146 | 146 |
|
147 | 147 | function is_combo(event) {
|
148 |
| - return toggle_combo?.every((key) => is_key_active(key, event)); |
| 148 | + return is_toggle(event) && toggle_combo?.every((key) => is_key_active(key, event)); |
| 149 | + } |
| 150 | +
|
| 151 | + function is_toggle(event) { |
| 152 | + return toggle_combo?.includes(event.key.toLowerCase()); |
149 | 153 | }
|
150 | 154 |
|
151 | 155 | function is_nav(event) {
|
|
157 | 161 | }
|
158 | 162 |
|
159 | 163 | function is_holding() {
|
160 |
| - return enabled_ts && Date.now() - enabled_ts > 250; |
| 164 | + return hold_start_ts && Date.now() - hold_start_ts > 250; |
161 | 165 | }
|
162 | 166 |
|
163 | 167 | function stop(event) {
|
|
167 | 171 | }
|
168 | 172 |
|
169 | 173 | function keydown(event) {
|
170 |
| - if (event.repeat || event.key == null) { |
| 174 | + if (event.repeat || event.key == null || (!enabled && !is_toggle(event))) { |
171 | 175 | return;
|
172 | 176 | }
|
173 |
| -
|
174 | 177 | if (is_combo(event)) {
|
175 | 178 | toggle();
|
176 | 179 | if (options.holdMode && enabled) {
|
177 |
| - enabled_ts = Date.now(); |
| 180 | + hold_start_ts = Date.now(); |
178 | 181 | }
|
179 | 182 | } else if (enabled) {
|
180 | 183 | if (is_nav(event)) {
|
|
185 | 188 | }
|
186 | 189 | } else if (is_open(event)) {
|
187 | 190 | open_editor(event);
|
| 191 | + } else if (is_holding()) { |
| 192 | + // unhandled additional key pressed while holding, possibly another shortcut, disable again |
| 193 | + disable(); |
188 | 194 | }
|
189 | 195 | }
|
190 | 196 | }
|
191 | 197 |
|
192 | 198 | function keyup(event) {
|
193 |
| - if (event.repeat || event.key == null) { |
| 199 | + if (event.repeat || event.key == null || !enabled) { |
194 | 200 | return;
|
195 | 201 | }
|
196 |
| - const k = event.key.toLowerCase(); |
197 |
| - if (enabled && is_holding() && toggle_combo.includes(k)) { |
198 |
| - disable(); |
199 |
| - } else { |
200 |
| - enabled_ts = null; |
| 202 | + if (is_toggle(event)) { |
| 203 | + if (is_holding()) { |
| 204 | + disable(); |
| 205 | + } else { |
| 206 | + hold_start_ts = null; |
| 207 | + } |
201 | 208 | }
|
202 | 209 | }
|
203 | 210 |
|
|
249 | 256 |
|
250 | 257 | function disable() {
|
251 | 258 | enabled = false;
|
252 |
| - hasOpened = false; |
253 |
| - enabled_ts = null; |
| 259 | + has_opened = false; |
| 260 | + hold_start_ts = null; |
254 | 261 | const b = document.body;
|
255 | 262 | listeners(b, enabled);
|
256 | 263 | if (options.customStyles) {
|
|
267 | 274 | }
|
268 | 275 |
|
269 | 276 | function onLeave() {
|
270 |
| - if (hasOpened) { |
| 277 | + // disable if a file has been opened or combo is held |
| 278 | + if (enabled && (has_opened || hold_start_ts)) { |
271 | 279 | disable();
|
272 | 280 | }
|
273 | 281 | }
|
|
0 commit comments