Skip to content

Commit

Permalink
Fix issue where native menu would not reset
Browse files Browse the repository at this point in the history
Calling SetMainMenu would append, oops
  • Loading branch information
andydotxyz committed Jul 26, 2021
1 parent 7fedbdc commit 6edc898
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
6 changes: 6 additions & 0 deletions internal/driver/glfw/menu_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ void completeDarwinMenu(void* menu, bool prepend);
const void* createDarwinMenu(const char* label);
const void* darwinAppMenu();
const void* insertDarwinMenuItem(const void* menu, const char* label, int id, int index, bool isSeparator);
void resetDarwinMenu();
// Used for tests.
const void* test_darwinMainMenu();
Expand Down Expand Up @@ -68,6 +69,10 @@ func addNativeSubmenu(w *window, nsParentMenuItem unsafe.Pointer, menu *fyne.Men
return nextItemID
}

func clearNativeMenu() {
C.resetDarwinMenu()
}

func createNativeMenu(w *window, menu *fyne.Menu, nextItemID int) (unsafe.Pointer, int) {
nsMenu := C.createDarwinMenu(C.CString(menu.Label))
for _, item := range menu.Items {
Expand Down Expand Up @@ -170,6 +175,7 @@ func menuChecked(id int) bool {
}

func setupNativeMenu(w *window, main *fyne.MainMenu) {
clearNativeMenu()
nextItemID := 0
callbacks = []*menuCallbacks{}
var helpMenu *fyne.Menu
Expand Down
37 changes: 33 additions & 4 deletions internal/driver/glfw/menu_darwin.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

const int menuTagMin = 5000;

extern void menuCallback(int);
extern BOOL menuEnabled(int);
extern BOOL menuChecked(int);
Expand All @@ -14,17 +16,17 @@ @interface FyneMenuHandler : NSObject {

@implementation FyneMenuHandler
+ (void) tapped:(NSMenuItem*) item {
menuCallback([item tag]);
menuCallback([item tag]-menuTagMin);
}
+ (BOOL) validateMenuItem:(NSMenuItem*) item {
BOOL checked = menuChecked([item tag]);
BOOL checked = menuChecked([item tag]-menuTagMin);
if (checked) {
[item setState:NSOnState];
} else {
[item setState:NSOffState];
}

return menuEnabled([item tag]);
return menuEnabled([item tag]-menuTagMin);
}
@end

Expand All @@ -41,6 +43,7 @@ void assignDarwinSubmenu(const void* i, const void* m) {
void completeDarwinMenu(const void* m, bool prepend) {
NSMenu* main = nativeMainMenu();
NSMenuItem* top = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
[top setTag:menuTagMin];
if (prepend) {
[main insertItem:top atIndex:1];
} else {
Expand Down Expand Up @@ -73,7 +76,7 @@ void handleException(const char* m, id e) {
action:@selector(tapped:)
keyEquivalent:@""];
[item setTarget:[FyneMenuHandler class]];
[item setTag:id];
[item setTag:id+menuTagMin];
}

if (index > -1) {
Expand All @@ -90,6 +93,32 @@ void handleException(const char* m, id e) {
return [app mainMenu];
}

void resetDarwinMenu() {
NSMenu *root = nativeMainMenu();
NSEnumerator *items = [[root itemArray] objectEnumerator];

id object;
while (object = [items nextObject]) {
NSMenuItem *item = object;
if ([item tag] < menuTagMin) {
// check for inserted items (like Settings...)
NSMenu *menu = [item submenu];
NSEnumerator *subItems = [[menu itemArray] objectEnumerator];

id sub;
while (sub = [subItems nextObject]) {
NSMenuItem *item = sub;
if ([item tag] >= menuTagMin) {
[menu removeItem: item];
}
}

continue;
}
[root removeItem: item];
}
}

const void* test_darwinMainMenu() {
return nativeMainMenu();
}
Expand Down

0 comments on commit 6edc898

Please sign in to comment.