Skip to content

Commit

Permalink
Merge pull request #9777 from keymanapp/fix/mac/sonoma-keyboards-menu
Browse files Browse the repository at this point in the history
fix(mac): move keyboard menu items to main Input Menu from submenu 🔥
  • Loading branch information
sgschantz authored Oct 20, 2023
2 parents 87c563b + 1ceeb81 commit e96b99f
Show file tree
Hide file tree
Showing 6 changed files with 214 additions and 137 deletions.
17 changes: 7 additions & 10 deletions mac/Keyman4MacIM/Keyman4MacIM/Base.lproj/MainMenu.xib
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
Expand All @@ -19,19 +19,16 @@
</customObject>
<menu id="Uod-T8-nBO">
<items>
<menuItem title="Keyboards" tag="1" id="bQa-j9-nHe">
<menuItem isSeparatorItem="YES" tag="-4" id="uqs-C7-aK3"/>
<menuItem title="Configuration..." tag="-3" id="P1b-lE-yFw"/>
<menuItem title="On-Screen Keyboard" tag="-2" id="s96-JI-YDh">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Keyboards" id="goP-aK-3WB"/>
</menuItem>
<menuItem title="Configuration..." tag="2" id="P1b-lE-yFw"/>
<menuItem title="On-Screen Keyboard" tag="3" id="s96-JI-YDh">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="About" tag="4" id="kb2-ww-RS3">
<menuItem title="About..." tag="-1" id="kb2-ww-RS3" userLabel="About">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
</items>
<point key="canvasLocation" x="57" y="152"/>
<point key="canvasLocation" x="56.5" y="151.5"/>
</menu>
</objects>
</document>
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,8 @@ - (void)checkBoxAction:(id)sender {
[self saveActiveKeyboards];
}
else if (checkBox.state == NSOffState) {
if ([self.AppDelegate debugMode])
NSLog(@"Disabling active keyboard: %@", kmxFilePath);
[self.activeKeyboards removeObject:kmxFilePath];
[self saveActiveKeyboards];
}
Expand Down
73 changes: 24 additions & 49 deletions mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m
Original file line number Diff line number Diff line change
Expand Up @@ -183,65 +183,40 @@ - (KMXFile *)kmx {
return self.AppDelegate.kmx;
}


