blob: 6fc4b3c1b55cf11466899aa6fb0e589c3a8b47dc [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SV_SALDATA_HXX
#define _SV_SALDATA_HXX
#include "osl/module.h"
#include <svdata.hxx>
#include <salwtype.hxx>
#include <win/wincomp.hxx>
#include <set> // for hMenu validation
#include <map>
class AutoTimer;
class WinSalInstance;
class WinSalObject;
class WinSalFrame;
class WinSalVirtualDevice;
class WinSalPrinter;
class Font;
struct HDCCache;
struct TempFontItem;
typedef HRESULT (WINAPI *DwmIsCompositionEnabled_ptr)(BOOL*);
// --------------------
// - Standard-Defines -
// --------------------
#define MAX_STOCKPEN 4
#define MAX_STOCKBRUSH 4
#define SAL_CLIPRECT_COUNT 16
// --------------------
// - Icon cache -
// --------------------
struct SalIcon
{
int nId;
HICON hIcon;
HICON hSmallIcon;
SalIcon *pNext;
};
// -----------
// - SalData -
// -----------
class SalData
{
public:
SalData();
~SalData();
// native widget framework
void initNWF();
void deInitNWF();
// fill maVKMap;
void initKeyCodeMap();
// checks if the menuhandle was created by VCL
sal_Bool IsKnownMenuHandle( HMENU hMenu );
public:
HINSTANCE mhInst; // default instance handle
HINSTANCE mhPrevInst; // previous instance handle
int mnCmdShow; // default frame show style
HPALETTE mhDitherPal; // dither palette
HGLOBAL mhDitherDIB; // dither memory handle
BYTE* mpDitherDIB; // dither memory
BYTE* mpDitherDIBData; // beginning of DIB data
long* mpDitherDiff; // Dither mapping table
BYTE* mpDitherLow; // Dither mapping table
BYTE* mpDitherHigh; // Dither mapping table
sal_uLong mnTimerMS; // Current Time (in MS) of the Timer
sal_uLong mnTimerOrgMS; // Current Original Time (in MS)
DWORD mnNextTimerTime;
DWORD mnLastEventTime;
UINT mnTimerId; // windows timer id
sal_Bool mbInTimerProc; // timer event is currently being dispatched
HHOOK mhSalObjMsgHook; // hook to get interesting msg for SalObject
HWND mhWantLeaveMsg; // window handle, that want a MOUSELEAVE message
AutoTimer* mpMouseLeaveTimer; // Timer for MouseLeave Test
WinSalInstance* mpFirstInstance; // pointer of first instance
WinSalFrame* mpFirstFrame; // pointer of first frame
WinSalObject* mpFirstObject; // pointer of first object window
WinSalVirtualDevice* mpFirstVD; // first VirDev
WinSalPrinter* mpFirstPrinter; // first printing printer
HDCCache* mpHDCCache; // Cache for three DC's
HBITMAP mh50Bmp; // 50% Bitmap
HBRUSH mh50Brush; // 50% Brush
COLORREF maStockPenColorAry[MAX_STOCKPEN];
COLORREF maStockBrushColorAry[MAX_STOCKBRUSH];
HPEN mhStockPenAry[MAX_STOCKPEN];
HBRUSH mhStockBrushAry[MAX_STOCKBRUSH];
sal_uInt16 mnStockPenCount; // count of static pens
sal_uInt16 mnStockBrushCount; // count of static brushes
WPARAM mnSalObjWantKeyEvt; // KeyEvent, welcher vom SalObj-Hook verarbeitet werden soll
BYTE mnCacheDCInUse; // count of CacheDC in use
sal_Bool mbObjClassInit; // is SALOBJECTCLASS initialised
sal_Bool mbInPalChange; // is in WM_QUERYNEWPALETTE
DWORD mnAppThreadId; // Id from Applikation-Thread
BOOL mbScrSvrEnabled; // ScreenSaver enabled
int mnSageStatus; // status of Sage-DLL (DISABLE_AGENT == nicht vorhanden)
SysAgt_Enable_PROC mpSageEnableProc; // funktion to deactivate the system agent
SalIcon* mpFirstIcon; // icon cache, points to first icon, NULL if none
TempFontItem* mpTempFontItem;
sal_Bool mbThemeChanged; // true if visual theme was changed: throw away theme handles
sal_Bool mbThemeMenuSupport;
// for GdiPlus GdiplusStartup/GdiplusShutdown
ULONG_PTR gdiplusToken;
std::set< HMENU > mhMenuSet; // keeps track of menu handles created by VCL, used by IsKnownMenuHandle()
std::map< UINT,USHORT > maVKMap; // map some dynamic VK_* entries
oslModule maDwmLib;
DwmIsCompositionEnabled_ptr mpDwmIsCompositionEnabled;
};
inline void SetSalData( SalData* pData ) { ImplGetSVData()->mpSalData = (void*)pData; }
inline SalData* GetSalData() { return (SalData*)ImplGetSVData()->mpSalData; }
inline SalData* GetAppSalData() { return (SalData*)ImplGetAppSVData()->mpSalData; }
// --------------
// - SalShlData -
// --------------
struct SalShlData
{
HINSTANCE mhInst; // Instance of SAL-DLL
UINT mnWheelScrollLines; // WheelScrollLines
UINT mnWheelScrollChars; // WheelScrollChars
UINT mnWheelMsgId; // Wheel-Message-Id fuer W95
WORD mnVersion; // System-Version (311 == 3.11)
BOOL mbW40; // Is System-Version >= 4.0
BOOL mbWXP; // Windows XP
BOOL mbWPrinter; // true: use unicode printer functions
// false: use anis compat printer functions
OSVERSIONINFO maVersionInfo;
};
extern SalShlData aSalShlData;
// ------------
// - GDICache -
// ------------
#define CACHESIZE_HDC 3
#define CACHED_HDC_1 0
#define CACHED_HDC_2 1
#define CACHED_HDC_DRAW 2
#define CACHED_HDC_DEFEXT 64
struct HDCCache
{
HDC mhDC;
HPALETTE mhDefPal;
HBITMAP mhDefBmp;
HBITMAP mhSelBmp;
HBITMAP mhActBmp;
};
void ImplClearHDCCache( SalData* pData );
HDC ImplGetCachedDC( sal_uLong nID, HBITMAP hBmp = 0 );
void ImplReleaseCachedDC( sal_uLong nID );
bool ImplAddTempFont( SalData&, const String& rFontFileURL );
void ImplReleaseTempFonts( SalData& );
// --------------------------------------------
// - SALSHL.CXX - for accessing DLL resources -
// --------------------------------------------
HCURSOR ImplLoadSalCursor( int nId );
HBITMAP ImplLoadSalBitmap( int nId );
sal_Bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon );
// SALGDI.CXX
void ImplInitSalGDI();
void ImplFreeSalGDI();
// --------------
// - Prototypes -
// --------------
// \\WIN\SOURCE\APP\SALINST.CXX
void ImplSalYieldMutexAcquireWithWait();
sal_Bool ImplSalYieldMutexTryToAcquire();
void ImplSalYieldMutexAcquire();
void ImplSalYieldMutexRelease();
sal_uLong ImplSalReleaseYieldMutex();
void ImplSalAcquireYieldMutex( sal_uLong nCount );
sal_Bool ImplInterceptChildWindowKeyDown( MSG& rMsg );
// \\WIN\SOURCE\WINDOW\SALFRAME.CXX
LRESULT CALLBACK SalFrameWndProcA( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
LRESULT CALLBACK SalFrameWndProcW( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
// \SV\WIN\SOURCE\APP\SALTIMER.CXX
#define SALTIMERPROC_RECURSIVE 0xffffffff
void CALLBACK SalTimerProc( HWND hWnd, UINT nMsg, UINT_PTR nId, DWORD nTime );
// \WIN\SOURCE\WINDOW\SALFRAME.CXX
void SalTestMouseLeave();
sal_Bool ImplWriteLastError( DWORD lastError, const char *szApiCall );
// \WIN\SOURCE\WINDOW\SALFRAME.CXX
long ImplHandleSalObjKeyMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
long ImplHandleSalObjSysCharMsg( HWND hWnd, WPARAM wParam, LPARAM lParam );
sal_Bool ImplHandleGlobalMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT& rlResult );
// \WIN\SOURCE\WINDOW\SALOBJ.CXX
WinSalObject* ImplFindSalObject( HWND hWndChild );
sal_Bool ImplSalPreDispatchMsg( MSG* pMsg );
void ImplSalPostDispatchMsg( MSG* pMsg, LRESULT nDispatchResult );
// \WIN\SOURCE\GDI\SALGDI3.CXX
void ImplSalLogFontToFontA( HDC hDC, const LOGFONTA& rLogFont, Font& rFont );
void ImplSalLogFontToFontW( HDC hDC, const LOGFONTW& rLogFont, Font& rFont );
bool ImplIsFontAvailable( HDC hDC, const UniString& rName );
// \WIN\SOURCE\APP\SALDATA.CXX
rtl_TextEncoding ImplSalGetSystemEncoding();
ByteString ImplSalGetWinAnsiString( const UniString& rStr, sal_Bool bFileName = FALSE );
UniString ImplSalGetUniString( const sal_Char* pStr, xub_StrLen nLen = STRING_LEN );
int ImplSalWICompareAscii( const wchar_t* pStr1, const char* pStr2 );
// -----------
// - Defines -
// -----------
#define SAL_FRAME_WNDEXTRA sizeof( DWORD )
#define SAL_FRAME_THIS 0
#define SAL_FRAME_CLASSNAMEA "SALFRAME"
#define SAL_FRAME_CLASSNAMEW L"SALFRAME"
#define SAL_SUBFRAME_CLASSNAMEA "SALSUBFRAME"
#define SAL_SUBFRAME_CLASSNAMEW L"SALSUBFRAME"
#define SAL_TMPSUBFRAME_CLASSNAMEW L"SALTMPSUBFRAME"
#define SAL_OBJECT_WNDEXTRA sizeof( DWORD )
#define SAL_OBJECT_THIS 0
#define SAL_OBJECT_CLASSNAMEA "SALOBJECT"
#define SAL_OBJECT_CLASSNAMEW L"SALOBJECT"
#define SAL_OBJECT_CHILDCLASSNAMEA "SALOBJECTCHILD"
#define SAL_OBJECT_CHILDCLASSNAMEW L"SALOBJECTCHILD"
#define SAL_COM_CLASSNAMEA "SALCOMWND"
#define SAL_COM_CLASSNAMEW L"SALCOMWND"
#define SAL_MOUSELEAVE_TIMEOUT 300
// wParam == hDC; lParam == 0
#define SAL_MSG_PRINTABORTJOB (WM_USER+110)
// wParam == bWait; lParam == 0
#define SAL_MSG_THREADYIELD (WM_USER+111)
// wParam == 0; lParam == 0
#define SAL_MSG_RELEASEWAITYIELD (WM_USER+112)
// wParam == 0; lParam == nMS
#define SAL_MSG_STARTTIMER (WM_USER+113)
// wParam == nFrameStyle; lParam == pParent; lResult == pFrame
#define SAL_MSG_CREATEFRAME (WM_USER+114)
// wParam == 0; lParam == 0
#define SAL_MSG_DESTROYFRAME (WM_USER+115)
// wParam == 0; lParam == pParent; lResult == pObject
#define SAL_MSG_CREATEOBJECT (WM_USER+116)
// wParam == 0; lParam == pObject;
#define SAL_MSG_DESTROYOBJECT (WM_USER+117)
// wParam == hWnd; lParam == 0; lResult == hDC
#define SAL_MSG_GETDC (WM_USER+120)
// wParam == hWnd; lParam == 0
#define SAL_MSG_RELEASEDC (WM_USER+121)
// wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd
#define SAL_MSG_RECREATEHWND (WM_USER+122)
// wParam == newParentHwnd; lParam == oldHwnd; lResult == newhWnd
#define SAL_MSG_RECREATECHILDHWND (WM_USER+123)
// wParam == 0; lParam == HWND;
#define SAL_MSG_DESTROYHWND (WM_USER+124)
// wParam == 0; lParam == pData
#define SAL_MSG_USEREVENT (WM_USER+130)
// wParam == 0; lParam == MousePosition relativ to upper left of screen
#define SAL_MSG_MOUSELEAVE (WM_USER+131)
// NULL-Message, soll nicht verarbeitet werden
#define SAL_MSG_DUMMY (WM_USER+132)
// wParam == 0; lParam == 0
#define SAL_MSG_POSTFOCUS (WM_USER+133)
// wParam == wParam; lParam == lParam
#define SAL_MSG_POSTQUERYNEWPAL (WM_USER+134)
// wParam == wParam; lParam == lParam
#define SAL_MSG_POSTPALCHANGED (WM_USER+135)
// wParam == wParam; lParam == lParam
#define SAL_MSG_POSTMOVE (WM_USER+136)
// wParam == wParam; lParam == lParam
#define SAL_MSG_POSTCALLSIZE (WM_USER+137)
// wParam == pRECT; lParam == 0
#define SAL_MSG_POSTPAINT (WM_USER+138)
// wParam == 0; lParam == pFrame; lResult 0
#define SAL_MSG_FORCEPALETTE (WM_USER+139)
// wParam == 0; lParam == 0
#define SAL_MSG_CAPTUREMOUSE (WM_USER+140)
// wParam == 0; lParam == 0
#define SAL_MSG_RELEASEMOUSE (WM_USER+141)
// wParam == nFlags; lParam == 0
#define SAL_MSG_TOTOP (WM_USER+142)
// wParam == bVisible; lParam == 0
#define SAL_MSG_SHOW (WM_USER+143)
// wParam == 0; lParam == SalInputContext
#define SAL_MSG_SETINPUTCONTEXT (WM_USER+144)
// wParam == nFlags; lParam == 0
#define SAL_MSG_ENDEXTTEXTINPUT (WM_USER+145)
// POSTTIMER-Message; wparam = 0, lParam == time
#define SAL_MSG_POSTTIMER (WM_USER+161)
// SysChild-ToTop; wParam = 0; lParam = 0
#define SALOBJ_MSG_TOTOP (WM_USER+160)
// POSTFOCUS-Message; wParam == bFocus; lParam == 0
#define SALOBJ_MSG_POSTFOCUS (WM_USER+161)
// -----------------
// - Helpfunctions -
// -----------------
// A/W-Wrapper
LONG ImplSetWindowLong( HWND hWnd, int nIndex, DWORD dwNewLong );
LONG ImplGetWindowLong( HWND hWnd, int nIndex );
BOOL ImplPostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL ImplSendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL ImplGetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
BOOL ImplPeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );
LONG ImplDispatchMessage( CONST MSG *lpMsg );
inline void SetWindowPtr( HWND hWnd, WinSalFrame* pThis )
{
ImplSetWindowLong( hWnd, SAL_FRAME_THIS, (LONG)pThis );
}
inline WinSalFrame* GetWindowPtr( HWND hWnd )
{
return (WinSalFrame*)ImplGetWindowLong( hWnd, SAL_FRAME_THIS );
}
inline void SetSalObjWindowPtr( HWND hWnd, WinSalObject* pThis )
{
ImplSetWindowLong( hWnd, SAL_OBJECT_THIS, (LONG)pThis );
}
inline WinSalObject* GetSalObjWindowPtr( HWND hWnd )
{
return (WinSalObject*)ImplGetWindowLong( hWnd, SAL_OBJECT_THIS );
}
#endif // _SV_SALDATA_HXX