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