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