summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-05-14 17:46:25 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-05-14 17:46:25 +0200
commit79c3db48cf593ccbe64f6c845af0777caebde2a8 (patch)
tree42cdb8075c572ae089f3fd596876692ecd4fe978 /src
parentea962375255190b5e641783ff193cff06ff616c6 (diff)
New member function Fl_Menu_Bar::play_menu(const char *title)
Diffstat (limited to 'src')
-rw-r--r--src/Fl_MacOS_Sys_Menu_Bar.mm32
-rw-r--r--src/Fl_Menu_Bar.cxx9
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx5
-rw-r--r--src/Fl_Sys_Menu_Bar_Driver.H1
-rw-r--r--src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H1
5 files changed, 48 insertions, 0 deletions
diff --git a/src/Fl_MacOS_Sys_Menu_Bar.mm b/src/Fl_MacOS_Sys_Menu_Bar.mm
index d51734729..aa8560966 100644
--- a/src/Fl_MacOS_Sys_Menu_Bar.mm
+++ b/src/Fl_MacOS_Sys_Menu_Bar.mm
@@ -726,4 +726,36 @@ void fl_mac_set_about(Fl_Callback *cb, void *user_data, int shortcut) {
Fl_Sys_Menu_Bar::about(cb, user_data);
}
+
+void Fl_MacOS_Sys_Menu_Bar_Driver::play_menu(const char *menu_name) {
+ // Use the accessibility interface to programmatically open a menu of the system menubar
+ char *ts = remove_ampersand(menu_name);
+ NSString *mac_name = [NSString stringWithUTF8String:ts];
+ free(ts);
+ AXUIElementRef appElement = AXUIElementCreateApplication(getpid());
+ AXUIElementRef menuBar;
+ AXError error = AXUIElementCopyAttributeValue(appElement, kAXMenuBarAttribute, (CFTypeRef *)&menuBar);
+ if (error) return;
+ CFIndex count = -1;
+ error = AXUIElementGetAttributeValueCount(menuBar, kAXChildrenAttribute, &count);
+ if (error) { CFRelease(menuBar); return; }
+ NSArray *children = nil;
+ error = AXUIElementCopyAttributeValues(menuBar, kAXChildrenAttribute, 0, count, (CFArrayRef *)&children);
+ if (error) { CFRelease(menuBar); return; }
+ for (id child in children) {
+ AXUIElementRef element = (AXUIElementRef)child;
+ id title;
+ AXError error = AXUIElementCopyAttributeValue(element, kAXTitleAttribute, (CFTypeRef *)&title);
+ if (!error && [title isEqualToString:mac_name]) {
+ AXUIElementPerformAction(element, kAXPressAction);
+ CFRelease(title);
+ break;
+ }
+ CFRelease(title);
+ }
+ CFRelease(menuBar);
+ [children release];
+ CFRelease(appElement);
+}
+
#endif /* __APPLE__ */
diff --git a/src/Fl_Menu_Bar.cxx b/src/Fl_Menu_Bar.cxx
index ebb97b7ca..d605efb1e 100644
--- a/src/Fl_Menu_Bar.cxx
+++ b/src/Fl_Menu_Bar.cxx
@@ -67,3 +67,12 @@ Fl_Menu_Bar::Fl_Menu_Bar(int X, int Y, int W, int H,const char *l)
: Fl_Menu_(X,Y,W,H,l)
{
}
+
+
+void Fl_Menu_Bar::play_menu(const char *title) {
+ const Fl_Menu_Item *v = find_item(title);
+ if (v) {
+ v = menu()->pulldown(x(), y(), w(), h(), v, this, 0, 1);
+ picked(v);
+ }
+}
diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx
index c0ae88b25..477470cd3 100644
--- a/src/Fl_Sys_Menu_Bar.cxx
+++ b/src/Fl_Sys_Menu_Bar.cxx
@@ -242,6 +242,11 @@ void Fl_Sys_Menu_Bar::create_window_menu() {
}
}
+void Fl_Sys_Menu_Bar::play_menu(const char *title) {
+ if (driver()) fl_sys_menu_bar->driver()->play_menu(title);
+ else Fl_Menu_Bar::play_menu(title);
+}
+
#if !defined(FL_DOXYGEN)
Fl_Sys_Menu_Bar_Driver *Fl_Sys_Menu_Bar::driver() {
return Fl::system_driver()->sys_menu_bar_driver();
diff --git a/src/Fl_Sys_Menu_Bar_Driver.H b/src/Fl_Sys_Menu_Bar_Driver.H
index b8e4b4373..38862ce01 100644
--- a/src/Fl_Sys_Menu_Bar_Driver.H
+++ b/src/Fl_Sys_Menu_Bar_Driver.H
@@ -48,6 +48,7 @@ public:
virtual void replace(int index, const char *name) { bar->Fl_Menu_Bar::replace(index, name); }
virtual void mode(int i, int fl) { bar->Fl_Menu_Bar::mode(i, fl); }
virtual void create_window_menu() {}
+ virtual void play_menu(const char *title) {}
static Fl_Sys_Menu_Bar::window_menu_style_enum window_menu_style() { return window_menu_style_; }
static void window_menu_style(Fl_Sys_Menu_Bar::window_menu_style_enum style) { window_menu_style_ = style; }
};
diff --git a/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H
index 684ae91f6..28f113a8e 100644
--- a/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H
+++ b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H
@@ -44,6 +44,7 @@ public:
void remove_window(Fl_Window *win);
void rename_window(Fl_Window *win);
static Fl_MacOS_Sys_Menu_Bar_Driver* driver();
+ void play_menu(const char *menu_name) FL_OVERRIDE;
};