You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2026-04-24 19:55:13 +02:00
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import { StateEffect, StateField, Transaction } from '@codemirror/state';
|
|
import { EditorView } from '@codemirror/view';
|
|
import { editorSettingsFacet } from './editorSettingsExtension';
|
|
|
|
// On MacOS: Tracks the meta key
|
|
// On other platforms: Tracks the ctrl key.
|
|
const ctrlOrMetaChangedEffect = StateEffect.define<boolean>();
|
|
|
|
const ctrlOrMetaPressedField = StateField.define<boolean>({
|
|
create: () => false,
|
|
update: (value: boolean, transaction: Transaction) => {
|
|
const toggleEffect = transaction.effects.find(effect => effect.is(ctrlOrMetaChangedEffect));
|
|
if (toggleEffect) {
|
|
return toggleEffect.value;
|
|
}
|
|
return value;
|
|
},
|
|
provide: (field) => [
|
|
EditorView.editorAttributes.from(field, on => ({
|
|
class: on ? '-ctrl-or-cmd-pressed' : '',
|
|
})),
|
|
...(() => {
|
|
const onEvent = (event: KeyboardEvent|MouseEvent, view: EditorView) => {
|
|
const editorSettings = view.state.facet(editorSettingsFacet);
|
|
const hasModifier = editorSettings.preferMacShortcuts ? event.metaKey : event.ctrlKey;
|
|
|
|
if (hasModifier !== view.state.field(ctrlOrMetaPressedField)) {
|
|
view.dispatch({
|
|
effects: [
|
|
ctrlOrMetaChangedEffect.of(hasModifier),
|
|
],
|
|
});
|
|
}
|
|
};
|
|
|
|
return [
|
|
EditorView.domEventObservers({
|
|
keydown: onEvent,
|
|
keyup: onEvent,
|
|
mouseenter: onEvent,
|
|
mousemove: onEvent,
|
|
}),
|
|
];
|
|
})(),
|
|
],
|
|
});
|
|
|
|
export default [
|
|
ctrlOrMetaPressedField,
|
|
];
|