summaryrefslogtreecommitdiff
path: root/vcl/osx
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2019-01-03 13:45:16 +0100
committerJan-Marek Glogowski <glogow@fbihome.de>2019-01-11 05:20:11 +0100
commit284a7f60fff72c4d8c011ff60ea2e40163cd25c3 (patch)
tree00e3e3988132d501ab22b32989fe08b5cd1782f4 /vcl/osx
parent8d4a7b17e60aa889d1a78da47630aae2d1c1513c (diff)
OSX Re-Introduce NSApplicationMain usage
This restores the nested NSApplicationMain and default run loop usage. Without it the Java AWT integration will start its own event loop, effectively blocking any non-system event processing. Reproducible via "Tools - Macros - Organize Macros - BeanShell... - LibreOffice Macros - HelloWorld - helloworld.bsh - Edit". The blocking can be prevented by overriding NSApplication::run and running our own event loop using Application::Execute. But this still doesn't show the Java AWT editor window and I couldn't find any information how to fix this. Since OSX now is a VCL plugin, this can't restore the old hook mechanism, but instead adds a new function to SalInstance. SalInstance initialization happens at InitVCL() start just a little bit later in the call stack. Somehow NSApplicationMain manages to run the Java VM in an extra thread, so it doesn't block the main loop. Probably this could also be handled by LO starting the JVM as a thread. Further information for an implementation eventually can be found in the "Technical Note TN2147" "JNI Development on Mac OS X." Change-Id: I04a0c2bf7949571f1b678ada9ab3592e0fe30c1f Regression-from: 925e2edb6f3f8fffcff9eddb31ed18bc77e2a690 Reviewed-on: https://gerrit.libreoffice.org/65836 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl/osx')
-rw-r--r--vcl/osx/salinst.cxx30
-rw-r--r--vcl/osx/salmenu.cxx9
-rw-r--r--vcl/osx/vclnsapp.mm16
3 files changed, 44 insertions, 11 deletions
diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx
index c92b621a023c..f0f470545138 100644
--- a/vcl/osx/salinst.cxx
+++ b/vcl/osx/salinst.cxx
@@ -81,6 +81,7 @@ extern "C" {
using namespace std;
using namespace ::com::sun::star;
+static int* gpnInit = nullptr;
static NSMenu* pDockMenu = nil;
static bool bLeftMain = false;
@@ -328,8 +329,6 @@ VCLPLUG_OSX_PUBLIC SalInstance* create_SalInstance()
ImplGetSVData()->maNWFData.mbProgressNeedsErase = true;
ImplGetSVData()->maNWFData.mnStatusBarLowerRightOffset = 10;
- [NSApp finishLaunching];
-
return pInst;
}
}
@@ -386,9 +385,14 @@ void AquaSalInstance::handleAppDefinedEvent( NSEvent* pEvent )
if ( pTimer )
pTimer->handleStartTimerEvent( pEvent );
break;
- case AppEndLoopEvent:
+ case AppExecuteSVMain:
+ {
+ int nRet = ImplSVMain();
+ if (gpnInit)
+ *gpnInit = nRet;
[NSApp stop: NSApp];
break;
+ }
case DispatchTimerEvent:
{
AquaSalInstance *pInst = GetSalData()->mpInstance;
@@ -958,5 +962,25 @@ NSImage* CreateNSImage( const Image& rImage )
return pImage;
}
+bool AquaSalInstance::SVMainHook(int* pnInit)
+{
+ gpnInit = pnInit;
+
+ 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
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/osx/salmenu.cxx b/vcl/osx/salmenu.cxx
index 792e5718d6ab..e55d253a18fc 100644
--- a/vcl/osx/salmenu.cxx
+++ b/vcl/osx/salmenu.cxx
@@ -117,19 +117,12 @@ static void initAppMenu()
static bool bInitialized = false;
if (bInitialized)
return;
-
- // get the main menu
- NSMenu* pMainMenu = [NSApp mainMenu];
- assert(pMainMenu == nil);
- if (pMainMenu != nil)
- return;
-
bInitialized = true;
NSMenu* pAppMenu = nil;
NSMenuItem* pNewItem = nil;
- pMainMenu = [[[NSMenu alloc] initWithTitle: @"Main Menu"] autorelease];
+ NSMenu* pMainMenu = [[[NSMenu alloc] initWithTitle: @"Main Menu"] autorelease];
pNewItem = [pMainMenu addItemWithTitle: @"Application"
action: nil
keyEquivalent: @""];
diff --git a/vcl/osx/vclnsapp.mm b/vcl/osx/vclnsapp.mm
index 223094e96c98..9effda6ff4c1 100644
--- a/vcl/osx/vclnsapp.mm
+++ b/vcl/osx/vclnsapp.mm
@@ -62,6 +62,22 @@
-(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 setAllowsAutomaticWindowTabbing:NO];