summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-05-18 12:09:49 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-05-18 12:09:49 +0200
commit642ec5b74b3b86610d1e28841c86d408ac079373 (patch)
tree0fa6306575a0a32a80c0da65b3cc6c2f39ae73e5
parentd0922792ae6be8c30fadfa93ad7cd482f38da160 (diff)
Slightly reorganize code of Fl_MacOS_Sys_Menu_Bar_Driver::play_menu()
-rw-r--r--src/Fl_MacOS_Sys_Menu_Bar.mm44
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx3
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);
}