- (void)menuAction:(id)sender {
NSMenuItem *mItem = [sender objectForKey:kIMKCommandMenuItemName];
NSInteger itag = mItem.tag;
if ([self.AppDelegate debugMode])
NSLog(@"Keyman menu clicked - tag: %lu", itag);
if (itag == 2) {
// Using `showConfigurationWindow` instead of `showPreferences:` because `showPreferences:` is missing in
// High Sierra (10.13.1 - 10.13.3). See: https://bugreport.apple.com/web/?problemID=35422518
// rrb: where Apple's API is broken (10.13.1-10.13.3) call our workaround, otherwise, call showPreferences
u_int16_t systemVersion = [KMOSVersion SystemVersion];
if ([KMOSVersion Version_10_13_1] <= systemVersion && systemVersion <= [KMOSVersion Version_10_13_3]) // between 10.13.1 and 10.13.3 inclusive
{
NSLog(@"Input Menu: calling workaround instead of showPreferences (sys ver %x)", systemVersion);
[self.AppDelegate showConfigurationWindow]; // call our workaround
}
else
{
NSLog(@"Input Menu: calling Apple's showPreferences (sys ver %x)", systemVersion);
[self showPreferences:sender]; // call Apple API
}
if (itag == CONFIG_MENUITEM_TAG) {
[self showConfigurationWindow:sender];
}
else if (itag == 3) {
else if (itag == OSK_MENUITEM_TAG) {
[self.AppDelegate showOSK];
}
else if (itag == 4) {
else if (itag == ABOUT_MENUITEM_TAG) {
[self.AppDelegate showAboutWindow];
}
else if (itag >= 1000) {
NSMenuItem *keyboards = [self.AppDelegate.menu itemWithTag:1];
for (NSMenuItem *item in keyboards.submenu.itemArray) {
if (item.tag == itag)
[item setState:NSOnState];
else
[item setState:NSOffState];
}

NSString *path = [self.AppDelegate.activeKeyboards objectAtIndex:itag%1000];
KMXFile *kmx = [[KMXFile alloc] initWithFilePath:path];
[self.AppDelegate setKmx:kmx];
KVKFile *kvk = nil;
NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:path];
NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey];
if (kvkFilename != nil) {
NSString *kvkFilePath = [self.AppDelegate kvkFilePathFromFilename:kvkFilename];
if (kvkFilePath != nil)
kvk = [[KVKFile alloc] initWithFilePath:kvkFilePath];
}
[self.AppDelegate setKvk:kvk];
NSString *keyboardName = [kmxInfo objectForKey:kKMKeyboardNameKey];
if ([self.AppDelegate debugMode])
NSLog(@"Selected keyboard from menu: %@", keyboardName);
[self.AppDelegate setKeyboardName:keyboardName];
[self.AppDelegate setKeyboardIcon:[kmxInfo objectForKey:kKMKeyboardIconKey]];
[self.AppDelegate setContextBuffer:nil];
[self.AppDelegate setSelectedKeyboard:path];
[self.AppDelegate loadSavedStores];
if (kvk != nil && self.AppDelegate.alwaysShowOSK)
[self.AppDelegate showOSK];
else if (itag >= KEYMAN_FIRST_KEYBOARD_MENUITEM_TAG) {
[self.AppDelegate selectKeyboardFromMenu:itag];
}
}

- (void)showConfigurationWindow:(id)sender {
// Using `showConfigurationWindow` instead of `showPreferences:` because `showPreferences:` is missing in
// High Sierra (10.13.1 - 10.13.3). See: https://bugreport.apple.com/web/?problemID=35422518
// rrb: where Apple's API is broken (10.13.1-10.13.3) call our workaround, otherwise, call showPreferences
u_int16_t systemVersion = [KMOSVersion SystemVersion];
if ([KMOSVersion Version_10_13_1] <= systemVersion && systemVersion <= [KMOSVersion Version_10_13_3]) // between 10.13.1 and 10.13.3 inclusive
{
NSLog(@"Input Menu: calling workaround instead of showPreferences (sys ver %x)", systemVersion);
[self.AppDelegate showConfigurationWindow]; // call our workaround
}
else
{
NSLog(@"Input Menu: calling Apple's showPreferences (sys ver %x)", systemVersion);
[self showPreferences:sender]; // call Apple API
}
}

@end
17 changes: 17 additions & 0 deletions mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,21 @@ typedef struct {
NSString *apiKeymanCom;
} KeymanVersionInfo;

// tags for default menu items, displayed whether keyboards are active or not
static const int DIVIDER_MENUITEM_TAG = -4;
static const int CONFIG_MENUITEM_TAG = -3;
static const int OSK_MENUITEM_TAG = -2;
static const int ABOUT_MENUITEM_TAG = -1;

// the number of menu items that do not represent active keyboards
static const int DEFAULT_KEYMAN_MENU_ITEM_COUNT = 4;

// the tag for the first keyboard dynamically added to the menu
static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_TAG = 0;

// the menu index for the first keyboard dynamically added to the menu
static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0;

@interface KMInputMethodAppDelegate : NSObject
#define USE_ALERT_SHOW_HELP_TO_FORCE_EASTER_EGG_CRASH_FROM_ENGINE 1
#ifdef USE_ALERT_SHOW_HELP_TO_FORCE_EASTER_EGG_CRASH_FROM_ENGINE
Expand All @@ -55,6 +70,7 @@ typedef struct {
@property (nonatomic, strong) NSMutableArray *kmxFileList;
@property (nonatomic, strong) NSString *selectedKeyboard;
@property (nonatomic, strong) NSMutableArray *activeKeyboards;
@property (assign) int numberOfKeyboardMenuItems;
@property (nonatomic, strong) NSMutableString *contextBuffer;
@property (nonatomic, assign) NSEventModifierFlags currentModifierFlags;
@property (nonatomic, assign) CFMachPortRef lowLevelEventTap;
Expand Down Expand Up @@ -88,6 +104,7 @@ typedef struct {
- (void)showAboutWindow;
- (void)showOSK;
- (void)showConfigurationWindow;
- (void)selectKeyboardFromMenu:(NSInteger)tag;
- (void)sleepFollowingDeactivationOfServer:(id)lastServer;
- (void)wakeUpWith:(id)newServer;
- (void)handleKeyEvent:(NSEvent *)event;
Expand Down
Loading

0 comments on commit e96b99f

Please sign in to comment.