Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <config_features.h>
21 :
22 : #include "comphelper/processfactory.hxx"
23 :
24 : #include "osl/module.h"
25 : #include "osl/file.hxx"
26 : #include "osl/thread.h"
27 :
28 : #include "rtl/tencinfo.h"
29 : #include "rtl/instance.hxx"
30 :
31 : #include "tools/debug.hxx"
32 : #include "tools/time.hxx"
33 :
34 : #include "i18nlangtag/mslangid.hxx"
35 :
36 : #include "unotools/syslocaleoptions.hxx"
37 :
38 : #include "vcl/settings.hxx"
39 : #include "vcl/keycod.hxx"
40 : #include "vcl/event.hxx"
41 : #include "vcl/vclevent.hxx"
42 : #include "vcl/virdev.hxx"
43 : #include "vcl/wrkwin.hxx"
44 : #include "vcl/svapp.hxx"
45 : #include "vcl/cvtgrf.hxx"
46 : #include "vcl/unowrap.hxx"
47 : #include "vcl/timer.hxx"
48 : #include "vcl/scheduler.hxx"
49 : #include "vcl/unohelp.hxx"
50 : #include "vcl/lazydelete.hxx"
51 :
52 : #include "salinst.hxx"
53 : #include "salframe.hxx"
54 : #include "salsys.hxx"
55 : #include "svdata.hxx"
56 : #include "salimestatus.hxx"
57 : #include "xconnection.hxx"
58 : #include "window.h"
59 : #include "accmgr.hxx"
60 : #include "idlemgr.hxx"
61 : #include "svids.hrc"
62 :
63 : #include "com/sun/star/uno/Reference.h"
64 : #include "com/sun/star/awt/XToolkit.hpp"
65 : #include "com/sun/star/uno/XNamingService.hpp"
66 : #include "com/sun/star/lang/XMultiServiceFactory.hpp"
67 : #include "comphelper/solarmutex.hxx"
68 : #include "osl/process.h"
69 :
70 : #include <cassert>
71 : #include <utility>
72 :
73 : using namespace ::com::sun::star;
74 : using namespace ::com::sun::star::uno;
75 :
76 : // keycodes handled internally by VCL
77 : class ImplReservedKey
78 : {
79 : public:
80 0 : ImplReservedKey( vcl::KeyCode aKeyCode, sal_uInt16 nResId ) :
81 0 : mKeyCode(aKeyCode), mnResId( nResId)
82 0 : {}
83 :
84 : vcl::KeyCode mKeyCode;
85 : sal_uInt16 mnResId;
86 : };
87 :
88 : typedef std::pair<ImplReservedKey*, size_t> ReservedKeys;
89 : namespace
90 : {
91 : struct ImplReservedKeysImpl
92 : {
93 0 : ReservedKeys* operator()()
94 : {
95 : static ImplReservedKey ImplReservedKeys[] =
96 : {
97 : ImplReservedKey(vcl::KeyCode(KEY_F1,0), SV_SHORTCUT_HELP),
98 : ImplReservedKey(vcl::KeyCode(KEY_F1,KEY_SHIFT), SV_SHORTCUT_ACTIVEHELP),
99 : ImplReservedKey(vcl::KeyCode(KEY_F1,KEY_MOD1), SV_SHORTCUT_CONTEXTHELP),
100 : ImplReservedKey(vcl::KeyCode(KEY_F2,KEY_SHIFT), SV_SHORTCUT_CONTEXTHELP),
101 : ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD1), SV_SHORTCUT_DOCKUNDOCK),
102 : ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD2), SV_SHORTCUT_DOCKUNDOCK),
103 : ImplReservedKey(vcl::KeyCode(KEY_F4,KEY_MOD1|KEY_MOD2), SV_SHORTCUT_DOCKUNDOCK),
104 : ImplReservedKey(vcl::KeyCode(KEY_F6,0), SV_SHORTCUT_NEXTSUBWINDOW),
105 : ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_MOD1), SV_SHORTCUT_TODOCUMENT),
106 : ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_SHIFT), SV_SHORTCUT_PREVSUBWINDOW),
107 : ImplReservedKey(vcl::KeyCode(KEY_F6,KEY_MOD1|KEY_SHIFT), SV_SHORTCUT_SPLITTER),
108 : ImplReservedKey(vcl::KeyCode(KEY_F10,0), SV_SHORTCUT_MENUBAR)
109 : #ifdef UNX
110 : ,
111 : ImplReservedKey(vcl::KeyCode(KEY_1,KEY_SHIFT|KEY_MOD1), 0),
112 : ImplReservedKey(vcl::KeyCode(KEY_2,KEY_SHIFT|KEY_MOD1), 0),
113 : ImplReservedKey(vcl::KeyCode(KEY_3,KEY_SHIFT|KEY_MOD1), 0),
114 : ImplReservedKey(vcl::KeyCode(KEY_4,KEY_SHIFT|KEY_MOD1), 0),
115 : ImplReservedKey(vcl::KeyCode(KEY_5,KEY_SHIFT|KEY_MOD1), 0),
116 : ImplReservedKey(vcl::KeyCode(KEY_6,KEY_SHIFT|KEY_MOD1), 0),
117 : ImplReservedKey(vcl::KeyCode(KEY_7,KEY_SHIFT|KEY_MOD1), 0),
118 : ImplReservedKey(vcl::KeyCode(KEY_8,KEY_SHIFT|KEY_MOD1), 0),
119 : ImplReservedKey(vcl::KeyCode(KEY_9,KEY_SHIFT|KEY_MOD1), 0),
120 : ImplReservedKey(vcl::KeyCode(KEY_0,KEY_SHIFT|KEY_MOD1), 0),
121 : ImplReservedKey(vcl::KeyCode(KEY_ADD,KEY_SHIFT|KEY_MOD1), 0)
122 : #endif
123 0 : };
124 : static ReservedKeys aKeys
125 : (
126 : &ImplReservedKeys[0],
127 : sizeof(ImplReservedKeys) / sizeof(ImplReservedKey)
128 : );
129 0 : return &aKeys;
130 : }
131 : };
132 :
133 : struct ImplReservedKeys
134 : : public rtl::StaticAggregate<ReservedKeys, ImplReservedKeysImpl> {};
135 : }
136 :
137 : extern "C" {
138 : typedef UnoWrapperBase* (SAL_CALL *FN_TkCreateUnoWrapper)();
139 : }
140 :
141 : struct ImplHotKey
142 : {
143 : ImplHotKey* mpNext;
144 : void* mpUserData;
145 : vcl::KeyCode maKeyCode;
146 : Link<> maLink;
147 : };
148 :
149 : struct ImplEventHook
150 : {
151 : ImplEventHook* mpNext;
152 : void* mpUserData;
153 : VCLEventHookProc mpProc;
154 : };
155 :
156 : struct ImplPostEventData
157 : {
158 : sal_uLong mnEvent;
159 : VclPtr<vcl::Window> mpWin;
160 : ImplSVEvent * mnEventId;
161 : KeyEvent maKeyEvent;
162 : MouseEvent maMouseEvent;
163 : ZoomEvent maZoomEvent;
164 : ScrollEvent maScrollEvent;
165 :
166 0 : ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const KeyEvent& rKeyEvent ) :
167 0 : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {}
168 0 : ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const MouseEvent& rMouseEvent ) :
169 0 : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {}
170 : #if !HAVE_FEATURE_DESKTOP
171 : ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const ZoomEvent& rZoomEvent ) :
172 : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {}
173 : ImplPostEventData( sal_uLong nEvent, vcl::Window* pWin, const ScrollEvent& rScrollEvent ) :
174 : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {}
175 : #endif
176 :
177 0 : ~ImplPostEventData() {}
178 : };
179 :
180 : typedef ::std::pair< VclPtr<vcl::Window>, ImplPostEventData* > ImplPostEventPair;
181 :
182 267 : static ::std::list< ImplPostEventPair > aPostedEventList;
183 :
184 90946 : Application* GetpApp()
185 : {
186 90946 : ImplSVData* pSVData = ImplGetSVData();
187 90946 : if ( !pSVData )
188 0 : return NULL;
189 90946 : return pSVData->mpApp;
190 : }
191 :
192 245 : Application::Application()
193 : {
194 : // useful for themes at least, perhaps extensions too
195 490 : OUString aVar("LIBO_VERSION"), aValue(LIBO_VERSION_DOTTED);
196 245 : osl_setEnvironment(aVar.pData, aValue.pData);
197 :
198 245 : ImplGetSVData()->mpApp = this;
199 490 : InitSalData();
200 245 : }
201 :
202 357 : Application::~Application()
203 : {
204 242 : ImplDeInitSVData();
205 242 : DeInitSalData();
206 242 : ImplGetSVData()->mpApp = NULL;
207 357 : }
208 :
209 0 : int Application::Main()
210 : {
211 : SAL_WARN("vcl", "Application is a base class and should be overridden.");
212 0 : return EXIT_SUCCESS;
213 : }
214 :
215 0 : bool Application::QueryExit()
216 : {
217 0 : WorkWindow* pAppWin = ImplGetSVData()->maWinData.mpAppWin;
218 :
219 : // call the close handler of the application window
220 0 : if ( pAppWin )
221 0 : return pAppWin->Close();
222 : else
223 0 : return true;
224 : }
225 :
226 118 : void Application::Init()
227 : {
228 118 : }
229 :
230 2584 : void Application::InitFinished()
231 : {
232 2584 : }
233 :
234 115 : void Application::DeInit()
235 : {
236 115 : }
237 :
238 132 : sal_uInt16 Application::GetCommandLineParamCount()
239 : {
240 132 : return (sal_uInt16)osl_getCommandArgCount();
241 : }
242 :
243 165 : OUString Application::GetCommandLineParam( sal_uInt16 nParam )
244 : {
245 165 : OUString aParam;
246 165 : osl_getCommandArg( nParam, &aParam.pData );
247 165 : return aParam;
248 : }
249 :
250 11 : OUString Application::GetAppFileName()
251 : {
252 11 : ImplSVData* pSVData = ImplGetSVData();
253 : DBG_ASSERT( pSVData->maAppData.mpAppFileName, "AppFileName should be set to something after SVMain!" );
254 11 : if ( pSVData->maAppData.mpAppFileName )
255 0 : return *pSVData->maAppData.mpAppFileName;
256 :
257 : /*
258 : * provide a fallback for people without initialized vcl here (like setup
259 : * in responsefile mode)
260 : */
261 11 : OUString aAppFileName;
262 22 : OUString aExeFileName;
263 11 : osl_getExecutableFile(&aExeFileName.pData);
264 :
265 : // convert path to native file format
266 11 : osl::FileBase::getSystemPathFromFileURL(aExeFileName, aAppFileName);
267 :
268 22 : return aAppFileName;
269 : }
270 :
271 0 : sal_uInt16 Application::Exception( sal_uInt16 nError )
272 : {
273 0 : switch ( nError & EXC_MAJORTYPE )
274 : {
275 : // System has precedence (so do nothing)
276 : case EXC_SYSTEM:
277 0 : return 0;
278 :
279 : case EXC_DISPLAY:
280 : case EXC_REMOTE:
281 0 : return 0;
282 :
283 : #ifdef DBG_UTIL
284 : case EXC_RSCNOTLOADED:
285 : Abort(OUString("Resource not loaded"));
286 : break;
287 : default:
288 : Abort(OUString("Unknown Error"));
289 : break;
290 : #else
291 : default:
292 0 : Abort(OUString());
293 0 : break;
294 : #endif
295 : }
296 :
297 0 : return 0;
298 : }
299 :
300 0 : void Application::Abort( const OUString& rErrorText )
301 : {
302 : //HACK: Dump core iff --norestore command line argument is given (assuming
303 : // this process is run by developers who are interested in cores, vs. end
304 : // users who are not):
305 0 : bool dumpCore = false;
306 0 : sal_uInt16 n = GetCommandLineParamCount();
307 0 : for (sal_uInt16 i = 0; i != n; ++i) {
308 0 : if (GetCommandLineParam(i) == "--norestore") {
309 0 : dumpCore = true;
310 0 : break;
311 : }
312 : }
313 :
314 0 : SalAbort( rErrorText, dumpCore );
315 0 : }
316 :
317 0 : sal_uLong Application::GetReservedKeyCodeCount()
318 : {
319 0 : return ImplReservedKeys::get()->second;
320 : }
321 :
322 0 : const vcl::KeyCode* Application::GetReservedKeyCode( sal_uLong i )
323 : {
324 0 : if( i >= GetReservedKeyCodeCount() )
325 0 : return NULL;
326 : else
327 0 : return &ImplReservedKeys::get()->first[i].mKeyCode;
328 : }
329 :
330 64 : void Application::Execute()
331 : {
332 64 : ImplSVData* pSVData = ImplGetSVData();
333 64 : pSVData->maAppData.mbInAppExecute = true;
334 :
335 13470837 : while ( !pSVData->maAppData.mbAppQuit )
336 13470709 : Application::Yield();
337 :
338 64 : pSVData->maAppData.mbInAppExecute = false;
339 64 : }
340 :
341 13482007 : inline void ImplYield( bool i_bWait, bool i_bAllEvents )
342 : {
343 13482007 : ImplSVData* pSVData = ImplGetSVData();
344 :
345 : //Process all Tasks
346 13482007 : Scheduler::ProcessTaskScheduling(false);
347 :
348 13482007 : pSVData->maAppData.mnDispatchLevel++;
349 : // do not wait for events if application was already quit; in that
350 : // case only dispatch events already available
351 : // do not wait for events either if the app decided that it is too busy for timers
352 : // (feature added for the slideshow)
353 13482007 : pSVData->mpDefInst->Yield( i_bWait && !pSVData->maAppData.mbAppQuit && !pSVData->maAppData.mbNoYield, i_bAllEvents );
354 13482007 : pSVData->maAppData.mnDispatchLevel--;
355 :
356 : DBG_TESTSOLARMUTEX(); // must be locked on return from Yield
357 :
358 : // flush lazy deleted objects
359 13482007 : if( pSVData->maAppData.mnDispatchLevel == 0 )
360 13481491 : vcl::LazyDelete::flush();
361 :
362 : // the system timer events will not necessarily come in non waiting mode
363 : // e.g. on OS X; need to trigger timer checks manually
364 13482007 : if( pSVData->maAppData.mbNoYield )
365 : {
366 : //Process all timers
367 0 : Scheduler::ProcessTaskScheduling(true);
368 : }
369 :
370 : // call post yield listeners
371 13482007 : if( pSVData->maAppData.mpPostYieldListeners )
372 0 : pSVData->maAppData.mpPostYieldListeners->callListeners( NULL );
373 13482007 : }
374 :
375 9151 : void Application::Reschedule( bool i_bAllEvents )
376 : {
377 9151 : ImplYield( false, i_bAllEvents );
378 9151 : }
379 :
380 13472856 : void Application::Yield()
381 : {
382 13472856 : ImplYield( true, false );
383 13472856 : }
384 :
385 128 : IMPL_STATIC_LINK_NOARG( ImplSVAppData, ImplQuitMsg )
386 : {
387 64 : ImplGetSVData()->maAppData.mbAppQuit = true;
388 64 : return 0;
389 : }
390 :
391 126 : void Application::Quit()
392 : {
393 126 : Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplQuitMsg ) );
394 126 : }
395 :
396 21610702 : comphelper::SolarMutex& Application::GetSolarMutex()
397 : {
398 21610702 : ImplSVData* pSVData = ImplGetSVData();
399 21610700 : return *(pSVData->mpDefInst->GetYieldMutex());
400 : }
401 :
402 0 : oslThreadIdentifier Application::GetMainThreadIdentifier()
403 : {
404 0 : return ImplGetSVData()->mnMainThreadId;
405 : }
406 :
407 1246 : sal_uLong Application::ReleaseSolarMutex()
408 : {
409 1246 : ImplSVData* pSVData = ImplGetSVData();
410 1246 : return pSVData->mpDefInst->ReleaseYieldMutex();
411 : }
412 :
413 1246 : void Application::AcquireSolarMutex( sal_uLong nCount )
414 : {
415 1246 : ImplSVData* pSVData = ImplGetSVData();
416 1246 : pSVData->mpDefInst->AcquireYieldMutex( nCount );
417 1246 : }
418 :
419 40832 : bool Application::IsInMain()
420 : {
421 40832 : ImplSVData* pSVData = ImplGetSVData();
422 40832 : return pSVData && pSVData->maAppData.mbInAppMain;
423 : }
424 :
425 3311 : bool Application::IsInExecute()
426 : {
427 3311 : return ImplGetSVData()->maAppData.mbInAppExecute;
428 : }
429 :
430 0 : bool Application::IsInModalMode()
431 : {
432 0 : return (ImplGetSVData()->maAppData.mnModalMode != 0);
433 : }
434 :
435 0 : sal_uInt16 Application::GetDispatchLevel()
436 : {
437 0 : return ImplGetSVData()->maAppData.mnDispatchLevel;
438 : }
439 :
440 60027200 : bool Application::AnyInput( VclInputFlags nType )
441 : {
442 60027200 : return ImplGetSVData()->mpDefInst->AnyInput( nType );
443 : }
444 :
445 3595 : sal_uInt64 Application::GetLastInputInterval()
446 : {
447 3595 : return (tools::Time::GetSystemTicks()-ImplGetSVData()->maAppData.mnLastInputTime);
448 : }
449 :
450 : extern int nImplSysDialog;
451 :
452 18 : bool Application::IsUICaptured()
453 : {
454 18 : ImplSVData* pSVData = ImplGetSVData();
455 :
456 : // If mouse was captured, or if in tracking- or in select-mode of a floatingwindow (e.g. menus
457 : // or pulldown toolboxes) another window should be created
458 : // D&D active !!!
459 72 : if ( pSVData->maWinData.mpCaptureWin || pSVData->maWinData.mpTrackWin ||
460 54 : pSVData->maWinData.mpFirstFloat || nImplSysDialog )
461 0 : return true;
462 : else
463 18 : return false;
464 : }
465 :
466 73 : void Application::OverrideSystemSettings( AllSettings& /*rSettings*/ )
467 : {
468 73 : }
469 :
470 486 : void Application::MergeSystemSettings( AllSettings& rSettings )
471 : {
472 486 : vcl::Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
473 486 : if( ! pWindow )
474 0 : pWindow = ImplGetDefaultWindow();
475 486 : if( pWindow )
476 : {
477 486 : ImplSVData* pSVData = ImplGetSVData();
478 486 : if ( !pSVData->maAppData.mbSettingsInit )
479 : {
480 : // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
481 119 : pWindow->ImplUpdateGlobalSettings( *pSVData->maAppData.mpSettings );
482 119 : pSVData->maAppData.mbSettingsInit = true;
483 : }
484 : // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings
485 486 : pWindow->ImplUpdateGlobalSettings( rSettings, false );
486 : }
487 486 : }
488 :
489 818 : void Application::SetSettings( const AllSettings& rSettings )
490 : {
491 818 : const SolarMutexGuard aGuard;
492 :
493 818 : ImplSVData* pSVData = ImplGetSVData();
494 818 : if ( !pSVData->maAppData.mpSettings )
495 : {
496 0 : InitSettings(pSVData);
497 0 : *pSVData->maAppData.mpSettings = rSettings;
498 0 : ResMgr::SetDefaultLocale( rSettings.GetUILanguageTag() );
499 : }
500 : else
501 : {
502 818 : AllSettings aOldSettings = *pSVData->maAppData.mpSettings;
503 818 : if( aOldSettings.GetUILanguageTag().getLanguageType() != rSettings.GetUILanguageTag().getLanguageType() &&
504 : pSVData->mpResMgr )
505 : {
506 0 : delete pSVData->mpResMgr;
507 0 : pSVData->mpResMgr = NULL;
508 : }
509 818 : ResMgr::SetDefaultLocale( rSettings.GetUILanguageTag() );
510 818 : *pSVData->maAppData.mpSettings = rSettings;
511 818 : AllSettingsFlags nChangeFlags = aOldSettings.GetChangeFlags( *pSVData->maAppData.mpSettings );
512 818 : if ( bool(nChangeFlags) )
513 : {
514 309 : DataChangedEvent aDCEvt( DataChangedEventType::SETTINGS, &aOldSettings, nChangeFlags );
515 :
516 : // notify data change handler
517 309 : ImplCallEventListeners( VCLEVENT_APPLICATION_DATACHANGED, NULL, &aDCEvt);
518 :
519 : // Update all windows
520 309 : vcl::Window* pFirstFrame = pSVData->maWinData.mpFirstFrame;
521 : // Reset data that needs to be re-calculated
522 309 : long nOldDPIX = 0;
523 309 : long nOldDPIY = 0;
524 309 : if ( pFirstFrame )
525 : {
526 307 : nOldDPIX = pFirstFrame->GetDPIX();
527 307 : nOldDPIY = pFirstFrame->GetDPIY();
528 307 : vcl::Window::ImplInitAppFontData(pFirstFrame);
529 : }
530 309 : vcl::Window* pFrame = pFirstFrame;
531 997 : while ( pFrame )
532 : {
533 : // restore AppFont cache data
534 379 : pFrame->mpWindowImpl->mpFrameData->meMapUnit = MAP_PIXEL;
535 :
536 : // call UpdateSettings from ClientWindow in order to prevent updating data twice
537 379 : vcl::Window* pClientWin = pFrame;
538 1137 : while ( pClientWin->ImplGetClientWindow() )
539 379 : pClientWin = pClientWin->ImplGetClientWindow();
540 379 : pClientWin->UpdateSettings( rSettings, true );
541 :
542 379 : vcl::Window* pTempWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
543 758 : while ( pTempWin )
544 : {
545 : // call UpdateSettings from ClientWindow in order to prevent updating data twice
546 0 : pClientWin = pTempWin;
547 0 : while ( pClientWin->ImplGetClientWindow() )
548 0 : pClientWin = pClientWin->ImplGetClientWindow();
549 0 : pClientWin->UpdateSettings( rSettings, true );
550 0 : pTempWin = pTempWin->mpWindowImpl->mpNextOverlap;
551 : }
552 :
553 379 : pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
554 : }
555 :
556 : // if DPI resolution for screen output was changed set the new resolution for all
557 : // screen compatible VirDev's
558 309 : pFirstFrame = pSVData->maWinData.mpFirstFrame;
559 309 : if ( pFirstFrame )
560 : {
561 614 : if ( (pFirstFrame->GetDPIX() != nOldDPIX) ||
562 307 : (pFirstFrame->GetDPIY() != nOldDPIY) )
563 : {
564 0 : VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev;
565 0 : while ( pVirDev )
566 : {
567 0 : if ( pVirDev->mbScreenComp &&
568 0 : (pVirDev->GetDPIX() == nOldDPIX) &&
569 0 : (pVirDev->GetDPIY() == nOldDPIY) )
570 : {
571 0 : pVirDev->SetDPIX( pFirstFrame->GetDPIX() );
572 0 : pVirDev->SetDPIY( pFirstFrame->GetDPIY() );
573 0 : if ( pVirDev->IsMapModeEnabled() )
574 : {
575 0 : MapMode aMapMode = pVirDev->GetMapMode();
576 0 : pVirDev->SetMapMode();
577 0 : pVirDev->SetMapMode( aMapMode );
578 : }
579 : }
580 :
581 0 : pVirDev = pVirDev->mpNext;
582 : }
583 : }
584 : }
585 818 : }
586 818 : }
587 818 : }
588 :
589 8090765 : const AllSettings& Application::GetSettings()
590 : {
591 8090765 : ImplSVData* pSVData = ImplGetSVData();
592 8090765 : if ( !pSVData->maAppData.mpSettings )
593 : {
594 226 : InitSettings(pSVData);
595 : }
596 :
597 8090765 : return *(pSVData->maAppData.mpSettings);
598 : }
599 :
600 226 : void Application::InitSettings(ImplSVData* pSVData)
601 : {
602 : assert(!pSVData->maAppData.mpSettings && "initialization should not happen twice!");
603 :
604 226 : pSVData->maAppData.mpCfgListener = new LocaleConfigurationListener;
605 226 : pSVData->maAppData.mpSettings = new AllSettings();
606 226 : pSVData->maAppData.mpSettings->GetSysLocale().GetOptions().AddListener( pSVData->maAppData.mpCfgListener );
607 226 : }
608 :
609 0 : void Application::NotifyAllWindows( DataChangedEvent& rDCEvt )
610 : {
611 0 : ImplSVData* pSVData = ImplGetSVData();
612 0 : vcl::Window* pFrame = pSVData->maWinData.mpFirstFrame;
613 0 : while ( pFrame )
614 : {
615 0 : pFrame->NotifyAllChildren( rDCEvt );
616 :
617 0 : vcl::Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
618 0 : while ( pSysWin )
619 : {
620 0 : pSysWin->NotifyAllChildren( rDCEvt );
621 0 : pSysWin = pSysWin->mpWindowImpl->mpNextOverlap;
622 : }
623 :
624 0 : pFrame = pFrame->mpWindowImpl->mpFrameData->mpNextFrame;
625 : }
626 0 : }
627 :
628 309 : void Application::ImplCallEventListeners( sal_uLong nEvent, vcl::Window *pWin, void* pData )
629 : {
630 309 : ImplSVData* pSVData = ImplGetSVData();
631 309 : VclWindowEvent aEvent( pWin, nEvent, pData );
632 :
633 309 : if ( pSVData->maAppData.mpEventListeners )
634 75 : pSVData->maAppData.mpEventListeners->Call( &aEvent );
635 309 : }
636 :
637 3053606 : void Application::ImplCallEventListeners( VclSimpleEvent* pEvent )
638 : {
639 3053606 : ImplSVData* pSVData = ImplGetSVData();
640 :
641 3053606 : if ( pSVData->maAppData.mpEventListeners )
642 3052166 : pSVData->maAppData.mpEventListeners->Call( pEvent );
643 3053606 : }
644 :
645 314 : void Application::AddEventListener( const Link<>& rEventListener )
646 : {
647 314 : ImplSVData* pSVData = ImplGetSVData();
648 314 : if( !pSVData->maAppData.mpEventListeners )
649 122 : pSVData->maAppData.mpEventListeners = new VclEventListeners;
650 314 : pSVData->maAppData.mpEventListeners->addListener( rEventListener );
651 314 : }
652 :
653 247 : void Application::RemoveEventListener( const Link<>& rEventListener )
654 : {
655 247 : ImplSVData* pSVData = ImplGetSVData();
656 247 : if( pSVData->maAppData.mpEventListeners )
657 247 : pSVData->maAppData.mpEventListeners->removeListener( rEventListener );
658 247 : }
659 :
660 0 : void Application::AddKeyListener( const Link<>& rKeyListener )
661 : {
662 0 : ImplSVData* pSVData = ImplGetSVData();
663 0 : if( !pSVData->maAppData.mpKeyListeners )
664 0 : pSVData->maAppData.mpKeyListeners = new VclEventListeners;
665 0 : pSVData->maAppData.mpKeyListeners->addListener( rKeyListener );
666 0 : }
667 :
668 0 : void Application::RemoveKeyListener( const Link<>& rKeyListener )
669 : {
670 0 : ImplSVData* pSVData = ImplGetSVData();
671 0 : if( pSVData->maAppData.mpKeyListeners )
672 0 : pSVData->maAppData.mpKeyListeners->removeListener( rKeyListener );
673 0 : }
674 :
675 0 : bool Application::HandleKey( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent )
676 : {
677 : // let listeners process the key event
678 0 : VclWindowEvent aEvent( pWin, nEvent, static_cast<void *>(pKeyEvent) );
679 :
680 0 : ImplSVData* pSVData = ImplGetSVData();
681 0 : bool bProcessed = false;
682 :
683 0 : if ( pSVData->maAppData.mpKeyListeners )
684 0 : bProcessed = pSVData->maAppData.mpKeyListeners->Process( &aEvent );
685 :
686 0 : return bProcessed;
687 : }
688 :
689 0 : ImplSVEvent * Application::PostKeyEvent( sal_uLong nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent )
690 : {
691 0 : const SolarMutexGuard aGuard;
692 0 : ImplSVEvent * nEventId = 0;
693 :
694 0 : if( pWin && pKeyEvent )
695 : {
696 0 : ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pKeyEvent );
697 :
698 : nEventId = PostUserEvent(
699 : LINK( NULL, Application, PostEventHandler ),
700 0 : pPostEventData );
701 :
702 0 : if( nEventId )
703 : {
704 0 : pPostEventData->mnEventId = nEventId;
705 0 : aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
706 : }
707 : else
708 0 : delete pPostEventData;
709 : }
710 :
711 0 : return nEventId;
712 : }
713 :
714 0 : ImplSVEvent * Application::PostMouseEvent( sal_uLong nEvent, vcl::Window *pWin, MouseEvent* pMouseEvent )
715 : {
716 0 : const SolarMutexGuard aGuard;
717 0 : ImplSVEvent * nEventId = 0;
718 :
719 0 : if( pWin && pMouseEvent )
720 : {
721 0 : Point aTransformedPos( pMouseEvent->GetPosPixel() );
722 :
723 0 : aTransformedPos.X() += pWin->GetOutOffXPixel();
724 0 : aTransformedPos.Y() += pWin->GetOutOffYPixel();
725 :
726 0 : const MouseEvent aTransformedEvent( aTransformedPos, pMouseEvent->GetClicks(), pMouseEvent->GetMode(),
727 0 : pMouseEvent->GetButtons(), pMouseEvent->GetModifier() );
728 :
729 0 : ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
730 :
731 : nEventId = PostUserEvent(
732 : LINK( NULL, Application, PostEventHandler ),
733 0 : pPostEventData );
734 :
735 0 : if( nEventId )
736 : {
737 0 : pPostEventData->mnEventId = nEventId;
738 0 : aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
739 : }
740 : else
741 0 : delete pPostEventData;
742 : }
743 :
744 0 : return nEventId;
745 : }
746 :
747 : #if !HAVE_FEATURE_DESKTOP
748 :
749 : ImplSVEvent * Application::PostZoomEvent( sal_uLong nEvent, vcl::Window *pWin, ZoomEvent* pZoomEvent )
750 : {
751 : const SolarMutexGuard aGuard;
752 : ImplSVEvent * nEventId = 0;
753 :
754 : if( pWin && pZoomEvent )
755 : {
756 : Point aTransformedPos( pZoomEvent->GetCenter() );
757 :
758 : aTransformedPos.X() += pWin->GetOutOffXPixel();
759 : aTransformedPos.Y() += pWin->GetOutOffYPixel();
760 :
761 : const ZoomEvent aTransformedEvent( aTransformedPos, pZoomEvent->GetScale() );
762 :
763 : ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
764 :
765 : nEventId = PostUserEvent(
766 : LINK( NULL, Application, PostEventHandler ),
767 : pPostEventData );
768 :
769 : if( nEventId )
770 : {
771 : pPostEventData->mnEventId = nEventId;
772 : aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
773 : }
774 : else
775 : delete pPostEventData;
776 : }
777 :
778 : return nEventId;
779 : }
780 :
781 : ImplSVEvent * Application::PostScrollEvent( sal_uLong nEvent, vcl::Window *pWin, ScrollEvent* pScrollEvent )
782 : {
783 : const SolarMutexGuard aGuard;
784 : ImplSVEvent * nEventId = 0;
785 :
786 : if( pWin && pScrollEvent )
787 : {
788 : ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, *pScrollEvent );
789 :
790 : nEventId = PostUserEvent(
791 : LINK( NULL, Application, PostEventHandler ),
792 : pPostEventData );
793 :
794 : if( nEventId )
795 : {
796 : pPostEventData->mnEventId = nEventId;
797 : aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
798 : }
799 : else
800 : delete pPostEventData;
801 : }
802 :
803 : return nEventId;
804 : }
805 :
806 : #endif // !HAVE_FEATURE_DESKTOP
807 :
808 0 : IMPL_STATIC_LINK( Application, PostEventHandler, void*, pCallData )
809 : {
810 0 : const SolarMutexGuard aGuard;
811 0 : ImplPostEventData* pData = static_cast< ImplPostEventData * >( pCallData );
812 : const void* pEventData;
813 : sal_uLong nEvent;
814 0 : ImplSVEvent * const nEventId = pData->mnEventId;
815 :
816 0 : switch( pData->mnEvent )
817 : {
818 : case VCLEVENT_WINDOW_MOUSEMOVE:
819 0 : nEvent = SALEVENT_EXTERNALMOUSEMOVE;
820 0 : pEventData = &pData->maMouseEvent;
821 0 : break;
822 :
823 : case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
824 0 : nEvent = SALEVENT_EXTERNALMOUSEBUTTONDOWN;
825 0 : pEventData = &pData->maMouseEvent;
826 0 : break;
827 :
828 : case VCLEVENT_WINDOW_MOUSEBUTTONUP:
829 0 : nEvent = SALEVENT_EXTERNALMOUSEBUTTONUP;
830 0 : pEventData = &pData->maMouseEvent;
831 0 : break;
832 :
833 : case VCLEVENT_WINDOW_KEYINPUT:
834 0 : nEvent = SALEVENT_EXTERNALKEYINPUT;
835 0 : pEventData = &pData->maKeyEvent;
836 0 : break;
837 :
838 : case VCLEVENT_WINDOW_KEYUP:
839 0 : nEvent = SALEVENT_EXTERNALKEYUP;
840 0 : pEventData = &pData->maKeyEvent;
841 0 : break;
842 :
843 : case VCLEVENT_WINDOW_ZOOM:
844 0 : nEvent = SALEVENT_EXTERNALZOOM;
845 0 : pEventData = &pData->maZoomEvent;
846 0 : break;
847 :
848 : case VCLEVENT_WINDOW_SCROLL:
849 0 : nEvent = SALEVENT_EXTERNALSCROLL;
850 0 : pEventData = &pData->maScrollEvent;
851 0 : break;
852 :
853 : default:
854 0 : nEvent = 0;
855 0 : pEventData = NULL;
856 0 : break;
857 : };
858 :
859 0 : if( pData->mpWin && pData->mpWin.get()->mpWindowImpl->mpFrameWindow.get() && pEventData )
860 0 : ImplWindowFrameProc( pData->mpWin.get()->mpWindowImpl->mpFrameWindow.get(), NULL, (sal_uInt16) nEvent, pEventData );
861 :
862 : // remove this event from list of posted events, watch for destruction of internal data
863 0 : ::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
864 :
865 0 : while( aIter != aPostedEventList.end() )
866 : {
867 0 : if( nEventId == (*aIter).second->mnEventId )
868 : {
869 0 : delete (*aIter).second;
870 0 : aIter = aPostedEventList.erase( aIter );
871 : }
872 : else
873 0 : ++aIter;
874 : }
875 :
876 0 : return 0;
877 : }
878 :
879 267413 : void Application::RemoveMouseAndKeyEvents( vcl::Window* pWin )
880 : {
881 267413 : const SolarMutexGuard aGuard;
882 :
883 : // remove all events for specific window, watch for destruction of internal data
884 267413 : ::std::list< ImplPostEventPair >::iterator aIter( aPostedEventList.begin() );
885 :
886 534826 : while( aIter != aPostedEventList.end() )
887 : {
888 0 : if( pWin == (*aIter).first )
889 : {
890 0 : if( (*aIter).second->mnEventId )
891 0 : RemoveUserEvent( (*aIter).second->mnEventId );
892 :
893 0 : delete (*aIter).second;
894 0 : aIter = aPostedEventList.erase( aIter );
895 : }
896 : else
897 0 : ++aIter;
898 267413 : }
899 267413 : }
900 :
901 99151 : ImplSVEvent * Application::PostUserEvent( const Link<>& rLink, void* pCaller,
902 : bool bReferenceLink )
903 : {
904 99151 : ImplSVEvent* pSVEvent = new ImplSVEvent;
905 99151 : pSVEvent->mpData = pCaller;
906 99151 : pSVEvent->mpLink = new Link<>( rLink );
907 99151 : pSVEvent->mpWindow = NULL;
908 99151 : pSVEvent->mbCall = true;
909 99151 : if (bReferenceLink)
910 : {
911 68676 : SolarMutexGuard aGuard;
912 : // Double check that this is indeed a vcl::Window instance.
913 : assert(dynamic_cast<vcl::Window *>(
914 : static_cast<vcl::Window *>(rLink.GetInstance())) ==
915 : static_cast<vcl::Window *>(rLink.GetInstance()));
916 68676 : pSVEvent->mpInstanceRef = static_cast<vcl::Window *>(rLink.GetInstance());
917 : }
918 :
919 99151 : vcl::Window* pDefWindow = ImplGetDefaultWindow();
920 99151 : if ( pDefWindow == 0 || !pDefWindow->ImplGetFrame()->PostEvent( pSVEvent ) )
921 : {
922 13 : delete pSVEvent->mpLink;
923 13 : delete pSVEvent;
924 13 : pSVEvent = 0;
925 : }
926 99151 : return pSVEvent;
927 : }
928 :
929 83167 : void Application::RemoveUserEvent( ImplSVEvent * nUserEvent )
930 : {
931 83167 : if(nUserEvent)
932 : {
933 : DBG_ASSERT( !nUserEvent->mpWindow,
934 : "Application::RemoveUserEvent(): Event is send to a window" );
935 : DBG_ASSERT( nUserEvent->mbCall,
936 : "Application::RemoveUserEvent(): Event is already removed" );
937 :
938 83167 : if ( nUserEvent->mpWindow )
939 : {
940 0 : if( ! nUserEvent->maDelData.IsDead() )
941 0 : nUserEvent->mpWindow->ImplRemoveDel( &(nUserEvent->maDelData) );
942 0 : nUserEvent->mpWindow.clear();
943 : }
944 83167 : nUserEvent->mpInstanceRef.clear();
945 83167 : nUserEvent->mbCall = false;
946 : }
947 83167 : }
948 :
949 87356 : bool Application::InsertIdleHdl( const Link<>& rLink, sal_uInt16 nPrio )
950 : {
951 87356 : ImplSVData* pSVData = ImplGetSVData();
952 :
953 : // create if does not exist
954 87356 : if ( !pSVData->maAppData.mpIdleMgr )
955 90 : pSVData->maAppData.mpIdleMgr = new ImplIdleMgr;
956 :
957 87356 : return pSVData->maAppData.mpIdleMgr->InsertIdleHdl( rLink, nPrio );
958 : }
959 :
960 87355 : void Application::RemoveIdleHdl( const Link<>& rLink )
961 : {
962 87355 : ImplSVData* pSVData = ImplGetSVData();
963 :
964 87355 : if ( pSVData->maAppData.mpIdleMgr )
965 87355 : pSVData->maAppData.mpIdleMgr->RemoveIdleHdl( rLink );
966 87355 : }
967 :
968 0 : void Application::EnableNoYieldMode()
969 : {
970 0 : ImplSVData* pSVData = ImplGetSVData();
971 0 : pSVData->maAppData.mbNoYield = true;
972 0 : }
973 :
974 0 : void Application::DisableNoYieldMode()
975 : {
976 0 : ImplSVData* pSVData = ImplGetSVData();
977 0 : pSVData->maAppData.mbNoYield = false;
978 0 : }
979 :
980 0 : void Application::AddPostYieldListener( const Link<>& i_rListener )
981 : {
982 0 : ImplSVData* pSVData = ImplGetSVData();
983 0 : if( ! pSVData->maAppData.mpPostYieldListeners )
984 0 : pSVData->maAppData.mpPostYieldListeners = new VclEventListeners2();
985 0 : pSVData->maAppData.mpPostYieldListeners->addListener( i_rListener );
986 0 : }
987 :
988 0 : void Application::RemovePostYieldListener( const Link<>& i_rListener )
989 : {
990 0 : ImplSVData* pSVData = ImplGetSVData();
991 0 : if( pSVData->maAppData.mpPostYieldListeners )
992 0 : pSVData->maAppData.mpPostYieldListeners->removeListener( i_rListener );
993 0 : }
994 :
995 0 : WorkWindow* Application::GetAppWindow()
996 : {
997 0 : return ImplGetSVData()->maWinData.mpAppWin;
998 : }
999 :
1000 77050 : vcl::Window* Application::GetFocusWindow()
1001 : {
1002 77050 : return ImplGetSVData()->maWinData.mpFocusWin;
1003 : }
1004 :
1005 302903 : OutputDevice* Application::GetDefaultDevice()
1006 : {
1007 302903 : return ImplGetDefaultWindow();
1008 : }
1009 :
1010 82 : vcl::Window* Application::GetFirstTopLevelWindow()
1011 : {
1012 82 : ImplSVData* pSVData = ImplGetSVData();
1013 82 : return pSVData->maWinData.mpFirstFrame;
1014 : }
1015 :
1016 0 : vcl::Window* Application::GetNextTopLevelWindow( vcl::Window* pWindow )
1017 : {
1018 0 : return pWindow->mpWindowImpl->mpFrameData->mpNextFrame;
1019 : }
1020 :
1021 0 : long Application::GetTopWindowCount()
1022 : {
1023 0 : long nRet = 0;
1024 0 : ImplSVData* pSVData = ImplGetSVData();
1025 0 : vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : NULL;
1026 0 : while( pWin )
1027 : {
1028 0 : if( pWin->ImplGetWindow()->IsTopWindow() )
1029 0 : nRet++;
1030 0 : pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
1031 : }
1032 0 : return nRet;
1033 : }
1034 :
1035 0 : vcl::Window* Application::GetTopWindow( long nIndex )
1036 : {
1037 0 : long nIdx = 0;
1038 0 : ImplSVData* pSVData = ImplGetSVData();
1039 0 : vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : NULL;
1040 0 : while( pWin )
1041 : {
1042 0 : if( pWin->ImplGetWindow()->IsTopWindow() )
1043 : {
1044 0 : if( nIdx == nIndex )
1045 0 : return pWin->ImplGetWindow();
1046 : else
1047 0 : nIdx++;
1048 : }
1049 0 : pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
1050 : }
1051 0 : return NULL;
1052 : }
1053 :
1054 86 : vcl::Window* Application::GetActiveTopWindow()
1055 : {
1056 86 : vcl::Window *pWin = ImplGetSVData()->maWinData.mpFocusWin;
1057 188 : while( pWin )
1058 : {
1059 20 : if( pWin->IsTopWindow() )
1060 4 : return pWin;
1061 16 : pWin = pWin->mpWindowImpl->mpParent;
1062 : }
1063 82 : return NULL;
1064 : }
1065 :
1066 116 : void Application::SetAppName( const OUString& rUniqueName )
1067 : {
1068 116 : ImplSVData* pSVData = ImplGetSVData();
1069 :
1070 : // create if does not exist
1071 116 : if ( !pSVData->maAppData.mpAppName )
1072 116 : pSVData->maAppData.mpAppName = new OUString( rUniqueName );
1073 : else
1074 0 : *(pSVData->maAppData.mpAppName) = rUniqueName;
1075 116 : }
1076 :
1077 120 : OUString Application::GetAppName()
1078 : {
1079 120 : ImplSVData* pSVData = ImplGetSVData();
1080 120 : if ( pSVData->maAppData.mpAppName )
1081 48 : return *(pSVData->maAppData.mpAppName);
1082 : else
1083 72 : return OUString();
1084 : }
1085 :
1086 116 : void Application::SetDisplayName( const OUString& rName )
1087 : {
1088 116 : ImplSVData* pSVData = ImplGetSVData();
1089 :
1090 : // create if does not exist
1091 116 : if ( !pSVData->maAppData.mpDisplayName )
1092 116 : pSVData->maAppData.mpDisplayName = new OUString( rName );
1093 : else
1094 0 : *(pSVData->maAppData.mpDisplayName) = rName;
1095 116 : }
1096 :
1097 0 : OUString Application::GetDisplayName()
1098 : {
1099 0 : ImplSVData* pSVData = ImplGetSVData();
1100 0 : if ( pSVData->maAppData.mpDisplayName )
1101 0 : return *(pSVData->maAppData.mpDisplayName);
1102 0 : else if ( pSVData->maWinData.mpAppWin )
1103 0 : return pSVData->maWinData.mpAppWin->GetText();
1104 : else
1105 0 : return OUString("");
1106 : }
1107 :
1108 6460 : unsigned int Application::GetScreenCount()
1109 : {
1110 6460 : SalSystem* pSys = ImplGetSalSystem();
1111 6460 : return pSys ? pSys->GetDisplayScreenCount() : 0;
1112 : }
1113 :
1114 6440 : bool Application::IsUnifiedDisplay()
1115 : {
1116 6440 : SalSystem* pSys = ImplGetSalSystem();
1117 6440 : return pSys == nullptr || pSys->IsUnifiedDisplay();
1118 : }
1119 :
1120 3 : unsigned int Application::GetDisplayBuiltInScreen()
1121 : {
1122 3 : SalSystem* pSys = ImplGetSalSystem();
1123 3 : return pSys ? pSys->GetDisplayBuiltInScreen() : 0;
1124 : }
1125 :
1126 0 : unsigned int Application::GetDisplayExternalScreen()
1127 : {
1128 : // This is really unpleasant, in theory we could have multiple
1129 : // external displays etc.
1130 0 : int nExternal(0);
1131 0 : switch (GetDisplayBuiltInScreen())
1132 : {
1133 : case 0:
1134 0 : nExternal = 1;
1135 0 : break;
1136 : case 1:
1137 0 : nExternal = 0;
1138 0 : break;
1139 : default:
1140 : // When the built-in display is neither 0 nor 1
1141 : // then place the full-screen presentation on the
1142 : // first available screen.
1143 0 : nExternal = 0;
1144 0 : break;
1145 : }
1146 0 : return nExternal;
1147 : }
1148 :
1149 6451 : Rectangle Application::GetScreenPosSizePixel( unsigned int nScreen )
1150 : {
1151 6451 : SalSystem* pSys = ImplGetSalSystem();
1152 6451 : return pSys ? pSys->GetDisplayScreenPosSizePixel( nScreen ) : Rectangle();
1153 : }
1154 :
1155 : namespace {
1156 0 : unsigned long calcDistSquare( const Point& i_rPoint, const Rectangle& i_rRect )
1157 : {
1158 0 : const Point aRectCenter( (i_rRect.Left() + i_rRect.Right())/2,
1159 0 : (i_rRect.Top() + i_rRect.Bottom())/ 2 );
1160 0 : const long nDX = aRectCenter.X() - i_rPoint.X();
1161 0 : const long nDY = aRectCenter.Y() - i_rPoint.Y();
1162 0 : return nDX*nDX + nDY*nDY;
1163 : }
1164 : }
1165 :
1166 0 : unsigned int Application::GetBestScreen( const Rectangle& i_rRect )
1167 : {
1168 0 : if( !IsUnifiedDisplay() )
1169 0 : return GetDisplayBuiltInScreen();
1170 :
1171 0 : const unsigned int nScreens = GetScreenCount();
1172 0 : unsigned int nBestMatchScreen = 0;
1173 0 : unsigned long nOverlap = 0;
1174 0 : for( unsigned int i = 0; i < nScreens; i++ )
1175 : {
1176 0 : const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
1177 : // if a screen contains the rectangle completely it is obviously the best screen
1178 0 : if( aCurScreenRect.IsInside( i_rRect ) )
1179 0 : return i;
1180 : // next the screen which contains most of the area of the rect is the best
1181 0 : Rectangle aIntersection( aCurScreenRect.GetIntersection( i_rRect ) );
1182 0 : if( ! aIntersection.IsEmpty() )
1183 : {
1184 0 : const unsigned long nCurOverlap( aIntersection.GetWidth() * aIntersection.GetHeight() );
1185 0 : if( nCurOverlap > nOverlap )
1186 : {
1187 0 : nOverlap = nCurOverlap;
1188 0 : nBestMatchScreen = i;
1189 : }
1190 : }
1191 : }
1192 0 : if( nOverlap > 0 )
1193 0 : return nBestMatchScreen;
1194 :
1195 : // finally the screen which center is nearest to the rect is the best
1196 0 : const Point aCenter( (i_rRect.Left() + i_rRect.Right())/2,
1197 0 : (i_rRect.Top() + i_rRect.Bottom())/2 );
1198 0 : unsigned long nDist = ULONG_MAX;
1199 0 : for( unsigned int i = 0; i < nScreens; i++ )
1200 : {
1201 0 : const Rectangle aCurScreenRect( GetScreenPosSizePixel( i ) );
1202 0 : const unsigned long nCurDist( calcDistSquare( aCenter, aCurScreenRect ) );
1203 0 : if( nCurDist < nDist )
1204 : {
1205 0 : nBestMatchScreen = i;
1206 0 : nDist = nCurDist;
1207 : }
1208 : }
1209 0 : return nBestMatchScreen;
1210 : }
1211 :
1212 0 : bool Application::InsertAccel( Accelerator* pAccel )
1213 : {
1214 0 : ImplSVData* pSVData = ImplGetSVData();
1215 :
1216 0 : if ( !pSVData->maAppData.mpAccelMgr )
1217 0 : pSVData->maAppData.mpAccelMgr = new ImplAccelManager();
1218 0 : return pSVData->maAppData.mpAccelMgr->InsertAccel( pAccel );
1219 : }
1220 :
1221 0 : void Application::RemoveAccel( Accelerator* pAccel )
1222 : {
1223 0 : ImplSVData* pSVData = ImplGetSVData();
1224 :
1225 0 : if ( pSVData->maAppData.mpAccelMgr )
1226 0 : pSVData->maAppData.mpAccelMgr->RemoveAccel( pAccel );
1227 0 : }
1228 :
1229 327 : void Application::SetHelp( Help* pHelp )
1230 : {
1231 327 : ImplGetSVData()->maAppData.mpHelp = pHelp;
1232 327 : }
1233 :
1234 2851 : Help* Application::GetHelp()
1235 : {
1236 2851 : return ImplGetSVData()->maAppData.mpHelp;
1237 : }
1238 :
1239 208 : void Application::EnableAutoHelpId( bool bEnabled )
1240 : {
1241 208 : ImplGetSVData()->maHelpData.mbAutoHelpId = bEnabled;
1242 208 : }
1243 :
1244 5794 : bool Application::IsAutoHelpIdEnabled()
1245 : {
1246 5794 : return ImplGetSVData()->maHelpData.mbAutoHelpId;
1247 : }
1248 :
1249 208 : void Application::EnableAutoMnemonic( bool bEnabled )
1250 : {
1251 208 : AllSettings aSettings = GetSettings();
1252 416 : StyleSettings aStyle = aSettings.GetStyleSettings();
1253 208 : aStyle.SetAutoMnemonic( bEnabled );
1254 208 : aSettings.SetStyleSettings( aStyle );
1255 416 : SetSettings( aSettings );
1256 208 : }
1257 :
1258 0 : bool Application::IsAutoMnemonicEnabled()
1259 : {
1260 0 : return GetSettings().GetStyleSettings().GetAutoMnemonic();
1261 : }
1262 :
1263 208 : void Application::SetDialogScaleX( short nScale )
1264 : {
1265 208 : ImplSVData* pSVData = ImplGetSVData();
1266 208 : pSVData->maAppData.mnDialogScaleX = nScale;
1267 208 : pSVData->maGDIData.mnAppFontX = pSVData->maGDIData.mnRealAppFontX;
1268 208 : if ( nScale )
1269 208 : pSVData->maGDIData.mnAppFontX += (pSVData->maGDIData.mnAppFontX*nScale)/100;
1270 208 : }
1271 :
1272 0 : void Application::SetDefDialogParent( vcl::Window* pWindow )
1273 : {
1274 0 : ImplGetSVData()->maWinData.mpDefDialogParent = pWindow;
1275 0 : }
1276 :
1277 264507 : vcl::Window* Application::GetDefDialogParent()
1278 : {
1279 264507 : ImplSVData* pSVData = ImplGetSVData();
1280 : // #103442# find some useful dialog parent if there
1281 : // was no default set
1282 : // NOTE: currently even the default is not used
1283 : if( false && pSVData->maWinData.mpDefDialogParent.get() != NULL )
1284 : return pSVData->maWinData.mpDefDialogParent;
1285 : else
1286 : {
1287 : // always use the topmost parent of the candidate
1288 : // window to avoid using dialogs or floaters
1289 : // as DefDialogParent
1290 :
1291 : // current focus frame
1292 264507 : vcl::Window *pWin = NULL;
1293 264507 : if( (pWin = pSVData->maWinData.mpFocusWin) != NULL )
1294 : {
1295 549723 : while( pWin->mpWindowImpl && pWin->mpWindowImpl->mpParent )
1296 292095 : pWin = pWin->mpWindowImpl->mpParent;
1297 :
1298 : // check for corrupted window hierarchy, #122232#, may be we now crash somewhere else
1299 128814 : if( !pWin->mpWindowImpl )
1300 : {
1301 : OSL_FAIL( "Window hierarchy corrupted!" );
1302 0 : pSVData->maWinData.mpFocusWin = NULL; // avoid further access
1303 0 : return NULL;
1304 : }
1305 :
1306 128814 : if( (pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0 )
1307 : {
1308 128814 : return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
1309 : }
1310 : }
1311 : // last active application frame
1312 135693 : if( NULL != (pWin = pSVData->maWinData.mpActiveApplicationFrame) )
1313 : {
1314 7 : return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
1315 : }
1316 : else
1317 : {
1318 : // first visible top window (may be totally wrong....)
1319 135686 : pWin = pSVData->maWinData.mpFirstFrame;
1320 834729 : while( pWin )
1321 : {
1322 1754783 : if( pWin->ImplGetWindow()->IsTopWindow() &&
1323 612681 : pWin->mpWindowImpl->mbReallyVisible &&
1324 24662 : (pWin->mpWindowImpl->mnStyle & WB_INTROWIN) == 0
1325 : )
1326 : {
1327 49324 : while( pWin->mpWindowImpl->mpParent )
1328 0 : pWin = pWin->mpWindowImpl->mpParent;
1329 24662 : return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
1330 : }
1331 563357 : pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
1332 : }
1333 : // use the desktop
1334 111024 : return NULL;
1335 : }
1336 : }
1337 : }
1338 :
1339 3274 : Application::DialogCancelMode Application::GetDialogCancelMode()
1340 : {
1341 3274 : return ImplGetSVData()->maAppData.meDialogCancel;
1342 : }
1343 :
1344 6791 : void Application::SetDialogCancelMode( DialogCancelMode mode )
1345 : {
1346 6791 : ImplGetSVData()->maAppData.meDialogCancel = mode;
1347 6791 : }
1348 :
1349 141223 : bool Application::IsDialogCancelEnabled()
1350 : {
1351 141223 : return ImplGetSVData()->maAppData.meDialogCancel != DIALOG_CANCEL_OFF;
1352 : }
1353 :
1354 13582 : void Application::SetSystemWindowMode( SystemWindowFlags nMode )
1355 : {
1356 13582 : ImplGetSVData()->maAppData.mnSysWinMode = nMode;
1357 13582 : }
1358 :
1359 6768 : SystemWindowFlags Application::GetSystemWindowMode()
1360 : {
1361 6768 : return ImplGetSVData()->maAppData.mnSysWinMode;
1362 : }
1363 :
1364 376 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > Application::GetVCLToolkit()
1365 : {
1366 376 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > xT;
1367 376 : UnoWrapperBase* pWrapper = Application::GetUnoWrapper( true );
1368 376 : if ( pWrapper )
1369 376 : xT = pWrapper->GetVCLToolkit();
1370 376 : return xT;
1371 : }
1372 :
1373 : #ifdef DISABLE_DYNLOADING
1374 :
1375 : extern "C" { UnoWrapperBase* CreateUnoWrapper(); }
1376 :
1377 : #else
1378 :
1379 0 : extern "C" { static void SAL_CALL thisModule() {} }
1380 :
1381 : #endif
1382 :
1383 375971 : UnoWrapperBase* Application::GetUnoWrapper( bool bCreateIfNotExist )
1384 : {
1385 375971 : ImplSVData* pSVData = ImplGetSVData();
1386 : static bool bAlreadyTriedToCreate = false;
1387 375971 : if ( !pSVData->mpUnoWrapper && bCreateIfNotExist && !bAlreadyTriedToCreate )
1388 : {
1389 : #ifndef DISABLE_DYNLOADING
1390 121 : osl::Module aTkLib;
1391 242 : OUString aLibName(TK_DLL_NAME);
1392 121 : aTkLib.loadRelative(&thisModule, aLibName, SAL_LOADMODULE_DEFAULT);
1393 121 : if (aTkLib.is())
1394 : {
1395 121 : FN_TkCreateUnoWrapper fnCreateWrapper = reinterpret_cast<FN_TkCreateUnoWrapper>(aTkLib.getFunctionSymbol("CreateUnoWrapper"));
1396 121 : if ( fnCreateWrapper )
1397 : {
1398 121 : pSVData->mpUnoWrapper = fnCreateWrapper();
1399 : }
1400 121 : aTkLib.release();
1401 : }
1402 : DBG_ASSERT( pSVData->mpUnoWrapper, "UnoWrapper could not be created!" );
1403 : #else
1404 : pSVData->mpUnoWrapper = CreateUnoWrapper();
1405 : #endif
1406 242 : bAlreadyTriedToCreate = true;
1407 : }
1408 375971 : return pSVData->mpUnoWrapper;
1409 : }
1410 :
1411 0 : void Application::SetUnoWrapper( UnoWrapperBase* pWrapper )
1412 : {
1413 0 : ImplSVData* pSVData = ImplGetSVData();
1414 : DBG_ASSERT( !pSVData->mpUnoWrapper, "SetUnoWrapper: Wrapper already exists" );
1415 0 : pSVData->mpUnoWrapper = pWrapper;
1416 0 : }
1417 :
1418 17601 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection > Application::GetDisplayConnection()
1419 : {
1420 17601 : ImplSVData* pSVData = ImplGetSVData();
1421 :
1422 17601 : if( !pSVData->mxDisplayConnection.is() )
1423 : {
1424 111 : pSVData->mxDisplayConnection.set( new vcl::DisplayConnection );
1425 111 : pSVData->mxDisplayConnection->start();
1426 : }
1427 :
1428 17601 : return pSVData->mxDisplayConnection.get();
1429 : }
1430 :
1431 2789 : void Application::SetFilterHdl( const Link<>& rLink )
1432 : {
1433 2789 : ImplGetSVData()->maGDIData.mpGrfConverter->SetFilterHdl( rLink );
1434 2789 : }
1435 :
1436 0 : bool ImplCallHotKey( const vcl::KeyCode& rKeyCode )
1437 : {
1438 0 : ImplSVData* pSVData = ImplGetSVData();
1439 0 : ImplHotKey* pHotKeyData = pSVData->maAppData.mpFirstHotKey;
1440 0 : while ( pHotKeyData )
1441 : {
1442 0 : if ( pHotKeyData->maKeyCode == rKeyCode )
1443 : {
1444 0 : pHotKeyData->maLink.Call( pHotKeyData->mpUserData );
1445 0 : return true;
1446 : }
1447 :
1448 0 : pHotKeyData = pHotKeyData->mpNext;
1449 : }
1450 :
1451 0 : return false;
1452 : }
1453 :
1454 0 : void ImplFreeHotKeyData()
1455 : {
1456 0 : ImplSVData* pSVData = ImplGetSVData();
1457 : ImplHotKey* pTempHotKeyData;
1458 0 : ImplHotKey* pHotKeyData = pSVData->maAppData.mpFirstHotKey;
1459 0 : while ( pHotKeyData )
1460 : {
1461 0 : pTempHotKeyData = pHotKeyData->mpNext;
1462 0 : delete pHotKeyData;
1463 0 : pHotKeyData = pTempHotKeyData;
1464 : }
1465 :
1466 0 : pSVData->maAppData.mpFirstHotKey = NULL;
1467 0 : }
1468 :
1469 0 : void ImplFreeEventHookData()
1470 : {
1471 0 : ImplSVData* pSVData = ImplGetSVData();
1472 : ImplEventHook* pTempEventHookData;
1473 0 : ImplEventHook* pEventHookData = pSVData->maAppData.mpFirstEventHook;
1474 0 : while ( pEventHookData )
1475 : {
1476 0 : pTempEventHookData = pEventHookData->mpNext;
1477 0 : delete pEventHookData;
1478 0 : pEventHookData = pTempEventHookData;
1479 : }
1480 :
1481 0 : pSVData->maAppData.mpFirstEventHook = NULL;
1482 0 : }
1483 :
1484 32698 : long Application::CallEventHooks( NotifyEvent& rEvt )
1485 : {
1486 32698 : ImplSVData* pSVData = ImplGetSVData();
1487 32698 : long nRet = 0;
1488 : ImplEventHook* pTempEventHookData;
1489 32698 : ImplEventHook* pEventHookData = pSVData->maAppData.mpFirstEventHook;
1490 65396 : while ( pEventHookData )
1491 : {
1492 0 : pTempEventHookData = pEventHookData->mpNext;
1493 0 : nRet = pEventHookData->mpProc( rEvt, pEventHookData->mpUserData );
1494 0 : if ( nRet )
1495 0 : break;
1496 0 : pEventHookData = pTempEventHookData;
1497 : }
1498 :
1499 32698 : return nRet;
1500 : }
1501 :
1502 0 : const LocaleDataWrapper& Application::GetAppLocaleDataWrapper()
1503 : {
1504 0 : return GetSettings().GetLocaleDataWrapper();
1505 : }
1506 :
1507 243 : void Application::EnableHeadlessMode( bool dialogsAreFatal )
1508 : {
1509 : SetDialogCancelMode(
1510 243 : dialogsAreFatal ? DIALOG_CANCEL_FATAL : DIALOG_CANCEL_SILENT );
1511 243 : }
1512 :
1513 141223 : bool Application::IsHeadlessModeEnabled()
1514 : {
1515 141223 : return IsDialogCancelEnabled();
1516 : }
1517 :
1518 : static bool bConsoleOnly = false;
1519 :
1520 832 : bool Application::IsConsoleOnly()
1521 : {
1522 832 : return bConsoleOnly;
1523 : }
1524 :
1525 11 : void Application::EnableConsoleOnly()
1526 : {
1527 11 : EnableHeadlessMode(true);
1528 11 : bConsoleOnly = true;
1529 11 : }
1530 :
1531 0 : void Application::ShowNativeErrorBox(const OUString& sTitle ,
1532 : const OUString& sMessage)
1533 : {
1534 0 : int btn = ImplGetSalSystem()->ShowNativeMessageBox (
1535 : sTitle,
1536 : sMessage,
1537 : SALSYSTEM_SHOWNATIVEMSGBOX_BTNCOMBI_OK,
1538 0 : SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK, false);
1539 : if (btn != SALSYSTEM_SHOWNATIVEMSGBOX_BTN_OK) {
1540 : OSL_TRACE("ShowNativeMessageBox returned %d", btn);
1541 : }
1542 0 : }
1543 :
1544 213 : bool Application::CanToggleImeStatusWindow()
1545 : {
1546 213 : ImplSVData* pSVData = ImplGetSVData();
1547 213 : if( ! pSVData->mpImeStatus )
1548 208 : pSVData->mpImeStatus = pSVData->mpDefInst->CreateI18NImeStatus();
1549 213 : return pSVData->mpImeStatus->canToggle();
1550 : }
1551 :
1552 0 : void Application::ShowImeStatusWindow(bool bShow)
1553 : {
1554 0 : ImplGetSVData()->maAppData.meShowImeStatusWindow = bShow
1555 : ? ImplSVAppData::ImeStatusWindowMode_SHOW
1556 0 : : ImplSVAppData::ImeStatusWindowMode_HIDE;
1557 :
1558 0 : ImplSVData* pSVData = ImplGetSVData();
1559 0 : if( ! pSVData->mpImeStatus )
1560 0 : pSVData->mpImeStatus = pSVData->mpDefInst->CreateI18NImeStatus();
1561 0 : pSVData->mpImeStatus->toggle();
1562 0 : }
1563 :
1564 0 : bool Application::GetShowImeStatusWindowDefault()
1565 : {
1566 : rtl_TextEncodingInfo aInfo;
1567 0 : aInfo.StructSize = sizeof aInfo;
1568 0 : return rtl_getTextEncodingInfo(osl_getThreadTextEncoding(), &aInfo)
1569 0 : && aInfo.MaximumCharSize > 1;
1570 : }
1571 :
1572 602 : const OUString& Application::GetDesktopEnvironment()
1573 : {
1574 602 : if (IsHeadlessModeEnabled())
1575 : {
1576 578 : static OUString aNone("none");
1577 578 : return aNone;
1578 : }
1579 : else
1580 24 : return SalGetDesktopEnvironment();
1581 : }
1582 :
1583 6291 : void Application::AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService)
1584 : {
1585 6291 : ImplSVData* pSVData = ImplGetSVData();
1586 6291 : pSVData->mpDefInst->AddToRecentDocumentList(rFileUrl, rMimeType, rDocumentService);
1587 6291 : }
1588 :
1589 0 : bool InitAccessBridge()
1590 : {
1591 : // Disable MSAA bridge on UNIX
1592 : #if defined UNX
1593 0 : return true;
1594 : #else
1595 : bool bRet = ImplInitAccessBridge();
1596 :
1597 : if( !bRet )
1598 : {
1599 : // disable accessibility if the user chooses to continue
1600 : AllSettings aSettings = Application::GetSettings();
1601 : MiscSettings aMisc = aSettings.GetMiscSettings();
1602 : aMisc.SetEnableATToolSupport( false );
1603 : aSettings.SetMiscSettings( aMisc );
1604 : Application::SetSettings( aSettings );
1605 : }
1606 : return bRet;
1607 : #endif // !UNX
1608 : }
1609 :
1610 : // MT: AppEvent was in oldsv.cxx, but is still needed...
1611 0 : void Application::AppEvent( const ApplicationEvent& /*rAppEvent*/ )
1612 : {
1613 0 : }
1614 :
1615 0 : bool Application::hasNativeFileSelection()
1616 : {
1617 0 : ImplSVData* pSVData = ImplGetSVData();
1618 0 : return pSVData->mpDefInst->hasNativeFileSelection();
1619 : }
1620 :
1621 : Reference< ui::dialogs::XFilePicker2 >
1622 0 : Application::createFilePicker( const Reference< uno::XComponentContext >& xSM )
1623 : {
1624 0 : ImplSVData* pSVData = ImplGetSVData();
1625 0 : return pSVData->mpDefInst->createFilePicker( xSM );
1626 : }
1627 :
1628 : Reference< ui::dialogs::XFolderPicker2 >
1629 1 : Application::createFolderPicker( const Reference< uno::XComponentContext >& xSM )
1630 : {
1631 1 : ImplSVData* pSVData = ImplGetSVData();
1632 1 : return pSVData->mpDefInst->createFolderPicker( xSM );
1633 : }
1634 :
1635 115 : void Application::setDeInitHook(Link<> const & hook) {
1636 115 : ImplSVData * pSVData = ImplGetSVData();
1637 : assert(!pSVData->maDeInitHook.IsSet());
1638 115 : pSVData->maDeInitHook = hook;
1639 : // Fake this for VCLXToolkit ctor instantiated from
1640 : // postprocess/CppunitTest_services.mk:
1641 115 : pSVData->maAppData.mbInAppMain = true;
1642 115 : }
1643 :
1644 11024153 : ImplDelData::ImplDelData( vcl::Window* pWindow ) :
1645 : mpNext( NULL ),
1646 : mpWindow( NULL ),
1647 11024153 : mbDel( false )
1648 : {
1649 11024153 : if( pWindow ) AttachToWindow( pWindow );
1650 11024153 : }
1651 :
1652 : // helper method to allow inline constructor even for pWindow!=NULL case
1653 7867819 : void ImplDelData::AttachToWindow( const vcl::Window* pWindow )
1654 : {
1655 7867819 : if( pWindow )
1656 : {
1657 7867819 : if( pWindow->IsDisposed() )
1658 0 : mbDel = true;
1659 : else
1660 7867819 : const_cast<vcl::Window*>(pWindow)->ImplAddDel( this );
1661 : }
1662 7867819 : }
1663 :
1664 : // define dtor for ImplDelData
1665 22038218 : ImplDelData::~ImplDelData()
1666 : {
1667 : // #112873# auto remove of ImplDelData
1668 : // due to this code actively calling ImplRemoveDel() is not mandatory anymore
1669 11019109 : if( !mbDel && mpWindow )
1670 : {
1671 : // the window still exists but we were not removed
1672 7867819 : mpWindow.get()->ImplRemoveDel( this );
1673 7867819 : mpWindow = NULL;
1674 : }
1675 11019910 : }
1676 :
1677 :
1678 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|