xref: /aoo4110/main/vcl/inc/unx/saldisp.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _SV_SALDISP_HXX
25*b1cdbd2cSJim Jagielski #define _SV_SALDISP_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // -=-= exports =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
28*b1cdbd2cSJim Jagielski class	SalDisplay;
29*b1cdbd2cSJim Jagielski class	SalColormap;
30*b1cdbd2cSJim Jagielski class	SalVisual;
31*b1cdbd2cSJim Jagielski class	SalXLib;
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski // -=-= #includes =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
34*b1cdbd2cSJim Jagielski #include <unx/salunx.h>
35*b1cdbd2cSJim Jagielski #include <vcl/salgtype.hxx>
36*b1cdbd2cSJim Jagielski #ifndef _SV_PTRSTYLE_HXX
37*b1cdbd2cSJim Jagielski #include <vcl/ptrstyle.hxx>
38*b1cdbd2cSJim Jagielski #endif
39*b1cdbd2cSJim Jagielski #include <sal/types.h>
40*b1cdbd2cSJim Jagielski #ifndef _OSL_MUTEX_H
41*b1cdbd2cSJim Jagielski #include <osl/mutex.h>
42*b1cdbd2cSJim Jagielski #endif
43*b1cdbd2cSJim Jagielski #include <vector>
44*b1cdbd2cSJim Jagielski #include <list>
45*b1cdbd2cSJim Jagielski #include <hash_map>
46*b1cdbd2cSJim Jagielski #include <tools/gen.hxx>
47*b1cdbd2cSJim Jagielski #include <salwtype.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <vclpluginapi.h>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski // -=-= forwards -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
52*b1cdbd2cSJim Jagielski class	BitmapPalette;
53*b1cdbd2cSJim Jagielski class	SalFrame;
54*b1cdbd2cSJim Jagielski class	ColorMask;
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski namespace vcl_sal { class WMAdaptor; }
57*b1cdbd2cSJim Jagielski class DtIntegrator;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski // -=-= #defines -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
60*b1cdbd2cSJim Jagielski #define PROPERTY_SUPPORT_WM_SetPos				0x00000001
61*b1cdbd2cSJim Jagielski #define PROPERTY_SUPPORT_WM_Screen				0x00000002
62*b1cdbd2cSJim Jagielski #define PROPERTY_SUPPORT_WM_Parent_Pixmap_None	0x00000004
63*b1cdbd2cSJim Jagielski #define PROPERTY_SUPPORT_WM_ClientPos			0x00000008
64*b1cdbd2cSJim Jagielski #define	PROPERTY_SUPPORT_XSetClipMask			0x00000010	// for bitmap ops.
65*b1cdbd2cSJim Jagielski #define	PROPERTY_SUPPORT_3ButtonMouse			0x00000020
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_XA_FAMILY_NAME_nil			0x00001000
68*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_XCopyArea_GXxor			0x00002000	// from window
69*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_Stipple					0x00004000	// 0/1 inverted
70*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_Tile                       0x00008000  // Recreate the
71*b1cdbd2cSJim Jagielski                                             // dither brush each time
72*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_FillPolygon_Tile           0x00010000  // always Toggle Fillstyle
73*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_DrawLine			        0x00020000  // a DrawLine is one point to short
74*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_CopyPlane_RevertBWPixel	0x00040000  // revert fg and bg for xcopyplane
75*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_CopyArea_OnlySmallSlices	0x00080000
76*b1cdbd2cSJim Jagielski #define PROPERTY_BUG_Bitmap_Bit_Order			0x00100000
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski #define	PROPERTY_FEATURE_Maximize				0x01000000
79*b1cdbd2cSJim Jagielski #define PROPERTY_FEATURE_SharedMemory           0x02000000
80*b1cdbd2cSJim Jagielski #define PROPERTY_FEATURE_TrustedSolaris         0x04000000
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #define	PROPERTY_DEFAULT						0x00000FCB
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski // ------------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski // server vendor
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski typedef enum  {
88*b1cdbd2cSJim Jagielski 	vendor_none = 0,
89*b1cdbd2cSJim Jagielski 	vendor_attachmate,
90*b1cdbd2cSJim Jagielski 	vendor_excursion,
91*b1cdbd2cSJim Jagielski 	vendor_hp,
92*b1cdbd2cSJim Jagielski 	vendor_hummingbird,
93*b1cdbd2cSJim Jagielski 	vendor_ibm,
94*b1cdbd2cSJim Jagielski 	vendor_sco,
95*b1cdbd2cSJim Jagielski 	vendor_sgi,
96*b1cdbd2cSJim Jagielski 	vendor_sun,
97*b1cdbd2cSJim Jagielski 	vendor_xfree,
98*b1cdbd2cSJim Jagielski 	vendor_xinside,
99*b1cdbd2cSJim Jagielski 	vendor_xprinter,
100*b1cdbd2cSJim Jagielski 	vendor_unknown
101*b1cdbd2cSJim Jagielski } srv_vendor_t;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski extern "C" srv_vendor_t sal_GetServerVendor( Display *p_display );
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski // -=-= SalWM =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
106*b1cdbd2cSJim Jagielski enum SalWM { olwm,		// Open Look
107*b1cdbd2cSJim Jagielski 			 mwm, 		// Motif
108*b1cdbd2cSJim Jagielski 			 kwm,		// KDE Desktop Environment
109*b1cdbd2cSJim Jagielski 			 FourDwm,	// SGI
110*b1cdbd2cSJim Jagielski 			 vuewm,		// HP
111*b1cdbd2cSJim Jagielski 			 dtwm,		// CDE
112*b1cdbd2cSJim Jagielski 			 winmgr,	// Oracle NC
113*b1cdbd2cSJim Jagielski 			 twm,
114*b1cdbd2cSJim Jagielski 			 fvwm,		// ...
115*b1cdbd2cSJim Jagielski 			 pmwm,		// SCO
116*b1cdbd2cSJim Jagielski              otherwm };
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski // -=-= SalRGB -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
119*b1cdbd2cSJim Jagielski // MSB/Bigendian Sicht (SalColor == RGB, r=0xFF0000, g=0xFF00, b=0xFF)
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski enum SalRGB { RGB,  RBG,
122*b1cdbd2cSJim Jagielski 			  GBR,  GRB,
123*b1cdbd2cSJim Jagielski 			  BGR,  BRG,
124*b1cdbd2cSJim Jagielski 			  RGBA,	RBGA,
125*b1cdbd2cSJim Jagielski 			  GBRA, GRBA,
126*b1cdbd2cSJim Jagielski 			  BGRA, BRGA,
127*b1cdbd2cSJim Jagielski               otherSalRGB };
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski // -=-= SalVisual =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
130*b1cdbd2cSJim Jagielski class SalVisual : public XVisualInfo
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski     SalRGB			eRGBMode_;
133*b1cdbd2cSJim Jagielski     int				nRedShift_;
134*b1cdbd2cSJim Jagielski     int				nGreenShift_;
135*b1cdbd2cSJim Jagielski     int				nBlueShift_;
136*b1cdbd2cSJim Jagielski     int				nRedBits_;
137*b1cdbd2cSJim Jagielski     int				nGreenBits_;
138*b1cdbd2cSJim Jagielski     int				nBlueBits_;
139*b1cdbd2cSJim Jagielski public:
140*b1cdbd2cSJim Jagielski                             SalVisual();
141*b1cdbd2cSJim Jagielski 							~SalVisual();
142*b1cdbd2cSJim Jagielski 							SalVisual( const XVisualInfo* pXVI );
143*b1cdbd2cSJim Jagielski 
GetVisualId() const144*b1cdbd2cSJim Jagielski 	inline	VisualID		GetVisualId() const { return visualid; }
GetVisual() const145*b1cdbd2cSJim Jagielski 	inline	Visual		   *GetVisual() const { return visual; }
GetClass() const146*b1cdbd2cSJim Jagielski 	inline	int				GetClass() const { return c_class; }
GetDepth() const147*b1cdbd2cSJim Jagielski 	inline	int				GetDepth() const { return depth; }
GetMode() const148*b1cdbd2cSJim Jagielski 	inline  SalRGB			GetMode() const { return eRGBMode_; }
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 			Pixel			GetTCPixel( SalColor nColor ) const;
151*b1cdbd2cSJim Jagielski 			SalColor		GetTCColor( Pixel nPixel ) const;
152*b1cdbd2cSJim Jagielski             sal_Bool			Convert( int &n0, int &n1, int &n2, int &n3 ); // 32bit
153*b1cdbd2cSJim Jagielski          	sal_Bool			Convert( int &n0, int &n1, int &n2 ); // 24bit
154*b1cdbd2cSJim Jagielski };
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski // -=-= SalColormap =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
157*b1cdbd2cSJim Jagielski class SalColormap
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski     const SalDisplay*       m_pDisplay;
160*b1cdbd2cSJim Jagielski     Colormap                m_hColormap;
161*b1cdbd2cSJim Jagielski     std::vector<SalColor>   m_aPalette;			// Pseudocolor
162*b1cdbd2cSJim Jagielski     SalVisual               m_aVisual;
163*b1cdbd2cSJim Jagielski     std::vector<sal_uInt16>     m_aLookupTable;		// Pseudocolor: 12bit reduction
164*b1cdbd2cSJim Jagielski     Pixel                   m_nWhitePixel;
165*b1cdbd2cSJim Jagielski     Pixel                   m_nBlackPixel;
166*b1cdbd2cSJim Jagielski     Pixel                   m_nUsed;			// Pseudocolor
167*b1cdbd2cSJim Jagielski     int                     m_nScreen;
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski     void			GetPalette();
170*b1cdbd2cSJim Jagielski     void			GetLookupTable();
171*b1cdbd2cSJim Jagielski public:
172*b1cdbd2cSJim Jagielski     SalColormap( const SalDisplay*  pSalDisplay,
173*b1cdbd2cSJim Jagielski                  Colormap           hColormap,
174*b1cdbd2cSJim Jagielski                  int                nScreen );
175*b1cdbd2cSJim Jagielski     SalColormap( const BitmapPalette &rpPalette );
176*b1cdbd2cSJim Jagielski     SalColormap( sal_uInt16             nDepth );
177*b1cdbd2cSJim Jagielski     SalColormap();
178*b1cdbd2cSJim Jagielski 	~SalColormap();
179*b1cdbd2cSJim Jagielski 
GetXColormap() const180*b1cdbd2cSJim Jagielski 	inline	Colormap		    GetXColormap() const { return m_hColormap; }
GetDisplay() const181*b1cdbd2cSJim Jagielski 	inline	const SalDisplay*   GetDisplay() const { return m_pDisplay; }
182*b1cdbd2cSJim Jagielski 	inline	Display*            GetXDisplay() const;
GetVisual() const183*b1cdbd2cSJim Jagielski 	inline	const SalVisual&    GetVisual() const { return m_aVisual; }
GetXVisual() const184*b1cdbd2cSJim Jagielski 	inline	Visual*             GetXVisual() const { return m_aVisual.GetVisual(); }
GetWhitePixel() const185*b1cdbd2cSJim Jagielski 	inline	Pixel			    GetWhitePixel() const { return m_nWhitePixel; }
GetBlackPixel() const186*b1cdbd2cSJim Jagielski 	inline	Pixel			    GetBlackPixel() const { return m_nBlackPixel; }
GetUsed() const187*b1cdbd2cSJim Jagielski 	inline	Pixel			    GetUsed() const { return m_nUsed; }
GetClass() const188*b1cdbd2cSJim Jagielski 	inline	int				    GetClass() const { return m_aVisual.GetClass(); }
GetScreenNumber() const189*b1cdbd2cSJim Jagielski     inline  int                 GetScreenNumber() const { return m_nScreen; }
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski     sal_Bool			GetXPixels( XColor  &rColor,
192*b1cdbd2cSJim Jagielski                                 int      r,
193*b1cdbd2cSJim Jagielski                                 int      g,
194*b1cdbd2cSJim Jagielski                                 int      b ) const;
195*b1cdbd2cSJim Jagielski 	inline	sal_Bool			GetXPixel( XColor  &rColor,
196*b1cdbd2cSJim Jagielski 									   int      r,
197*b1cdbd2cSJim Jagielski 									   int      g,
198*b1cdbd2cSJim Jagielski 									   int      b ) const;
199*b1cdbd2cSJim Jagielski     Pixel			GetPixel( SalColor nColor ) const;
200*b1cdbd2cSJim Jagielski     SalColor		GetColor( Pixel nPixel ) const;
201*b1cdbd2cSJim Jagielski     void			SetPalette( const BitmapPalette &rPalette );
202*b1cdbd2cSJim Jagielski };
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski // -=-= SalXLib =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
205*b1cdbd2cSJim Jagielski typedef int(*YieldFunc)(int fd, void* data);
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski class VCLPLUG_GEN_PUBLIC SalXLib
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski protected:
210*b1cdbd2cSJim Jagielski     timeval			m_aTimeout;
211*b1cdbd2cSJim Jagielski     sal_uLong           m_nTimeoutMS;
212*b1cdbd2cSJim Jagielski 	int             m_pTimeoutFDS[2];
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     bool			m_bHaveSystemChildFrames;
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     int				nFDs_;
217*b1cdbd2cSJim Jagielski     fd_set	        aReadFDS_;
218*b1cdbd2cSJim Jagielski     fd_set	        aExceptionFDS_;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     struct XErrorStackEntry
222*b1cdbd2cSJim Jagielski     {
223*b1cdbd2cSJim Jagielski         bool            m_bIgnore;
224*b1cdbd2cSJim Jagielski         bool            m_bWas;
225*b1cdbd2cSJim Jagielski         unsigned int    m_nLastErrorRequest;
226*b1cdbd2cSJim Jagielski         XErrorHandler   m_aHandler;
227*b1cdbd2cSJim Jagielski     };
228*b1cdbd2cSJim Jagielski     std::vector< XErrorStackEntry > m_aXErrorHandlerStack;
229*b1cdbd2cSJim Jagielski     XIOErrorHandler m_aOrigXIOErrorHandler;
230*b1cdbd2cSJim Jagielski public:
231*b1cdbd2cSJim Jagielski     SalXLib();
232*b1cdbd2cSJim Jagielski     virtual			~SalXLib();
233*b1cdbd2cSJim Jagielski     virtual void		Init();
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     virtual void		Yield( bool bWait, bool bHandleAllCurrentEvents );
236*b1cdbd2cSJim Jagielski     virtual void        Wakeup();
237*b1cdbd2cSJim Jagielski     virtual void		PostUserEvent();
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski     virtual void    Insert( int fd, void* data,
240*b1cdbd2cSJim Jagielski                             YieldFunc	pending,
241*b1cdbd2cSJim Jagielski                             YieldFunc	queued,
242*b1cdbd2cSJim Jagielski                             YieldFunc	handle );
243*b1cdbd2cSJim Jagielski     virtual void    Remove( int fd );
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski     void			XError( Display *pDisp, XErrorEvent *pEvent );
HasXErrorOccured() const246*b1cdbd2cSJim Jagielski     bool            HasXErrorOccured() const { return m_aXErrorHandlerStack.back().m_bWas; }
GetLastXErrorRequestCode() const247*b1cdbd2cSJim Jagielski     unsigned int    GetLastXErrorRequestCode() const { return m_aXErrorHandlerStack.back().m_nLastErrorRequest; }
ResetXErrorOccured()248*b1cdbd2cSJim Jagielski     void            ResetXErrorOccured() { m_aXErrorHandlerStack.back().m_bWas = false; }
249*b1cdbd2cSJim Jagielski     void PushXErrorLevel( bool bIgnore );
250*b1cdbd2cSJim Jagielski     void PopXErrorLevel();
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	virtual void			StartTimer( sal_uLong nMS );
253*b1cdbd2cSJim Jagielski 	virtual void			StopTimer();
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski     bool            CheckTimeout( bool bExecuteTimers = true );
256*b1cdbd2cSJim Jagielski 
setHaveSystemChildFrame()257*b1cdbd2cSJim Jagielski     void			setHaveSystemChildFrame()
258*b1cdbd2cSJim Jagielski     { m_bHaveSystemChildFrames = true; }
getHaveSystemChildFrame() const259*b1cdbd2cSJim Jagielski     bool            getHaveSystemChildFrame() const
260*b1cdbd2cSJim Jagielski     { return m_bHaveSystemChildFrames; }
261*b1cdbd2cSJim Jagielski };
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski // -=-= SalDisplay -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski class SalI18N_InputMethod;
266*b1cdbd2cSJim Jagielski class SalI18N_KeyboardExtension;
267*b1cdbd2cSJim Jagielski class AttributeProvider;
268*b1cdbd2cSJim Jagielski class SalUnicodeConverter;
269*b1cdbd2cSJim Jagielski class SalConverterCache;
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski extern "C" {
272*b1cdbd2cSJim Jagielski     struct SnDisplay;
273*b1cdbd2cSJim Jagielski     struct SnLauncheeContext;
274*b1cdbd2cSJim Jagielski     typedef Bool(*X_if_predicate)(Display*,XEvent*,XPointer);
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski class VCLPLUG_GEN_PUBLIC SalDisplay
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski public:
280*b1cdbd2cSJim Jagielski     struct RenderEntry
281*b1cdbd2cSJim Jagielski     {
282*b1cdbd2cSJim Jagielski         Pixmap      m_aPixmap;
283*b1cdbd2cSJim Jagielski         Picture     m_aPicture;
284*b1cdbd2cSJim Jagielski 
RenderEntrySalDisplay::RenderEntry285*b1cdbd2cSJim Jagielski         RenderEntry() : m_aPixmap( 0 ), m_aPicture( 0 ) {}
286*b1cdbd2cSJim Jagielski     };
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski     typedef std::hash_map<int,RenderEntry> RenderEntryMap;
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski     struct ScreenData
291*b1cdbd2cSJim Jagielski     {
292*b1cdbd2cSJim Jagielski         bool                m_bInit;
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski         XLIB_Window         m_aRoot;
295*b1cdbd2cSJim Jagielski         XLIB_Window         m_aRefWindow;
296*b1cdbd2cSJim Jagielski         Size                m_aSize;
297*b1cdbd2cSJim Jagielski         SalVisual           m_aVisual;
298*b1cdbd2cSJim Jagielski         SalColormap         m_aColormap;
299*b1cdbd2cSJim Jagielski         GC				    m_aMonoGC;
300*b1cdbd2cSJim Jagielski         GC				    m_aCopyGC;
301*b1cdbd2cSJim Jagielski         GC				    m_aAndInvertedGC;
302*b1cdbd2cSJim Jagielski         GC				    m_aAndGC;
303*b1cdbd2cSJim Jagielski         GC				    m_aOrGC;
304*b1cdbd2cSJim Jagielski         GC			        m_aStippleGC;
305*b1cdbd2cSJim Jagielski         Pixmap			    m_hInvert50;
306*b1cdbd2cSJim Jagielski         mutable RenderEntryMap m_aRenderData;
307*b1cdbd2cSJim Jagielski 
ScreenDataSalDisplay::ScreenData308*b1cdbd2cSJim Jagielski         ScreenData() :
309*b1cdbd2cSJim Jagielski         m_bInit( false ),
310*b1cdbd2cSJim Jagielski         m_aRoot( None ),
311*b1cdbd2cSJim Jagielski         m_aRefWindow( None ),
312*b1cdbd2cSJim Jagielski         m_aMonoGC( None ),
313*b1cdbd2cSJim Jagielski         m_aCopyGC( None ),
314*b1cdbd2cSJim Jagielski         m_aAndInvertedGC( None ),
315*b1cdbd2cSJim Jagielski         m_aAndGC( None ),
316*b1cdbd2cSJim Jagielski         m_aOrGC( None ),
317*b1cdbd2cSJim Jagielski         m_aStippleGC( None ),
318*b1cdbd2cSJim Jagielski         m_hInvert50( None ),
319*b1cdbd2cSJim Jagielski         m_aRenderData( 1 )
320*b1cdbd2cSJim Jagielski         {}
321*b1cdbd2cSJim Jagielski     };
322*b1cdbd2cSJim Jagielski // -=-= UserEvent =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
323*b1cdbd2cSJim Jagielski     struct SalUserEvent
324*b1cdbd2cSJim Jagielski     {
325*b1cdbd2cSJim Jagielski         SalFrame*		m_pFrame;
326*b1cdbd2cSJim Jagielski         void*			m_pData;
327*b1cdbd2cSJim Jagielski         sal_uInt16			m_nEvent;
328*b1cdbd2cSJim Jagielski 
SalUserEventSalDisplay::SalUserEvent329*b1cdbd2cSJim Jagielski         SalUserEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent = SALEVENT_USEREVENT )
330*b1cdbd2cSJim Jagielski                 : m_pFrame( pFrame ),
331*b1cdbd2cSJim Jagielski                   m_pData( pData ),
332*b1cdbd2cSJim Jagielski                   m_nEvent( nEvent )
333*b1cdbd2cSJim Jagielski         {}
334*b1cdbd2cSJim Jagielski     };
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski protected:
337*b1cdbd2cSJim Jagielski     SalXLib		   *pXLib_;
338*b1cdbd2cSJim Jagielski     SalI18N_InputMethod			*mpInputMethod;
339*b1cdbd2cSJim Jagielski     SalI18N_KeyboardExtension	*mpKbdExtension;
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski     AttributeProvider 			*mpFactory;
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     Display		   *pDisp_;				// X Display
344*b1cdbd2cSJim Jagielski     int				m_nDefaultScreen;			// XDefaultScreen
345*b1cdbd2cSJim Jagielski     std::vector< ScreenData >    m_aScreens;
346*b1cdbd2cSJim Jagielski     ScreenData      m_aInvalidScreenData;
347*b1cdbd2cSJim Jagielski     Pair			aResolution_;		// [dpi]
348*b1cdbd2cSJim Jagielski     bool			mbExactResolution;
349*b1cdbd2cSJim Jagielski     sal_uLong			nMaxRequestSize_;	// [byte]
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski     srv_vendor_t	meServerVendor;
352*b1cdbd2cSJim Jagielski     SalWM			eWindowManager_;
353*b1cdbd2cSJim Jagielski     sal_uLong			nProperties_;		// PROPERTY_SUPPORT, BUG, FEATURE
354*b1cdbd2cSJim Jagielski     sal_Bool			bLocal_;			// Server==Client? Init
355*b1cdbd2cSJim Jagielski     // in SalDisplay::IsLocal()
356*b1cdbd2cSJim Jagielski     sal_Bool			mbLocalIsValid;		// bLocal_ is valid ?
357*b1cdbd2cSJim Jagielski     // until x bytes
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski     oslMutex        hEventGuard_;
360*b1cdbd2cSJim Jagielski     std::list< SalUserEvent > m_aUserEvents;
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski     XLIB_Cursor		aPointerCache_[POINTER_COUNT];
363*b1cdbd2cSJim Jagielski     SalFrame*		m_pCapture;
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     // Keyboard
366*b1cdbd2cSJim Jagielski     sal_Bool			bNumLockFromXS_;	// Num Lock handled by X Server
367*b1cdbd2cSJim Jagielski     int				nNumLockIndex_;		// modifier index in modmap
368*b1cdbd2cSJim Jagielski     int				nNumLockMask_;		// keyevent state mask for
369*b1cdbd2cSJim Jagielski     KeySym			nShiftKeySym_;		// first shift modifier
370*b1cdbd2cSJim Jagielski     KeySym			nCtrlKeySym_;		// first control modifier
371*b1cdbd2cSJim Jagielski     KeySym			nMod1KeySym_;		// first mod1 modifier
372*b1cdbd2cSJim Jagielski     ByteString		m_aKeyboardName;
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski     vcl_sal::WMAdaptor*	m_pWMAdaptor;
375*b1cdbd2cSJim Jagielski     DtIntegrator*       m_pDtIntegrator;
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski     bool			m_bXinerama;
378*b1cdbd2cSJim Jagielski     std::vector< Rectangle > m_aXineramaScreens;
379*b1cdbd2cSJim Jagielski     std::list<SalFrame*> m_aFrames;
380*b1cdbd2cSJim Jagielski     std::list<SalObject*> m_aSalObjects;
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski     bool            m_bUseRandRWrapper; // don't use randr on gtk, use gdk signals there
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     mutable XLIB_Time  m_nLastUserEventTime; // mutable because changed on first access
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     virtual long	Dispatch( XEvent *pEvent ) = 0;
387*b1cdbd2cSJim Jagielski     void			InitXinerama();
388*b1cdbd2cSJim Jagielski     void            InitRandR( XLIB_Window aRoot ) const;
389*b1cdbd2cSJim Jagielski     void            DeInitRandR();
390*b1cdbd2cSJim Jagielski     int             processRandREvent( XEvent* );
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     void			doDestruct();
393*b1cdbd2cSJim Jagielski     int             addXineramaScreenUnique( long i_nX, long i_nY, long i_nWidth, long i_nHeight );
394*b1cdbd2cSJim Jagielski public:
395*b1cdbd2cSJim Jagielski 	static	SalDisplay	   *GetSalDisplay( Display* display );
396*b1cdbd2cSJim Jagielski 	static	sal_Bool			BestVisual( Display     *pDisp,
397*b1cdbd2cSJim Jagielski 										int          nScreen,
398*b1cdbd2cSJim Jagielski 										XVisualInfo &rVI );
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 							SalDisplay( Display* pDisp );
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski     virtual ~SalDisplay();
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski     virtual void			registerFrame( SalFrame* pFrame );
406*b1cdbd2cSJim Jagielski     virtual void			deregisterFrame( SalFrame* pFrame );
setHaveSystemChildFrame() const407*b1cdbd2cSJim Jagielski     void					setHaveSystemChildFrame() const
408*b1cdbd2cSJim Jagielski     { pXLib_->setHaveSystemChildFrame(); }
getHaveSystemChildFrame() const409*b1cdbd2cSJim Jagielski     bool                    getHaveSystemChildFrame() const
410*b1cdbd2cSJim Jagielski     { return pXLib_->getHaveSystemChildFrame(); }
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski     void			Init();
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski     void			SendInternalEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent = SALEVENT_USEREVENT );
415*b1cdbd2cSJim Jagielski     void            CancelInternalEvent( SalFrame* pFrame, void* pData, sal_uInt16 nEvent );
416*b1cdbd2cSJim Jagielski     bool			DispatchInternalEvent();
417*b1cdbd2cSJim Jagielski     void			PrintInfo() const;
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski     void			PrintEvent( const ByteString &rComment,
420*b1cdbd2cSJim Jagielski                                 XEvent       *pEvent ) const;
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski     void			Beep() const;
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski     void			ModifierMapping();
425*b1cdbd2cSJim Jagielski     String			GetKeyNameFromKeySym( KeySym keysym ) const;
426*b1cdbd2cSJim Jagielski     XubString		GetKeyName( sal_uInt16 nKeyCode ) const;
427*b1cdbd2cSJim Jagielski     sal_uInt16			GetKeyCode( KeySym keysym, char*pcPrintable ) const;
428*b1cdbd2cSJim Jagielski     KeySym			GetKeySym( XKeyEvent      *pEvent,
429*b1cdbd2cSJim Jagielski                                unsigned char  *pPrintable,
430*b1cdbd2cSJim Jagielski                                int			  *pLen,
431*b1cdbd2cSJim Jagielski                                KeySym         *pUnmodifiedKeySym,
432*b1cdbd2cSJim Jagielski                                Status         *pStatus,
433*b1cdbd2cSJim Jagielski                                XIC = NULL ) const;
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski     XLIB_Cursor		GetPointer( int ePointerStyle );
436*b1cdbd2cSJim Jagielski     virtual int	CaptureMouse( SalFrame *pCapture );
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski     sal_Bool			IsLocal();
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     void			Remove( XEvent   *pEvent );
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski     virtual void          initScreen( int nScreen ) const;
getDataForScreen(int nScreen) const443*b1cdbd2cSJim Jagielski     const ScreenData&     getDataForScreen( int nScreen ) const
444*b1cdbd2cSJim Jagielski     {
445*b1cdbd2cSJim Jagielski         if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) )
446*b1cdbd2cSJim Jagielski             return m_aInvalidScreenData;
447*b1cdbd2cSJim Jagielski         if( ! m_aScreens[nScreen].m_bInit )
448*b1cdbd2cSJim Jagielski             initScreen( nScreen );
449*b1cdbd2cSJim Jagielski         return m_aScreens[nScreen];
450*b1cdbd2cSJim Jagielski     }
451*b1cdbd2cSJim Jagielski 
GetDrawable(int nScreen) const452*b1cdbd2cSJim Jagielski 	XLIB_Window		GetDrawable( int nScreen ) const { return getDataForScreen( nScreen ).m_aRefWindow; }
GetDisplay() const453*b1cdbd2cSJim Jagielski 	Display		   *GetDisplay() const { return pDisp_; }
GetDefaultScreenNumber() const454*b1cdbd2cSJim Jagielski 	int				GetDefaultScreenNumber() const { return m_nDefaultScreen; }
GetDefaultMonitorNumber() const455*b1cdbd2cSJim Jagielski 	virtual int		GetDefaultMonitorNumber() const { return 0; }
GetScreenSize(int nScreen) const456*b1cdbd2cSJim Jagielski     const Size&     GetScreenSize( int nScreen ) const { return getDataForScreen( nScreen ).m_aSize; }
GetServerVendor() const457*b1cdbd2cSJim Jagielski 	srv_vendor_t	GetServerVendor() const { return meServerVendor; }
SetServerVendor()458*b1cdbd2cSJim Jagielski 	void			SetServerVendor() { meServerVendor = sal_GetServerVendor(pDisp_); }
IsDisplay() const459*b1cdbd2cSJim Jagielski 	sal_Bool			IsDisplay() const { return !!pXLib_; }
GetMonoGC(int nScreen) const460*b1cdbd2cSJim Jagielski 	GC				GetMonoGC( int nScreen ) const { return getDataForScreen(nScreen).m_aMonoGC; }
GetCopyGC(int nScreen) const461*b1cdbd2cSJim Jagielski 	GC				GetCopyGC( int nScreen ) const { return getDataForScreen(nScreen).m_aCopyGC; }
GetAndInvertedGC(int nScreen) const462*b1cdbd2cSJim Jagielski 	GC				GetAndInvertedGC( int nScreen ) const { return getDataForScreen(nScreen).m_aAndInvertedGC; }
GetAndGC(int nScreen) const463*b1cdbd2cSJim Jagielski 	GC				GetAndGC( int nScreen ) const { return getDataForScreen(nScreen).m_aAndGC; }
GetOrGC(int nScreen) const464*b1cdbd2cSJim Jagielski 	GC				GetOrGC( int nScreen ) const { return getDataForScreen(nScreen).m_aOrGC; }
GetStippleGC(int nScreen) const465*b1cdbd2cSJim Jagielski 	GC				GetStippleGC( int nScreen ) const { return getDataForScreen(nScreen).m_aStippleGC; }
466*b1cdbd2cSJim Jagielski 	GC				GetGC( sal_uInt16 nDepth, int nScreen ) const;
GetInvert50(int nScreen) const467*b1cdbd2cSJim Jagielski 	Pixmap			GetInvert50( int nScreen ) const { return getDataForScreen(nScreen).m_hInvert50; }
GetColormap(int nScreen) const468*b1cdbd2cSJim Jagielski 	const SalColormap&    GetColormap( int nScreen ) const { return getDataForScreen(nScreen).m_aColormap; }
GetVisual(int nScreen) const469*b1cdbd2cSJim Jagielski 	const SalVisual&      GetVisual( int nScreen ) const { return getDataForScreen(nScreen).m_aVisual; }
GetRenderEntries(int nScreen) const470*b1cdbd2cSJim Jagielski 	RenderEntryMap&       GetRenderEntries( int nScreen ) const { return getDataForScreen(nScreen).m_aRenderData; }
GetResolution() const471*b1cdbd2cSJim Jagielski 	const Pair	   &GetResolution() const { return aResolution_; }
GetExactResolution() const472*b1cdbd2cSJim Jagielski     bool			GetExactResolution() const { return mbExactResolution; }
GetProperties() const473*b1cdbd2cSJim Jagielski 	sal_uLong			GetProperties() const { return nProperties_; }
GetMaxRequestSize() const474*b1cdbd2cSJim Jagielski 	sal_uLong			GetMaxRequestSize() const { return nMaxRequestSize_; }
475*b1cdbd2cSJim Jagielski     XLIB_Time       GetLastUserEventTime( bool bAlwaysReget = false ) const;
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski     bool            XIfEventWithTimeout( XEvent*, XPointer, X_if_predicate, long i_nTimeout = 1000 ) const;
478*b1cdbd2cSJim Jagielski 
MouseCaptured(const SalFrame * pFrameData) const479*b1cdbd2cSJim Jagielski 	sal_Bool			MouseCaptured( const SalFrame *pFrameData ) const
480*b1cdbd2cSJim Jagielski     { return m_pCapture == pFrameData; }
GetCaptureFrame() const481*b1cdbd2cSJim Jagielski     SalFrame*	GetCaptureFrame() const
482*b1cdbd2cSJim Jagielski     { return m_pCapture; }
GetXLib() const483*b1cdbd2cSJim Jagielski 	SalXLib*         GetXLib() const { return pXLib_; }
484*b1cdbd2cSJim Jagielski 
GetInputMethod() const485*b1cdbd2cSJim Jagielski 	SalI18N_InputMethod*			GetInputMethod()  const { return mpInputMethod;  }
GetKbdExtension() const486*b1cdbd2cSJim Jagielski 	SalI18N_KeyboardExtension* 	GetKbdExtension() const { return mpKbdExtension; }
SetInputMethod(SalI18N_InputMethod * pInputMethod)487*b1cdbd2cSJim Jagielski 	void 			SetInputMethod( SalI18N_InputMethod *pInputMethod )
488*b1cdbd2cSJim Jagielski     { mpInputMethod = pInputMethod; }
SetKbdExtension(SalI18N_KeyboardExtension * pKbdExtension)489*b1cdbd2cSJim Jagielski 	void			SetKbdExtension(SalI18N_KeyboardExtension *pKbdExtension)
490*b1cdbd2cSJim Jagielski     { mpKbdExtension = pKbdExtension; }
491*b1cdbd2cSJim Jagielski 	const char*	GetKeyboardName( sal_Bool bRefresh = sal_False );
getWMAdaptor() const492*b1cdbd2cSJim Jagielski     ::vcl_sal::WMAdaptor* getWMAdaptor() const { return m_pWMAdaptor; }
getDtIntegrator() const493*b1cdbd2cSJim Jagielski     DtIntegrator* getDtIntegrator() const { return m_pDtIntegrator; }
IsXinerama() const494*b1cdbd2cSJim Jagielski     bool			IsXinerama() const { return m_bXinerama; }
GetXineramaScreens() const495*b1cdbd2cSJim Jagielski     const std::vector< Rectangle >& GetXineramaScreens() const { return m_aXineramaScreens; }
GetRootWindow(int nScreen) const496*b1cdbd2cSJim Jagielski     XLIB_Window     GetRootWindow( int nScreen ) const
497*b1cdbd2cSJim Jagielski     { return getDataForScreen( nScreen ).m_aRoot; }
GetScreenData()498*b1cdbd2cSJim Jagielski     const std::vector< ScreenData >& GetScreenData()
499*b1cdbd2cSJim Jagielski     { return m_aScreens; }
GetScreenCount() const500*b1cdbd2cSJim Jagielski     int GetScreenCount() const { return static_cast<int>(m_aScreens.size()); }
501*b1cdbd2cSJim Jagielski 
getFrames() const502*b1cdbd2cSJim Jagielski     const std::list< SalFrame* >& getFrames() const
503*b1cdbd2cSJim Jagielski     { return m_aFrames; }
504*b1cdbd2cSJim Jagielski 
IsNumLockFromXS() const505*b1cdbd2cSJim Jagielski     sal_Bool            IsNumLockFromXS() const { return bNumLockFromXS_; }
506*b1cdbd2cSJim Jagielski 
getSalObjects()507*b1cdbd2cSJim Jagielski     std::list< SalObject* >& getSalObjects() { return m_aSalObjects; }
508*b1cdbd2cSJim Jagielski };
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski // -=-= inlines =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
511*b1cdbd2cSJim Jagielski 
GetGC(sal_uInt16 nDepth,int nScreen) const512*b1cdbd2cSJim Jagielski inline GC SalDisplay::GetGC( sal_uInt16 nDepth, int nScreen ) const
513*b1cdbd2cSJim Jagielski { return 1 == nDepth
514*b1cdbd2cSJim Jagielski 	     ? GetMonoGC( nScreen )
515*b1cdbd2cSJim Jagielski 	     : getDataForScreen(nScreen).m_aVisual.GetDepth() == nDepth
516*b1cdbd2cSJim Jagielski 	       ? GetCopyGC( nScreen )
517*b1cdbd2cSJim Jagielski 	       : None; }
518*b1cdbd2cSJim Jagielski 
GetXDisplay() const519*b1cdbd2cSJim Jagielski inline	Display	*SalColormap::GetXDisplay() const
520*b1cdbd2cSJim Jagielski { return m_pDisplay->GetDisplay(); }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski class VCLPLUG_GEN_PUBLIC SalX11Display : public SalDisplay
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski public:
525*b1cdbd2cSJim Jagielski 		     SalX11Display( Display* pDisp );
526*b1cdbd2cSJim Jagielski     virtual ~SalX11Display();
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski     virtual long		Dispatch( XEvent *pEvent );
529*b1cdbd2cSJim Jagielski     virtual void		Yield();
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski     sal_Bool	 IsEvent();
532*b1cdbd2cSJim Jagielski };
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski /*----------------------------------------------------------
535*b1cdbd2cSJim Jagielski  keep track of correct size of the initial window
536*b1cdbd2cSJim Jagielski  */
537*b1cdbd2cSJim Jagielski // get foreign key names
538*b1cdbd2cSJim Jagielski namespace vcl_sal {
539*b1cdbd2cSJim Jagielski 	String getKeysymReplacementName(
540*b1cdbd2cSJim Jagielski 		const char* pKeyboard,
541*b1cdbd2cSJim Jagielski 		KeySym nSymbol );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski #endif // _SV_SALDISP_HXX
546