Line data Source code
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 : #ifndef _SV_SALDISP_HXX
21 : #define _SV_SALDISP_HXX
22 :
23 : // -=-= exports =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
24 : class SalDisplay;
25 : class SalColormap;
26 : class SalVisual;
27 : class SalXLib;
28 :
29 : #include <unx/salunx.h>
30 : #include <unx/saltype.h>
31 : #include <vcl/salgtype.hxx>
32 : #include <vcl/ptrstyle.hxx>
33 : #include <sal/types.h>
34 : #include <osl/mutex.h>
35 : #include <vector>
36 : #include <list>
37 : #include <boost/unordered_map.hpp>
38 : #include <tools/gen.hxx>
39 : #include <salwtype.hxx>
40 : #include <generic/gendisp.hxx>
41 :
42 : #include <vclpluginapi.h>
43 :
44 : // -=-= forwards -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
45 : class BitmapPalette;
46 : class SalFrame;
47 : class ColorMask;
48 :
49 : namespace vcl_sal { class WMAdaptor; }
50 :
51 : // -=-= #defines -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
52 : #define PROPERTY_SUPPORT_WM_Parent_Pixmap_None 0x00000004
53 : #define PROPERTY_SUPPORT_WM_ClientPos 0x00000008
54 : #define PROPERTY_SUPPORT_3ButtonMouse 0x00000020
55 :
56 : #define PROPERTY_BUG_XCopyArea_GXxor 0x00002000 // from window
57 : #define PROPERTY_BUG_Tile 0x00008000 // Recreate the
58 : // dither brush each time
59 : #define PROPERTY_BUG_FillPolygon_Tile 0x00010000 // always Toggle Fillstyle
60 : #define PROPERTY_BUG_DrawLine 0x00020000 // a DrawLine is one point to short
61 : #define PROPERTY_BUG_Bitmap_Bit_Order 0x00100000
62 :
63 : #define PROPERTY_FEATURE_SharedMemory 0x02000000
64 : #define PROPERTY_FEATURE_TrustedSolaris 0x04000000
65 :
66 : #define PROPERTY_DEFAULT 0x00000FCB
67 :
68 : // ------------------------------------------------------------------------
69 : // server vendor
70 :
71 : typedef enum {
72 : vendor_none = 0,
73 : vendor_sun,
74 : vendor_unknown
75 : } srv_vendor_t;
76 :
77 : extern "C" srv_vendor_t sal_GetServerVendor( Display *p_display );
78 :
79 : // -=-= SalRGB -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
80 : // MSB/Bigendian view (SalColor == RGB, r=0xFF0000, g=0xFF00, b=0xFF)
81 :
82 : enum SalRGB { RGB, RBG,
83 : GBR, GRB,
84 : BGR, BRG,
85 : RGBA, RBGA,
86 : GBRA, GRBA,
87 : BGRA, BRGA,
88 : otherSalRGB };
89 :
90 : // -=-= SalVisual =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
91 : class SalVisual : public XVisualInfo
92 : {
93 : SalRGB eRGBMode_;
94 : int nRedShift_;
95 : int nGreenShift_;
96 : int nBlueShift_;
97 : int nRedBits_;
98 : int nGreenBits_;
99 : int nBlueBits_;
100 : public:
101 : SalVisual();
102 : ~SalVisual();
103 : SalVisual( const XVisualInfo* pXVI );
104 :
105 0 : inline VisualID GetVisualId() const { return visualid; }
106 0 : inline Visual *GetVisual() const { return visual; }
107 0 : inline int GetClass() const { return c_class; }
108 0 : inline int GetDepth() const { return depth; }
109 : inline SalRGB GetMode() const { return eRGBMode_; }
110 :
111 : Pixel GetTCPixel( SalColor nColor ) const;
112 : SalColor GetTCColor( Pixel nPixel ) const;
113 : };
114 :
115 : // -=-= SalColormap =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
116 0 : class SalColormap
117 : {
118 : const SalDisplay* m_pDisplay;
119 : Colormap m_hColormap;
120 : std::vector<SalColor> m_aPalette; // Pseudocolor
121 : SalVisual m_aVisual;
122 : std::vector<sal_uInt16> m_aLookupTable; // Pseudocolor: 12bit reduction
123 : Pixel m_nWhitePixel;
124 : Pixel m_nBlackPixel;
125 : Pixel m_nUsed; // Pseudocolor
126 : SalX11Screen m_nXScreen;
127 :
128 : void GetPalette();
129 : void GetLookupTable();
130 : public:
131 : SalColormap( const SalDisplay* pSalDisplay,
132 : Colormap hColormap,
133 : SalX11Screen nXScreen );
134 : SalColormap( sal_uInt16 nDepth );
135 : SalColormap();
136 : ~SalColormap();
137 :
138 0 : inline Colormap GetXColormap() const { return m_hColormap; }
139 0 : inline const SalDisplay* GetDisplay() const { return m_pDisplay; }
140 : inline Display* GetXDisplay() const;
141 0 : inline const SalVisual& GetVisual() const { return m_aVisual; }
142 0 : inline Visual* GetXVisual() const { return m_aVisual.GetVisual(); }
143 0 : inline Pixel GetWhitePixel() const { return m_nWhitePixel; }
144 0 : inline Pixel GetBlackPixel() const { return m_nBlackPixel; }
145 0 : inline Pixel GetUsed() const { return m_nUsed; }
146 : inline int GetClass() const { return m_aVisual.GetClass(); }
147 :
148 : sal_Bool GetXPixels( XColor &rColor,
149 : int r,
150 : int g,
151 : int b ) const;
152 : inline sal_Bool GetXPixel( XColor &rColor,
153 : int r,
154 : int g,
155 : int b ) const;
156 : Pixel GetPixel( SalColor nColor ) const;
157 : SalColor GetColor( Pixel nPixel ) const;
158 : };
159 :
160 : // -=-= SalXLib =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
161 : typedef int(*YieldFunc)(int fd, void* data);
162 : struct YieldEntry;
163 :
164 : class VCLPLUG_GEN_PUBLIC SalXLib
165 : {
166 : protected:
167 : timeval m_aTimeout;
168 : sal_uLong m_nTimeoutMS;
169 : int m_pTimeoutFDS[2];
170 :
171 : int nFDs_;
172 : fd_set aReadFDS_;
173 : fd_set aExceptionFDS_;
174 : YieldEntry *pYieldEntries_;
175 :
176 : public:
177 : SalXLib();
178 : virtual ~SalXLib();
179 : virtual void Init();
180 :
181 : virtual void Yield( bool bWait, bool bHandleAllCurrentEvents );
182 : virtual void Wakeup();
183 : virtual void PostUserEvent();
184 :
185 : virtual void Insert( int fd, void* data,
186 : YieldFunc pending,
187 : YieldFunc queued,
188 : YieldFunc handle );
189 : virtual void Remove( int fd );
190 :
191 : virtual void StartTimer( sal_uLong nMS );
192 : virtual void StopTimer();
193 :
194 : bool CheckTimeout( bool bExecuteTimers = true );
195 : };
196 :
197 : // -=-= SalDisplay -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
198 :
199 : class SalI18N_InputMethod;
200 : class SalI18N_KeyboardExtension;
201 : class AttributeProvider;
202 :
203 : extern "C" {
204 : typedef Bool(*X_if_predicate)(Display*,XEvent*,XPointer);
205 : }
206 :
207 : class VCLPLUG_GEN_PUBLIC SalDisplay : public SalGenericDisplay
208 : {
209 : public:
210 : struct RenderEntry
211 : {
212 : Pixmap m_aPixmap;
213 : Picture m_aPicture;
214 :
215 0 : RenderEntry() : m_aPixmap( 0 ), m_aPicture( 0 ) {}
216 : };
217 :
218 : typedef boost::unordered_map<int,RenderEntry> RenderEntryMap;
219 :
220 0 : struct ScreenData
221 : {
222 : bool m_bInit;
223 :
224 : XLIB_Window m_aRoot;
225 : XLIB_Window m_aRefWindow;
226 : Size m_aSize;
227 : SalVisual m_aVisual;
228 : SalColormap m_aColormap;
229 : GC m_aMonoGC;
230 : GC m_aCopyGC;
231 : GC m_aAndInvertedGC;
232 : GC m_aAndGC;
233 : GC m_aOrGC;
234 : GC m_aStippleGC;
235 : Pixmap m_hInvert50;
236 : mutable RenderEntryMap m_aRenderData;
237 :
238 0 : ScreenData() :
239 : m_bInit( false ),
240 : m_aRoot( None ),
241 : m_aRefWindow( None ),
242 : m_aMonoGC( None ),
243 : m_aCopyGC( None ),
244 : m_aAndInvertedGC( None ),
245 : m_aAndGC( None ),
246 : m_aOrGC( None ),
247 : m_aStippleGC( None ),
248 : m_hInvert50( None ),
249 0 : m_aRenderData( 1 )
250 0 : {}
251 : };
252 :
253 : protected:
254 : SalXLib *pXLib_;
255 : SalI18N_InputMethod *mpInputMethod;
256 : SalI18N_KeyboardExtension *mpKbdExtension;
257 :
258 : AttributeProvider *mpFactory;
259 :
260 : Display *pDisp_; // X Display
261 :
262 : SalX11Screen m_nXDefaultScreen;
263 : std::vector< ScreenData > m_aScreens;
264 : ScreenData m_aInvalidScreenData;
265 : Pair aResolution_; // [dpi]
266 : bool mbExactResolution;
267 : sal_uLong nMaxRequestSize_; // [byte]
268 :
269 : srv_vendor_t meServerVendor;
270 :
271 : // until x bytes
272 :
273 : XLIB_Cursor aPointerCache_[POINTER_COUNT];
274 :
275 : // Keyboard
276 : sal_Bool bNumLockFromXS_; // Num Lock handled by X Server
277 : int nNumLockIndex_; // modifier index in modmap
278 : int nNumLockMask_; // keyevent state mask for
279 : KeySym nShiftKeySym_; // first shift modifier
280 : KeySym nCtrlKeySym_; // first control modifier
281 : KeySym nMod1KeySym_; // first mod1 modifier
282 :
283 : vcl_sal::WMAdaptor* m_pWMAdaptor;
284 :
285 : bool m_bXinerama;
286 : std::vector< Rectangle > m_aXineramaScreens;
287 : std::vector< int > m_aXineramaScreenIndexMap;
288 : std::list<SalObject*> m_aSalObjects;
289 :
290 : bool m_bUseRandRWrapper; // don't use randr on gtk, use gdk signals there
291 :
292 : mutable XLIB_Time m_nLastUserEventTime; // mutable because changed on first access
293 :
294 : virtual long Dispatch( XEvent *pEvent ) = 0;
295 : void InitXinerama();
296 : void InitRandR( XLIB_Window aRoot ) const;
297 : void DeInitRandR();
298 : int processRandREvent( XEvent* );
299 :
300 : void doDestruct();
301 : void addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight );
302 : public:
303 : static SalDisplay *GetSalDisplay( Display* display );
304 : static sal_Bool BestVisual( Display *pDisp,
305 : int nScreen,
306 : XVisualInfo &rVI );
307 :
308 : SalDisplay( Display* pDisp );
309 :
310 : virtual ~SalDisplay();
311 :
312 : void Init();
313 : void PrintInfo() const;
314 :
315 : #ifdef DBG_UTIL
316 : void DbgPrintDisplayEvent(const char *pComment, XEvent *pEvent) const;
317 : #endif
318 :
319 : void ModifierMapping();
320 : void SimulateKeyPress( sal_uInt16 nKeyCode );
321 : sal_uInt16 GetIndicatorState() const;
322 : rtl::OUString GetKeyNameFromKeySym( KeySym keysym ) const;
323 : rtl::OUString GetKeyName( sal_uInt16 nKeyCode ) const;
324 : sal_uInt16 GetKeyCode( KeySym keysym, char*pcPrintable ) const;
325 : KeySym GetKeySym( XKeyEvent *pEvent,
326 : unsigned char *pPrintable,
327 : int *pLen,
328 : KeySym *pUnmodifiedKeySym,
329 : Status *pStatus,
330 : XIC = NULL ) const;
331 :
332 : XLIB_Cursor GetPointer( int ePointerStyle );
333 : virtual int CaptureMouse( SalFrame *pCapture );
334 :
335 : void Remove( XEvent *pEvent );
336 : virtual ScreenData *initScreen( SalX11Screen nXScreen ) const;
337 0 : const ScreenData& getDataForScreen( SalX11Screen nXScreen ) const
338 : {
339 0 : if( nXScreen.getXScreen() >= m_aScreens.size() )
340 0 : return m_aInvalidScreenData;
341 0 : if( ! m_aScreens[nXScreen.getXScreen()].m_bInit )
342 0 : initScreen( nXScreen );
343 0 : return m_aScreens[nXScreen.getXScreen()];
344 : }
345 :
346 0 : XLIB_Window GetDrawable( SalX11Screen nXScreen ) const { return getDataForScreen( nXScreen ).m_aRefWindow; }
347 0 : Display *GetDisplay() const { return pDisp_; }
348 0 : SalX11Screen GetDefaultXScreen() const { return m_nXDefaultScreen; }
349 0 : const Size& GetScreenSize( SalX11Screen nXScreen ) const { return getDataForScreen( nXScreen ).m_aSize; }
350 0 : srv_vendor_t GetServerVendor() const { return meServerVendor; }
351 0 : void SetServerVendor() { meServerVendor = sal_GetServerVendor(pDisp_); }
352 0 : sal_Bool IsDisplay() const { return !!pXLib_; }
353 : GC GetMonoGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aMonoGC; }
354 0 : GC GetCopyGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aCopyGC; }
355 : GC GetAndInvertedGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aAndInvertedGC; }
356 : GC GetAndGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aAndGC; }
357 : GC GetOrGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aOrGC; }
358 : GC GetStippleGC( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aStippleGC; }
359 : GC GetGC( sal_uInt16 nDepth, SalX11Screen nXScreen ) const;
360 0 : Pixmap GetInvert50( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_hInvert50; }
361 0 : const SalColormap& GetColormap( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aColormap; }
362 0 : const SalVisual& GetVisual( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aVisual; }
363 0 : RenderEntryMap& GetRenderEntries( SalX11Screen nXScreen ) const { return getDataForScreen(nXScreen).m_aRenderData; }
364 0 : const Pair &GetResolution() const { return aResolution_; }
365 0 : bool GetExactResolution() const { return mbExactResolution; }
366 0 : sal_uLong GetProperties() const { return PROPERTY_DEFAULT; }
367 0 : sal_uLong GetMaxRequestSize() const { return nMaxRequestSize_; }
368 : XLIB_Time GetLastUserEventTime( bool bAlwaysReget = false ) const;
369 :
370 : bool XIfEventWithTimeout( XEvent*, XPointer, X_if_predicate, long i_nTimeout = 1000 ) const;
371 : SalXLib* GetXLib() const { return pXLib_; }
372 :
373 0 : SalI18N_InputMethod* GetInputMethod() const { return mpInputMethod; }
374 0 : SalI18N_KeyboardExtension* GetKbdExtension() const { return mpKbdExtension; }
375 0 : void SetInputMethod( SalI18N_InputMethod *pInputMethod )
376 0 : { mpInputMethod = pInputMethod; }
377 0 : void SetKbdExtension(SalI18N_KeyboardExtension *pKbdExtension)
378 0 : { mpKbdExtension = pKbdExtension; }
379 0 : ::vcl_sal::WMAdaptor* getWMAdaptor() const { return m_pWMAdaptor; }
380 0 : bool IsXinerama() const { return m_bXinerama; }
381 0 : const std::vector< Rectangle >& GetXineramaScreens() const { return m_aXineramaScreens; }
382 0 : XLIB_Window GetRootWindow( SalX11Screen nXScreen ) const
383 0 : { return getDataForScreen( nXScreen ).m_aRoot; }
384 : const std::vector< ScreenData >& GetScreenData() { return m_aScreens; }
385 0 : unsigned int GetXScreenCount() const { return m_aScreens.size(); }
386 :
387 0 : const std::list< SalFrame* >& getFrames() const { return m_aFrames; }
388 0 : sal_Bool IsNumLockFromXS() const { return bNumLockFromXS_; }
389 :
390 0 : std::list< SalObject* >& getSalObjects() { return m_aSalObjects; }
391 :
392 : virtual void PostUserEvent() = 0;
393 : };
394 :
395 : // -=-= inlines =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
396 :
397 : inline GC SalDisplay::GetGC( sal_uInt16 nDepth, SalX11Screen nXScreen ) const
398 : { return 1 == nDepth
399 : ? GetMonoGC( nXScreen )
400 : : getDataForScreen(nXScreen).m_aVisual.GetDepth() == nDepth
401 : ? GetCopyGC( nXScreen )
402 : : None; }
403 :
404 0 : inline Display *SalColormap::GetXDisplay() const
405 0 : { return m_pDisplay->GetDisplay(); }
406 :
407 : class VCLPLUG_GEN_PUBLIC SalX11Display : public SalDisplay
408 : {
409 : public:
410 : SalX11Display( Display* pDisp );
411 : virtual ~SalX11Display();
412 :
413 : virtual long Dispatch( XEvent *pEvent );
414 : virtual void Yield();
415 : virtual void PostUserEvent();
416 :
417 : sal_Bool IsEvent();
418 : void SetupInput( SalI18N_InputMethod *pInputMethod );
419 : };
420 :
421 :
422 : // get foreign key names
423 : namespace vcl_sal {
424 : rtl::OUString getKeysymReplacementName(
425 : rtl::OUString pLang,
426 : KeySym nSymbol );
427 : }
428 :
429 :
430 : #endif // _SV_SALDISP_HXX
431 :
432 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|