diff --git a/uppsrc/CtrlCore/CocoKeys.h b/uppsrc/CtrlCore/CocoKeys.h index 6978c23fc..92083055a 100644 --- a/uppsrc/CtrlCore/CocoKeys.h +++ b/uppsrc/CtrlCore/CocoKeys.h @@ -8,9 +8,10 @@ K_SPACE = kVK_Space|K_DELTA, K_RETURN = kVK_Return|K_DELTA, K_ENTER = K_RETURN, -K_SHIFT_KEY, +K_SHIFT_KEY = 500|K_DELTA, K_CTRL_KEY, K_ALT_KEY, +K_OPTION_KEY, K_CAPSLOCK, K_ESCAPE = kVK_Escape|K_DELTA, diff --git a/uppsrc/CtrlCore/CocoProc.mm b/uppsrc/CtrlCore/CocoProc.mm index e6919a6d5..686c85bd2 100644 --- a/uppsrc/CtrlCore/CocoProc.mm +++ b/uppsrc/CtrlCore/CocoProc.mm @@ -108,11 +108,32 @@ struct MMImp { if(!up && !(k & (K_CTRL|K_ALT))) { WString x = ToWString((CFStringRef)(e.characters)); for(wchar c : x) - if(c < 0xF700 && c >= 32 && c != 127) + if(c < 0xF700 && (c >= 32 && c != 127 || c == 9)) ctrl->DispatchKey(c, 1); } return true; } + + static bool KeyFlags(Upp::Ctrl *ctrl, NSEvent *e) { + bool alt = GetAlt(); + bool ctl = GetCtrl(); + bool sht = GetShift(); + bool opt = GetOption(); + Flags(e); + if(!ctrl->IsEnabled()) + return false; + + if(alt != GetAlt()) + ctrl->DispatchKey(K_ALT_KEY|(alt * K_KEYUP), 1); + if(ctl != GetCtrl()) + ctrl->DispatchKey(K_CTRL_KEY|(ctl * K_KEYUP), 1); + if(sht != GetShift()) + ctrl->DispatchKey(K_SHIFT_KEY|(sht * K_KEYUP), 1); + if(opt != GetOption()) + ctrl->DispatchKey(K_OPTION_KEY|(opt * K_KEYUP), 1); + + return true; + } static void BecomeKey(Upp::Ctrl *ctrl) { @@ -190,6 +211,11 @@ struct MMImp { [super keyUp:e]; } +- (void)flagsChanged:(NSEvent *)e { + if(!Upp::MMImp::KeyFlags(ctrl, e)) + [super flagsChanged:e]; +} + - (BOOL)windowShouldClose:(NSWindow *)sender { Upp::MMImp::DoClose(ctrl); return NO; diff --git a/uppsrc/CtrlCore/CtrlKbd.cpp b/uppsrc/CtrlCore/CtrlKbd.cpp index fd3bd8c19..b709139cb 100644 --- a/uppsrc/CtrlCore/CtrlKbd.cpp +++ b/uppsrc/CtrlCore/CtrlKbd.cpp @@ -423,6 +423,9 @@ String GetKeyDesc(dword key) { K_PLUS, tt_("key\v[+]") }, { K_MINUS, tt_("key\v[-]") }, { K_COMMA, tt_("key\v[,]") }, { K_PERIOD, tt_("key\v[.]") }, { K_SEMICOLON, tt_("key\v[;]") }, { K_SLASH, tt_("key\v[/]") }, { K_GRAVE, tt_("key\v[`]") }, { K_LBRACKET, tt_("key\v[[]") }, { K_BACKSLASH, tt_("key\v[\\]") }, { K_RBRACKET, tt_("key\v[]]") }, { K_QUOTEDBL, tt_("key\v[']") }, + #ifdef PLATFORM_COCOA + { K_OPTION_KEY, tt_("key\vOption") }, + #endif { 0, NULL } }; for(int i = 0; nkey[i].key; i++)