/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" #define _SV_SALDATA_CXX #include #include #include #include #include #include #include #include #include #ifdef FREEBSD #include #include #include #endif #include #include "unx/i18n_im.hxx" #include "unx/i18n_xkb.hxx" #include #include #include #include #include #include /* #i59042# override KApplications method for session management * since it will interfere badly with our own. */ class VCLKDEApplication : public KApplication { public: VCLKDEApplication() : KApplication() {} virtual void commitData(QSessionManager &sm); }; void VCLKDEApplication::commitData(QSessionManager&) { } /*************************************************************************** * class SalKDEDisplay * ***************************************************************************/ SalKDEDisplay::SalKDEDisplay( Display* pDisp ) : SalX11Display( pDisp ) { } SalKDEDisplay::~SalKDEDisplay() { // in case never a frame opened static_cast(GetXLib())->doStartup(); // clean up own members doDestruct(); // prevent SalDisplay from closing KApplication's display pDisp_ = NULL; } /*************************************************************************** * class KDEXLib * ***************************************************************************/ KDEXLib::~KDEXLib() { // #158056# on 64 bit linux using libXRandr.so.2 will crash in // XCloseDisplay when freeing extension data // no known work around, therefor currently leak. Hopefully // this does not make problems since we're shutting down anyway // should we ever get a real kde plugin that uses the KDE event loop // we should use kde's method to signal screen changes similar // to the gtk plugin #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64) // properly deinitialize KApplication delete (VCLKDEApplication*)m_pApplication; #endif // free the faked cmdline arguments no longer needed by KApplication for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) free( m_pFreeCmdLineArgs[i] ); delete [] m_pFreeCmdLineArgs; delete [] m_pAppCmdLineArgs; } void KDEXLib::Init() { SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod; pInputMethod->SetLocale(); XrmInitialize(); KAboutData *kAboutData = new KAboutData( "OpenOffice.org", I18N_NOOP( "OpenOffice.org" ), "1.1.0", I18N_NOOP( "OpenOffice.org with KDE Native Widget Support." ), KAboutData::License_LGPL, "(c) 2003, 2004 Novell, Inc", I18N_NOOP( "OpenOffice.org is an office suite.\n" ), "http://kde.openoffice.org/index.html", "dev@kde.openoffice.org"); kAboutData->addAuthor( "Jan Holesovsky", I18N_NOOP( "Original author and maintainer of the KDE NWF." ), "kendy@artax.karlin.mff.cuni.cz", "http://artax.karlin.mff.cuni.cz/~kendy" ); m_nFakeCmdLineArgs = 1; USHORT nIdx; vos::OExtCommandLine aCommandLine; int nParams = aCommandLine.getCommandArgCount(); rtl::OString aDisplay; rtl::OUString aParam, aBin; for ( nIdx = 0; nIdx < nParams; ++nIdx ) { aCommandLine.getCommandArg( nIdx, aParam ); if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams ) { aCommandLine.getCommandArg( nIdx + 1, aParam ); aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() ); m_nFakeCmdLineArgs = 3; m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" ); m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() ); } } if ( !m_pFreeCmdLineArgs ) m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; osl_getExecutableFile( &aParam.pData ); osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData ); rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() ); m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() ); // make a copy of the string list for freeing it since // KApplication manipulates the pointers inside the argument vector // note: KApplication bad ! m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i]; KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData ); KApplication::disableAutoDcopRegistration(); m_pApplication = new VCLKDEApplication(); kapp->disableSessionManagement(); Display* pDisp = QPaintDevice::x11AppDisplay(); SalDisplay *pSalDisplay = new SalKDEDisplay( pDisp ); pInputMethod->CreateMethod( pDisp ); pInputMethod->AddConnectionWatch( pDisp, (void*)this ); pSalDisplay->SetInputMethod( pInputMethod ); PushXErrorLevel( true ); SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); XSync( pDisp, False ); pKbdExtension->UseExtension( ! HasXErrorOccured() ); PopXErrorLevel(); pSalDisplay->SetKbdExtension( pKbdExtension ); } void KDEXLib::doStartup() { if( ! m_bStartupDone ) { KStartupInfo::appStarted(); m_bStartupDone = true; #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "called KStartupInfo::appStarted()\n" ); #endif } } /********************************************************************** * class KDEData * **********************************************************************/ KDEData::~KDEData() { } void KDEData::Init() { pXLib_ = new KDEXLib(); pXLib_->Init(); } /********************************************************************** * plugin entry point * **********************************************************************/ extern "C" { VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule ) { /* #i92121# workaround deadlocks in the X11 implementation */ static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); /* #i90094# from now on we know that an X connection will be established, so protect X against itself */ if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) XInitThreads(); rtl::OString aVersion( qVersion() ); #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() ); #endif sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0; nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32(); if( nIndex > 0 ) nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32(); if( nIndex > 0 ) nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32(); if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) ) { #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro ); #endif return NULL; } KDESalInstance* pInstance = new KDESalInstance( new SalYieldMutex() ); #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "created KDESalInstance 0x%p\n", pInstance ); #endif // initialize SalData KDEData *pSalData = new KDEData(); SetSalData( pSalData ); pSalData->m_pInstance = pInstance; pSalData->Init(); pSalData->initNWF(); return pInstance; } }