LibreOffice Module vcl (master)  1
svapp.hxx
Go to the documentation of this file.
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 #ifndef INCLUDED_VCL_SVAPP_HXX
21 #define INCLUDED_VCL_SVAPP_HXX
22 
23 #include <sal/config.h>
24 #include <sal/types.h>
25 
26 #include <cassert>
27 #include <vector>
28 
30 #include <LibreOfficeKit/LibreOfficeKitTypes.h>
31 #include <osl/mutex.hxx>
32 #include <rtl/ustring.hxx>
33 #include <osl/thread.h>
34 #include <tools/gen.hxx>
35 #include <tools/link.hxx>
36 #include <vcl/dllapi.h>
38 #include <vcl/inputtypes.hxx>
39 #include <vcl/exceptiontypes.hxx>
40 #include <vcl/vclevent.hxx>
41 #include <vcl/vclenum.hxx>
42 #include <i18nlangtag/lang.h>
43 #include <o3tl/typed_flags_set.hxx>
44 #include <com/sun/star/uno/Reference.h>
45 
46 
47 class BitmapEx;
48 namespace weld
49 {
50  class Builder;
51  class MessageDialog;
52  class Widget;
53  class Window;
54 }
55 class LocaleDataWrapper;
56 class AllSettings;
57 class DataChangedEvent;
58 class Accelerator;
59 class Help;
60 class OutputDevice;
61 namespace vcl { class Window; }
62 namespace vcl { class KeyCode; }
63 class NotifyEvent;
64 class KeyEvent;
65 class MouseEvent;
66 class GestureEvent;
67 struct ImplSVEvent;
68 struct ConvertData;
69 
70 namespace com::sun::star::uno {
71  class XComponentContext;
72 }
74  class XFilePicker2;
75  class XFolderPicker2;
76 }
77 namespace com::sun::star::awt {
78  class XToolkit;
79  class XDisplayConnection;
80  class XWindow;
81 }
82 
83 // helper needed by SalLayout implementations as well as svx/source/dialog/svxbmpnumbalueset.cxx
86 
87 enum class SystemWindowFlags {
88  NOAUTOMODE = 0x0001,
89  DIALOG = 0x0002
90 };
91 namespace o3tl
92 {
93  template<> struct typed_flags<SystemWindowFlags> : is_typed_flags<SystemWindowFlags, 0x03> {};
94 }
95 
96 typedef long (*VCLEventHookProc)( NotifyEvent& rEvt, void* pData );
97 
116 {
117 public:
118  enum class Type {
119  Accept,
120  Appear,
121  Open,
122  OpenHelpUrl,
123  Print,
124  PrivateDoShutdown,
125  QuickStart,
126  ShowDialog,
127  Unaccept
128  };
129 
137  explicit ApplicationEvent(Type type): aEvent(type)
138  {
139  assert(type == Type::Appear || type == Type::PrivateDoShutdown || type == Type::QuickStart);
140  }
141 
149  ApplicationEvent(Type type, OUString const & data): aEvent(type)
150  {
151  assert(
152  type == Type::Accept || type == Type::OpenHelpUrl
153  || type == Type::ShowDialog || type == Type::Unaccept);
154  aData.push_back(data);
155  }
156 
164  ApplicationEvent(Type type, std::vector<OUString> const & data):
165  aEvent(type), aData(data)
166  {
167  assert(type == Type::Open || type == Type::Print);
168  }
169 
174  Type GetEvent() const
175  {
176  return aEvent;
177  }
178 
186  OUString const & GetStringData() const
187  {
188  assert(
189  aEvent == Type::Accept
190  || aEvent == Type::OpenHelpUrl || aEvent == Type::ShowDialog
191  || aEvent == Type::Unaccept);
192  assert(aData.size() == 1);
193  return aData[0];
194  }
195 
201  std::vector<OUString> const & GetStringsData() const
202  {
203  assert(aEvent == Type::Open || aEvent == Type::Print);
204  return aData;
205  }
206 
207 private:
209  std::vector<OUString> aData;
210 };
211 
212 enum class DialogCancelMode {
213  Off,
214  Silent,
215  Fatal
216 };
217 
232 class VCL_DLLPUBLIC Application : public vcl::ILibreOfficeKitNotifier
233 {
234 public:
239 
249  Application();
250 
256  virtual ~Application();
257 
265  virtual void Init();
266 
271  virtual void InitFinished();
272 
280  virtual void DeInit();
281 
283 
344  virtual int Main();
345 
350  virtual bool QueryExit();
351 
352  virtual void Shutdown();
353 
358 
366  static void NotifyAllWindows( DataChangedEvent& rDCEvt );
367 
369 
377 
385  static sal_uInt16 GetCommandLineParamCount();
386 
395  static OUString GetCommandLineParam( sal_uInt16 nParam );
396 
403  static OUString GetAppFileName();
404 
406 
421  virtual void Exception( ExceptionCategory nCategory );
422 
433  static void Abort( const OUString& rErrorText );
434 
436 
442 
449  static void Execute();
450 
456  static void Quit();
457 
473  static bool Reschedule( bool bHandleAllCurrentEvents = false );
474 
483  static void Yield();
484 
490  static void EndYield();
491 
502  static comphelper::SolarMutex& GetSolarMutex();
503 
511  static bool IsMainThread();
512 
523  static sal_uInt32 ReleaseSolarMutex();
524 
533  static void AcquireSolarMutex( sal_uInt32 nCount );
534 
542  static bool IsInMain();
543 
550  static bool IsInExecute();
551 
558  static bool IsInModalMode();
559 
564  static sal_uInt16 GetDispatchLevel();
565 
575  static bool AnyInput( VclInputFlags nType = VCL_INPUT_ANY );
576 
583  static sal_uInt64 GetLastInputInterval();
584 
586 
587  /* Determines if the UI is captured.
588 
589  The UI is considered captured if a system dialog is open (e.g. printer setup),
590  a floating window, menu or toolbox dropdown is open, or a window has been
591  captured by the mouse.
592 
593  @returns true if UI is captured, false if not
594  */
595  static bool IsUICaptured();
596 
603 
619  virtual void OverrideSystemSettings( AllSettings& rSettings );
620 
628  static void MergeSystemSettings( AllSettings& rSettings );
629 
638  static void SetSettings( const AllSettings& rSettings );
639 
648  static const AllSettings& GetSettings();
649 
654  static const LocaleDataWrapper& GetAppLocaleDataWrapper();
655 
657 
663 
665 
674  static void AddEventListener( const Link<VclSimpleEvent&,void>& rEventListener );
675 
682  static void RemoveEventListener( const Link<VclSimpleEvent&,void>& rEventListener );
683 
692  static void AddKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener );
693 
700  static void RemoveKeyListener( const Link<VclWindowEvent&,bool>& rKeyListener );
701 
709  static void ImplCallEventListenersApplicationDataChanged( void* pData );
710 
717  static void ImplCallEventListeners( VclSimpleEvent& rEvent );
718 
727  static bool HandleKey( VclEventId nEvent, vcl::Window *pWin, KeyEvent* pKeyEvent );
728 
737  static ImplSVEvent * PostKeyEvent( VclEventId nEvent, vcl::Window *pWin, KeyEvent const * pKeyEvent );
738 
745  static ImplSVEvent * PostMouseEvent( VclEventId nEvent, vcl::Window *pWin, MouseEvent const * pMouseEvent );
746 
747  static ImplSVEvent* PostGestureEvent(VclEventId nEvent, vcl::Window* pWin, GestureEvent const * pGestureEvent);
748 
756  static void RemoveMouseAndKeyEvents( vcl::Window *pWin );
757 
772  static ImplSVEvent * PostUserEvent( const Link<void*,void>& rLink, void* pCaller = nullptr,
773  bool bReferenceLink = false );
774 
779  static void RemoveUserEvent( ImplSVEvent * nUserEvent );
780 
781  /*** Get the DisplayConnection.
782 
783  It is a reference to XDisplayConnection, which allows toolkits to send display
784  events to the application.
785 
786  @returns UNO reference to an object that implements the css:awt:XDisplayConnection
787  interface.
788  */
789  static css::uno::Reference< css::awt::XDisplayConnection > GetDisplayConnection();
790 
797  virtual void AppEvent( const ApplicationEvent& rAppEvent );
798 
800 
805 
813  static vcl::Window* GetFocusWindow();
814 
822  static OutputDevice* GetDefaultDevice();
823 
831  static vcl::Window* GetFirstTopLevelWindow();
832 
840  static vcl::Window* GetNextTopLevelWindow( vcl::Window const * pWindow );
841 
850  static tools::Long GetTopWindowCount();
851 
864  static vcl::Window* GetTopWindow( tools::Long nIndex );
865 
876  static vcl::Window* GetActiveTopWindow();
877 
879 
886  static void SetAppName( const OUString& rUniqueName );
887 
888 
891 
897  static OUString GetAppName();
898 
904  static OUString GetHWOSConfInfo(const int bSelection = 0, bool bLocalize = true);
905 
913  static bool LoadBrandBitmap (const char* pName, BitmapEx &rBitmap);
914 
916 
919 
927  static void SetDisplayName( const OUString& rDisplayName );
928 
933  static OUString GetDisplayName();
934 
939  static OUString GetToolkitName();
940 
947  static unsigned int GetScreenCount();
948 
957  static tools::Rectangle GetScreenPosSizePixel( unsigned int nScreen );
958 
969  static bool IsUnifiedDisplay();
970 
981  SAL_DLLPRIVATE static unsigned int GetBestScreen( const tools::Rectangle& );
982 
993  static unsigned int GetDisplayBuiltInScreen();
994 
1002  static unsigned int GetDisplayExternalScreen();
1003 
1005 
1014 
1024  static bool InsertAccel( Accelerator* pAccel );
1025 
1032  static void RemoveAccel( Accelerator const * pAccel );
1033 
1040  static size_t GetReservedKeyCodeCount();
1041 
1050  static const vcl::KeyCode* GetReservedKeyCode( size_t i );
1051 
1053 
1059 
1067  static void SetHelp( Help* pHelp = nullptr );
1068 
1076  static Help* GetHelp();
1077 
1079 
1086 
1099  static vcl::Window* GetDefDialogParent();
1100 
1101 
1108  static DialogCancelMode GetDialogCancelMode();
1109 
1120  static void SetDialogCancelMode( DialogCancelMode mode );
1121 
1128  static bool IsDialogCancelEnabled();
1129 
1130 
1138  static void SetSystemWindowMode( SystemWindowFlags nMode );
1139 
1146  static SystemWindowFlags GetSystemWindowMode();
1147 
1149 
1157 
1165  static css::uno::Reference< css::awt::XToolkit > GetVCLToolkit();
1166 
1168 
1169 
1170  /*** @name Graphic Filters
1171  */
1173 
1180  static void SetFilterHdl( const Link<ConvertData&,bool>& rLink );
1181 
1183 
1191  static void EnableHeadlessMode( bool dialogsAreFatal );
1192 
1197  static bool IsHeadlessModeEnabled();
1198 
1203  static void EnableConsoleOnly();
1204 
1207  static void EnableBitmapRendering();
1208 
1213  static bool IsBitmapRendering();
1214 
1216 
1223  static void EnableEventTestingMode();
1224 
1229  static bool IsEventTestingModeEnabled();
1230 
1232  static void EnableSafeMode();
1233 
1235  static bool IsSafeModeEnabled();
1236 
1238 
1243  static const OUString& GetDesktopEnvironment();
1244 
1245  /*** @name Platform Functionality
1246  */
1248 
1262  static void AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService);
1263 
1264  /*** Show a native error messagebox
1265 
1266  @param sTitle Title of error messagebox
1267 
1268  @param sMessage Message displayed in messagebox
1269  */
1270  static void ShowNativeErrorBox(const OUString& sTitle ,
1271  const OUString& sMessage);
1272 
1274  static void UpdateMainThread();
1275 
1280  static bool hasNativeFileSelection();
1281 
1289  static css::uno::Reference< css::ui::dialogs::XFilePicker2 >
1290  createFilePicker( const css::uno::Reference< css::uno::XComponentContext >& rServiceManager );
1291 
1299  static css::uno::Reference< css::ui::dialogs::XFolderPicker2 >
1300  createFolderPicker( const css::uno::Reference< css::uno::XComponentContext >& rServiceManager );
1301 
1304  static void EndAllDialogs();
1305 
1308  static void EndAllPopups();
1309 
1311 
1312  // For vclbootstrapprotector:
1313  static void setDeInitHook(Link<LinkParamNone*,void> const & hook);
1314 
1315  static weld::Builder* CreateBuilder(weld::Widget* pParent, const OUString &rUIFile, bool bMobile = false);
1316  // For the duration of vcl parent windows
1317  static weld::Builder* CreateInterimBuilder(vcl::Window* pParent, const OUString &rUIFile, bool bAllowCycleFocusOut, sal_uInt64 nLOKWindowId = 0);
1318 
1319  static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType,
1320  VclButtonsType eButtonType, const OUString& rPrimaryMessage,
1321  bool bMobile = false);
1322 
1323  static weld::Window* GetFrameWeld(const css::uno::Reference<css::awt::XWindow>& rWindow);
1324 
1325  // ILibreOfficeKitNotifier
1327  LibreOfficeKitCallback m_pCallback;
1328 
1329  virtual void notifyWindow(vcl::LOKWindowId nLOKWindowId,
1330  const OUString& rAction,
1331  const std::vector<vcl::LOKPayloadItem>& rPayload = std::vector<vcl::LOKPayloadItem>()) const override;
1332  virtual void libreOfficeKitViewCallback(int nType, const char* pPayload) const override;
1333 
1334 private:
1335  DECL_STATIC_LINK( Application, PostEventHandler, void*, void );
1336 };
1337 
1339  : public osl::Guard<comphelper::SolarMutex>
1340 {
1341 public:
1343  : osl::Guard<comphelper::SolarMutex>( Application::GetSolarMutex() ) {}
1344 };
1345 
1347  : public osl::ClearableGuard<comphelper::SolarMutex>
1348 {
1349 public:
1351  : osl::ClearableGuard<comphelper::SolarMutex>( Application::GetSolarMutex() ) {}
1352 };
1353 
1355  : public osl::ResettableGuard<comphelper::SolarMutex>
1356 {
1357 public:
1359  : osl::ResettableGuard<comphelper::SolarMutex>( Application::GetSolarMutex() ) {}
1360 };
1361 
1362 namespace vcl
1363 {
1364 
1368 {
1369 private:
1371 #ifdef DBG_UTIL
1373 #endif
1375 
1378 
1379 public:
1380 
1382  : m_isAcquired(false)
1383 #ifdef DBG_UTIL
1384  , m_isChecked(false)
1385 #endif
1386  , m_rSolarMutex(Application::GetSolarMutex())
1387 
1388  {
1389  m_isAcquired = m_rSolarMutex.tryToAcquire();
1390  }
1391 
1393  {
1394 #ifdef DBG_UTIL
1395  assert(m_isChecked);
1396 #endif
1397  if (m_isAcquired)
1398  m_rSolarMutex.release();
1399  }
1400 
1401  bool isAcquired()
1402  {
1403 #ifdef DBG_UTIL
1404  m_isChecked = true;
1405 #endif
1406  return m_isAcquired;
1407  }
1408 };
1409 
1410 } // namespace vcl
1411 
1417 {
1418  const sal_uInt32 mnReleased;
1419 public:
1420  SolarMutexReleaser(): mnReleased(Application::ReleaseSolarMutex()) {}
1422 };
1423 
1425 
1426 // returns true if vcl is already initialized
1427 VCL_DLLPUBLIC bool IsVCLInit();
1428 // returns true if vcl successfully initializes or was already initialized
1429 VCL_DLLPUBLIC bool InitVCL();
1430 VCL_DLLPUBLIC void DeInitVCL();
1431 
1433 
1434 // only allowed to call, if no thread is running. You must call JoinMainLoopThread to free all memory.
1435 VCL_DLLPUBLIC void CreateMainLoopThread( oslWorkerFunction pWorker, void * pThreadData );
1437 
1439 struct ImplSVHelpData;
1443 
1445 struct ImplSVWinData;
1449 
1451 {
1453 }
1454 
1455 #endif // _APP_HXX
1456 
1457 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::vector< OUString > const & GetStringsData() const
Gets the event's array of strings.
Definition: svapp.hxx:201
Type GetEvent() const
Get the type of event.
Definition: svapp.hxx:174
def Print(s)
OUString sMessage
sal_Int32 nIndex
ApplicationEvent(Type type, OUString const &data)
Constructor for ApplicationEvent, accepts a string for the data associated with the event...
Definition: svapp.hxx:149
VCL_DLLPUBLIC bool IsVCLInit()
Definition: svmain.cxx:271
static void AcquireSolarMutex(sal_uInt32 nCount)
Acquire Solar Mutex(es) for this thread.
Definition: svapp.cxx:559
void Init()
sal_uInt32 sal_UCS4
Definition: vclenum.hxx:196
VclButtonsType
Definition: vclenum.hxx:246
std::unique_ptr< ContentProperties > pData
Definition: help.hxx:60
#define VCL_DLLPUBLIC
Definition: dllapi.h:29
VCL_DLLPUBLIC bool InitAccessBridge()
Definition: svapp.cxx:1614
long Long
VCL_DLLPUBLIC void SetSVHelpData(ImplSVHelpData *)
Definition: svdata.cxx:440
std::vector< OUString > aData
Definition: svapp.hxx:209
VCL_DLLPUBLIC void JoinMainLoopThread()
Definition: svmain.cxx:668
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
Post a user event to the default window.
Definition: svapp.cxx:1016
An application can be notified of a number of different events:
Definition: svapp.hxx:115
VCL_DLLPUBLIC void DestroySVHelpData(ImplSVHelpData *)
Definition: svdata.cxx:422
VclInputFlags
Definition: inputtypes.hxx:25
ApplicationEvent(Type type)
Explicit constructor for ApplicationEvent.
Definition: svapp.hxx:137
void * m_pCallbackData
Definition: svapp.hxx:1326
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
A helper class that calls Application::ReleaseSolarMutex() in its constructor and restores the mutex ...
Definition: svapp.hxx:1416
int nCount
VclEventId
Definition: vclevent.hxx:37
VclMessageType
Definition: vclenum.hxx:256
VCL_DLLPUBLIC void DestroySVWinData(ImplSVWinData *)
Definition: svdata.cxx:368
ExceptionCategory
sal_uInt32 release(bool bUnlockAll=false)
constexpr OUStringLiteral aData
ApplicationEvent(Type type, std::vector< OUString > const &data)
Constructor for ApplicationEvent, accepts an array of strings for the data associated with the event...
Definition: svapp.hxx:164
VCL_DLLPUBLIC bool InitVCL()
Definition: svmain.cxx:290
const sal_uInt32 mnReleased
Definition: svapp.hxx:1418
sal_uInt16 char * pName
SolarMutexTryAndBuyGuard & operator=(const SolarMutexTryAndBuyGuard &)=delete
VCL_DLLPUBLIC Application * GetpApp()
Definition: svapp.cxx:149
silently cancel any dialogs
int i
void EndAllDialogs(vcl::Window const *pParent)
Definition: dialog.cxx:1182
VCL_DLLPUBLIC ImplSVHelpData * CreateSVHelpData()
Definition: svdata.cxx:403
SystemWindowFlags
Definition: svapp.hxx:87
sal_uInt16 & nParam
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:303
VCL_DLLPUBLIC void SetSVWinData(ImplSVWinData *)
Definition: svdata.cxx:373
VCL_DLLPUBLIC sal_UCS4 GetMirroredChar(sal_UCS4)
Definition: sallayout.cxx:131
Base class used mainly for the LibreOffice Desktop class.
Definition: svapp.hxx:232
VCL_DLLPUBLIC ImplSVWinData * CreateSVWinData()
Definition: svdata.cxx:354
sal_uInt32 LOKWindowId
ConversionMode mode
#define VCL_INPUT_ANY
Definition: inputtypes.hxx:39
VCL_DLLPUBLIC void CreateMainLoopThread(oslWorkerFunction pWorker, void *pThreadData)
Definition: svmain.cxx:650
LibreOfficeKitCallback m_pCallback
Definition: svapp.hxx:1327
VCL_DLLPUBLIC sal_UCS4 GetLocalizedChar(sal_UCS4, LanguageType)
Definition: sallayout.cxx:137
long(* VCLEventHookProc)(NotifyEvent &rEvt, void *pData)
Definition: svapp.hxx:96
cancel any dialogs by std::abort
QPRO_FUNC_TYPE nType
virtual bool tryToAcquire()
VCL_DLLPUBLIC void DeInitVCL()
Definition: svmain.cxx:412
guard class that uses tryToAcquire() and has isAcquired() to check
Definition: svapp.hxx:1367
OUString const & GetStringData() const
Gets the application event's data string.
Definition: svapp.hxx:186
DialogCancelMode
Definition: svapp.hxx:212
comphelper::SolarMutex & m_rSolarMutex
Definition: svapp.hxx:1374
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
AnyEventRef aEvent
static void EndYield()
Definition: svapp.hxx:1450