[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master ff9cf99 6/6: Support opening the toolkit menu bar on NS
From: |
Po Lu |
Subject: |
master ff9cf99 6/6: Support opening the toolkit menu bar on NS |
Date: |
Wed, 10 Nov 2021 00:57:41 -0500 (EST) |
branch: master
commit ff9cf991c1608cd2578a66cba41e654a2b5d9144
Author: oldosfan <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Support opening the toolkit menu bar on NS
* src/nsmenu.m (ns_activate_menubar, Fns_open_menubar): New functions.
* src/nsterm.m (ns_create_terminal): Add activate_menubar_hook.
* lisp/menu-bar.el (menu-bar-open): Use ns-menu-bar-open on Nextstep.
---
lisp/menu-bar.el | 8 +++++---
src/nsmenu.m | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/nsterm.m | 1 +
3 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 1a81f1a..e50d4fe 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -2665,9 +2665,10 @@ first TTY menu-bar menu to be dropped down.
Interactively,
this is the numeric argument to the command.
This function decides which method to use to access the menu
depending on FRAME's terminal device. On X displays, it calls
-`x-menu-bar-open'; on Windows, `w32-menu-bar-open'; otherwise it
-calls either `popup-menu' or `tmm-menubar' depending on whether
-`tty-menu-open-use-tmm' is nil or not.
+`x-menu-bar-open'; on Windows, `w32-menu-bar-open';
+on NS, `ns-menu-bar-open'; otherwise it calls either `popup-menu'
+or `tmm-menubar' depending on whether `tty-menu-open-use-tmm'
+is nil or not.
If FRAME is nil or not given, use the selected frame."
(interactive
@@ -2676,6 +2677,7 @@ If FRAME is nil or not given, use the selected frame."
(cond
((eq type 'x) (x-menu-bar-open frame))
((eq type 'w32) (w32-menu-bar-open frame))
+ ((eq type 'ns) (ns-menu-bar-open frame))
((and (null tty-menu-open-use-tmm)
(not (zerop (or (frame-parameter nil 'menu-bar-lines) 0))))
;; Make sure the menu bar is up to date. One situation where
diff --git a/src/nsmenu.m b/src/nsmenu.m
index 29201e6..b93d3a7 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -439,6 +439,44 @@ set_frame_menubar (struct frame *f, bool deep_p)
ns_update_menubar (f, deep_p);
}
+void
+ns_activate_menubar (struct frame *frame)
+{
+ if (frame != SELECTED_FRAME ()
+ || !FRAME_EXTERNAL_MENU_BAR (frame))
+ return;
+
+ block_input ();
+ NSApplication *app = [NSApplication sharedApplication];
+ NSMenu *menu = [app mainMenu];
+ for (NSMenuItem *item in [menu itemArray])
+ {
+ if ([item hasSubmenu])
+ {
+#ifdef NS_IMPL_GNUSTEP
+ [[item submenu] display];
+#else
+ NSWindow *window = [FRAME_NS_VIEW (frame) window];
+ NSScreen *screen = [window screen];
+
+ NSRect screen_frame = [screen frame];
+ [app postEvent: [NSEvent mouseEventWithType: NSLeftMouseDown
+ location: NSMakePoint (NSMinX
(screen_frame),
+ NSMinY
(screen_frame) + 10)
+ modifierFlags: 0
+ timestamp: 0
+ windowNumber: [window windowNumber]
+ context: [NSGraphicsContext
currentContext]
+ eventNumber: 0
+ clickCount: 1
+ pressure: 1.0f]
+ atStart: YES];
+#endif
+ break;
+ }
+ }
+ unblock_input ();
+}
/* ==========================================================================
@@ -1916,6 +1954,22 @@ DEFUN ("menu-or-popup-active-p",
Fmenu_or_popup_active_p, Smenu_or_popup_active_
return popup_activated () ? Qt : Qnil;
}
+DEFUN ("ns-menu-bar-open", Fns_menu_bar_open, Sns_menu_bar_open, 0, 1, "i",
+ doc: /* Start key navigation of the menu bar in FRAME.
+This initially opens the first menu bar item and you can then navigate with the
+arrow keys, select a menu entry with the return key or cancel with the
+escape key. If FRAME has no menu bar this function does nothing.
+
+If FRAME is nil or not given, use the selected frame. */)
+ (Lisp_Object frame)
+{
+ struct frame *f = decode_window_system_frame (frame);
+
+ ns_activate_menubar (f);
+
+ return Qnil;
+}
+
/* ==========================================================================
Lisp interface declaration
@@ -1927,6 +1981,7 @@ syms_of_nsmenu (void)
{
defsubr (&Sns_reset_menu);
defsubr (&Smenu_or_popup_active_p);
+ defsubr (&Sns_menu_bar_open);
DEFSYM (Qdebug_on_next_call, "debug-on-next-call");
}
diff --git a/src/nsterm.m b/src/nsterm.m
index ed0e7a2..4e84e13 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -5067,6 +5067,7 @@ ns_create_terminal (struct ns_display_info *dpyinfo)
terminal->delete_frame_hook = ns_destroy_window;
terminal->delete_terminal_hook = ns_delete_terminal;
terminal->change_tab_bar_height_hook = ns_change_tab_bar_height;
+ terminal->activate_menubar_hook = ns_activate_menubar;
/* Other hooks are NULL by default. */
return terminal;
- master updated (057fd1e -> ff9cf99), Po Lu, 2021/11/10
- master 68a2a33 2/6: *** empty log message ***, Po Lu, 2021/11/10
- master 278e4fc 1/6: Fix mouse face in NS port, Po Lu, 2021/11/10
- master 346cfc8 3/6: Add support for event processing via XInput 2, Po Lu, 2021/11/10
- master 7117bbc 5/6: Revert "Fix erasing cursor on top of raised boxes in NS port", Po Lu, 2021/11/10
- master 2b5a2ab 4/6: Fix erasing cursor on top of raised boxes in NS port, Po Lu, 2021/11/10
- master ff9cf99 6/6: Support opening the toolkit menu bar on NS,
Po Lu <=