diff --git a/src/Plugins/MacOS/mac_utilities.h b/src/Plugins/MacOS/mac_utilities.h index 538327c264..a3e5f0a65f 100644 --- a/src/Plugins/MacOS/mac_utilities.h +++ b/src/Plugins/MacOS/mac_utilities.h @@ -25,4 +25,7 @@ void mac_fix_yosemite_bug(); void mac_begin_server (); void mac_end_server (); +void mac_save_and_clear_menu (); +void mac_restore_menu (); + #endif // MAC_UTILITIES_H diff --git a/src/Plugins/MacOS/mac_utilities.mm b/src/Plugins/MacOS/mac_utilities.mm index 5ede9a254b..68b89a23ce 100644 --- a/src/Plugins/MacOS/mac_utilities.mm +++ b/src/Plugins/MacOS/mac_utilities.mm @@ -504,6 +504,23 @@ unless we remove the duplicates and most plugins fail to start (since they are } +static NSMenu* savedMainMenu= nil; + +void +mac_save_and_clear_menu () { + savedMainMenu= [[NSApp mainMenu] retain]; + [NSApp setMainMenu:nil]; +} + +void +mac_restore_menu () { + if (savedMainMenu) { + [NSApp setMainMenu:savedMainMenu]; + [savedMainMenu release]; + savedMainMenu= nil; + } +} + static id background_activity= nil; void diff --git a/src/Plugins/Qt/qt_chooser_widget.cpp b/src/Plugins/Qt/qt_chooser_widget.cpp index 86b48e9276..fd36c370f0 100644 --- a/src/Plugins/Qt/qt_chooser_widget.cpp +++ b/src/Plugins/Qt/qt_chooser_widget.cpp @@ -24,12 +24,17 @@ #include "mupdf_picture.hpp" #endif +#include #include #include #include #include #include +#ifdef OS_MACOS +#include "MacOS/mac_utilities.h" +#endif + #include using moebius::data::scm_quote; @@ -344,6 +349,15 @@ qt_chooser_widget_rep::perform_dialog () { r.moveCenter (pos); dialog->setGeometry (r); +#ifdef OS_MACOS + // On macOS, QAction shortcuts registered in the menu bar become NSMenuItem + // key equivalents. When a native file dialog is open, these key equivalents + // intercept standard editing shortcuts (Cmd+V, Cmd+C, Cmd+X, Cmd+A) before + // the dialog's text field can handle them. Temporarily removing the native + // menu allows the dialog to process these keys normally. + mac_save_and_clear_menu (); +#endif + QStringList fileNames; file= "#f"; if (dialog->exec ()) { @@ -429,6 +443,10 @@ qt_chooser_widget_rep::perform_dialog () { delete dialog; +#ifdef OS_MACOS + mac_restore_menu (); +#endif + cmd (); if (!is_nil (quit)) quit (); }