LibreOffice Module vcl (master)  1
win/saldata.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_INC_WIN_SALDATA_HXX
21 #define INCLUDED_VCL_INC_WIN_SALDATA_HXX
22 
23 #include <memory>
24 #include <osl/module.h>
25 
26 #include <svdata.hxx>
27 #include <salwtype.hxx>
28 
29 #include <win/wincomp.hxx>
30 
31 #include <set>
32 #include <map>
33 
34 class AutoTimer;
35 class WinSalInstance;
36 class WinSalObject;
37 class WinSalFrame;
39 class WinSalPrinter;
40 namespace vcl { class Font; }
42 struct HDCCache;
43 struct TempFontItem;
44 class TextOutRenderer;
45 class TheTextureCache;
46 
47 #define MAX_STOCKPEN 4
48 #define MAX_STOCKBRUSH 4
49 #define SAL_CLIPRECT_COUNT 16
50 
51 struct SalIcon
52 {
53  int nId;
54  HICON hIcon;
55  HICON hSmallIcon;
57 };
58 
59 class SalData
60 {
61 public:
62  SalData();
63  ~SalData();
64 
65  // native widget framework
66  static void initNWF();
67  static void deInitNWF();
68 
69  // fill maVKMap;
70  void initKeyCodeMap();
71 
72  // checks if the menuhandle was created by VCL
73  bool IsKnownMenuHandle( HMENU hMenu );
74 
76 
77 public:
78  HINSTANCE mhInst; // default instance handle
79  int mnCmdShow; // default frame show style
80  HPALETTE mhDitherPal; // dither palette
81  HGLOBAL mhDitherDIB; // dither memory handle
82  BYTE* mpDitherDIB; // dither memory
83  BYTE* mpDitherDIBData; // beginning of DIB data
84  long* mpDitherDiff; // Dither mapping table
85  BYTE* mpDitherLow; // Dither mapping table
86  BYTE* mpDitherHigh; // Dither mapping table
87  HHOOK mhSalObjMsgHook; // hook to get interesting msg for SalObject
88  HWND mhWantLeaveMsg; // window handle, that want a MOUSELEAVE message
89  AutoTimer* mpMouseLeaveTimer; // Timer for MouseLeave Test
91  WinSalFrame* mpFirstFrame; // pointer of first frame
92  WinSalObject* mpFirstObject; // pointer of first object window
93  WinSalVirtualDevice* mpFirstVD; // first VirDev
94  WinSalPrinter* mpFirstPrinter; // first printing printer
95  HDCCache* mpHDCCache; // Cache for three DC's
96  HBITMAP mh50Bmp; // 50% Bitmap
97  HBRUSH mh50Brush; // 50% Brush
102  sal_uInt16 mnStockPenCount; // count of static pens
103  sal_uInt16 mnStockBrushCount; // count of static brushes
104  WPARAM mnSalObjWantKeyEvt; // KeyEvent that should be processed by SalObj-Hook
105  BYTE mnCacheDCInUse; // count of CacheDC in use
106  bool mbObjClassInit; // is SALOBJECTCLASS initialised
107  bool mbInPalChange; // is in WM_QUERYNEWPALETTE
108  DWORD mnAppThreadId; // Id from Application-Thread
109  BOOL mbScrSvrEnabled; // ScreenSaver enabled
110  SalIcon* mpFirstIcon; // icon cache, points to first icon, NULL if none
111  TempFontItem* mpSharedTempFontItem; // LibreOffice shared fonts
112  TempFontItem* mpOtherTempFontItem; // other temporary fonts (embedded?)
113  bool mbThemeChanged; // true if visual theme was changed: throw away theme handles
115 
116  // for GdiPlus GdiplusStartup/GdiplusShutdown
117  ULONG_PTR gdiplusToken;
118 
119  std::set< HMENU > mhMenuSet; // keeps track of menu handles created by VCL, used by IsKnownMenuHandle()
120  std::map< UINT,sal_uInt16 > maVKMap; // map some dynamic VK_* entries
121 
122  std::unique_ptr<TextOutRenderer> m_pD2DWriteTextOutRenderer;
123  // tdf#107205 need 2 instances because D2DWrite can't rotate text
124  std::unique_ptr<TextOutRenderer> m_pExTextOutRenderer;
125  std::unique_ptr<GlobalOpenGLGlyphCache> m_pGlobalOpenGLGlyphCache;
126  std::unique_ptr<TheTextureCache> m_pTextureCache;
127 };
128 
129 inline void SetSalData( SalData* pData ) { ImplGetSVData()->mpSalData = pData; }
130 inline SalData* GetSalData() { return ImplGetSVData()->mpSalData; }
131 
133 {
134  HINSTANCE mhInst; // Instance of SAL-DLL
135  UINT mnWheelScrollLines; // WheelScrollLines
136  UINT mnWheelScrollChars; // WheelScrollChars
137 };
138 
139 extern SalShlData aSalShlData;
140 
141 #define CACHESIZE_HDC 3
142 #define CACHED_HDC_1 0
143 #define CACHED_HDC_2 1
144 #define CACHED_HDC_DRAW 2
145 #define CACHED_HDC_DEFEXT 64
146 
147 struct HDCCache
148 {
149  HDC mhDC;
150  HPALETTE mhDefPal;
151  HBITMAP mhDefBmp;
152  HBITMAP mhSelBmp;
153  HBITMAP mhActBmp;
154 };
155 
156 void ImplClearHDCCache( SalData* pData );
157 HDC ImplGetCachedDC( sal_uLong nID, HBITMAP hBmp = nullptr );
158 void ImplReleaseCachedDC( sal_uLong nID );
159 
160 void ImplReleaseTempFonts(SalData&, bool bAll);
161 
162 HCURSOR ImplLoadSalCursor( int nId );
163 HBITMAP ImplLoadSalBitmap( int nId );
164 bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon );
165 
166 void ImplInitSalGDI();
167 void ImplFreeSalGDI();
168 
169 void ImplSalYieldMutexAcquireWithWait( sal_uInt32 nCount = 1 );
172 
173 LRESULT CALLBACK SalFrameWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
174 
175 void SalTestMouseLeave();
176 
177 bool ImplHandleSalObjKeyMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
178 bool ImplHandleSalObjSysCharMsg( HWND hWnd, WPARAM wParam, LPARAM lParam );
179 bool ImplHandleGlobalMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT& rlResult );
180 
181 WinSalObject* ImplFindSalObject( HWND hWndChild );
182 bool ImplSalPreDispatchMsg( const MSG* pMsg );
183 void ImplSalPostDispatchMsg( const MSG* pMsg );
184 
185 void ImplSalLogFontToFontW( HDC hDC, const LOGFONTW& rLogFont, vcl::Font& rFont );
186 
187 rtl_TextEncoding ImplSalGetSystemEncoding();
188 OUString ImplSalGetUniString(const sal_Char* pStr, sal_Int32 nLen = -1);
189 int ImplSalWICompareAscii( const wchar_t* pStr1, const char* pStr2 );
190 
191 #define SAL_FRAME_WNDEXTRA sizeof( DWORD )
192 #define SAL_FRAME_THIS GWLP_USERDATA
193 #define SAL_FRAME_CLASSNAMEW L"SALFRAME"
194 #define SAL_SUBFRAME_CLASSNAMEW L"SALSUBFRAME"
195 #define SAL_TMPSUBFRAME_CLASSNAMEW L"SALTMPSUBFRAME"
196 #define SAL_OBJECT_WNDEXTRA sizeof( DWORD )
197 #define SAL_OBJECT_THIS GWLP_USERDATA
198 #define SAL_OBJECT_CLASSNAMEW L"SALOBJECT"
199 #define SAL_OBJECT_CHILDCLASSNAMEW L"SALOBJECTCHILD"
200 #define SAL_COM_CLASSNAMEW L"SALCOMWND"
201 
202 #define SAL_MOUSELEAVE_TIMEOUT 300
203 
204 // wParam == bWait; lParam == 0
205 #define SAL_MSG_THREADYIELD (WM_USER+111)
206 // wParam == 0; lParam == nMS
207 #define SAL_MSG_STARTTIMER (WM_USER+113)
208 // wParam == nFrameStyle; lParam == pParent; lResult == pFrame
209 #define SAL_MSG_CREATEFRAME (WM_USER+114)
210 // wParam == 0; lParam == 0
211 #define SAL_MSG_DESTROYFRAME (WM_USER+115)
212 // wParam == 0; lParam == pParent; lResult == pObject
213 #define SAL_MSG_CREATEOBJECT (WM_USER+116)
214 // wParam == 0; lParam == pObject;
215 #define SAL_MSG_DESTROYOBJECT (WM_USER+117)
216 // wParam == hWnd; lParam == 0; lResult == hDC
217 #define SAL_MSG_GETCACHEDDC (WM_USER+120)
218 // wParam == hWnd; lParam == 0
219 #define SAL_MSG_RELEASEDC (WM_USER+121)
220 // wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd
221 #define SAL_MSG_RECREATEHWND (WM_USER+122)
222 // wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd
223 #define SAL_MSG_RECREATECHILDHWND (WM_USER+123)
224 // wParam == 0; lParam == HWND;
225 #define SAL_MSG_DESTROYHWND (WM_USER+124)
226 
227 // wParam == 0; lParam == pData
228 #define SAL_MSG_USEREVENT (WM_USER+130)
229 // wParam == 0; lParam == MousePosition relative to upper left of screen
230 #define SAL_MSG_MOUSELEAVE (WM_USER+131)
231 // NULL-Message, should not be processed
232 #define SAL_MSG_DUMMY (WM_USER+132)
233 // Used for SETFOCUS and KILLFOCUS
234 // wParam == 0; lParam == 0
235 #define SAL_MSG_POSTFOCUS (WM_USER+133)
236 // wParam == wParam; lParam == lParam
237 #define SAL_MSG_POSTQUERYNEWPAL (WM_USER+134)
238 // wParam == wParam; lParam == lParam
239 #define SAL_MSG_POSTPALCHANGED (WM_USER+135)
240 // wParam == wParam; lParam == lParam
241 #define SAL_MSG_POSTMOVE (WM_USER+136)
242 // wParam == wParam; lParam == lParam
243 #define SAL_MSG_POSTCALLSIZE (WM_USER+137)
244 // wParam == pRECT; lParam == 0
245 #define SAL_MSG_POSTPAINT (WM_USER+138)
246 // wParam == 0; lParam == pFrame; lResult 0
247 #define SAL_MSG_FORCEPALETTE (WM_USER+139)
248 // wParam == 0; lParam == 0
249 #define SAL_MSG_CAPTUREMOUSE (WM_USER+140)
250 // wParam == 0; lParam == 0
251 #define SAL_MSG_RELEASEMOUSE (WM_USER+141)
252 // wParam == nFlags; lParam == 0
253 #define SAL_MSG_TOTOP (WM_USER+142)
254 // wParam == bVisible; lParam == 0
255 #define SAL_MSG_SHOW (WM_USER+143)
256 // wParam == 0; lParam == SalInputContext
257 #define SAL_MSG_SETINPUTCONTEXT (WM_USER+144)
258 // wParam == nFlags; lParam == 0
259 #define SAL_MSG_ENDEXTTEXTINPUT (WM_USER+145)
260 
261 // SysChild-ToTop; wParam = 0; lParam = 0
262 #define SALOBJ_MSG_TOTOP (WM_USER+160)
263 // Used for SETFOCUS and KILLFOCUS
264 // POSTFOCUS-Message; wParam == bFocus; lParam == 0
265 #define SALOBJ_MSG_POSTFOCUS (WM_USER+161)
266 
267 // Call the Timer's callback from the main thread
268 // wParam = 1 == run when yield is idle instead of direct
269 #define SAL_MSG_TIMER_CALLBACK (WM_USER+162)
270 // Stop the timer from the main thread; wParam = 0, lParam = 0
271 #define SAL_MSG_STOPTIMER (WM_USER+163)
272 // Start a real timer while GUI is blocked by native dialog
273 #define SAL_MSG_FORCE_REAL_TIMER (WM_USER+164)
274 
275 inline void SetWindowPtr( HWND hWnd, WinSalFrame* pThis )
276 {
277  SetWindowLongPtrW( hWnd, SAL_FRAME_THIS, reinterpret_cast<LONG_PTR>(pThis) );
278 }
279 
280 inline WinSalFrame* GetWindowPtr( HWND hWnd )
281 {
282  return reinterpret_cast<WinSalFrame*>(GetWindowLongPtrW( hWnd, SAL_FRAME_THIS ));
283 }
284 
285 inline void SetSalObjWindowPtr( HWND hWnd, WinSalObject* pThis )
286 {
287  SetWindowLongPtrW( hWnd, SAL_OBJECT_THIS, reinterpret_cast<LONG_PTR>(pThis) );
288 }
289 
290 inline WinSalObject* GetSalObjWindowPtr( HWND hWnd )
291 {
292  return reinterpret_cast<WinSalObject*>(GetWindowLongPtrW( hWnd, SAL_OBJECT_THIS ));
293 }
294 
295 #endif // INCLUDED_VCL_INC_WIN_SALDATA_HXX
296 
297 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bool mbThemeMenuSupport
std::map< UINT, sal_uInt16 > maVKMap
SalData * mpSalData
Definition: svdata.hxx:335
HBITMAP mh50Bmp
Definition: win/saldata.hxx:96
bool ImplHandleGlobalMsg(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT &rlResult)
HBITMAP mhActBmp
unsigned char BYTE
std::unique_ptr< TextOutRenderer > m_pExTextOutRenderer
void SalTestMouseLeave()
TempFontItem * mpSharedTempFontItem
sal_uIntPtr sal_uLong
HBRUSH mh50Brush
Definition: win/saldata.hxx:97
bool IsKnownMenuHandle(HMENU hMenu)
BYTE * mpDitherDIB
Definition: win/saldata.hxx:82
WinSalPrinter * mpFirstPrinter
Definition: win/saldata.hxx:94
OUString ImplSalGetUniString(const sal_Char *pStr, sal_Int32 nLen=-1)
void ImplSalLogFontToFontW(HDC hDC, const LOGFONTW &rLogFont, vcl::Font &rFont)
DWORD mnAppThreadId
void ImplSalYieldMutexAcquireWithWait(sal_uInt32 nCount=1)
bool ImplHandleSalObjSysCharMsg(HWND hWnd, WPARAM wParam, LPARAM lParam)
HICON hIcon
Definition: win/saldata.hxx:54
COLORREF maStockBrushColorAry[MAX_STOCKBRUSH]
Definition: win/saldata.hxx:99
bool ImplLoadSalIcon(int nId, HICON &rIcon, HICON &rSmallIcon)
const wchar_t *typedef BOOL
char sal_Char
std::unique_ptr< TheTextureCache > m_pTextureCache
void ImplSalPostDispatchMsg(const MSG *pMsg)
#define MAX_STOCKPEN
Definition: win/saldata.hxx:47
std::unique_ptr< GlobalOpenGLGlyphCache > m_pGlobalOpenGLGlyphCache
void ImplSalYieldMutexRelease()
HHOOK mhSalObjMsgHook
Definition: win/saldata.hxx:87
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:67
An auto-timer is a multi-shot timer re-emitting itself at interval until destroyed or stopped...
Definition: timer.hxx:72
static void initNWF()
UINT mnWheelScrollChars
HWND mhWantLeaveMsg
Definition: win/saldata.hxx:88
BYTE * mpDitherHigh
Definition: win/saldata.hxx:86
void SetWindowPtr(HWND hWnd, WinSalFrame *pThis)
bool ImplSalPreDispatchMsg(const MSG *pMsg)
WinSalFrame * mpFirstFrame
Definition: win/saldata.hxx:91
bool mbThemeChanged
HBITMAP mhDefBmp
#define MAX_STOCKBRUSH
Definition: win/saldata.hxx:48
void ImplFreeSalGDI()
std::set< HMENU > mhMenuSet
void ImplReleaseCachedDC(sal_uLong nID)
HBITMAP ImplLoadSalBitmap(int nId)
#define SAL_OBJECT_THIS
bool mbObjClassInit
bool mbInPalChange
ULONG_PTR gdiplusToken
HPALETTE mhDefPal
HBITMAP mhSelBmp
BYTE * mpDitherDIBData
Definition: win/saldata.hxx:83
HBRUSH mhStockBrushAry[MAX_STOCKBRUSH]
sal_uInt16 mnStockPenCount
static void deInitNWF()
WinSalVirtualDevice * mpFirstVD
Definition: win/saldata.hxx:93
void ImplReleaseTempFonts(SalData &, bool bAll)
HCURSOR ImplLoadSalCursor(int nId)
BOOL mbScrSvrEnabled
WinSalFrame * GetWindowPtr(HWND hWnd)
HINSTANCE mhInst
Definition: win/saldata.hxx:78
HINSTANCE mhInst
HPEN mhStockPenAry[MAX_STOCKPEN]
TempFontItem * mpOtherTempFontItem
#define SAL_FRAME_THIS
int ImplSalWICompareAscii(const wchar_t *pStr1, const char *pStr2)
BYTE mnCacheDCInUse
LRESULT CALLBACK SalFrameWndProcW(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
void SetSalData(SalData *pData)
~SalData()
Definition: salplug.cxx:338
void ImplClearHDCCache(SalData *pData)
SalIcon * pNext
Definition: win/saldata.hxx:56
HGLOBAL mhDitherDIB
Definition: win/saldata.hxx:81
sal_uInt16 mnStockBrushCount
bool ImplSalYieldMutexTryToAcquire()
SalData()
Definition: salplug.cxx:332
void ImplInitSalGDI()
WinSalObject * ImplFindSalObject(HWND hWndChild)
WinSalInstance * mpInstance
Definition: win/saldata.hxx:90
SalData * GetSalData()
SalShlData aSalShlData
rtl_TextEncoding ImplSalGetSystemEncoding()
COLORREF maStockPenColorAry[MAX_STOCKPEN]
Definition: win/saldata.hxx:98
HDCCache * mpHDCCache
Definition: win/saldata.hxx:95
WinSalObject * GetSalObjWindowPtr(HWND hWnd)
#define CALLBACK
HDC ImplGetCachedDC(sal_uLong nID, HBITMAP hBmp=nullptr)
AutoTimer * mpMouseLeaveTimer
Definition: win/saldata.hxx:89
bool mbResourcesAlreadyFreed
Definition: win/saldata.hxx:75
SalIcon * mpFirstIcon
std::unique_ptr< TextOutRenderer > m_pD2DWriteTextOutRenderer
bool ImplHandleSalObjKeyMsg(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
int mnCmdShow
Definition: win/saldata.hxx:79
BYTE * mpDitherLow
Definition: win/saldata.hxx:85
HPALETTE mhDitherPal
Definition: win/saldata.hxx:80
UINT mnWheelScrollLines
WPARAM mnSalObjWantKeyEvt
void SetSalObjWindowPtr(HWND hWnd, WinSalObject *pThis)
WinSalObject * mpFirstObject
Definition: win/saldata.hxx:92
HICON hSmallIcon
Definition: win/saldata.hxx:55
long * mpDitherDiff
Definition: win/saldata.hxx:84
void initKeyCodeMap()