xref: /trunk/main/vcl/unx/kde4/KDEXLib.cxx (revision 557fdb96)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <vos/process.hxx>
25 
26 #include "VCLKDEApplication.hxx"
27 
28 #define Region QtXRegion
29 
30 #include <kapplication.h>
31 #include <klocale.h>
32 #include <kaboutdata.h>
33 #include <kcmdlineargs.h>
34 #include <kstartupinfo.h>
35 
36 #undef Region
37 
38 #include "KDEXLib.hxx"
39 
40 #include <unx/i18n_im.hxx>
41 #include <unx/i18n_xkb.hxx>
42 
43 #include <unx/saldata.hxx>
44 
45 #include "KDESalDisplay.hxx"
46 
47 #if OSL_DEBUG_LEVEL > 1
48 #include <stdio.h>
49 #endif
50 
51 KDEXLib::KDEXLib() :
52 	SalXLib(),	m_bStartupDone(false), m_pApplication(0),
53 	m_pFreeCmdLineArgs(0), m_pAppCmdLineArgs(0), m_nFakeCmdLineArgs( 0 )
54 {
55 }
56 
57 KDEXLib::~KDEXLib()
58 {
59 	delete (VCLKDEApplication*)m_pApplication;
60 
61     // free the faked cmdline arguments no longer needed by KApplication
62     for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
63 	{
64         free( m_pFreeCmdLineArgs[i] );
65 	}
66 
67     delete [] m_pFreeCmdLineArgs;
68     delete [] m_pAppCmdLineArgs;
69 }
70 
71 void KDEXLib::Init()
72 {
73 	SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod;
74 	pInputMethod->SetLocale();
75 	XrmInitialize();
76 
77 	KAboutData *kAboutData = new KAboutData("OpenOffice",
78 			"kdelibs4",
79 			ki18n( "Apache OpenOffice" ),
80 			"3.4.0",
81 			ki18n( "Apache OpenOffice with KDE Native Widget Support." ),
82 			KAboutData::License_File,
83 			ki18n( "Joint Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Novell, Inc and Apache Software Foundation"),
84 			ki18n( "Apache OpenOffice is an office suite.\n" ),
85 			"http://openoffice.apache.org/",
86 			"ooo-issues@incubator.apache.org" );
87 
88 	kAboutData->addAuthor( ki18n( "Jan Holesovsky" ),
89 			ki18n( "Original author and maintainer of the KDE NWF." ),
90 			"kendy@artax.karlin.mff.cuni.cz",
91 			"http://artax.karlin.mff.cuni.cz/~kendy" );
92 	kAboutData->addAuthor( ki18n("Roman Shtylman"),
93 			ki18n( "Porting to KDE 4." ),
94 			"shtylman@gmail.com", "http://shtylman.com" );
95 	kAboutData->addAuthor( ki18n("Eric Bischoff"),
96 			ki18n( "Accessibility fixes, porting to KDE 4." ),
97 			"bischoff@kde.org" );
98 
99 	//kAboutData->setProgramIconName("OpenOffice");
100 
101 	m_nFakeCmdLineArgs = 1;
102 	int nIdx;
103 	vos::OExtCommandLine aCommandLine;
104 	int nParams = aCommandLine.getCommandArgCount();
105 	rtl::OString aDisplay;
106 	rtl::OUString aParam, aBin;
107 
108 	for ( nIdx = 0; nIdx < nParams; ++nIdx )
109 	{
110 		aCommandLine.getCommandArg( nIdx, aParam );
111 		if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams )
112 		{
113 			aCommandLine.getCommandArg( nIdx + 1, aParam );
114 			aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() );
115 
116 			m_nFakeCmdLineArgs = 3;
117 			m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
118 			m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" );
119 			m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() );
120 		}
121 	}
122 	if ( !m_pFreeCmdLineArgs )
123 		m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
124 
125     osl_getExecutableFile( &aParam.pData );
126     osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData );
127     rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() );
128 	m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() );
129 
130     // make a copy of the string list for freeing it since
131     // KApplication manipulates the pointers inside the argument vector
132     // note: KApplication bad !
133     m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ];
134     for( int i = 0; i < m_nFakeCmdLineArgs; i++ )
135         m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i];
136 
137 	KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData );
138 
139 	m_pApplication = new VCLKDEApplication();
140 	kapp->disableSessionManagement();
141 	KApplication::setQuitOnLastWindowClosed(false);
142 
143 	Display* pDisp = QX11Info::display();
144 	SalKDEDisplay *pSalDisplay = new SalKDEDisplay(pDisp);
145 
146 	((VCLKDEApplication*)m_pApplication)->disp = pSalDisplay;
147 
148 	pInputMethod->CreateMethod( pDisp );
149 	pInputMethod->AddConnectionWatch( pDisp, (void*)this );
150 	pSalDisplay->SetInputMethod( pInputMethod );
151 
152     PushXErrorLevel( true );
153 	SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp );
154 	XSync( pDisp, False );
155 
156 	pKbdExtension->UseExtension( ! HasXErrorOccured() );
157 	PopXErrorLevel();
158 
159 	pSalDisplay->SetKbdExtension( pKbdExtension );
160 }
161 
162 void KDEXLib::doStartup()
163 {
164     if( ! m_bStartupDone )
165     {
166         KStartupInfo::appStarted();
167         m_bStartupDone = true;
168         #if OSL_DEBUG_LEVEL > 1
169         fprintf( stderr, "called KStartupInfo::appStarted()\n" );
170         #endif
171     }
172 }
173