1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _SV_SALDATA_HXX 25 #define _SV_SALDATA_HXX 26 27 #include "osl/module.h" 28 29 #include <svdata.hxx> 30 #include <salwtype.hxx> 31 32 #include <win/wincomp.hxx> 33 34 #include <set> // for hMenu validation 35 #include <map> 36 37 class AutoTimer; 38 class WinSalInstance; 39 class WinSalObject; 40 class WinSalFrame; 41 class WinSalVirtualDevice; 42 class WinSalPrinter; 43 class Font; 44 struct HDCCache; 45 struct TempFontItem; 46 47 typedef HRESULT (WINAPI *DwmIsCompositionEnabled_ptr)(BOOL*); 48 49 // -------------------- 50 // - Standard-Defines - 51 // -------------------- 52 53 #define MAX_STOCKPEN 4 54 #define MAX_STOCKBRUSH 4 55 #define SAL_CLIPRECT_COUNT 16 56 57 // -------------------- 58 // - Icon cache - 59 // -------------------- 60 61 struct SalIcon 62 { 63 int nId; 64 HICON hIcon; 65 HICON hSmallIcon; 66 SalIcon *pNext; 67 }; 68 69 // ----------- 70 // - SalData - 71 // ----------- 72 73 class SalData 74 { 75 public: 76 SalData(); 77 ~SalData(); 78 79 // native widget framework 80 void initNWF(); 81 void deInitNWF(); 82 83 // fill maVKMap; 84 void initKeyCodeMap(); 85 86 // checks if the menuhandle was created by VCL 87 sal_Bool IsKnownMenuHandle( HMENU hMenu ); 88 89 public: 90 HINSTANCE mhInst; // default instance handle 91 HINSTANCE mhPrevInst; // previous instance handle 92 int mnCmdShow; // default frame show style 93 HPALETTE mhDitherPal; // dither palette 94 HGLOBAL mhDitherDIB; // dither memory handle 95 BYTE* mpDitherDIB; // dither memory 96 BYTE* mpDitherDIBData; // beginning of DIB data 97 long* mpDitherDiff; // Dither mapping table 98 BYTE* mpDitherLow; // Dither mapping table 99 BYTE* mpDitherHigh; // Dither mapping table 100 sal_uLong mnTimerMS; // Current Time (in MS) of the Timer 101 sal_uLong mnTimerOrgMS; // Current Original Time (in MS) 102 DWORD mnNextTimerTime; 103 DWORD mnLastEventTime; 104 UINT mnTimerId; // windows timer id 105 sal_Bool mbInTimerProc; // timer event is currently being dispatched 106 HHOOK mhSalObjMsgHook; // hook to get interesting msg for SalObject 107 HWND mhWantLeaveMsg; // window handle, that want a MOUSELEAVE message 108 AutoTimer* mpMouseLeaveTimer; // Timer for MouseLeave Test 109 WinSalInstance* mpFirstInstance; // pointer of first instance 110 WinSalFrame* mpFirstFrame; // pointer of first frame 111 WinSalObject* mpFirstObject; // pointer of first object window 112 WinSalVirtualDevice* mpFirstVD; // first VirDev 113 WinSalPrinter* mpFirstPrinter; // first printing printer 114 HDCCache* mpHDCCache; // Cache for three DC's 115 HBITMAP mh50Bmp; // 50% Bitmap 116 HBRUSH mh50Brush; // 50% Brush 117 COLORREF maStockPenColorAry[MAX_STOCKPEN]; 118 COLORREF maStockBrushColorAry[MAX_STOCKBRUSH]; 119 HPEN mhStockPenAry[MAX_STOCKPEN]; 120 HBRUSH mhStockBrushAry[MAX_STOCKBRUSH]; 121 sal_uInt16 mnStockPenCount; // count of static pens 122 sal_uInt16 mnStockBrushCount; // count of static brushes 123 WPARAM mnSalObjWantKeyEvt; // KeyEvent, welcher vom SalObj-Hook verarbeitet werden soll 124 BYTE mnCacheDCInUse; // count of CacheDC in use 125 sal_Bool mbObjClassInit; // is SALOBJECTCLASS initialised 126 sal_Bool mbInPalChange; // is in WM_QUERYNEWPALETTE 127 DWORD mnAppThreadId; // Id from Applikation-Thread 128 BOOL mbScrSvrEnabled; // ScreenSaver enabled 129 int mnSageStatus; // status of Sage-DLL (DISABLE_AGENT == nicht vorhanden) 130 SysAgt_Enable_PROC mpSageEnableProc; // funktion to deactivate the system agent 131 SalIcon* mpFirstIcon; // icon cache, points to first icon, NULL if none 132 TempFontItem* mpTempFontItem; 133 sal_Bool mbThemeChanged; // true if visual theme was changed: throw away theme handles 134 sal_Bool mbThemeMenuSupport; 135 136 // for GdiPlus GdiplusStartup/GdiplusShutdown 137 ULONG_PTR gdiplusToken; 138 139 std::set< HMENU > mhMenuSet; // keeps track of menu handles created by VCL, used by IsKnownMenuHandle() 140 std::map< UINT,USHORT > maVKMap; // map some dynamic VK_* entries 141 oslModule maDwmLib; 142 DwmIsCompositionEnabled_ptr mpDwmIsCompositionEnabled; 143 }; 144 145 inline void SetSalData( SalData* pData ) { ImplGetSVData()->mpSalData = (void*)pData; } 146 inline SalData* GetSalData() { return (SalData*)ImplGetSVData()->mpSalData; } 147 inline SalData* GetAppSalData() { return (SalData*)ImplGetAppSVData()->mpSalData; } 148 149 // -------------- 150 // - SalShlData - 151 // -------------- 152 153 struct SalShlData 154 { 155 HINSTANCE mhInst; // Instance of SAL-DLL 156 UINT mnWheelScrollLines; // WheelScrollLines 157 UINT mnWheelScrollChars; // WheelScrollChars 158 UINT mnWheelMsgId; // Wheel-Message-Id fuer W95 159 WORD mnVersion; // System-Version (311 == 3.11) 160 BOOL mbW40; // Is System-Version >= 4.0 161 BOOL mbWXP; // Windows XP 162 BOOL mbWPrinter; // true: use unicode printer functions 163 // false: use anis compat printer functions 164 OSVERSIONINFO maVersionInfo; 165 }; 166 167 extern SalShlData aSalShlData; 168 169 // ------------ 170 // - GDICache - 171 // ------------ 172 173 #define CACHESIZE_HDC 3 174 #define CACHED_HDC_1 0 175 #define CACHED_HDC_2 1 176 #define CACHED_HDC_DRAW 2 177 #define CACHED_HDC_DEFEXT 64 178 179 struct HDCCache 180 { 181 HDC mhDC; 182 HPALETTE mhDefPal; 183 HBITMAP mhDefBmp; 184 HBITMAP mhSelBmp; 185 HBITMAP mhActBmp; 186 }; 187 188 void ImplClearHDCCache( SalData* pData ); 189 HDC ImplGetCachedDC( sal_uLong nID, HBITMAP hBmp = 0 ); 190 void ImplReleaseCachedDC( sal_uLong nID ); 191 192 bool ImplAddTempFont( SalData&, const String& rFontFileURL ); 193 void ImplReleaseTempFonts( SalData& ); 194 195 // -------------------------------------------- 196 // - SALSHL.CXX - for accessing DLL resources - 197 // -------------------------------------------- 198 199 HCURSOR ImplLoadSalCursor( int nId ); 200 HBITMAP ImplLoadSalBitmap( int nId ); 201 sal_Bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon ); 202 203 // SALGDI.CXX 204 void ImplInitSalGDI(); 205 void ImplFreeSalGDI(); 206 207 // -------------- 208 // - Prototypes - 209 // -------------- 210 211 // \\WIN\SOURCE\APP\SALINST.CXX 212 void ImplSalYieldMutexAcquireWithWait(); 213 sal_Bool ImplSalYieldMutexTryToAcquire(); 214 void ImplSalYieldMutexAcquire(); 215 void ImplSalYieldMutexRelease(); 216 sal_uLong ImplSalReleaseYieldMutex(); 217 void ImplSalAcquireYieldMutex( sal_uLong nCount ); 218 sal_Bool ImplInterceptChildWindowKeyDown( MSG& rMsg ); 219 220 // \\WIN\SOURCE\WINDOW\SALFRAME.CXX 221 LRESULT CALLBACK SalFrameWndProcA( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ); 222 LRESULT CALLBACK SalFrameWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ); 223 // \SV\WIN\SOURCE\APP\SALTIMER.CXX 224 #define SALTIMERPROC_RECURSIVE 0xffffffff 225 void CALLBACK SalTimerProc( HWND hWnd, UINT nMsg, UINT_PTR nId, DWORD nTime ); 226 227 // \WIN\SOURCE\WINDOW\SALFRAME.CXX 228 void SalTestMouseLeave(); 229 sal_Bool ImplWriteLastError( DWORD lastError, const char *szApiCall ); 230 231 // \WIN\SOURCE\WINDOW\SALFRAME.CXX 232 long ImplHandleSalObjKeyMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ); 233 long ImplHandleSalObjSysCharMsg( HWND hWnd, WPARAM wParam, LPARAM lParam ); 234 sal_Bool ImplHandleGlobalMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT& rlResult ); 235 236 // \WIN\SOURCE\WINDOW\SALOBJ.CXX 237 WinSalObject* ImplFindSalObject( HWND hWndChild ); 238 sal_Bool ImplSalPreDispatchMsg( MSG* pMsg ); 239 void ImplSalPostDispatchMsg( MSG* pMsg, LRESULT nDispatchResult ); 240 241 // \WIN\SOURCE\GDI\SALGDI3.CXX 242 void ImplSalLogFontToFontA( HDC hDC, const LOGFONTA& rLogFont, Font& rFont ); 243 void ImplSalLogFontToFontW( HDC hDC, const LOGFONTW& rLogFont, Font& rFont ); 244 bool ImplIsFontAvailable( HDC hDC, const UniString& rName ); 245 246 // \WIN\SOURCE\APP\SALDATA.CXX 247 rtl_TextEncoding ImplSalGetSystemEncoding(); 248 ByteString ImplSalGetWinAnsiString( const UniString& rStr, sal_Bool bFileName = FALSE ); 249 UniString ImplSalGetUniString( const sal_Char* pStr, xub_StrLen nLen = STRING_LEN ); 250 int ImplSalWICompareAscii( const wchar_t* pStr1, const char* pStr2 ); 251 252 // ----------- 253 // - Defines - 254 // ----------- 255 256 #define SAL_FRAME_WNDEXTRA sizeof( DWORD ) 257 #define SAL_FRAME_THIS 0 258 #define SAL_FRAME_CLASSNAMEA "SALFRAME" 259 #define SAL_FRAME_CLASSNAMEW L"SALFRAME" 260 #define SAL_SUBFRAME_CLASSNAMEA "SALSUBFRAME" 261 #define SAL_SUBFRAME_CLASSNAMEW L"SALSUBFRAME" 262 #define SAL_TMPSUBFRAME_CLASSNAMEW L"SALTMPSUBFRAME" 263 #define SAL_OBJECT_WNDEXTRA sizeof( DWORD ) 264 #define SAL_OBJECT_THIS 0 265 #define SAL_OBJECT_CLASSNAMEA "SALOBJECT" 266 #define SAL_OBJECT_CLASSNAMEW L"SALOBJECT" 267 #define SAL_OBJECT_CHILDCLASSNAMEA "SALOBJECTCHILD" 268 #define SAL_OBJECT_CHILDCLASSNAMEW L"SALOBJECTCHILD" 269 #define SAL_COM_CLASSNAMEA "SALCOMWND" 270 #define SAL_COM_CLASSNAMEW L"SALCOMWND" 271 272 #define SAL_MOUSELEAVE_TIMEOUT 300 273 274 // wParam == hDC; lParam == 0 275 #define SAL_MSG_PRINTABORTJOB (WM_USER+110) 276 // wParam == bWait; lParam == 0 277 #define SAL_MSG_THREADYIELD (WM_USER+111) 278 // wParam == 0; lParam == 0 279 #define SAL_MSG_RELEASEWAITYIELD (WM_USER+112) 280 // wParam == 0; lParam == nMS 281 #define SAL_MSG_STARTTIMER (WM_USER+113) 282 // wParam == nFrameStyle; lParam == pParent; lResult == pFrame 283 #define SAL_MSG_CREATEFRAME (WM_USER+114) 284 // wParam == 0; lParam == 0 285 #define SAL_MSG_DESTROYFRAME (WM_USER+115) 286 // wParam == 0; lParam == pParent; lResult == pObject 287 #define SAL_MSG_CREATEOBJECT (WM_USER+116) 288 // wParam == 0; lParam == pObject; 289 #define SAL_MSG_DESTROYOBJECT (WM_USER+117) 290 // wParam == hWnd; lParam == 0; lResult == hDC 291 #define SAL_MSG_GETDC (WM_USER+120) 292 // wParam == hWnd; lParam == 0 293 #define SAL_MSG_RELEASEDC (WM_USER+121) 294 // wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd 295 #define SAL_MSG_RECREATEHWND (WM_USER+122) 296 // wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd 297 #define SAL_MSG_RECREATECHILDHWND (WM_USER+123) 298 // wParam == 0; lParam == HWND; 299 #define SAL_MSG_DESTROYHWND (WM_USER+124) 300 301 // wParam == 0; lParam == pData 302 #define SAL_MSG_USEREVENT (WM_USER+130) 303 // wParam == 0; lParam == MousePosition relativ to upper left of screen 304 #define SAL_MSG_MOUSELEAVE (WM_USER+131) 305 // NULL-Message, soll nicht verarbeitet werden 306 #define SAL_MSG_DUMMY (WM_USER+132) 307 // wParam == 0; lParam == 0 308 #define SAL_MSG_POSTFOCUS (WM_USER+133) 309 // wParam == wParam; lParam == lParam 310 #define SAL_MSG_POSTQUERYNEWPAL (WM_USER+134) 311 // wParam == wParam; lParam == lParam 312 #define SAL_MSG_POSTPALCHANGED (WM_USER+135) 313 // wParam == wParam; lParam == lParam 314 #define SAL_MSG_POSTMOVE (WM_USER+136) 315 // wParam == wParam; lParam == lParam 316 #define SAL_MSG_POSTCALLSIZE (WM_USER+137) 317 // wParam == pRECT; lParam == 0 318 #define SAL_MSG_POSTPAINT (WM_USER+138) 319 // wParam == 0; lParam == pFrame; lResult 0 320 #define SAL_MSG_FORCEPALETTE (WM_USER+139) 321 // wParam == 0; lParam == 0 322 #define SAL_MSG_CAPTUREMOUSE (WM_USER+140) 323 // wParam == 0; lParam == 0 324 #define SAL_MSG_RELEASEMOUSE (WM_USER+141) 325 // wParam == nFlags; lParam == 0 326 #define SAL_MSG_TOTOP (WM_USER+142) 327 // wParam == bVisible; lParam == 0 328 #define SAL_MSG_SHOW (WM_USER+143) 329 // wParam == 0; lParam == SalInputContext 330 #define SAL_MSG_SETINPUTCONTEXT (WM_USER+144) 331 // wParam == nFlags; lParam == 0 332 #define SAL_MSG_ENDEXTTEXTINPUT (WM_USER+145) 333 // POSTTIMER-Message; wparam = 0, lParam == time 334 #define SAL_MSG_POSTTIMER (WM_USER+161) 335 336 // SysChild-ToTop; wParam = 0; lParam = 0 337 #define SALOBJ_MSG_TOTOP (WM_USER+160) 338 // POSTFOCUS-Message; wParam == bFocus; lParam == 0 339 #define SALOBJ_MSG_POSTFOCUS (WM_USER+161) 340 341 342 // ----------------- 343 // - Helpfunctions - 344 // ----------------- 345 346 // A/W-Wrapper 347 LONG ImplSetWindowLong( HWND hWnd, int nIndex, DWORD dwNewLong ); 348 LONG ImplGetWindowLong( HWND hWnd, int nIndex ); 349 BOOL ImplPostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); 350 BOOL ImplSendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); 351 BOOL ImplGetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ); 352 BOOL ImplPeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); 353 LONG ImplDispatchMessage( CONST MSG *lpMsg ); 354 355 inline void SetWindowPtr( HWND hWnd, WinSalFrame* pThis ) 356 { 357 ImplSetWindowLong( hWnd, SAL_FRAME_THIS, (LONG)pThis ); 358 } 359 360 inline WinSalFrame* GetWindowPtr( HWND hWnd ) 361 { 362 return (WinSalFrame*)ImplGetWindowLong( hWnd, SAL_FRAME_THIS ); 363 } 364 365 inline void SetSalObjWindowPtr( HWND hWnd, WinSalObject* pThis ) 366 { 367 ImplSetWindowLong( hWnd, SAL_OBJECT_THIS, (LONG)pThis ); 368 } 369 370 inline WinSalObject* GetSalObjWindowPtr( HWND hWnd ) 371 { 372 return (WinSalObject*)ImplGetWindowLong( hWnd, SAL_OBJECT_THIS ); 373 } 374 375 #endif // _SV_SALDATA_HXX 376