xref: /aoo4110/main/vcl/unx/kde/kdedata.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #define _SV_SALDATA_CXX
28*b1cdbd2cSJim Jagielski #include <shell/kde_headers.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <unistd.h>
31*b1cdbd2cSJim Jagielski #include <fcntl.h>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <stdio.h>
34*b1cdbd2cSJim Jagielski #include <string.h>
35*b1cdbd2cSJim Jagielski #include <stdlib.h>
36*b1cdbd2cSJim Jagielski #include <limits.h>
37*b1cdbd2cSJim Jagielski #include <errno.h>
38*b1cdbd2cSJim Jagielski #include <poll.h>
39*b1cdbd2cSJim Jagielski #ifdef FREEBSD
40*b1cdbd2cSJim Jagielski #include <sys/types.h>
41*b1cdbd2cSJim Jagielski #include <sys/time.h>
42*b1cdbd2cSJim Jagielski #include <unistd.h>
43*b1cdbd2cSJim Jagielski #endif
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <osl/thread.h>
46*b1cdbd2cSJim Jagielski #include <osl/process.h>
47*b1cdbd2cSJim Jagielski #include <osl/module.h>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #include <vos/process.hxx>
52*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include "unx/kde/kdedata.hxx"
55*b1cdbd2cSJim Jagielski #include "unx/i18n_im.hxx"
56*b1cdbd2cSJim Jagielski #include "unx/i18n_xkb.hxx"
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #include "vclpluginapi.h"
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski /* #i59042# override KApplications method for session management
61*b1cdbd2cSJim Jagielski  * since it will interfere badly with our own.
62*b1cdbd2cSJim Jagielski  */
63*b1cdbd2cSJim Jagielski class VCLKDEApplication : public KApplication
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski     public:
VCLKDEApplication()66*b1cdbd2cSJim Jagielski     VCLKDEApplication() : KApplication() {}
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     virtual void commitData(QSessionManager &sm);
69*b1cdbd2cSJim Jagielski };
70*b1cdbd2cSJim Jagielski 
commitData(QSessionManager &)71*b1cdbd2cSJim Jagielski void VCLKDEApplication::commitData(QSessionManager&)
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski }
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski /***************************************************************************
76*b1cdbd2cSJim Jagielski  * class SalKDEDisplay                                                     *
77*b1cdbd2cSJim Jagielski  ***************************************************************************/
78*b1cdbd2cSJim Jagielski 
SalKDEDisplay(Display * pDisp)79*b1cdbd2cSJim Jagielski SalKDEDisplay::SalKDEDisplay( Display* pDisp )
80*b1cdbd2cSJim Jagielski     : SalX11Display( pDisp )
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
~SalKDEDisplay()84*b1cdbd2cSJim Jagielski SalKDEDisplay::~SalKDEDisplay()
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski     // in case never a frame opened
87*b1cdbd2cSJim Jagielski     static_cast<KDEXLib*>(GetXLib())->doStartup();
88*b1cdbd2cSJim Jagielski     // clean up own members
89*b1cdbd2cSJim Jagielski     doDestruct();
90*b1cdbd2cSJim Jagielski     // prevent SalDisplay from closing KApplication's display
91*b1cdbd2cSJim Jagielski     pDisp_ = NULL;
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski /***************************************************************************
95*b1cdbd2cSJim Jagielski  * class KDEXLib                                                           *
96*b1cdbd2cSJim Jagielski  ***************************************************************************/
97*b1cdbd2cSJim Jagielski 
~KDEXLib()98*b1cdbd2cSJim Jagielski KDEXLib::~KDEXLib()
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski     // #158056# on 64 bit linux using libXRandr.so.2 will crash in
101*b1cdbd2cSJim Jagielski     // XCloseDisplay when freeing extension data
102*b1cdbd2cSJim Jagielski     // no known work around, therefor currently leak. Hopefully
103*b1cdbd2cSJim Jagielski     // this does not make problems since we're shutting down anyway
104*b1cdbd2cSJim Jagielski     // should we ever get a real kde plugin that uses the KDE event loop
105*b1cdbd2cSJim Jagielski     // we should use kde's method to signal screen changes similar
106*b1cdbd2cSJim Jagielski     // to the gtk plugin
107*b1cdbd2cSJim Jagielski     #if ! defined USE_RANDR || ! (defined LINUX && defined X86_64)
108*b1cdbd2cSJim Jagielski     // properly deinitialize KApplication
109*b1cdbd2cSJim Jagielski     delete (VCLKDEApplication*)m_pApplication;
110*b1cdbd2cSJim Jagielski     #endif
111*b1cdbd2cSJim Jagielski     // free the faked cmdline arguments no longer needed by KApplication
112*b1cdbd2cSJim Jagielski     for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
113*b1cdbd2cSJim Jagielski         free( m_pFreeCmdLineArgs[i] );
114*b1cdbd2cSJim Jagielski     delete [] m_pFreeCmdLineArgs;
115*b1cdbd2cSJim Jagielski     delete [] m_pAppCmdLineArgs;
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
Init()118*b1cdbd2cSJim Jagielski void KDEXLib::Init()
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski 	SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod;
121*b1cdbd2cSJim Jagielski 	pInputMethod->SetLocale();
122*b1cdbd2cSJim Jagielski 	XrmInitialize();
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 	KAboutData *kAboutData = new KAboutData( "Apache OpenOffice",
125*b1cdbd2cSJim Jagielski 			I18N_NOOP( "Apache OpenOffice" ),
126*b1cdbd2cSJim Jagielski 			"3.4.0",
127*b1cdbd2cSJim Jagielski 			I18N_NOOP( "Apache OpenOffice with KDE Native Widget Support." ),
128*b1cdbd2cSJim Jagielski 			KAboutData::License_File,
129*b1cdbd2cSJim Jagielski 			"(c) 2003, 2004 Novell, Inc and Apache Software Foundation",
130*b1cdbd2cSJim Jagielski 			I18N_NOOP( "Apache OpenOffice is an office suite.\n" ),
131*b1cdbd2cSJim Jagielski 			"http://openoffice.apache.org/index.html",
132*b1cdbd2cSJim Jagielski 			"ooo-issues@incubator.apache.org");
133*b1cdbd2cSJim Jagielski 	kAboutData->addAuthor( "Jan Holesovsky",
134*b1cdbd2cSJim Jagielski 			I18N_NOOP( "Original author and maintainer of the KDE NWF." ),
135*b1cdbd2cSJim Jagielski 			"kendy@artax.karlin.mff.cuni.cz",
136*b1cdbd2cSJim Jagielski 			"http://artax.karlin.mff.cuni.cz/~kendy" );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     m_nFakeCmdLineArgs = 1;
139*b1cdbd2cSJim Jagielski 	sal_uInt16 nIdx;
140*b1cdbd2cSJim Jagielski 	vos::OExtCommandLine aCommandLine;
141*b1cdbd2cSJim Jagielski 	int nParams = aCommandLine.getCommandArgCount();
142*b1cdbd2cSJim Jagielski 	rtl::OString aDisplay;
143*b1cdbd2cSJim Jagielski 	rtl::OUString aParam, aBin;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	for ( nIdx = 0; nIdx < nParams; ++nIdx )
146*b1cdbd2cSJim Jagielski 	{
147*b1cdbd2cSJim Jagielski 		aCommandLine.getCommandArg( nIdx, aParam );
148*b1cdbd2cSJim Jagielski 		if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams )
149*b1cdbd2cSJim Jagielski 		{
150*b1cdbd2cSJim Jagielski 			aCommandLine.getCommandArg( nIdx + 1, aParam );
151*b1cdbd2cSJim Jagielski 			aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() );
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 			m_nFakeCmdLineArgs = 3;
154*b1cdbd2cSJim Jagielski 			m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
155*b1cdbd2cSJim Jagielski 			m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" );
156*b1cdbd2cSJim Jagielski 			m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() );
157*b1cdbd2cSJim Jagielski 		}
158*b1cdbd2cSJim Jagielski 	}
159*b1cdbd2cSJim Jagielski 	if ( !m_pFreeCmdLineArgs )
160*b1cdbd2cSJim Jagielski 		m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski     osl_getExecutableFile( &aParam.pData );
163*b1cdbd2cSJim Jagielski     osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData );
164*b1cdbd2cSJim Jagielski     rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() );
165*b1cdbd2cSJim Jagielski 	m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     // make a copy of the string list for freeing it since
168*b1cdbd2cSJim Jagielski     // KApplication manipulates the pointers inside the argument vector
169*b1cdbd2cSJim Jagielski     // note: KApplication bad !
170*b1cdbd2cSJim Jagielski     m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
171*b1cdbd2cSJim Jagielski     for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
172*b1cdbd2cSJim Jagielski         m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i];
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	KApplication::disableAutoDcopRegistration();
177*b1cdbd2cSJim Jagielski 	m_pApplication = new VCLKDEApplication();
178*b1cdbd2cSJim Jagielski     kapp->disableSessionManagement();
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	Display* pDisp = QPaintDevice::x11AppDisplay();
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	SalDisplay *pSalDisplay = new SalKDEDisplay( pDisp );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	pInputMethod->CreateMethod( pDisp );
185*b1cdbd2cSJim Jagielski 	pInputMethod->AddConnectionWatch( pDisp, (void*)this );
186*b1cdbd2cSJim Jagielski 	pSalDisplay->SetInputMethod( pInputMethod );
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski     PushXErrorLevel( true );
189*b1cdbd2cSJim Jagielski 	SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp );
190*b1cdbd2cSJim Jagielski 	XSync( pDisp, False );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	pKbdExtension->UseExtension( ! HasXErrorOccured() );
193*b1cdbd2cSJim Jagielski 	PopXErrorLevel();
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	pSalDisplay->SetKbdExtension( pKbdExtension );
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
doStartup()198*b1cdbd2cSJim Jagielski void KDEXLib::doStartup()
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     if( ! m_bStartupDone )
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         KStartupInfo::appStarted();
203*b1cdbd2cSJim Jagielski         m_bStartupDone = true;
204*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 1
205*b1cdbd2cSJim Jagielski         fprintf( stderr, "called KStartupInfo::appStarted()\n" );
206*b1cdbd2cSJim Jagielski         #endif
207*b1cdbd2cSJim Jagielski     }
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski /**********************************************************************
211*b1cdbd2cSJim Jagielski  * class KDEData                                                      *
212*b1cdbd2cSJim Jagielski  **********************************************************************/
213*b1cdbd2cSJim Jagielski 
~KDEData()214*b1cdbd2cSJim Jagielski KDEData::~KDEData()
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
Init()218*b1cdbd2cSJim Jagielski void KDEData::Init()
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski     pXLib_ = new KDEXLib();
221*b1cdbd2cSJim Jagielski     pXLib_->Init();
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski /**********************************************************************
225*b1cdbd2cSJim Jagielski  * plugin entry point                                                 *
226*b1cdbd2cSJim Jagielski  **********************************************************************/
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski extern "C" {
create_SalInstance(oslModule)229*b1cdbd2cSJim Jagielski     VCLPLUG_KDE_PUBLIC SalInstance* create_SalInstance( oslModule )
230*b1cdbd2cSJim Jagielski     {
231*b1cdbd2cSJim Jagielski         /* #i92121# workaround deadlocks in the X11 implementation
232*b1cdbd2cSJim Jagielski         */
233*b1cdbd2cSJim Jagielski         static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" );
234*b1cdbd2cSJim Jagielski         /* #i90094#
235*b1cdbd2cSJim Jagielski            from now on we know that an X connection will be
236*b1cdbd2cSJim Jagielski            established, so protect X against itself
237*b1cdbd2cSJim Jagielski         */
238*b1cdbd2cSJim Jagielski         if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
239*b1cdbd2cSJim Jagielski             XInitThreads();
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski         rtl::OString aVersion( qVersion() );
242*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
243*b1cdbd2cSJim Jagielski         fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() );
244*b1cdbd2cSJim Jagielski #endif
245*b1cdbd2cSJim Jagielski         sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0;
246*b1cdbd2cSJim Jagielski         nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32();
247*b1cdbd2cSJim Jagielski         if( nIndex > 0 )
248*b1cdbd2cSJim Jagielski             nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32();
249*b1cdbd2cSJim Jagielski         if( nIndex > 0 )
250*b1cdbd2cSJim Jagielski             nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32();
251*b1cdbd2cSJim Jagielski         if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) )
252*b1cdbd2cSJim Jagielski         {
253*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
254*b1cdbd2cSJim Jagielski             fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro );
255*b1cdbd2cSJim Jagielski #endif
256*b1cdbd2cSJim Jagielski             return NULL;
257*b1cdbd2cSJim Jagielski         }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         KDESalInstance* pInstance = new KDESalInstance( new SalYieldMutex() );
260*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 1
261*b1cdbd2cSJim Jagielski         fprintf( stderr, "created KDESalInstance 0x%p\n", pInstance );
262*b1cdbd2cSJim Jagielski #endif
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski         // initialize SalData
265*b1cdbd2cSJim Jagielski         KDEData *pSalData = new KDEData();
266*b1cdbd2cSJim Jagielski         SetSalData( pSalData );
267*b1cdbd2cSJim Jagielski         pSalData->m_pInstance = pInstance;
268*b1cdbd2cSJim Jagielski         pSalData->Init();
269*b1cdbd2cSJim Jagielski         pSalData->initNWF();
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski         return pInstance;
272*b1cdbd2cSJim Jagielski     }
273*b1cdbd2cSJim Jagielski }
274