diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-05-18 12:09:49 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-05-18 12:09:49 +0200 |
| commit | 642ec5b74b3b86610d1e28841c86d408ac079373 (patch) | |
| tree | 0fa6306575a0a32a80c0da65b3cc6c2f39ae73e5 /src | |
| parent | d0922792ae6be8c30fadfa93ad7cd482f38da160 (diff) | |
Slightly reorganize code of Fl_MacOS_Sys_Menu_Bar_Driver::play_menu()
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_MacOS_Sys_Menu_Bar.mm | 44 | ||||
| -rw-r--r-- | src/Fl_Sys_Menu_Bar.cxx | 3 |
2 files changed, 23 insertions, 24 deletions
diff --git a/src/Fl_MacOS_Sys_Menu_Bar.mm b/src/Fl_MacOS_Sys_Menu_Bar.mm index 788f8b61e..de7e7b00c 100644 --- a/src/Fl_MacOS_Sys_Menu_Bar.mm +++ b/src/Fl_MacOS_Sys_Menu_Bar.mm @@ -729,38 +729,36 @@ void fl_mac_set_about(Fl_Callback *cb, void *user_data, int shortcut) { void Fl_MacOS_Sys_Menu_Bar_Driver::play_menu(const Fl_Menu_Item *item) { // Use the accessibility interface to programmatically open a menu of the system menubar - NSArray *children = nil; - CFIndex count = -1; + CFArrayRef children = NULL; + CFIndex count = 0; AXUIElementRef element; - NSEnumerator *enumerator = nil; char *label = remove_ampersand(item->label()); NSString *mac_name = NSLocalizedString([NSString stringWithUTF8String:label], nil); free(label); AXUIElementRef appElement = AXUIElementCreateApplication(getpid()); AXUIElementRef menu_bar = NULL; - AXError error = AXUIElementCopyAttributeValue(appElement, kAXMenuBarAttribute, (CFTypeRef *)&menu_bar); - if (error) goto way_out; - error = AXUIElementGetAttributeValueCount(menu_bar, kAXChildrenAttribute, &count); - if (error) goto way_out; - error = AXUIElementCopyAttributeValues(menu_bar, kAXChildrenAttribute, 0, count, (CFArrayRef *)&children); - if (error) goto way_out; - enumerator = [children objectEnumerator]; - [enumerator nextObject]; // skip Apple menu - [enumerator nextObject]; // skip application menu - while ((element = (AXUIElementRef)[enumerator nextObject]) != nil) { - id title; - AXError error = AXUIElementCopyAttributeValue(element, kAXTitleAttribute, (CFTypeRef *)&title); - if (error) goto way_out; - if ([title isEqualToString:mac_name]) { - AXUIElementPerformAction(element, kAXPressAction); - CFRelease(title); - break; + AXError error = AXUIElementCopyAttributeValue(appElement, kAXMenuBarAttribute, + (CFTypeRef *)&menu_bar); + if (!error) error = AXUIElementGetAttributeValueCount(menu_bar, kAXChildrenAttribute, &count); + if (!error) error = AXUIElementCopyAttributeValues(menu_bar, kAXChildrenAttribute, 0, count, + &children); + if (!error) { + NSEnumerator *enumerator = [(NSArray*)children objectEnumerator]; + [enumerator nextObject]; // skip Apple menu + [enumerator nextObject]; // skip application menu + bool need_more = true; + while (need_more && (element = (AXUIElementRef)[enumerator nextObject]) != nil) { + CFTypeRef title = NULL; + need_more = ( AXUIElementCopyAttributeValue(element, kAXTitleAttribute, &title) == 0 ); + if (need_more && [(NSString*)title isEqualToString:mac_name]) { + AXUIElementPerformAction(element, kAXPressAction); + need_more = false; + } + if (title) CFRelease(title); } - CFRelease(title); } -way_out: if (menu_bar) CFRelease(menu_bar); - if (children) [children release]; + if (children) CFRelease(children); CFRelease(appElement); } diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx index fc9605eb0..fc83e6bab 100644 --- a/src/Fl_Sys_Menu_Bar.cxx +++ b/src/Fl_Sys_Menu_Bar.cxx @@ -243,7 +243,8 @@ void Fl_Sys_Menu_Bar::create_window_menu() { } void Fl_Sys_Menu_Bar::play_menu(const Fl_Menu_Item *item) { - if (driver()) fl_sys_menu_bar->driver()->play_menu(item); + Fl_Sys_Menu_Bar_Driver *dr = driver(); + if (dr) dr->play_menu(item); else Fl_Menu_Bar::play_menu(item); } |
