Repository.mk | 1 include/vcl/ImageTree.hxx | 2 include/vcl/svmain.hxx | 2 include/vcl/window.hxx | 2 vcl/Library_vcl.mk | 113 +++--------------------- vcl/Library_vclplug_osx.mk | 195 ++++++++++++++++++++++++++++++++++++++++++ vcl/Module_vcl.mk | 1 vcl/inc/bmpfast.hxx | 4 vcl/inc/osx/salinst.h | 5 - vcl/inc/salinst.hxx | 4 vcl/inc/vclpluginapi.h | 6 + vcl/osx/saldata.cxx | 8 + vcl/osx/salinst.cxx | 137 +++++++---------------------- vcl/osx/salmenu.cxx | 190 +++++++++++++++++++--------------------- vcl/osx/salplug.cxx | 167 +++++++++++++++++++++++++++++++++++ vcl/osx/vclnsapp.mm | 16 --- vcl/source/app/svmain.cxx | 10 -- vcl/source/app/svmainhook.cxx | 34 ------- 18 files changed, 528 insertions(+), 369 deletions(-)
New commits: commit 55a5917777004d84bf4a5c5814c9e5ff7dd73f3c Author: Jan-Marek Glogowski <[email protected]> AuthorDate: Wed Sep 12 19:56:39 2018 +0200 Commit: Jan-Marek Glogowski <[email protected]> CommitDate: Wed Sep 12 18:03:52 2018 +0000 Make osx a vclplug Also removes this nested NSApplicationMain calling. Now builds our own app menu. Still needs passing of debug options to cocoa. Change-Id: I4179ec6e03b5e3d7ba9dd4cee38aa51cb452d20f diff --git a/Repository.mk b/Repository.mk index bf5af2f647c2..fff511dc8fed 100644 --- a/Repository.mk +++ b/Repository.mk @@ -485,6 +485,7 @@ $(eval $(call gb_Helper_register_libraries_for_install,OOOLIBS,ooo, \ AppleRemote \ ) \ fps_aqua \ + vclplug_osx \ MacOSXSpell \ ) \ )) diff --git a/include/vcl/ImageTree.hxx b/include/vcl/ImageTree.hxx index 66a82b000ebc..6598c34c09e9 100644 --- a/include/vcl/ImageTree.hxx +++ b/include/vcl/ImageTree.hxx @@ -70,7 +70,7 @@ public: /** a crude form of life cycle control (called from DeInitVCL; otherwise, * if the ImplImageTree singleton were destroyed during exit that would * be too late for the destructors of the bitmaps in maIconCache)*/ - void shutdown(); + VCL_DLLPUBLIC void shutdown(); }; #endif diff --git a/include/vcl/svmain.hxx b/include/vcl/svmain.hxx index c4437b27d556..6305c090d289 100644 --- a/include/vcl/svmain.hxx +++ b/include/vcl/svmain.hxx @@ -25,7 +25,7 @@ // #i47888# allow for alternative initialization as required for e.g. MacOSX bool ImplSVMainHook( int* ); -int ImplSVMain(); +VCL_DLLPUBLIC int ImplSVMain(); VCL_DLLPUBLIC int SVMain(); diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index fc74f2918ab5..ef26ea68e1bf 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -555,7 +555,7 @@ public: SalFrame* ImplGetFrame() const; SAL_DLLPRIVATE ImplFrameData* ImplGetFrameData(); - SAL_DLLPRIVATE vcl::Window* ImplGetWindow(); + SAL_DLLPUBLIC vcl::Window* ImplGetWindow(); SAL_DLLPRIVATE ImplWinData* ImplGetWinData() const; SAL_DLLPRIVATE vcl::Window* ImplGetClientWindow() const; SAL_DLLPRIVATE vcl::Window* ImplGetDlgWindow( sal_uInt16 n, GetDlgWindowType nType, sal_uInt16 nStart = 0, sal_uInt16 nEnd = 0xFFFF, sal_uInt16* pIndex = nullptr ); diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index a2e66ebba63b..1c7fc607f5a1 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -373,7 +373,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/app/svapp \ vcl/source/app/svdata \ vcl/source/app/svmain \ - vcl/source/app/svmainhook \ vcl/source/app/timer \ vcl/source/app/unohelp2 \ vcl/source/app/unohelp \ @@ -444,7 +443,11 @@ $(eval $(call gb_Library_add_cobjects,vcl,\ vcl/source/filter/jpeg/transupp \ )) -# optional parts +ifneq ($(ENABLE_MACOSX_SANDBOX),TRUE) +$(eval $(call gb_Library_use_libraries,vcl,\ + AppleRemote \ +)) +endif vcl_quartz_code= \ vcl/quartz/salbmp \ @@ -456,100 +459,6 @@ vcl_coretext_code= \ vcl/quartz/ctfonts \ vcl/quartz/salgdi \ -ifeq ($(OS),MACOSX) - -$(eval $(call gb_Library_add_cxxflags,vcl,\ - $(gb_OBJCXXFLAGS) \ -)) - -$(eval $(call gb_Library_add_defs,vcl,\ - -DMACOSX_BUNDLE_IDENTIFIER=\"$(MACOSX_BUNDLE_IDENTIFIER)\" \ -)) - -$(eval $(call gb_Library_add_exception_objects,vcl,\ - $(vcl_coretext_code) \ -)) - -$(eval $(call gb_Library_use_system_darwin_frameworks,vcl,\ - ApplicationServices \ -)) - -$(eval $(call gb_Library_add_objcxxobjects,vcl,\ - vcl/osx/a11yactionwrapper \ - vcl/osx/a11ycomponentwrapper \ - vcl/osx/a11yfactory \ - vcl/osx/a11yrolehelper \ - vcl/osx/a11yselectionwrapper \ - vcl/osx/a11ytablewrapper \ - vcl/osx/a11ytextattributeswrapper \ - vcl/osx/a11ytextwrapper \ - vcl/osx/a11yutil \ - vcl/osx/a11yvaluewrapper \ - vcl/osx/a11ywrapper \ - vcl/osx/a11ywrapperbutton \ - vcl/osx/a11ywrappercheckbox \ - vcl/osx/a11ywrappercombobox \ - vcl/osx/a11ywrappergroup \ - vcl/osx/a11ywrapperlist \ - vcl/osx/a11ywrapperradiobutton \ - vcl/osx/a11ywrapperradiogroup \ - vcl/osx/a11ywrapperrow \ - vcl/osx/a11ywrapperscrollarea \ - vcl/osx/a11ywrapperscrollbar \ - vcl/osx/a11ywrappersplitter \ - vcl/osx/a11ywrapperstatictext \ - vcl/osx/a11ywrappertabgroup \ - vcl/osx/a11ywrappertextarea \ - vcl/osx/a11ywrappertoolbar \ - vcl/osx/salnstimer \ - vcl/osx/vclnsapp \ - vcl/osx/printaccessoryview \ - vcl/osx/printview \ - vcl/osx/salframeview \ - vcl/osx/salnsmenu \ -)) -$(eval $(call gb_Library_add_exception_objects,vcl,\ - vcl/osx/a11yfocuslistener \ - vcl/osx/a11yfocustracker \ - vcl/osx/a11ylistener \ - vcl/osx/documentfocuslistener \ - vcl/osx/saldata \ - vcl/osx/salinst \ - vcl/osx/salsys \ - vcl/osx/saltimer \ - vcl/osx/DataFlavorMapping \ - vcl/osx/DragActionConversion \ - vcl/osx/DragSource \ - vcl/osx/DragSourceContext \ - vcl/osx/DropTarget \ - vcl/osx/HtmlFmtFlt \ - vcl/osx/OSXTransferable \ - vcl/osx/PictToBmpFlt \ - vcl/osx/clipboard \ - vcl/osx/service_entry \ - $(vcl_quartz_code) \ - vcl/quartz/salgdiutils \ - vcl/osx/salnativewidgets \ - vcl/osx/salprn \ - vcl/osx/salframe \ - vcl/osx/salmenu \ - vcl/osx/salobj \ -)) -$(eval $(call gb_Library_use_system_darwin_frameworks,vcl,\ - $(if $(filter X86_64,$(CPUNAME)),,QuickTime) \ - Cocoa \ - Carbon \ - CoreFoundation \ -)) - -ifneq ($(ENABLE_MACOSX_SANDBOX),TRUE) -$(eval $(call gb_Library_use_libraries,vcl,\ - AppleRemote \ -)) -endif - -endif - vcl_headless_code= \ vcl/headless/svpframe \ $(if $(filter-out IOS,$(OS)), \ @@ -730,6 +639,18 @@ endif # OS-specific stuff +# for harfbuzz +ifeq ($(OS),MACOSX) +$(eval $(call gb_Library_use_system_darwin_frameworks,vcl,\ + Cocoa \ + CoreFoundation \ +)) + +$(eval $(call gb_Library_add_exception_objects,vcl,\ + vcl/osx/salplug \ +)) +endif + ifeq ($(OS),WNT) $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/opengl/win/WinDeviceInfo \ diff --git a/vcl/Library_vclplug_osx.mk b/vcl/Library_vclplug_osx.mk new file mode 100644 index 000000000000..968d34b9b99b --- /dev/null +++ b/vcl/Library_vclplug_osx.mk @@ -0,0 +1,195 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Library_Library,vclplug_osx)) + +$(eval $(call gb_Library_set_componentfile,vclplug_osx,vcl/vcl.common)) + +$(eval $(call gb_Library_set_include,vclplug_osx,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ +)) + + +ifeq ($(SYSTEM_GLM),TRUE) +$(eval $(call gb_Library_add_defs,vclplug_osx,\ + -DGLM_ENABLE_EXPERIMENTAL \ +)) +endif + +$(eval $(call gb_Library_use_sdk_api,vclplug_osx)) + +$(eval $(call gb_Library_use_custom_headers,vclplug_osx,\ + officecfg/registry \ +)) + +$(eval $(call gb_Library_add_libs,vclplug_osx,\ + -framework IOKit \ + -F/System/Library/PrivateFrameworks \ + -framework CoreUI \ + -lobjc \ +)) + +$(eval $(call gb_Library_add_cxxflags,vclplug_osx,\ + $(gb_OBJCXXFLAGS) \ +)) + +ifeq ($(ENABLE_JAVA),TRUE) +$(eval $(call gb_Library_use_libraries,vclplug_osx,\ + jvmaccess \ +)) +endif + +$(eval $(call gb_Library_use_libraries,vclplug_osx,\ + vcl \ + tl \ + utl \ + sot \ + ucbhelper \ + basegfx \ + comphelper \ + cppuhelper \ + i18nlangtag \ + i18nutil \ + $(if $(ENABLE_JAVA), \ + jvmaccess) \ + cppu \ + sal \ + salhelper \ +)) + +$(eval $(call gb_Library_use_externals,vclplug_osx,\ + boost_headers \ + gio \ + glm_headers \ + graphite \ + harfbuzz \ + icu_headers \ + icuuc \ + lcms2 \ + mdds_headers \ +)) +ifeq ($(DISABLE_GUI),) +$(eval $(call gb_Library_use_externals,vclplug_osx,\ + epoxy \ + )) +endif + +# optional parts + +vcl_quartz_code= \ + vcl/quartz/salbmp \ + vcl/quartz/utils \ + vcl/quartz/salgdicommon \ + vcl/quartz/salvd \ + +vcl_coretext_code= \ + vcl/quartz/ctfonts \ + vcl/quartz/salgdi \ + +$(eval $(call gb_Library_add_cxxflags,vclplug_osx,\ + $(gb_OBJCXXFLAGS) \ +)) + +$(eval $(call gb_Library_add_defs,vclplug_osx,\ + -DMACOSX_BUNDLE_IDENTIFIER=\"$(MACOSX_BUNDLE_IDENTIFIER)\" \ +)) + +$(eval $(call gb_Library_add_exception_objects,vclplug_osx,\ + $(vcl_coretext_code) \ +)) + +$(eval $(call gb_Library_add_objcxxobjects,vclplug_osx,\ + vcl/osx/a11yactionwrapper \ + vcl/osx/a11ycomponentwrapper \ + vcl/osx/a11yfactory \ + vcl/osx/a11yrolehelper \ + vcl/osx/a11yselectionwrapper \ + vcl/osx/a11ytablewrapper \ + vcl/osx/a11ytextattributeswrapper \ + vcl/osx/a11ytextwrapper \ + vcl/osx/a11yutil \ + vcl/osx/a11yvaluewrapper \ + vcl/osx/a11ywrapper \ + vcl/osx/a11ywrapperbutton \ + vcl/osx/a11ywrappercheckbox \ + vcl/osx/a11ywrappercombobox \ + vcl/osx/a11ywrappergroup \ + vcl/osx/a11ywrapperlist \ + vcl/osx/a11ywrapperradiobutton \ + vcl/osx/a11ywrapperradiogroup \ + vcl/osx/a11ywrapperrow \ + vcl/osx/a11ywrapperscrollarea \ + vcl/osx/a11ywrapperscrollbar \ + vcl/osx/a11ywrappersplitter \ + vcl/osx/a11ywrapperstatictext \ + vcl/osx/a11ywrappertabgroup \ + vcl/osx/a11ywrappertextarea \ + vcl/osx/a11ywrappertoolbar \ + vcl/osx/salnstimer \ + vcl/osx/vclnsapp \ + vcl/osx/printaccessoryview \ + vcl/osx/printview \ + vcl/osx/salframeview \ + vcl/osx/salnsmenu \ +)) + +$(eval $(call gb_Library_add_exception_objects,vclplug_osx,\ + vcl/osx/a11yfocuslistener \ + vcl/osx/a11yfocustracker \ + vcl/osx/a11ylistener \ + vcl/osx/documentfocuslistener \ + vcl/osx/saldata \ + vcl/osx/salinst \ + vcl/osx/salsys \ + vcl/osx/saltimer \ + vcl/osx/DataFlavorMapping \ + vcl/osx/DragActionConversion \ + vcl/osx/DragSource \ + vcl/osx/DragSourceContext \ + vcl/osx/DropTarget \ + vcl/osx/HtmlFmtFlt \ + vcl/osx/OSXTransferable \ + vcl/osx/PictToBmpFlt \ + vcl/osx/clipboard \ + vcl/osx/service_entry \ + $(vcl_quartz_code) \ + vcl/quartz/salgdiutils \ + vcl/osx/salnativewidgets \ + vcl/osx/salprn \ + vcl/osx/salframe \ + vcl/osx/salmenu \ + vcl/osx/salobj \ +)) + +$(eval $(call gb_Library_use_system_darwin_frameworks,vclplug_osx,\ + ApplicationServices \ + Cocoa \ + Carbon \ + CoreFoundation \ + $(if $(filter X86_64,$(CPUNAME)),,QuickTime) \ +)) + +ifneq ($(ENABLE_MACOSX_SANDBOX),TRUE) +$(eval $(call gb_Library_use_libraries,vclplug_osx,\ + AppleRemote \ +)) +endif + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index c2a26d5e9685..8fbe1fdca943 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -106,6 +106,7 @@ endif ifeq ($(OS),MACOSX) $(eval $(call gb_Module_add_targets,vcl,\ Package_osxres \ + Library_vclplug_osx \ )) endif diff --git a/vcl/inc/bmpfast.hxx b/vcl/inc/bmpfast.hxx index 6e5e22544c5d..f9a1f891bb47 100644 --- a/vcl/inc/bmpfast.hxx +++ b/vcl/inc/bmpfast.hxx @@ -20,6 +20,8 @@ #ifndef INCLUDED_VCL_INC_BMPFAST_HXX #define INCLUDED_VCL_INC_BMPFAST_HXX +#include <vcl/dllapi.h> + class BitmapWriteAccess; class BitmapReadAccess; struct BitmapBuffer; @@ -29,7 +31,7 @@ struct SalTwoRect; // the bmpfast functions have signatures with good compatibility to // their canonic counterparts, which employ the GetPixel/SetPixel methods -bool ImplFastBitmapConversion( BitmapBuffer& rDst, const BitmapBuffer& rSrc, +VCL_DLLPUBLIC bool ImplFastBitmapConversion( BitmapBuffer& rDst, const BitmapBuffer& rSrc, const SalTwoRect& rTwoRect ); bool ImplFastBitmapBlending( BitmapWriteAccess const & rDst, diff --git a/vcl/inc/osx/salinst.h b/vcl/inc/osx/salinst.h index 8e15730a3843..9164cdab3de0 100644 --- a/vcl/inc/osx/salinst.h +++ b/vcl/inc/osx/salinst.h @@ -76,7 +76,7 @@ class AquaSalInstance : public SalInstance, public SalUserEventList public: virtual void TriggerUserEventProcessing() override; - SalYieldMutex* mpSalYieldMutex; // Sal-Yield-Mutex + std::unique_ptr<SalYieldMutex> mpSalYieldMutex; OUString maDefaultPrinter; oslThreadIdentifier maMainThread; int mnActivePrintJobs; @@ -91,6 +91,8 @@ public: AquaSalInstance(); virtual ~AquaSalInstance() override; + virtual void AfterAppInit() override; + virtual SalFrame* CreateChildFrame( SystemParentData* pParent, SalFrameStyleFlags nStyle ) override; virtual SalFrame* CreateFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) override; virtual void DestroyFrame( SalFrame* pFrame ) override; @@ -148,7 +150,6 @@ public: void endedPrintJob() { mnActivePrintJobs--; } // event subtypes for NSApplicationDefined events - static const short AppExecuteSVMain = 0x7fff; static const short AppEndLoopEvent = 1; static const short AppStartTimerEvent = 10; static const short YieldWakeupEvent = 20; diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx index 38fdccf54620..7b93edd5c76c 100644 --- a/vcl/inc/salinst.hxx +++ b/vcl/inc/salinst.hxx @@ -215,10 +215,6 @@ void DeInitSalData(); // called from Application-Dtor void InitSalMain(); -#ifdef MACOSX -void postInitVCLinitNSApp(); -#endif - #endif // INCLUDED_VCL_INC_SALINST_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/vclpluginapi.h b/vcl/inc/vclpluginapi.h index 88defd3972d6..fb3350e43a1f 100644 --- a/vcl/inc/vclpluginapi.h +++ b/vcl/inc/vclpluginapi.h @@ -47,6 +47,12 @@ #define VCLPLUG_KDE5_PUBLIC SAL_DLLPUBLIC_IMPORT #endif +#if defined VCLPLUG_OSX_IMPLEMENTATION +#define VCLPLUG_OSX_PUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define VCLPLUG_OSX_PUBLIC SAL_DLLPUBLIC_IMPORT +#endif + #if defined VCLPLUG_QT5_IMPLEMENTATION #define VCLPLUG_QT5_PUBLIC SAL_DLLPUBLIC_EXPORT #else diff --git a/vcl/osx/saldata.cxx b/vcl/osx/saldata.cxx index 3357adbcd60a..033114dae7e1 100644 --- a/vcl/osx/saldata.cxx +++ b/vcl/osx/saldata.cxx @@ -54,6 +54,7 @@ SalData::SalData() mnDPIX( 0 ), mnDPIY( 0 ) { + SetSalData(this); maCursors.fill( INVALID_CURSOR_PTR ); if( s_aAutoReleaseKey == nullptr ) s_aAutoReleaseKey = osl_createThreadKey( releasePool ); @@ -85,6 +86,13 @@ SalData::~SalData() if ( mpAppleRemoteMainController ) [mpAppleRemoteMainController release]; #endif + + if( mpStatusItem ) + { + [mpStatusItem release]; + mpStatusItem = nil; + } + SetSalData( nullptr ); } void SalData::ensureThreadAutoreleasePool() diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx index 17f7d89adb07..08359f04f7db 100644 --- a/vcl/osx/salinst.cxx +++ b/vcl/osx/salinst.cxx @@ -35,7 +35,7 @@ #include <osl/process.h> #include <rtl/ustrbuf.hxx> - +#include <vclpluginapi.h> #include <vcl/svapp.hxx> #include <vcl/window.hxx> #include <vcl/idle.hxx> @@ -57,6 +57,7 @@ #include <print.h> #include <salimestatus.hxx> +#include <o3tl/make_unique.hxx> #include <comphelper/processfactory.hxx> @@ -77,9 +78,7 @@ extern "C" { using namespace std; using namespace ::com::sun::star; -static int* gpnInit = nullptr; static NSMenu* pDockMenu = nil; -static bool bNoSVMain = true; static bool bLeftMain = false; class AquaDelayedSettingsChanged : public Idle @@ -143,23 +142,7 @@ bool AquaSalInstance::isOnCommandLine( const OUString& rArg ) return false; } -// initialize the cocoa VCL_NSApplication object -// returns an NSAutoreleasePool that must be released when the event loop begins -static void initNSApp() -{ - // create our cocoa NSApplication - [VCL_NSApplication sharedApplication]; - - SalData::ensureThreadAutoreleasePool(); - - // put cocoa into multithreaded mode - [NSThread detachNewThreadSelector:@selector(enableCocoaThreads:) toTarget:[[CocoaThreadEnabler alloc] init] withObject:nil]; - - // activate our delegate methods - [NSApp setDelegate: NSApp]; -} - -void postInitVCLinitNSApp() +void AquaSalInstance::AfterAppInit() { [[NSNotificationCenter defaultCenter] addObserver: NSApp selector: @selector(systemColorsChanged:) @@ -196,38 +179,6 @@ void postInitVCLinitNSApp() #endif } -bool ImplSVMainHook( int * pnInit ) -{ - if (comphelper::LibreOfficeKit::isActive()) - return false; - - NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ]; - unlink([[NSString stringWithFormat:@"%@/Library/Saved Application State/%s.savedState/restorecount.plist", NSHomeDirectory(), MACOSX_BUNDLE_IDENTIFIER] UTF8String]); - unlink([[NSString stringWithFormat:@"%@/Library/Saved Application State/%s.savedState/restorecount.txt", NSHomeDirectory(), MACOSX_BUNDLE_IDENTIFIER] UTF8String]); - [ pool drain ]; - - gpnInit = pnInit; - - bNoSVMain = false; - initNSApp(); - - OUString aExeURL, aExe; - osl_getExecutableFile( &aExeURL.pData ); - osl_getSystemPathFromFileURL( aExeURL.pData, &aExe.pData ); - OString aByteExe( OUStringToOString( aExe, osl_getThreadTextEncoding() ) ); - -#ifdef DEBUG - aByteExe += OString ( " NSAccessibilityDebugLogLevel 1" ); - const char* pArgv[] = { aByteExe.getStr(), NULL }; - NSApplicationMain( 3, pArgv ); -#else - const char* pArgv[] = { aByteExe.getStr(), nullptr }; - NSApplicationMain( 1, pArgv ); -#endif - - return TRUE; // indicate that ImplSVMainHook is implemented -} - void SalAbort( const OUString& rErrorText, bool bDumpCore ) { if( rErrorText.isEmpty() ) @@ -241,34 +192,12 @@ void SalAbort( const OUString& rErrorText, bool bDumpCore ) _exit(1); } -void InitSalData() -{ - SalData *pSalData = new SalData; - SetSalData( pSalData ); -} - const OUString& SalGetDesktopEnvironment() { static OUString aDesktopEnvironment( "MacOSX" ); return aDesktopEnvironment; } -void DeInitSalData() -{ - SalData *pSalData = GetSalData(); - if( pSalData->mpStatusItem ) - { - [pSalData->mpStatusItem release]; - pSalData->mpStatusItem = nil; - } - delete pSalData; - SetSalData( nullptr ); -} - -void InitSalMain() -{ -} - SalYieldMutex::SalYieldMutex() : m_aCodeBlock( nullptr ) { @@ -367,14 +296,27 @@ void ImplSalYieldMutexRelease() pInst->mpSalYieldMutex->release(); } -SalInstance* CreateSalInstance() +extern "C" { +VCLPLUG_OSX_PUBLIC SalInstance* create_SalInstance() { - // this is the case for not using SVMain - // not so good - if( bNoSVMain ) - initNSApp(); + SalData* pSalData = new SalData; + + NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ]; + unlink([[NSString stringWithFormat:@"%@/Library/Saved Application State/%s.savedState/restorecount.plist", NSHomeDirectory(), MACOSX_BUNDLE_IDENTIFIER] UTF8String]); + unlink([[NSString stringWithFormat:@"%@/Library/Saved Application State/%s.savedState/restorecount.txt", NSHomeDirectory(), MACOSX_BUNDLE_IDENTIFIER] UTF8String]); + [ pool drain ]; + + // create our cocoa NSApplication + [VCL_NSApplication sharedApplication]; + + SalData::ensureThreadAutoreleasePool(); + + // put cocoa into multithreaded mode + [NSThread detachNewThreadSelector:@selector(enableCocoaThreads:) toTarget:[[CocoaThreadEnabler alloc] init] withObject:nil]; + + // activate our delegate methods + [NSApp setDelegate: NSApp]; - SalData* pSalData = GetSalData(); SAL_WARN_IF( pSalData->mpInstance != nullptr, "vcl", "more than one instance created" ); AquaSalInstance* pInst = new AquaSalInstance; @@ -389,29 +331,32 @@ SalInstance* CreateSalInstance() ImplGetSVData()->maNWFData.mbProgressNeedsErase = true; ImplGetSVData()->maNWFData.mnStatusBarLowerRightOffset = 10; + [NSApp finishLaunching]; + return pInst; } - -void DestroySalInstance( SalInstance* pInst ) -{ - delete pInst; } AquaSalInstance::AquaSalInstance() - : mnActivePrintJobs( 0 ) + : mpSalYieldMutex(o3tl::make_unique<SalYieldMutex>()) + , mnActivePrintJobs( 0 ) , mbIsLiveResize( false ) , mbNoYieldLock( false ) , mbTimerProcessed( false ) { - mpSalYieldMutex = new SalYieldMutex; mpSalYieldMutex->acquire(); maMainThread = osl::Thread::getCurrentIdentifier(); } AquaSalInstance::~AquaSalInstance() { - mpSalYieldMutex->release(); - delete mpSalYieldMutex; + [NSApp stop: NSApp]; + bLeftMain = true; + if( pDockMenu ) + { + [pDockMenu release]; + pDockMenu = nil; + } } void AquaSalInstance::TriggerUserEventProcessing() @@ -429,7 +374,7 @@ void AquaSalInstance::ProcessEvent( SalUserEvent aEvent ) comphelper::SolarMutex* AquaSalInstance::GetYieldMutex() { - return mpSalYieldMutex; + return mpSalYieldMutex.get(); } sal_uInt32 AquaSalInstance::ReleaseYieldMutexAll() @@ -460,20 +405,6 @@ void AquaSalInstance::handleAppDefinedEvent( NSEvent* pEvent ) case AppEndLoopEvent: [NSApp stop: NSApp]; break; - case AppExecuteSVMain: - { - int nResult = ImplSVMain(); - if( gpnInit ) - *gpnInit = nResult; - [NSApp stop: NSApp]; - bLeftMain = true; - if( pDockMenu ) - { - [pDockMenu release]; - pDockMenu = nil; - } - break; - } case DispatchTimerEvent: { AquaSalInstance *pInst = GetSalData()->mpInstance; diff --git a/vcl/osx/salmenu.cxx b/vcl/osx/salmenu.cxx index ee0e99278892..4ec9e7d70871 100644 --- a/vcl/osx/salmenu.cxx +++ b/vcl/osx/salmenu.cxx @@ -112,111 +112,99 @@ static MainMenuSelector* pMainMenuSelector = nil; static void initAppMenu() { - static bool bOnce = true; - if( bOnce ) - { - bOnce = false; + static bool bInitialized = false; + if (bInitialized) + return; - // get the main menu - NSMenu* pMainMenu = [NSApp mainMenu]; - if( pMainMenu != nil ) - { - // create the action selector - pMainMenuSelector = [[MainMenuSelector alloc] init]; + // get the main menu + NSMenu* pMainMenu = [NSApp mainMenu]; + assert(pMainMenu == nil); + if (pMainMenu != nil) + return; - // get the proper submenu - NSMenu* pAppMenu = [[pMainMenu itemAtIndex: 0] submenu]; - if( pAppMenu ) - { - // insert about entry - OUString aAbout(VclResId(SV_STDTEXT_ABOUT)); - NSString* pString = CreateNSString( aAbout ); - NSMenuItem* pNewItem = [pAppMenu insertItemWithTitle: pString - action: @selector(showAbout:) - keyEquivalent: @"" - atIndex: 0]; - if (pString) - [pString release]; - if( pNewItem ) - { - [pNewItem setTarget: pMainMenuSelector]; - [pAppMenu insertItem: [NSMenuItem separatorItem] atIndex: 1]; - } - - // insert preferences entry - OUString aPref(VclResId(SV_STDTEXT_PREFERENCES)); - pString = CreateNSString( aPref ); - pNewItem = [pAppMenu insertItemWithTitle: pString - action: @selector(showPreferences:) - keyEquivalent: @"," - atIndex: 2]; - if (pString) - [pString release]; - if( pNewItem ) - { + bInitialized = true; + + NSMenu* pAppMenu = nil; + NSMenuItem* pNewItem = nil; + + pMainMenu = [[[NSMenu alloc] initWithTitle: @"Main Menu"] autorelease]; + pNewItem = [pMainMenu addItemWithTitle: @"Application" + action: nil + keyEquivalent: @""]; + pAppMenu = [[[NSMenu alloc] initWithTitle: @"Application"] autorelease]; + [pNewItem setSubmenu: pAppMenu]; + [NSApp setMainMenu: pMainMenu]; + + pMainMenuSelector = [[MainMenuSelector alloc] init]; + + // about + NSString* pString = CreateNSString(VclResId(SV_STDTEXT_ABOUT)); + pNewItem = [pAppMenu addItemWithTitle: pString + action: @selector(showAbout:) + keyEquivalent: @""]; + [pString release]; + [pNewItem setTarget: pMainMenuSelector]; + + [pAppMenu addItem:[NSMenuItem separatorItem]]; + + // preferences + pString = CreateNSString(VclResId(SV_STDTEXT_PREFERENCES)); + pNewItem = [pAppMenu addItemWithTitle: pString + action: @selector(showPreferences:) + keyEquivalent: @","]; + [pString release]; SAL_WNODEPRECATED_DECLARATIONS_PUSH -// 'NSCommandKeyMask' is deprecated: first deprecated in macOS 10.12 - [pNewItem setKeyEquivalentModifierMask: NSCommandKeyMask]; + // 'NSCommandKeyMask' is deprecated: first deprecated in macOS 10.12 + [pNewItem setKeyEquivalentModifierMask: NSCommandKeyMask]; SAL_WNODEPRECATED_DECLARATIONS_POP - [pNewItem setTarget: pMainMenuSelector]; - [pAppMenu insertItem: [NSMenuItem separatorItem] atIndex: 3]; - } - - // WARNING: ultra ugly code ahead - - // rename standard entries - // rename "Services" - pNewItem = [pAppMenu itemAtIndex: 4]; - if( pNewItem ) - { - pString = CreateNSString(VclResId(SV_MENU_MAC_SERVICES)); - [pNewItem setTitle: pString]; - if( pString ) - [pString release]; - } - - // rename "Hide NewApplication" - pNewItem = [pAppMenu itemAtIndex: 6]; - if( pNewItem ) - { - pString = CreateNSString(VclResId(SV_MENU_MAC_HIDEAPP)); - [pNewItem setTitle: pString]; - if( pString ) - [pString release]; - } - - // rename "Hide Others" - pNewItem = [pAppMenu itemAtIndex: 7]; - if( pNewItem ) - { - pString = CreateNSString(VclResId(SV_MENU_MAC_HIDEALL)); - [pNewItem setTitle: pString]; - if( pString ) - [pString release]; - } - - // rename "Show all" - pNewItem = [pAppMenu itemAtIndex: 8]; - if( pNewItem ) - { - pString = CreateNSString(VclResId(SV_MENU_MAC_SHOWALL)); - [pNewItem setTitle: pString]; - if( pString ) - [pString release]; - } - - // rename "Quit NewApplication" - pNewItem = [pAppMenu itemAtIndex: 10]; - if( pNewItem ) - { - pString = CreateNSString(VclResId(SV_MENU_MAC_QUITAPP)); - [pNewItem setTitle: pString]; - if( pString ) - [pString release]; - } - } - } - } + [pNewItem setTarget: pMainMenuSelector]; + + [pAppMenu addItem:[NSMenuItem separatorItem]]; + + // Services item and menu + pString = CreateNSString(VclResId(SV_MENU_MAC_SERVICES)); + pNewItem = [pAppMenu addItemWithTitle: pString + action: nil + keyEquivalent: @""]; + NSMenu *servicesMenu = [[[NSMenu alloc] initWithTitle:@"Services"] autorelease]; + [pNewItem setSubmenu: servicesMenu]; + [NSApp setServicesMenu: servicesMenu]; + + [pAppMenu addItem:[NSMenuItem separatorItem]]; + + // Hide Application + pString = CreateNSString(VclResId(SV_MENU_MAC_HIDEAPP)); + [pAppMenu addItemWithTitle: pString + action:@selector(hide:) + keyEquivalent:@"h"]; + [pString release]; + + // Hide Others + pString = CreateNSString(VclResId(SV_MENU_MAC_HIDEALL)); + [pAppMenu addItemWithTitle: pString + action:@selector(hideOtherApplications:) + keyEquivalent:@"h"]; + [pString release]; +SAL_WNODEPRECATED_DECLARATIONS_PUSH + // 'NSCommandKeyMask' is deprecated: first deprecated in macOS 10.12 + [pNewItem setKeyEquivalentModifierMask: NSCommandKeyMask | NSAlternateKeyMask]; +SAL_WNODEPRECATED_DECLARATIONS_POP + + // Show All + pString = CreateNSString(VclResId(SV_MENU_MAC_SHOWALL)); + [pAppMenu addItemWithTitle: pString + action:@selector(unhideAllApplications:) + keyEquivalent:@""]; + [pString release]; + + [pAppMenu addItem:[NSMenuItem separatorItem]]; + + // Quit + pString = CreateNSString(VclResId(SV_MENU_MAC_QUITAPP)); + [pAppMenu addItemWithTitle: pString + action:@selector(terminate:) + keyEquivalent:@"q"]; + [pString release]; } std::unique_ptr<SalMenu> AquaSalInstance::CreateMenu( bool bMenuBar, Menu* pVCLMenu ) diff --git a/vcl/osx/salplug.cxx b/vcl/osx/salplug.cxx new file mode 100644 index 000000000000..e4f69a10ee25 --- /dev/null +++ b/vcl/osx/salplug.cxx @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <osl/module.hxx> +#include <osl/process.h> + +#include <rtl/bootstrap.hxx> +#include <rtl/process.h> +#include <sal/log.hxx> + +#include <salinst.hxx> +#include <saldatabasic.hxx> +#include <config_vclplug.h> +#include <desktop/crashreport.hxx> + +#include <cstdio> + +extern "C" { +typedef SalInstance*(*salFactoryProc)(); +} + +static oslModule pCloseModule = nullptr; + +static SalInstance* tryInstance( const OUString& rModuleBase, bool bForce = false ) +{ + SalInstance* pInst = nullptr; + OUString aModule( +#ifdef SAL_DLLPREFIX + SAL_DLLPREFIX +#endif + "vclplug_" + rModuleBase + "lo" SAL_DLLEXTENSION ); + + osl::Module aMod; + if (aMod.loadRelative(reinterpret_cast<oslGenericFunction>(&tryInstance), aModule, SAL_LOADMODULE_GLOBAL)) + { + salFactoryProc aProc = reinterpret_cast<salFactoryProc>(aMod.getFunctionSymbol("create_SalInstance")); + if (aProc) + { + pInst = aProc(); + SAL_INFO( + "vcl.plugadapt", + "sal plugin " << aModule << " produced instance " << pInst); + if (pInst) + { + pCloseModule = static_cast<oslModule>(aMod); + aMod.release(); + } + } + else + { + SAL_WARN( + "vcl.plugadapt", + "could not load symbol create_SalInstance from shared object " + << aModule); + } + } + else if (bForce) + { + SAL_WARN("vcl.plugadapt", "could not load shared object " << aModule); + } + else + { + SAL_INFO("vcl.plugadapt", "could not load shared object " << aModule); + } + + // coverity[leaked_storage] - this is on purpose + return pInst; +} + +SalInstance *CreateSalInstance() +{ + SalInstance *pInst = nullptr; + + OUString aUsePlugin; + rtl::Bootstrap::get( "SAL_USE_VCLPLUGIN", aUsePlugin ); + + if( !aUsePlugin.isEmpty() ) + pInst = tryInstance( aUsePlugin, true ); + + // fallback, try everything + static const char* const pPlugin[] = { "osx" }; + + for ( int i = 0; !pInst && i != SAL_N_ELEMENTS(pPlugin); ++i ) + pInst = tryInstance( OUString::createFromAscii( pPlugin[ i ] ) ); + + if( ! pInst ) + { + std::fprintf( stderr, "no suitable windowing system found, exiting.\n" ); + _exit( 1 ); + } + + // acquire SolarMutex + pInst->AcquireYieldMutex(); + + return pInst; +} + +void DestroySalInstance( SalInstance *pInst ) +{ + // release SolarMutex + pInst->ReleaseYieldMutexAll(); + + delete pInst; + if( pCloseModule ) + osl_unloadModule( pCloseModule ); +} + +void InitSalData() +{ +} + +void DeInitSalData() +{ +} + +void InitSalMain() +{ +} + +void SalAbort( const OUString& rErrorText, bool bDumpCore ) +{ + if( rErrorText.isEmpty() ) + std::fprintf( stderr, "Application Error\n" ); + else + { + CrashReporter::AddKeyValue("AbortMessage", rErrorText); + std::fprintf( stderr, "%s\n", OUStringToOString(rErrorText, osl_getThreadTextEncoding()).getStr() ); + } + if( bDumpCore ) + abort(); + else + _exit(1); +} + +const OUString& SalGetDesktopEnvironment() +{ + static OUString aDesktopEnvironment( "Windows" ); + return aDesktopEnvironment; +} + +SalData::SalData() : + m_pInstance(nullptr), + m_pPIManager(nullptr) +{ +} + +SalData::~SalData() COVERITY_NOEXCEPT_FALSE +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/osx/vclnsapp.mm b/vcl/osx/vclnsapp.mm index f60b478a185f..7bbdc9d8843f 100644 --- a/vcl/osx/vclnsapp.mm +++ b/vcl/osx/vclnsapp.mm @@ -62,22 +62,6 @@ -(void)applicationDidFinishLaunching:(NSNotification*)pNotification { (void)pNotification; - -SAL_WNODEPRECATED_DECLARATIONS_PUSH - // 'NSApplicationDefined' is deprecated: first deprecated in macOS 10.12 - NSEvent* pEvent = [NSEvent otherEventWithType: NSApplicationDefined - location: NSZeroPoint - modifierFlags: 0 - timestamp: [[NSProcessInfo processInfo] systemUptime] - windowNumber: 0 - context: nil - subtype: AquaSalInstance::AppExecuteSVMain - data1: 0 - data2: 0 ]; -SAL_WNODEPRECATED_DECLARATIONS_POP - assert( pEvent ); - [NSApp postEvent: pEvent atStart: NO]; - if( [NSWindow respondsToSelector:@selector(allowsAutomaticWindowTabbing)] ) { NSWindow.allowsAutomaticWindowTabbing = NO; diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index beed24273e0d..3f8eae56836f 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -192,10 +192,6 @@ int ImplSVMain() bool bInit = isInitVCL() || InitVCL(); -#ifdef MACOSX - postInitVCLinitNSApp(); -#endif - if( bInit ) { // call application main @@ -234,11 +230,7 @@ int ImplSVMain() int SVMain() { - int nRet; - if( !Application::IsConsoleOnly() && ImplSVMainHook( &nRet ) ) - return nRet; - else - return ImplSVMain(); + return ImplSVMain(); } // This variable is set when no Application object has been instantiated diff --git a/vcl/source/app/svmainhook.cxx b/vcl/source/app/svmainhook.cxx deleted file mode 100644 index a66bbc186f92..000000000000 --- a/vcl/source/app/svmainhook.cxx +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include <sal/config.h> - -#include <vcl/svmain.hxx> - -#ifndef MACOSX -// MacOSX implementation of ImplSVMainHook is in osx/salinst.cxx - -bool ImplSVMainHook( int * ) -{ - return false; // indicate that ImplSVMainHook is not implemented -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
