Post by Stephan WittPost by Patrick De VisscherePost by Stephan WittPost by Patrick De VisscherePost by Stephan WittPost by Patrick De VisscherePost by Stephan WittAs a follow-up on reports in the thread "LyX on OS X 10.9" from some months ago, I build LyX(master) + Qt5(stable) (CMake + XCode).
1) When starting up the menu bar is not visible; One must switch to another app and then bring lyx to the foreground to make the menu bar appear.
2) When closing the (last) window the menu bar disappears mostly, except for the LyX menu. This was also reported by Stephan Witt, but I did observe no crash.
When closing the last window Qt5 should switch to the "default menu bar" but apparently it doesn't find one and creates it's own minimal default menu bar.
The default menu bar is created by GlobalMenuBar() (in GuiApplication.cpp) which has a constructor GlobalMenuBar() : new QMenuBar(0); according to the Qt docs the first parent-less QMenuBar created will be used as the default menu bar. Apparently Qt5 does not detect the QMenuBar(0) created via a subclass;
When replacing the GlobalMenuBar() by a base QMenuBar(0) problem 2) is solved.
GlobalMenuBar() was introduced to override the event() function to handle QEvent::ShortcutOverride events but shortcuts seem to work without using the GlobalMenuBar (Cmd-Q and Cmd-, work as expected; Cmd-N and Cmd-O only work after first activating one of them via the menu, but the latter also happens in LyX211 and may not be related to Qt5). Building LyX + Qt4.8.6 confirms that GlobalMenuBar's event() is not called when issuing a shortcut with no window present. I assume that these standard mac-shortcuts are handled automatically by Qt.
If someone wants to check this, see the attached patch, which includes all changes (but does not solve issue 1)).
Patrick De Visschere
<Qt5-fix-Q_WS_MACX+GlobalMenuBar.diff>
Hi Patrick,
the GlobalMenuBar() thing is a wonderful idea! I'm struggling since a while with the Qt5 build and failed to solve this issue 2. This I did while being on vacation, so I couldn't answer earlier.
The issue 1 was solved by Benjamin Piwowar already, IMHO. It's caused by Qt5 not showing a menu top item without any action attached. The latest change is the dummy action has to be attached to the sub menu after the addMenu(subMenu) method call.
I’ve used commit 453ce611919ff66d8b00bda9a9dcc32f4d38a843, which does include this dummy action, if I’m not mistaken.
Yes, me too. But this dummy action is added before the addMenu(menu) method call. I've had to move it the addAction call after the addMenu call.
Post by Patrick De VisscherePost by Stephan WittBoth issues are regressions of Qt5, IMO.
The QMacStyle doesn't need to be replaced if LyX is linked with the QMacExtras framework.
Regarding the Q_WS_MACX macro replacement I'm not sure what should be done.
1. I'd prefer to simply replace Q_WS_MACX with Q_OS_MAC which is available since 4.6.x at least.
2. I'd prefer to replace Q_WS_X11 and Q_WS_WIN with Q_OS_X11 and Q_OS_WIN at the same time but cannot test all platforms.
This results in the attached patch. It contains some additional changes in Menu.cpp I introduced while attacking the issue 2. Furthermore I changed CMakeLists.txt because of some warnings from newer cmake.
This patch should not be commit as is but in some separate steps. Please, if someone can try it or comment on it, I'd like to hear other opinions.
With this patch I get basically the same behaviour as I described in my initial message. Without a window being present, Cmd-O and Cmd-N don’t work right away. And the application still starts without the menubar being visible (issue 1), but the shortcuts do work.
Ok, that's not good.
But on my system the menu bar is visible on startup.
* Mac OS X 10.8.5
* Darwin Kernel Version 12.5.0
$ configure -debug-and-release -opensource -silent -shared -confirm-license -no-strip -no-kms -no-pkg-config -nomake examples -nomake tools -skip qtquick1 -skip qtwebkit -skip qtconnectivity -skip qtquickcontrols -skip qtdeclarative -skip qtscript -arch x86_64 -prefix /Users/Shared/LyX/qt-5.3.1-frameworks-cocoa-x86_64
With autotools I build with
* gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
With cmake I build with
* AppleClang 5.1.0.5030040 (Apple LLVM 5.1)
The LyX package I made on a Mac 10.6.8 works like the package build on 10.8.5.
My environment
* Mac OS X 10.9.4
* Darwin Kernel Version 13.3.0
* Qt 5.3.1 (stable branch) (default Cocoa)
./configure -opensource -silent -shared -release -no-dbus -nomake examples -nomake tools -no-framework
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
I’ve build for 10.8 with "compiler default” C++ settings, or for
10.9 with c++11 and libc++ settings,
with the same result;
Although I haven’t a clue where to start debugging issue 1, I think I'll start by building the -debug version of qt5.
Or could it be a 10.9 issue?
Building the debug version is an option to attack the issue. On a Mac this results in two separate shared libraries in the Qt frameworks. E.g. QtCore and QtCore_debug inside the QtCore.framework - at runtime one may activate the debug version via environment DYLD_IMAGE_SUFFIX=_debug. AFAIK, the additional debug version for Qt is build by an separate make call - so I would be surprised if it improves the situation at runtime. But of course, you have the option to step into Qt calls after building the debug libraries.
I think it's more likely an issue with 10.9 - perhaps a compile time or an runtime issue or both.
You said you had tried it with 10.8 deployment target - do you have similar library dependencies for your resulting LyX?
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/Users/Share/LyX/qt-5.3.1-frameworks-cocoa-x86_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.3.0, current version 5.3.1)
/Users/Share/LyX/qt-5.3.1-frameworks-cocoa-x86_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.3.0, current version 5.3.1)
/Users/Share/LyX/utilities/lib/libhunspell-1.3.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/Share/LyX/utilities/lib/libaspell.15.dylib (compatibility version 17.0.0, current version 17.5.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1187.39.0)
/Users/Share/LyX/qt-5.3.1-frameworks-cocoa-x86_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.3.0, current version 5.3.1)
/Users/Share/LyX/qt-5.3.1-frameworks-cocoa-x86_64/lib/QtConcurrent.framework/Versions/5/QtConcurrent (compatibility version 5.3.0, current version 5.3.1)
/Users/Share/LyX/qt-5.3.1-frameworks-cocoa-x86_64/lib/QtMacExtras.framework/Versions/5/QtMacExtras (compatibility version 5.3.0, current version 5.3.1)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.19.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.18.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 57.0.0)
Stephan
Mine are very similar but libiconv and zlib are different (I use the macports versions) and I have 2 extras: libmagic and /System/…/Cocoa, which I find strange.
/usr/local/Qt-5.3.1/lib/libQt5Core.5.dylib (compatibility version 5.3.0, current version 5.3.1)
/usr/local/Qt-5.3.1/lib/libQt5Gui.5.dylib (compatibility version 5.3.0, current version 5.3.1)
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
/usr/lib/libhunspell-1.2.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libaspell.15.dylib (compatibility version 17.0.0, current version 17.5.0)
/opt/local/lib/libmagic.1.dylib (compatibility version 2.0.0, current version 2.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
/usr/local/Qt-5.3.1/lib/libQt5Widgets.5.dylib (compatibility version 5.3.0, current version 5.3.1)
/usr/local/Qt-5.3.1/lib/libQt5Concurrent.5.dylib (compatibility version 5.3.0, current version 5.3.1)
/usr/local/Qt-5.3.1/lib/libQt5MacExtras.5.dylib (compatibility version 5.3.0, current version 5.3.1)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1187.39.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.19.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.18.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 57.0.0)
Hmm. What's the reason to use the macports versions of zlib and iconv?
I'd guess you want (or cmake wants) to use aspell from macports and
this is the price you pay?
If I use the system libraries I get this warning from cmake
Undefined symbols for architecture x86_64:
"_libiconv", referenced from:
(anonymous namespace)::iconv_codecvt_facet::do_iconv(void*, char const**, unsigned long*, char**, unsigned long*) const in libsupport.a(docstream.o)
lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long) in libsupport.a(unicode.o)
"_libiconv_close", referenced from:
(anonymous namespace)::iconv_codecvt_facet::~iconv_codecvt_facet() in libsupport.a(docstream.o)
lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long) in libsupport.a(unicode.o)
lyx::IconvProcessor::Impl::~Impl() in libsupport.a(unicode.o)
"_libiconv_open", referenced from:
(anonymous namespace)::iconv_codecvt_facet::iconv_codecvt_facet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, unsigned long) in libsupport.a(docstream.o)
lyx::IconvProcessor::init() in libsupport.a(unicode.o)
ld: symbol(s) not found for architecture x86_64
and the build fails with linker errors:
Undefined symbols for architecture x86_64:
"_libiconv", referenced from:
(anonymous namespace)::iconv_codecvt_facet::do_iconv(void*, char const**, unsigned long*, char**, unsigned long*) const in libsupport.a(docstream.o)
lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long) in libsupport.a(unicode.o)
"_libiconv_close", referenced from:
(anonymous namespace)::iconv_codecvt_facet::~iconv_codecvt_facet() in libsupport.a(docstream.o)
lyx::IconvProcessor::convert(char const*, unsigned long, char*, unsigned long) in libsupport.a(unicode.o)
lyx::IconvProcessor::Impl::~Impl() in libsupport.a(unicode.o)
"_libiconv_open", referenced from:
(anonymous namespace)::iconv_codecvt_facet::iconv_codecvt_facet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, unsigned long) in libsupport.a(docstream.o)
lyx::IconvProcessor::init() in libsupport.a(unicode.o)
ld: symbol(s) not found for architecture x86_64
Post by Stephan WittI'm trying hard to avoid the mixture of system libraries with the versions from
macports. In your case I suspect the qt libraries you've built are compiled with
the system versions of these libraries (zlib resp. iconv). You may verify this with
the config.summary file in the qtbase directory of your build tree. (I've attached
the contents of my summary file.)
But I really don't know if and how this can cause the effects you see.
Regarding the Cocoa framework I'm surprised too. libmagic is detected and included
by the cmake Xcode project generator, I think.
I installed libmagic with macports and cmake finds it. I’ve only installed it recently to get rid of the cmake warning. It’s probably not needed.
Post by Stephan WittI uploaded to dropbox the package made by autotools from patched 2.2.0dev. Perhaps,
you can try it and see if it works on your system.
https://dl.dropboxusercontent.com/u/27842660/LyX-2.2.0dev-2014-08-20%2Bqt5-x86_64-cocoa.dmg
https://dl.dropboxusercontent.com/u/27842660/LyX-2.2.0dev-2014-08-20%2Bqt5-x86_64-cocoa.dmg.sig
It works OK. The menubar appears immediately.
Post by Stephan WittStephan
<config.summary>