Discard shift
when it causes keyboard to output a different character
This commit is contained in:
parent
9c412a8806
commit
136550de9f
2 changed files with 78 additions and 74 deletions
|
@ -11,22 +11,22 @@
|
||||||
"enter": "menu::Confirm",
|
"enter": "menu::Confirm",
|
||||||
"escape": "menu::Cancel",
|
"escape": "menu::Cancel",
|
||||||
"ctrl-c": "menu::Cancel",
|
"ctrl-c": "menu::Cancel",
|
||||||
"shift-cmd-{": "pane::ActivatePrevItem",
|
"cmd-{": "pane::ActivatePrevItem",
|
||||||
"shift-cmd-}": "pane::ActivateNextItem",
|
"cmd-}": "pane::ActivateNextItem",
|
||||||
"alt-cmd-left": "pane::ActivatePrevItem",
|
"alt-cmd-left": "pane::ActivatePrevItem",
|
||||||
"alt-cmd-right": "pane::ActivateNextItem",
|
"alt-cmd-right": "pane::ActivateNextItem",
|
||||||
"cmd-w": "pane::CloseActiveItem",
|
"cmd-w": "pane::CloseActiveItem",
|
||||||
"cmd-shift-W": "workspace::CloseWindow",
|
"cmd-shift-w": "workspace::CloseWindow",
|
||||||
"alt-cmd-t": "pane::CloseInactiveItems",
|
"alt-cmd-t": "pane::CloseInactiveItems",
|
||||||
"cmd-s": "workspace::Save",
|
"cmd-s": "workspace::Save",
|
||||||
"cmd-shift-S": "workspace::SaveAs",
|
"cmd-shift-s": "workspace::SaveAs",
|
||||||
"cmd-=": "zed::IncreaseBufferFontSize",
|
"cmd-=": "zed::IncreaseBufferFontSize",
|
||||||
"cmd--": "zed::DecreaseBufferFontSize",
|
"cmd--": "zed::DecreaseBufferFontSize",
|
||||||
"cmd-0": "zed::ResetBufferFontSize",
|
"cmd-0": "zed::ResetBufferFontSize",
|
||||||
"cmd-,": "zed::OpenSettings",
|
"cmd-,": "zed::OpenSettings",
|
||||||
"cmd-q": "zed::Quit",
|
"cmd-q": "zed::Quit",
|
||||||
"cmd-n": "workspace::NewFile",
|
"cmd-n": "workspace::NewFile",
|
||||||
"cmd-shift-N": "workspace::NewWindow",
|
"cmd-shift-n": "workspace::NewWindow",
|
||||||
"cmd-o": "workspace::Open"
|
"cmd-o": "workspace::Open"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -53,7 +53,7 @@
|
||||||
"cmd-c": "editor::Copy",
|
"cmd-c": "editor::Copy",
|
||||||
"cmd-v": "editor::Paste",
|
"cmd-v": "editor::Paste",
|
||||||
"cmd-z": "editor::Undo",
|
"cmd-z": "editor::Undo",
|
||||||
"cmd-shift-Z": "editor::Redo",
|
"cmd-shift-z": "editor::Redo",
|
||||||
"up": "editor::MoveUp",
|
"up": "editor::MoveUp",
|
||||||
"down": "editor::MoveDown",
|
"down": "editor::MoveDown",
|
||||||
"left": "editor::MoveLeft",
|
"left": "editor::MoveLeft",
|
||||||
|
@ -73,17 +73,17 @@
|
||||||
"cmd-up": "editor::MoveToBeginning",
|
"cmd-up": "editor::MoveToBeginning",
|
||||||
"cmd-down": "editor::MoveToEnd",
|
"cmd-down": "editor::MoveToEnd",
|
||||||
"shift-up": "editor::SelectUp",
|
"shift-up": "editor::SelectUp",
|
||||||
"ctrl-shift-P": "editor::SelectUp",
|
"ctrl-shift-p": "editor::SelectUp",
|
||||||
"shift-down": "editor::SelectDown",
|
"shift-down": "editor::SelectDown",
|
||||||
"ctrl-shift-N": "editor::SelectDown",
|
"ctrl-shift-n": "editor::SelectDown",
|
||||||
"shift-left": "editor::SelectLeft",
|
"shift-left": "editor::SelectLeft",
|
||||||
"ctrl-shift-B": "editor::SelectLeft",
|
"ctrl-shift-b": "editor::SelectLeft",
|
||||||
"shift-right": "editor::SelectRight",
|
"shift-right": "editor::SelectRight",
|
||||||
"ctrl-shift-F": "editor::SelectRight",
|
"ctrl-shift-f": "editor::SelectRight",
|
||||||
"alt-shift-left": "editor::SelectToPreviousWordStart",
|
"alt-shift-left": "editor::SelectToPreviousWordStart",
|
||||||
"alt-shift-B": "editor::SelectToPreviousWordStart",
|
"alt-shift-b": "editor::SelectToPreviousWordStart",
|
||||||
"alt-shift-right": "editor::SelectToNextWordEnd",
|
"alt-shift-right": "editor::SelectToNextWordEnd",
|
||||||
"alt-shift-F": "editor::SelectToNextWordEnd",
|
"alt-shift-f": "editor::SelectToNextWordEnd",
|
||||||
"cmd-shift-up": "editor::SelectToBeginning",
|
"cmd-shift-up": "editor::SelectToBeginning",
|
||||||
"cmd-shift-down": "editor::SelectToEnd",
|
"cmd-shift-down": "editor::SelectToEnd",
|
||||||
"cmd-a": "editor::SelectAll",
|
"cmd-a": "editor::SelectAll",
|
||||||
|
@ -94,7 +94,7 @@
|
||||||
"stop_at_soft_wraps": true
|
"stop_at_soft_wraps": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ctrl-shift-A": [
|
"ctrl-shift-a": [
|
||||||
"editor::SelectToBeginningOfLine",
|
"editor::SelectToBeginningOfLine",
|
||||||
{
|
{
|
||||||
"stop_at_soft_wraps": true
|
"stop_at_soft_wraps": true
|
||||||
|
@ -106,7 +106,7 @@
|
||||||
"stop_at_soft_wraps": true
|
"stop_at_soft_wraps": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ctrl-shift-E": [
|
"ctrl-shift-e": [
|
||||||
"editor::SelectToEndOfLine",
|
"editor::SelectToEndOfLine",
|
||||||
{
|
{
|
||||||
"stop_at_soft_wraps": true
|
"stop_at_soft_wraps": true
|
||||||
|
@ -155,7 +155,7 @@
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-f": "project_search::ToggleFocus",
|
"cmd-f": "project_search::ToggleFocus",
|
||||||
"cmd-g": "search::SelectNextMatch",
|
"cmd-g": "search::SelectNextMatch",
|
||||||
"cmd-shift-G": "search::SelectPrevMatch",
|
"cmd-shift-g": "search::SelectPrevMatch",
|
||||||
"alt-cmd-c": "search::ToggleCaseSensitive",
|
"alt-cmd-c": "search::ToggleCaseSensitive",
|
||||||
"alt-cmd-w": "search::ToggleWholeWord",
|
"alt-cmd-w": "search::ToggleWholeWord",
|
||||||
"alt-cmd-r": "search::ToggleRegex"
|
"alt-cmd-r": "search::ToggleRegex"
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
"alt-up": "editor::SelectLargerSyntaxNode",
|
"alt-up": "editor::SelectLargerSyntaxNode",
|
||||||
"alt-down": "editor::SelectSmallerSyntaxNode",
|
"alt-down": "editor::SelectSmallerSyntaxNode",
|
||||||
"cmd-u": "editor::UndoSelection",
|
"cmd-u": "editor::UndoSelection",
|
||||||
"cmd-shift-U": "editor::RedoSelection",
|
"cmd-shift-u": "editor::RedoSelection",
|
||||||
"f8": "editor::GoToNextDiagnostic",
|
"f8": "editor::GoToNextDiagnostic",
|
||||||
"shift-f8": "editor::GoToPrevDiagnostic",
|
"shift-f8": "editor::GoToPrevDiagnostic",
|
||||||
"f2": "editor::Rename",
|
"f2": "editor::Rename",
|
||||||
|
@ -203,7 +203,7 @@
|
||||||
{
|
{
|
||||||
"context": "Editor && mode == full",
|
"context": "Editor && mode == full",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-shift-O": "outline::Toggle",
|
"cmd-shift-o": "outline::Toggle",
|
||||||
"ctrl-g": "go_to_line::Toggle"
|
"ctrl-g": "go_to_line::Toggle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -248,9 +248,9 @@
|
||||||
],
|
],
|
||||||
"ctrl-0": "pane::ActivateLastItem",
|
"ctrl-0": "pane::ActivateLastItem",
|
||||||
"ctrl--": "pane::GoBack",
|
"ctrl--": "pane::GoBack",
|
||||||
"shift-ctrl-_": "pane::GoForward",
|
"ctrl-_": "pane::GoForward",
|
||||||
"cmd-shift-T": "pane::ReopenClosedItem",
|
"cmd-shift-t": "pane::ReopenClosedItem",
|
||||||
"cmd-shift-F": "project_search::ToggleFocus"
|
"cmd-shift-f": "project_search::ToggleFocus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -293,14 +293,14 @@
|
||||||
8
|
8
|
||||||
],
|
],
|
||||||
"cmd-b": "workspace::ToggleLeftSidebar",
|
"cmd-b": "workspace::ToggleLeftSidebar",
|
||||||
"cmd-shift-F": "project_search::Deploy",
|
"cmd-shift-f": "project_search::Deploy",
|
||||||
"cmd-k cmd-t": "theme_selector::Toggle",
|
"cmd-k cmd-t": "theme_selector::Toggle",
|
||||||
"cmd-k cmd-s": "zed::OpenKeymap",
|
"cmd-k cmd-s": "zed::OpenKeymap",
|
||||||
"cmd-t": "project_symbols::Toggle",
|
"cmd-t": "project_symbols::Toggle",
|
||||||
"cmd-p": "file_finder::Toggle",
|
"cmd-p": "file_finder::Toggle",
|
||||||
"cmd-shift-P": "command_palette::Toggle",
|
"cmd-shift-p": "command_palette::Toggle",
|
||||||
"cmd-shift-M": "diagnostics::Deploy",
|
"cmd-shift-m": "diagnostics::Deploy",
|
||||||
"cmd-shift-E": "project_panel::Toggle",
|
"cmd-shift-e": "project_panel::Toggle",
|
||||||
"cmd-alt-s": "workspace::SaveAll"
|
"cmd-alt-s": "workspace::SaveAll"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -308,9 +308,9 @@
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"ctrl-shift-K": "editor::DeleteLine",
|
"ctrl-shift-k": "editor::DeleteLine",
|
||||||
"cmd-shift-D": "editor::DuplicateLine",
|
"cmd-shift-d": "editor::DuplicateLine",
|
||||||
"cmd-shift-L": "editor::SplitSelectionIntoLines",
|
"cmd-shift-l": "editor::SplitSelectionIntoLines",
|
||||||
"ctrl-cmd-up": "editor::MoveLineUp",
|
"ctrl-cmd-up": "editor::MoveLineUp",
|
||||||
"ctrl-cmd-down": "editor::MoveLineDown",
|
"ctrl-cmd-down": "editor::MoveLineDown",
|
||||||
"ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
|
"ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
|
||||||
|
@ -322,9 +322,9 @@
|
||||||
"ctrl-alt-right": "editor::MoveToNextSubwordEnd",
|
"ctrl-alt-right": "editor::MoveToNextSubwordEnd",
|
||||||
"ctrl-alt-f": "editor::MoveToNextSubwordEnd",
|
"ctrl-alt-f": "editor::MoveToNextSubwordEnd",
|
||||||
"ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
|
"ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
|
||||||
"ctrl-alt-shift-B": "editor::SelectToPreviousSubwordStart",
|
"ctrl-alt-shift-b": "editor::SelectToPreviousSubwordStart",
|
||||||
"ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
|
"ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
|
||||||
"ctrl-alt-shift-F": "editor::SelectToNextSubwordEnd"
|
"ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -385,8 +385,8 @@
|
||||||
{
|
{
|
||||||
"context": "Workspace",
|
"context": "Workspace",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"cmd-shift-C": "contacts_panel::Toggle",
|
"cmd-shift-c": "contacts_panel::Toggle",
|
||||||
"cmd-shift-B": "workspace::ToggleRightSidebar"
|
"cmd-shift-b": "workspace::ToggleRightSidebar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,6 +10,7 @@ use cocoa::{
|
||||||
base::{id, YES},
|
base::{id, YES},
|
||||||
foundation::NSString as _,
|
foundation::NSString as _,
|
||||||
};
|
};
|
||||||
|
use objc::{msg_send, sel, sel_impl};
|
||||||
use std::{borrow::Cow, ffi::CStr, os::raw::c_char};
|
use std::{borrow::Cow, ffi::CStr, os::raw::c_char};
|
||||||
|
|
||||||
const BACKSPACE_KEY: u16 = 0x7f;
|
const BACKSPACE_KEY: u16 = 0x7f;
|
||||||
|
@ -77,42 +78,13 @@ impl Event {
|
||||||
cmd,
|
cmd,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
NSEventType::NSKeyDown => {
|
NSEventType::NSKeyDown => Some(Self::KeyDown(KeyDownEvent {
|
||||||
let modifiers = native_event.modifierFlags();
|
keystroke: parse_keystroke(native_event),
|
||||||
let ctrl = modifiers.contains(NSEventModifierFlags::NSControlKeyMask);
|
is_held: native_event.isARepeat() == YES,
|
||||||
let alt = modifiers.contains(NSEventModifierFlags::NSAlternateKeyMask);
|
})),
|
||||||
let shift = modifiers.contains(NSEventModifierFlags::NSShiftKeyMask);
|
NSEventType::NSKeyUp => Some(Self::KeyUp(KeyUpEvent {
|
||||||
let cmd = modifiers.contains(NSEventModifierFlags::NSCommandKeyMask);
|
keystroke: parse_keystroke(native_event),
|
||||||
|
})),
|
||||||
let unmodified_chars = get_key_text(native_event)?;
|
|
||||||
Some(Self::KeyDown(KeyDownEvent {
|
|
||||||
keystroke: Keystroke {
|
|
||||||
ctrl,
|
|
||||||
alt,
|
|
||||||
shift,
|
|
||||||
cmd,
|
|
||||||
key: unmodified_chars.into(),
|
|
||||||
},
|
|
||||||
is_held: native_event.isARepeat() == YES,
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
NSEventType::NSKeyUp => {
|
|
||||||
let modifiers = native_event.modifierFlags();
|
|
||||||
let ctrl = modifiers.contains(NSEventModifierFlags::NSControlKeyMask);
|
|
||||||
let alt = modifiers.contains(NSEventModifierFlags::NSAlternateKeyMask);
|
|
||||||
let shift = modifiers.contains(NSEventModifierFlags::NSShiftKeyMask);
|
|
||||||
let cmd = modifiers.contains(NSEventModifierFlags::NSCommandKeyMask);
|
|
||||||
let unmodified_chars = get_key_text(native_event)?;
|
|
||||||
Some(Self::KeyUp(KeyUpEvent {
|
|
||||||
keystroke: Keystroke {
|
|
||||||
ctrl,
|
|
||||||
alt,
|
|
||||||
shift,
|
|
||||||
cmd,
|
|
||||||
key: unmodified_chars.into(),
|
|
||||||
},
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
NSEventType::NSLeftMouseDown
|
NSEventType::NSLeftMouseDown
|
||||||
| NSEventType::NSRightMouseDown
|
| NSEventType::NSRightMouseDown
|
||||||
| NSEventType::NSOtherMouseDown => {
|
| NSEventType::NSOtherMouseDown => {
|
||||||
|
@ -231,17 +203,21 @@ impl Event {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn get_key_text(native_event: id) -> Option<&'static str> {
|
unsafe fn parse_keystroke(native_event: id) -> Keystroke {
|
||||||
|
use cocoa::appkit::*;
|
||||||
|
|
||||||
|
let modifiers = native_event.modifierFlags();
|
||||||
|
let ctrl = modifiers.contains(NSEventModifierFlags::NSControlKeyMask);
|
||||||
|
let alt = modifiers.contains(NSEventModifierFlags::NSAlternateKeyMask);
|
||||||
|
let mut shift = modifiers.contains(NSEventModifierFlags::NSShiftKeyMask);
|
||||||
|
let cmd = modifiers.contains(NSEventModifierFlags::NSCommandKeyMask);
|
||||||
let unmodified_chars =
|
let unmodified_chars =
|
||||||
CStr::from_ptr(native_event.charactersIgnoringModifiers().UTF8String() as *mut c_char)
|
CStr::from_ptr(native_event.charactersIgnoringModifiers().UTF8String() as *mut c_char)
|
||||||
.to_str()
|
.to_str()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let first_char = unmodified_chars.chars().next().map(|ch| ch as u16);
|
|
||||||
use cocoa::appkit::*;
|
|
||||||
|
|
||||||
#[allow(non_upper_case_globals)]
|
#[allow(non_upper_case_globals)]
|
||||||
let unmodified_chars = match first_char {
|
let key = match unmodified_chars.chars().next().map(|ch| ch as u16) {
|
||||||
Some(SPACE_KEY) => "space",
|
Some(SPACE_KEY) => "space",
|
||||||
Some(BACKSPACE_KEY) => "backspace",
|
Some(BACKSPACE_KEY) => "backspace",
|
||||||
Some(ENTER_KEY) | Some(NUMPAD_ENTER_KEY) => "enter",
|
Some(ENTER_KEY) | Some(NUMPAD_ENTER_KEY) => "enter",
|
||||||
|
@ -267,8 +243,36 @@ unsafe fn get_key_text(native_event: id) -> Option<&'static str> {
|
||||||
Some(NSF10FunctionKey) => "f10",
|
Some(NSF10FunctionKey) => "f10",
|
||||||
Some(NSF11FunctionKey) => "f11",
|
Some(NSF11FunctionKey) => "f11",
|
||||||
Some(NSF12FunctionKey) => "f12",
|
Some(NSF12FunctionKey) => "f12",
|
||||||
_ => unmodified_chars,
|
_ => {
|
||||||
|
if shift {
|
||||||
|
let chars_without_shift: id = msg_send![
|
||||||
|
native_event,
|
||||||
|
charactersByApplyingModifiers: NSEventModifierFlags::empty()
|
||||||
|
];
|
||||||
|
let chars_without_shift =
|
||||||
|
CStr::from_ptr(chars_without_shift.UTF8String() as *mut c_char)
|
||||||
|
.to_str()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
if chars_without_shift == unmodified_chars.to_ascii_lowercase() {
|
||||||
|
chars_without_shift
|
||||||
|
} else if chars_without_shift != unmodified_chars {
|
||||||
|
shift = false;
|
||||||
|
unmodified_chars
|
||||||
|
} else {
|
||||||
|
unmodified_chars
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unmodified_chars
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Some(unmodified_chars)
|
Keystroke {
|
||||||
|
ctrl,
|
||||||
|
alt,
|
||||||
|
shift,
|
||||||
|
cmd,
|
||||||
|
key: key.into(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue