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 <array>
25#include <memory>
26#include <osl/module.h>
27
28#include <svdata.hxx>
29#include <salwtype.hxx>
30
31#include <systools/win32/comtools.hxx>
32#include <tools/long.hxx>
33
34#include <win/wincomp.hxx>
35
36#include <set>
37#include <map>
38
39class AutoTimer;
40class WinSalInstance;
41class WinSalObject;
42class WinSalFrame;
44class WinSalPrinter;
45namespace vcl { class Font; }
46struct HDCCache;
47struct TempFontItem;
48class TextOutRenderer;
49#if HAVE_FEATURE_SKIA
51#endif
52
53#define MAX_STOCKPEN 4
54#define MAX_STOCKBRUSH 4
55#define SAL_CLIPRECT_COUNT 16
56
57#define CACHESIZE_HDC 3
58#define CACHED_HDC_1 0
59#define CACHED_HDC_2 1
60#define CACHED_HDC_DRAW 2
61#define CACHED_HDC_DEFEXT 64
62
64{
65 HDC mhDC = nullptr;
66 HPALETTE mhDefPal = nullptr;
67 HBITMAP mhDefBmp = nullptr;
68 HBITMAP mhSelBmp = nullptr;
69 HBITMAP mhActBmp = nullptr;
70};
71
72struct SalIcon
73{
74 int nId;
75 HICON hIcon;
78};
79
80class SalData : public sal::systools::CoInitializeGuard
81{
82public:
85
86 // native widget framework
87 static void initNWF();
88 static void deInitNWF();
89
90 // fill maVKMap;
92
93 // checks if the menuhandle was created by VCL
94 bool IsKnownMenuHandle( HMENU hMenu );
95
97
98public:
99 HINSTANCE mhInst; // default instance handle
100 int mnCmdShow; // default frame show style
101 HPALETTE mhDitherPal; // dither palette
102 HGLOBAL mhDitherDIB; // dither memory handle
103 BYTE* mpDitherDIB; // dither memory
104 BYTE* mpDitherDIBData; // beginning of DIB data
105 std::unique_ptr<tools::Long[]> mpDitherDiff; // Dither mapping table
106 std::unique_ptr<BYTE[]> mpDitherLow; // Dither mapping table
107 std::unique_ptr<BYTE[]> mpDitherHigh; // Dither mapping table
108 HHOOK mhSalObjMsgHook; // hook to get interesting msg for SalObject
109 HWND mhWantLeaveMsg; // window handle, that want a MOUSELEAVE message
111 WinSalFrame* mpFirstFrame; // pointer of first frame
112 WinSalObject* mpFirstObject; // pointer of first object window
114 WinSalPrinter* mpFirstPrinter; // first printing printer
115 std::array<HDCCache, CACHESIZE_HDC> maHDCCache; // Cache for three DC's
116 HBITMAP mh50Bmp; // 50% Bitmap
117 HBRUSH mh50Brush; // 50% Brush
122 sal_uInt16 mnStockPenCount; // count of static pens
123 sal_uInt16 mnStockBrushCount; // count of static brushes
124 WPARAM mnSalObjWantKeyEvt; // KeyEvent that should be processed by SalObj-Hook
125 BYTE mnCacheDCInUse; // count of CacheDC in use
126 bool mbObjClassInit; // is SALOBJECTCLASS initialised
127 bool mbInPalChange; // is in WM_QUERYNEWPALETTE
128 DWORD mnAppThreadId; // Id from Application-Thread
129 SalIcon* mpFirstIcon; // icon cache, points to first icon, NULL if none
130 TempFontItem* mpSharedTempFontItem; // LibreOffice shared fonts
131 TempFontItem* mpOtherTempFontItem; // other temporary fonts (embedded?)
132 bool mbThemeChanged; // true if visual theme was changed: throw away theme handles
134
135 // for GdiPlus GdiplusStartup/GdiplusShutdown
136 ULONG_PTR gdiplusToken;
137
138 std::set< HMENU > mhMenuSet; // keeps track of menu handles created by VCL, used by IsKnownMenuHandle()
139 std::map< UINT,sal_uInt16 > maVKMap; // map some dynamic VK_* entries
140
141 std::unique_ptr<TextOutRenderer> m_pD2DWriteTextOutRenderer;
142 // tdf#107205 need 2 instances because D2DWrite can't rotate text
143 std::unique_ptr<TextOutRenderer> m_pExTextOutRenderer;
144#if HAVE_FEATURE_SKIA
145 std::unique_ptr<SkiaControlsCache> m_pSkiaControlsCache;
146#endif
147};
148
150{
151 HINSTANCE mhInst; // Instance of SAL-DLL
152 UINT mnWheelScrollLines; // WheelScrollLines
153 UINT mnWheelScrollChars; // WheelScrollChars
154};
155
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// 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
275inline void SetWindowPtr( HWND hWnd, WinSalFrame* pThis )
276{
277 SetWindowLongPtrW( hWnd, SAL_FRAME_THIS, reinterpret_cast<LONG_PTR>(pThis) );
278}
279
280inline WinSalFrame* GetWindowPtr( HWND hWnd )
281{
282 return reinterpret_cast<WinSalFrame*>(GetWindowLongPtrW( hWnd, SAL_FRAME_THIS ));
283}
284
285inline void SetSalObjWindowPtr( HWND hWnd, WinSalObject* pThis )
286{
287 SetWindowLongPtrW( hWnd, SAL_OBJECT_THIS, reinterpret_cast<LONG_PTR>(pThis) );
288}
289
291{
292 return reinterpret_cast<WinSalObject*>(GetWindowLongPtrW( hWnd, SAL_OBJECT_THIS ));
293}
294
295/* 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
std::unique_ptr< TextOutRenderer > m_pD2DWriteTextOutRenderer
sal_uInt16 mnStockBrushCount
WinSalPrinter * mpFirstPrinter
std::array< HDCCache, CACHESIZE_HDC > maHDCCache
std::map< UINT, sal_uInt16 > maVKMap
HPEN mhStockPenAry[MAX_STOCKPEN]
bool mbResourcesAlreadyFreed
Definition: win/saldata.hxx:96
std::unique_ptr< BYTE[]> mpDitherHigh
std::unique_ptr< BYTE[]> mpDitherLow
HWND mhWantLeaveMsg
COLORREF maStockBrushColorAry[MAX_STOCKBRUSH]
bool mbInPalChange
WinSalInstance * mpInstance
bool IsKnownMenuHandle(HMENU hMenu)
bool mbThemeChanged
HBRUSH mhStockBrushAry[MAX_STOCKBRUSH]
std::unique_ptr< TextOutRenderer > m_pExTextOutRenderer
WinSalVirtualDevice * mpFirstVD
BYTE mnCacheDCInUse
sal_uInt16 mnStockPenCount
SalIcon * mpFirstIcon
HINSTANCE mhInst
Definition: win/saldata.hxx:99
HPALETTE mhDitherPal
std::set< HMENU > mhMenuSet
HGLOBAL mhDitherDIB
WinSalFrame * mpFirstFrame
WPARAM mnSalObjWantKeyEvt
DWORD mnAppThreadId
ULONG_PTR gdiplusToken
int mnCmdShow
void initKeyCodeMap()
TempFontItem * mpSharedTempFontItem
HHOOK mhSalObjMsgHook
static void initNWF()
HBRUSH mh50Brush
TempFontItem * mpOtherTempFontItem
std::unique_ptr< tools::Long[]> mpDitherDiff
static void deInitNWF()
HBITMAP mh50Bmp
COLORREF maStockPenColorAry[MAX_STOCKPEN]
bool mbThemeMenuSupport
WinSalObject * mpFirstObject
BYTE * mpDitherDIB
bool mbObjClassInit
#define CALLBACK
sal_uIntPtr sal_uLong
HBITMAP mhSelBmp
Definition: win/saldata.hxx:68
HBITMAP mhDefBmp
Definition: win/saldata.hxx:67
HBITMAP mhActBmp
Definition: win/saldata.hxx:69
HPALETTE mhDefPal
Definition: win/saldata.hxx:66
HICON hSmallIcon
Definition: win/saldata.hxx:76
HICON hIcon
Definition: win/saldata.hxx:75
SalIcon * pNext
Definition: win/saldata.hxx:77
UINT mnWheelScrollLines
HINSTANCE mhInst
UINT mnWheelScrollChars
unsigned char BYTE
bool ImplHandleSalObjSysCharMsg(HWND hWnd, WPARAM wParam, LPARAM lParam)
#define MAX_STOCKBRUSH
Definition: win/saldata.hxx:54
void ImplSalYieldMutexAcquireWithWait(sal_uInt32 nCount=1)
bool ImplLoadSalIcon(int nId, HICON &rIcon, HICON &rSmallIcon)
void ImplSalYieldMutexRelease()
#define MAX_STOCKPEN
Definition: win/saldata.hxx:53
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)