Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set function keys as key equivalents programmatically

From NSMenuItem Class Reference

If you want to specify the Backspace key as the key equivalent for a menu item, use a single character string with NSBackspaceCharacter (defined in NSText.h as 0x08) and for the Forward Delete key, use NSDeleteCharacter (defined in NSText.h as 0x7F).

Not sure I understand "use a single character string with..." from the class ref.

// This works as expected

NSString *s = [NSString stringWithFormat:@"%c",NSDeleteCharacter];

    [myMenuItem setKeyEquivalentModifierMask:NSCommandKeyMask];

    [myMenuItem setKeyEquivalent:s];

enter image description here

// This doesn't works as expected

NSString *s = [NSString stringWithFormat:@"%c",NSF2FunctionKey];

    [myMenuItem setKeyEquivalentModifierMask:NSCommandKeyMask];

    [myMenuItem setKeyEquivalent:s];

enter image description here

like image 973
vcirilli Avatar asked Aug 22 '13 16:08

vcirilli


3 Answers

Figured it out myself.

   unichar c = NSF2FunctionKey;

    NSString *f2 = [NSString stringWithCharacters:&c length:1];

    [mi setKeyEquivalent:f2];
    [mi setKeyEquivalentModifierMask:NSCommandKeyMask];

enter image description here

like image 109
vcirilli Avatar answered Nov 16 '22 22:11

vcirilli


Example for Swift 2.0:

let key = String(utf16CodeUnits: [unichar(NSBackspaceCharacter)], count: 1) as String
menuItem.keyEquivalentModifierMask = Int(NSEventModifierFlags.CommandKeyMask.rawValue)
menuItem.keyEquivalent = key
like image 21
seb Avatar answered Nov 16 '22 23:11

seb


In Swift 3, 4, and 5:

let f2Character: Character = Character(UnicodeScalar(NSF2FunctionKey)!)
myMenuItem.keyEquivalent = String(f2Character)
myMenuItem.keyEquivalentModifierMask = []
like image 5
Ky. Avatar answered Nov 16 '22 23:11

Ky.