1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #ifndef INCLUDED_VCL_INC_UNX_SALDISP_HXX
21 #define INCLUDED_VCL_INC_UNX_SALDISP_HXX
29 #include <X11/Xutil.h>
30 #include <X11/extensions/render.h>
31 #include <epoxy/glx.h>
33 #include <rtl/string.hxx>
34 #include <unx/saltype.h>
35 #include <vcl/opengl/OpenGLContext.hxx>
36 #include <vcl/ptrstyle.hxx>
37 #include <sal/types.h>
40 #include <unordered_map>
42 #include <tools/gen.hxx>
43 #include <salwtype.hxx>
44 #include <unx/gendata.hxx>
45 #include <unx/gendisp.hxx>
46 #include <o3tl/enumarray.hxx>
48 #include <vclpluginapi.h>
50 /* From <X11/Intrinsic.h> */
51 typedef unsigned long Pixel
;
57 namespace vcl_sal
{ class WMAdaptor
; }
67 extern "C" srv_vendor_t
sal_GetServerVendor( Display
*p_display
);
69 // MSB/Bigendian view (Color == RGB, r=0xFF0000, g=0xFF00, b=0xFF)
71 enum class SalRGB
{ RGB
, RBG
,
76 class SalVisual
: public XVisualInfo
87 SalVisual( const XVisualInfo
* pXVI
);
89 VisualID
GetVisualId() const { return visualid
; }
90 Visual
*GetVisual() const { return visual
; }
91 int GetClass() const { return c_class
; }
92 int GetDepth() const { return depth
; }
94 Pixel
GetTCPixel( Color nColor
) const;
95 Color
GetTCColor( Pixel nPixel
) const;
98 // A move-only flag, used by SalColormap to track ownership of its m_aVisual.visual:
99 struct OwnershipFlag
{
102 OwnershipFlag() = default;
104 OwnershipFlag(OwnershipFlag
&& other
) noexcept
: owner(other
.owner
) { other
.owner
= false; }
106 OwnershipFlag
& operator =(OwnershipFlag
&& other
) noexcept
{
107 assert(&other
!= this);
116 const SalDisplay
* m_pDisplay
;
117 Colormap m_hColormap
;
118 std::vector
<Color
> m_aPalette
; // Pseudocolor
120 OwnershipFlag m_aVisualOwnership
;
121 std::vector
<sal_uInt16
> m_aLookupTable
; // Pseudocolor: 12bit reduction
124 Pixel m_nUsed
; // Pseudocolor
125 SalX11Screen m_nXScreen
;
128 void GetLookupTable();
130 SalColormap( const SalDisplay
* pSalDisplay
,
132 SalX11Screen nXScreen
);
133 SalColormap( sal_uInt16 nDepth
);
138 SalColormap(SalColormap
&&) = default;
139 SalColormap
& operator =(SalColormap
&&) = default;
141 Colormap
GetXColormap() const { return m_hColormap
; }
142 const SalDisplay
* GetDisplay() const { return m_pDisplay
; }
143 inline Display
* GetXDisplay() const;
144 const SalVisual
& GetVisual() const { return m_aVisual
; }
145 Visual
* GetXVisual() const { return m_aVisual
.GetVisual(); }
146 Pixel
GetWhitePixel() const { return m_nWhitePixel
; }
147 Pixel
GetBlackPixel() const { return m_nBlackPixel
; }
148 Pixel
GetUsed() const { return m_nUsed
; }
150 bool GetXPixels( XColor
&rColor
,
154 inline bool GetXPixel( XColor
&rColor
,
158 Pixel
GetPixel( Color nColor
) const;
159 Color
GetColor( Pixel nPixel
) const;
162 class SalI18N_InputMethod
;
164 typedef int(*YieldFunc
)(int fd
, void* data
);
170 sal_uLong m_nTimeoutMS
;
171 int m_pTimeoutFDS
[2];
175 fd_set aExceptionFDS_
;
178 std::unique_ptr
<SalI18N_InputMethod
> m_pInputMethod
;
185 virtual bool Yield( bool bWait
, bool bHandleAllCurrentEvents
);
186 virtual void Wakeup();
187 void TriggerUserEventProcessing();
189 virtual void Insert( int fd
, void* data
,
193 virtual void Remove( int fd
);
195 virtual void StartTimer( sal_uInt64 nMS
);
196 virtual void StopTimer();
198 virtual bool CheckTimeout( bool bExecuteTimers
= true );
200 SalI18N_InputMethod
* GetInputMethod() const { return m_pInputMethod
.get(); }
201 Display
* GetDisplay() const { return m_pDisplay
; }
204 class SalI18N_KeyboardExtension
;
205 class AttributeProvider
;
208 typedef Bool(*X_if_predicate
)(Display
*,XEvent
*,XPointer
);
211 class GLX11Window
: public GLWindow
219 OString GLXExtensions
;
221 bool HasGLXExtension(const char* name
) const;
224 virtual bool Synchronize(bool bOnoff
) const override
;
225 virtual ~GLX11Window() override
;
228 class VCLPLUG_GEN_PUBLIC SalDisplay
: public SalGenericDisplay
236 RenderEntry() : m_aPixmap( 0 ), m_aPicture( 0 ) {}
239 typedef std::unordered_map
<int,RenderEntry
> RenderEntryMap
;
246 ::Window m_aRefWindow
;
249 SalColormap m_aColormap
;
257 mutable RenderEntryMap m_aRenderData
;
262 m_aRefWindow( None
),
265 m_aAndInvertedGC( None
),
268 m_aStippleGC( None
),
276 SalI18N_KeyboardExtension
*mpKbdExtension
;
278 Display
*pDisp_
; // X Display
280 SalX11Screen m_nXDefaultScreen
;
281 std::vector
< ScreenData
> m_aScreens
;
282 ScreenData
const m_aInvalidScreenData
;
283 Pair aResolution_
; // [dpi]
284 sal_uLong nMaxRequestSize_
; // [byte]
286 srv_vendor_t meServerVendor
;
290 o3tl::enumarray
<PointerStyle
, Cursor
> aPointerCache_
;
293 bool bNumLockFromXS_
; // Num Lock handled by X Server
294 int nNumLockIndex_
; // modifier index in modmap
295 KeySym nShiftKeySym_
; // first shift modifier
296 KeySym nCtrlKeySym_
; // first control modifier
297 KeySym nMod1KeySym_
; // first mod1 modifier
299 std::unique_ptr
<vcl_sal::WMAdaptor
> m_pWMAdaptor
;
302 std::vector
< tools::Rectangle
> m_aXineramaScreens
;
303 std::vector
< int > m_aXineramaScreenIndexMap
;
304 std::list
<SalObject
*> m_aSalObjects
;
306 mutable Time m_nLastUserEventTime
; // mutable because changed on first access
308 virtual bool Dispatch( XEvent
*pEvent
) = 0;
310 void InitRandR( ::Window aRoot
) const;
311 static void DeInitRandR();
312 void processRandREvent( XEvent
* );
315 void addXineramaScreenUnique( int i
, long i_nX
, long i_nY
, long i_nWidth
, long i_nHeight
);
316 Time
GetEventTimeImpl( bool bAlwaysReget
= false ) const;
318 static bool BestOpenGLVisual(Display
* pDisplay
, int nScreen
, XVisualInfo
& rVI
);
319 static bool BestVisual(Display
*pDisp
, int nScreen
, XVisualInfo
&rVI
);
321 SalDisplay( Display
* pDisp
);
323 virtual ~SalDisplay() override
;
328 void PrintInfo() const;
329 void DbgPrintDisplayEvent(const char *pComment
, XEvent
*pEvent
) const;
334 void ModifierMapping();
335 void SimulateKeyPress( sal_uInt16 nKeyCode
);
336 KeyIndicatorState
GetIndicatorState() const;
337 OUString
GetKeyNameFromKeySym( KeySym keysym
) const;
338 OUString
GetKeyName( sal_uInt16 nKeyCode
) const;
339 sal_uInt16
GetKeyCode( KeySym keysym
, char*pcPrintable
) const;
340 KeySym
GetKeySym( XKeyEvent
*pEvent
,
343 KeySym
*pUnmodifiedKeySym
,
345 XIC
= nullptr ) const;
347 Cursor
GetPointer( PointerStyle ePointerStyle
);
348 int CaptureMouse( SalFrame
*pCapture
);
350 ScreenData
* initScreen( SalX11Screen nXScreen
) const;
351 const ScreenData
& getDataForScreen( SalX11Screen nXScreen
) const
353 if( nXScreen
.getXScreen() >= m_aScreens
.size() )
354 return m_aInvalidScreenData
;
355 if( ! m_aScreens
[nXScreen
.getXScreen()].m_bInit
)
356 initScreen( nXScreen
);
357 return m_aScreens
[nXScreen
.getXScreen()];
360 ::Window
GetDrawable( SalX11Screen nXScreen
) const { return getDataForScreen( nXScreen
).m_aRefWindow
; }
361 Display
*GetDisplay() const { return pDisp_
; }
362 const SalX11Screen
& GetDefaultXScreen() const { return m_nXDefaultScreen
; }
363 const Size
& GetScreenSize( SalX11Screen nXScreen
) const { return getDataForScreen( nXScreen
).m_aSize
; }
364 srv_vendor_t
GetServerVendor() const { return meServerVendor
; }
365 bool IsDisplay() const { return !!pXLib_
; }
366 GC
GetCopyGC( SalX11Screen nXScreen
) const { return getDataForScreen(nXScreen
).m_aCopyGC
; }
367 Pixmap
GetInvert50( SalX11Screen nXScreen
) const { return getDataForScreen(nXScreen
).m_hInvert50
; }
368 const SalColormap
& GetColormap( SalX11Screen nXScreen
) const { return getDataForScreen(nXScreen
).m_aColormap
; }
369 const SalVisual
& GetVisual( SalX11Screen nXScreen
) const { return getDataForScreen(nXScreen
).m_aVisual
; }
370 RenderEntryMap
& GetRenderEntries( SalX11Screen nXScreen
) const { return getDataForScreen(nXScreen
).m_aRenderData
; }
371 const Pair
&GetResolution() const { return aResolution_
; }
372 sal_uLong
GetMaxRequestSize() const { return nMaxRequestSize_
; }
373 Time
GetLastUserEventTime() const { return GetEventTimeImpl(); }
374 // this is an equivalent of gdk_x11_get_server_time()
375 Time
GetX11ServerTime() const { return GetEventTimeImpl( true ); }
377 bool XIfEventWithTimeout( XEvent
*, XPointer
, X_if_predicate
) const;
378 SalXLib
* GetXLib() const { return pXLib_
; }
380 SalI18N_InputMethod
* GetInputMethod() const { return pXLib_
->GetInputMethod(); }
381 SalI18N_KeyboardExtension
* GetKbdExtension() const { return mpKbdExtension
; }
382 void SetKbdExtension(SalI18N_KeyboardExtension
*pKbdExtension
)
383 { mpKbdExtension
= pKbdExtension
; }
384 ::vcl_sal::WMAdaptor
* getWMAdaptor() const { return m_pWMAdaptor
.get(); }
385 bool IsXinerama() const { return m_bXinerama
; }
386 const std::vector
< tools::Rectangle
>& GetXineramaScreens() const { return m_aXineramaScreens
; }
387 ::Window
GetRootWindow( SalX11Screen nXScreen
) const
388 { return getDataForScreen( nXScreen
).m_aRoot
; }
389 unsigned int GetXScreenCount() const { return m_aScreens
.size(); }
391 const SalFrameSet
& getFrames() const { return m_aFrames
; }
393 std::list
< SalObject
* >& getSalObjects() { return m_aSalObjects
; }
396 inline Display
*SalColormap::GetXDisplay() const
397 { return m_pDisplay
->GetDisplay(); }
399 class SalX11Display
: public SalDisplay
402 SalX11Display( Display
* pDisp
);
403 virtual ~SalX11Display() override
;
405 virtual bool Dispatch( XEvent
*pEvent
) override
;
406 virtual void Yield();
407 virtual void TriggerUserEventProcessing() override
;
414 // get foreign key names
415 OUString
getKeysymReplacementName(
416 const OUString
& pLang
,
419 inline SalDisplay
*getSalDisplay(GenericUnixSalData
const * data
)
421 assert(data
!= nullptr);
422 assert(data
->GetType() != SAL_DATA_GTK3
);
423 return static_cast<SalDisplay
*>(data
->GetDisplay());
427 #endif // INCLUDED_VCL_INC_UNX_SALDISP_HXX
429 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */