xref: /aoo41x/main/vcl/unx/generic/window/salobj.cxx (revision c82f2877)
1*c82f2877SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c82f2877SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c82f2877SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c82f2877SAndrew Rist  * distributed with this work for additional information
6*c82f2877SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c82f2877SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c82f2877SAndrew Rist  * "License"); you may not use this file except in compliance
9*c82f2877SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c82f2877SAndrew Rist  *
11*c82f2877SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c82f2877SAndrew Rist  *
13*c82f2877SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c82f2877SAndrew Rist  * software distributed under the License is distributed on an
15*c82f2877SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c82f2877SAndrew Rist  * KIND, either express or implied.  See the License for the
17*c82f2877SAndrew Rist  * specific language governing permissions and limitations
18*c82f2877SAndrew Rist  * under the License.
19*c82f2877SAndrew Rist  *
20*c82f2877SAndrew Rist  *************************************************************/
21*c82f2877SAndrew Rist 
22*c82f2877SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
28cdf0e10cSrcweir #include <stdio.h>
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #include <tools/debug.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <vcl/keycodes.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <tools/prex.h>
35cdf0e10cSrcweir #include <X11/Xlib.h>
36cdf0e10cSrcweir #include <X11/extensions/shape.h>
37cdf0e10cSrcweir #include <tools/postx.h>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <unx/salunx.h>
40cdf0e10cSrcweir #include <unx/salstd.hxx>
41cdf0e10cSrcweir #include <unx/saldata.hxx>
42cdf0e10cSrcweir #include <unx/salinst.h>
43cdf0e10cSrcweir #include <unx/saldisp.hxx>
44cdf0e10cSrcweir #include <unx/salframe.h>
45cdf0e10cSrcweir #include <unx/salobj.h>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #include <salwtype.hxx>
48cdf0e10cSrcweir 
49cdf0e10cSrcweir 
50cdf0e10cSrcweir // =======================================================================
51cdf0e10cSrcweir // SalInstance member to create and destroy a SalObject
52cdf0e10cSrcweir 
CreateObject(SalFrame * pParent,SystemWindowData * pWindowData,sal_Bool bShow)53cdf0e10cSrcweir SalObject* X11SalInstance::CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, sal_Bool bShow )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir     return X11SalObject::CreateObject( pParent, pWindowData, bShow );
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
CreateObject(SalFrame * pParent,SystemWindowData * pWindowData,sal_Bool bShow)58cdf0e10cSrcweir X11SalObject* X11SalObject::CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, sal_Bool bShow )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir 	int error_base, event_base;
61cdf0e10cSrcweir 	X11SalObject*		pObject  = new X11SalObject();
62cdf0e10cSrcweir 	SystemChildData*	pObjData = const_cast<SystemChildData*>(pObject->GetSystemData());
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	if ( ! XShapeQueryExtension( (Display*)pObjData->pDisplay,
65cdf0e10cSrcweir 								  &event_base, &error_base ) )
66cdf0e10cSrcweir 	{
67cdf0e10cSrcweir 		delete pObject;
68cdf0e10cSrcweir 		return NULL;
69cdf0e10cSrcweir 	}
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     pObject->mpParent = pParent;
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 	SalDisplay* pSalDisp		= GetX11SalData()->GetDisplay();
74cdf0e10cSrcweir     const SystemEnvData* pEnv	= pParent->GetSystemData();
75cdf0e10cSrcweir     Display* pDisp				= pSalDisp->GetDisplay();
76cdf0e10cSrcweir 	XLIB_Window aObjectParent	= (XLIB_Window)pEnv->aWindow;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir     // find out on which screen that window is
79cdf0e10cSrcweir     XWindowAttributes aParentAttr;
80cdf0e10cSrcweir     XGetWindowAttributes( pDisp, aObjectParent, &aParentAttr );
81cdf0e10cSrcweir     int nScreen = XScreenNumberOfScreen( aParentAttr.screen );
82cdf0e10cSrcweir     Visual* pVisual = (pWindowData && pWindowData->pVisual) ?
83cdf0e10cSrcweir                       (Visual*)pWindowData->pVisual :
84cdf0e10cSrcweir                       pSalDisp->GetVisual( nScreen ).GetVisual();
85cdf0e10cSrcweir     // get visual info
86cdf0e10cSrcweir     VisualID aVisID = XVisualIDFromVisual( pVisual );
87cdf0e10cSrcweir     XVisualInfo aTemplate;
88cdf0e10cSrcweir     aTemplate.visualid = aVisID;
89cdf0e10cSrcweir     int nVisuals = 0;
90cdf0e10cSrcweir     XVisualInfo* pInfos = XGetVisualInfo( pDisp, VisualIDMask, &aTemplate, &nVisuals );
91cdf0e10cSrcweir     // only one VisualInfo structure can match the visual id
92cdf0e10cSrcweir     DBG_ASSERT( nVisuals == 1, "match count for visual id is not 1" );
93cdf0e10cSrcweir     unsigned int nDepth     = pInfos->depth;
94cdf0e10cSrcweir     XFree( pInfos );
95cdf0e10cSrcweir     XSetWindowAttributes aAttribs;
96cdf0e10cSrcweir     aAttribs.event_mask =   StructureNotifyMask
97cdf0e10cSrcweir                           | ButtonPressMask
98cdf0e10cSrcweir                           | ButtonReleaseMask
99cdf0e10cSrcweir                           | PointerMotionMask
100cdf0e10cSrcweir                           | EnterWindowMask
101cdf0e10cSrcweir                           | LeaveWindowMask
102cdf0e10cSrcweir                           | FocusChangeMask
103cdf0e10cSrcweir                           | ExposureMask
104cdf0e10cSrcweir                           ;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 	pObject->maPrimary =
107cdf0e10cSrcweir         XCreateSimpleWindow( pDisp,
108cdf0e10cSrcweir                              aObjectParent,
109cdf0e10cSrcweir                              0, 0,
110cdf0e10cSrcweir                              1, 1, 0,
111cdf0e10cSrcweir                              pSalDisp->GetColormap( nScreen ).GetBlackPixel(),
112cdf0e10cSrcweir                              pSalDisp->GetColormap( nScreen ).GetWhitePixel()
113cdf0e10cSrcweir                              );
114cdf0e10cSrcweir     if( aVisID == pSalDisp->GetVisual( nScreen ).GetVisualId() )
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         pObject->maSecondary =
117cdf0e10cSrcweir             XCreateSimpleWindow( pDisp,
118cdf0e10cSrcweir                                  pObject->maPrimary,
119cdf0e10cSrcweir                                  0, 0,
120cdf0e10cSrcweir                                  1, 1, 0,
121cdf0e10cSrcweir                                  pSalDisp->GetColormap( nScreen ).GetBlackPixel(),
122cdf0e10cSrcweir                                  pSalDisp->GetColormap( nScreen ).GetWhitePixel()
123cdf0e10cSrcweir                                  );
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir     else
126cdf0e10cSrcweir     {
127cdf0e10cSrcweir         #if OSL_DEBUG_LEVEL > 1
128cdf0e10cSrcweir         fprintf( stderr, "visual id of vcl %x, of visual %x\n",
129cdf0e10cSrcweir                  static_cast<unsigned int> (pSalDisp->GetVisual( nScreen ).GetVisualId()),
130cdf0e10cSrcweir                  static_cast<unsigned int> (aVisID) );
131cdf0e10cSrcweir         #endif
132cdf0e10cSrcweir         pSalDisp->GetXLib()->PushXErrorLevel( true );
133cdf0e10cSrcweir 
134cdf0e10cSrcweir         // create colormap for visual - there might not be one
135cdf0e10cSrcweir         pObject->maColormap = aAttribs.colormap = XCreateColormap(
136cdf0e10cSrcweir             pDisp,
137cdf0e10cSrcweir             pSalDisp->GetRootWindow( nScreen ),
138cdf0e10cSrcweir             pVisual,
139cdf0e10cSrcweir             AllocNone );
140cdf0e10cSrcweir 
141cdf0e10cSrcweir         pObject->maSecondary =
142cdf0e10cSrcweir             XCreateWindow( pDisp,
143cdf0e10cSrcweir                            pSalDisp->GetRootWindow( nScreen ),
144cdf0e10cSrcweir                            0, 0,
145cdf0e10cSrcweir                            1, 1, 0,
146cdf0e10cSrcweir                            nDepth, InputOutput,
147cdf0e10cSrcweir                            pVisual,
148cdf0e10cSrcweir                            CWEventMask|CWColormap, &aAttribs );
149cdf0e10cSrcweir         XSync( pDisp, False );
150cdf0e10cSrcweir         sal_Bool bWasXError = pSalDisp->GetXLib()->HasXErrorOccured();
151cdf0e10cSrcweir         pSalDisp->GetXLib()->PopXErrorLevel();
152cdf0e10cSrcweir         if( bWasXError )
153cdf0e10cSrcweir         {
154cdf0e10cSrcweir             pObject->maSecondary = None;
155cdf0e10cSrcweir             delete pObject;
156cdf0e10cSrcweir             return NULL;
157cdf0e10cSrcweir         }
158cdf0e10cSrcweir         XReparentWindow( pDisp, pObject->maSecondary, pObject->maPrimary, 0, 0 );
159cdf0e10cSrcweir     }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     pSalDisp->GetXLib()->PushXErrorLevel( true );
162cdf0e10cSrcweir     if( bShow ) {
163cdf0e10cSrcweir         XMapWindow( pDisp, pObject->maSecondary );
164cdf0e10cSrcweir         XMapWindow( pDisp, pObject->maPrimary );
165cdf0e10cSrcweir     }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 	pObjData->pDisplay		= pDisp;
168cdf0e10cSrcweir 	pObjData->aWindow		= pObject->maSecondary;
169cdf0e10cSrcweir 	pObjData->pWidget		= NULL;
170cdf0e10cSrcweir 	pObjData->pVisual		= pVisual;
171cdf0e10cSrcweir 	pObjData->nDepth		= nDepth;
172cdf0e10cSrcweir 	pObjData->aColormap		= aVisID == pSalDisp->GetVisual( nScreen ).GetVisualId() ?
173cdf0e10cSrcweir                               pSalDisp->GetColormap( nScreen ).GetXColormap() : None;
174cdf0e10cSrcweir 	pObjData->pAppContext	= NULL;
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	XSync(pDisp, False);
177cdf0e10cSrcweir     sal_Bool bWasXError = pSalDisp->GetXLib()->HasXErrorOccured();
178cdf0e10cSrcweir     pSalDisp->GetXLib()->PopXErrorLevel();
179cdf0e10cSrcweir     if( bWasXError )
180cdf0e10cSrcweir     {
181cdf0e10cSrcweir         delete pObject;
182cdf0e10cSrcweir         return NULL;
183cdf0e10cSrcweir     }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	return pObject;
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 
DestroyObject(SalObject * pObject)189cdf0e10cSrcweir void X11SalInstance::DestroyObject( SalObject* pObject )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir 	delete pObject;
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 
195cdf0e10cSrcweir // ======================================================================
196cdf0e10cSrcweir // SalClipRegion is a member of SalObject
197cdf0e10cSrcweir // definition of SalClipRegion my be found in unx/inc/salobj.h
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 
SalClipRegion()200cdf0e10cSrcweir SalClipRegion::SalClipRegion()
201cdf0e10cSrcweir {
202cdf0e10cSrcweir 	ClipRectangleList = NULL;
203cdf0e10cSrcweir 	numClipRectangles = 0;
204cdf0e10cSrcweir 	maxClipRectangles = 0;
205cdf0e10cSrcweir 	nClipRegionType   = SAL_OBJECT_CLIP_INCLUDERECTS;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 
~SalClipRegion()209cdf0e10cSrcweir SalClipRegion::~SalClipRegion()
210cdf0e10cSrcweir {
211cdf0e10cSrcweir 	if ( ClipRectangleList )
212cdf0e10cSrcweir 		delete [] ClipRectangleList;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir void
BeginSetClipRegion(sal_uLong nRects)217cdf0e10cSrcweir SalClipRegion::BeginSetClipRegion( sal_uLong nRects )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir 	if (ClipRectangleList)
220cdf0e10cSrcweir 		delete [] ClipRectangleList;
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	ClipRectangleList = new XRectangle[nRects];
223cdf0e10cSrcweir 	numClipRectangles = 0;
224cdf0e10cSrcweir 	maxClipRectangles = nRects;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 
228cdf0e10cSrcweir void
UnionClipRegion(long nX,long nY,long nWidth,long nHeight)229cdf0e10cSrcweir SalClipRegion::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
230cdf0e10cSrcweir {
231cdf0e10cSrcweir 	if ( nWidth && nHeight && (numClipRectangles < maxClipRectangles) )
232cdf0e10cSrcweir 	{
233cdf0e10cSrcweir 		XRectangle *aRect = ClipRectangleList + numClipRectangles;
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 		aRect->x	 = (short) nX;
236cdf0e10cSrcweir 		aRect->y	 = (short) nY;
237cdf0e10cSrcweir 		aRect->width = (unsigned short) nWidth;
238cdf0e10cSrcweir 		aRect->height= (unsigned short) nHeight;
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 		numClipRectangles++;
241cdf0e10cSrcweir 	}
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 
245cdf0e10cSrcweir // =======================================================================
246cdf0e10cSrcweir // SalObject Implementation
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 
X11SalObject()249cdf0e10cSrcweir X11SalObject::X11SalObject()
250cdf0e10cSrcweir {
251cdf0e10cSrcweir 	maSystemChildData.nSize		= sizeof( SystemChildData );
252cdf0e10cSrcweir 	maSystemChildData.pDisplay 	= GetX11SalData()->GetDisplay()->GetDisplay();
253cdf0e10cSrcweir 	maSystemChildData.aWindow		= None;
254cdf0e10cSrcweir 	maSystemChildData.pSalFrame	= 0;
255cdf0e10cSrcweir 	maSystemChildData.pWidget		= 0;
256cdf0e10cSrcweir 	maSystemChildData.pVisual		= 0;
257cdf0e10cSrcweir 	maSystemChildData.nDepth		= 0;
258cdf0e10cSrcweir 	maSystemChildData.aColormap	= 0;
259cdf0e10cSrcweir 	maSystemChildData.pAppContext	= NULL;
260cdf0e10cSrcweir 	maSystemChildData.aShellWindow	= 0;
261cdf0e10cSrcweir 	maSystemChildData.pShellWidget	= NULL;
262cdf0e10cSrcweir 	maPrimary						= 0;
263cdf0e10cSrcweir 	maSecondary						= 0;
264cdf0e10cSrcweir     maColormap                      = 0;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     std::list< SalObject* >& rObjects = GetX11SalData()->GetDisplay()->getSalObjects();
267cdf0e10cSrcweir     rObjects.push_back( this );
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 
~X11SalObject()271cdf0e10cSrcweir X11SalObject::~X11SalObject()
272cdf0e10cSrcweir {
273cdf0e10cSrcweir     std::list< SalObject* >& rObjects = GetX11SalData()->GetDisplay()->getSalObjects();
274cdf0e10cSrcweir     rObjects.remove( this );
275cdf0e10cSrcweir     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
276cdf0e10cSrcweir     pSalDisp->GetXLib()->PushXErrorLevel( true );
277cdf0e10cSrcweir 	if ( maSecondary )
278cdf0e10cSrcweir 		XDestroyWindow( (Display*)maSystemChildData.pDisplay, maSecondary );
279cdf0e10cSrcweir 	if ( maPrimary )
280cdf0e10cSrcweir 		XDestroyWindow( (Display*)maSystemChildData.pDisplay, maPrimary );
281cdf0e10cSrcweir     if ( maColormap )
282cdf0e10cSrcweir         XFreeColormap((Display*)maSystemChildData.pDisplay, maColormap);
283cdf0e10cSrcweir     XSync( (Display*)maSystemChildData.pDisplay, False );
284cdf0e10cSrcweir     pSalDisp->GetXLib()->PopXErrorLevel();
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 
288cdf0e10cSrcweir void
ResetClipRegion()289cdf0e10cSrcweir X11SalObject::ResetClipRegion()
290cdf0e10cSrcweir {
291cdf0e10cSrcweir 	maClipRegion.ResetClipRegion();
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 	const int	dest_kind	= ShapeBounding;
294cdf0e10cSrcweir 	const int	op			= ShapeSet;
295cdf0e10cSrcweir 	const int	ordering	= YSorted;
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	XWindowAttributes win_attrib;
298cdf0e10cSrcweir 	XRectangle		  win_size;
299cdf0e10cSrcweir 
300cdf0e10cSrcweir 	XLIB_Window aShapeWindow = maPrimary;
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	XGetWindowAttributes ( (Display*)maSystemChildData.pDisplay,
303cdf0e10cSrcweir 						   aShapeWindow,
304cdf0e10cSrcweir 						   &win_attrib );
305cdf0e10cSrcweir 
306cdf0e10cSrcweir 	win_size.x		= 0;
307cdf0e10cSrcweir 	win_size.y		= 0;
308cdf0e10cSrcweir 	win_size.width	= win_attrib.width;
309cdf0e10cSrcweir 	win_size.height = win_attrib.height;
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 	XShapeCombineRectangles ( (Display*)maSystemChildData.pDisplay,
312cdf0e10cSrcweir 							  aShapeWindow,
313cdf0e10cSrcweir 							  dest_kind,
314cdf0e10cSrcweir 							  0, 0, 			// x_off, y_off
315cdf0e10cSrcweir 							  &win_size,		// list of rectangles
316cdf0e10cSrcweir 							  1,				// number of rectangles
317cdf0e10cSrcweir 							  op, ordering );
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 
321cdf0e10cSrcweir void
BeginSetClipRegion(sal_uLong nRectCount)322cdf0e10cSrcweir X11SalObject::BeginSetClipRegion( sal_uLong nRectCount )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	maClipRegion.BeginSetClipRegion ( nRectCount );
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 
328cdf0e10cSrcweir void
UnionClipRegion(long nX,long nY,long nWidth,long nHeight)329cdf0e10cSrcweir X11SalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir 	maClipRegion.UnionClipRegion ( nX, nY, nWidth, nHeight );
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 
335cdf0e10cSrcweir void
EndSetClipRegion()336cdf0e10cSrcweir X11SalObject::EndSetClipRegion()
337cdf0e10cSrcweir {
338cdf0e10cSrcweir 	XRectangle *pRectangles = maClipRegion.EndSetClipRegion ();
339cdf0e10cSrcweir 	const int	nType		= maClipRegion.GetClipRegionType();
340cdf0e10cSrcweir 	const int	nRectangles = maClipRegion.GetRectangleCount();
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 	const int	dest_kind	= ShapeBounding;
343cdf0e10cSrcweir 	const int	ordering	= YSorted;
344cdf0e10cSrcweir 	int 		op;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir 	switch ( nType )
347cdf0e10cSrcweir 	{
348cdf0e10cSrcweir 		case SAL_OBJECT_CLIP_INCLUDERECTS :
349cdf0e10cSrcweir 			op = ShapeSet;
350cdf0e10cSrcweir 			break;
351cdf0e10cSrcweir 		case SAL_OBJECT_CLIP_EXCLUDERECTS :
352cdf0e10cSrcweir 			op = ShapeSubtract;
353cdf0e10cSrcweir 			break;
354cdf0e10cSrcweir 		case SAL_OBJECT_CLIP_ABSOLUTE :
355cdf0e10cSrcweir 			op = ShapeSet;
356cdf0e10cSrcweir 			break;
357cdf0e10cSrcweir 		default :
358cdf0e10cSrcweir 			op = ShapeUnion;
359cdf0e10cSrcweir 	}
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	XLIB_Window aShapeWindow = maPrimary;
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 	XShapeCombineRectangles ( (Display*)maSystemChildData.pDisplay,
364cdf0e10cSrcweir 							  aShapeWindow,
365cdf0e10cSrcweir 							  dest_kind,
366cdf0e10cSrcweir 							  0, 0, // x_off, y_off
367cdf0e10cSrcweir 							  pRectangles,
368cdf0e10cSrcweir 							  nRectangles,
369cdf0e10cSrcweir 							  op, ordering );
370cdf0e10cSrcweir }
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 
373cdf0e10cSrcweir sal_uInt16
GetClipRegionType()374cdf0e10cSrcweir X11SalObject::GetClipRegionType()
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	return maClipRegion.GetClipRegionType();
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir // -----------------------------------------------------------------------
380cdf0e10cSrcweir 
381cdf0e10cSrcweir void
SetPosSize(long nX,long nY,long nWidth,long nHeight)382cdf0e10cSrcweir X11SalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight )
383cdf0e10cSrcweir {
384cdf0e10cSrcweir 	if ( maPrimary && maSecondary && nWidth && nHeight )
385cdf0e10cSrcweir 	{
386cdf0e10cSrcweir         XMoveResizeWindow( (Display*)maSystemChildData.pDisplay,
387cdf0e10cSrcweir                            maPrimary,
388cdf0e10cSrcweir  						   nX, nY, nWidth, nHeight );
389cdf0e10cSrcweir         XMoveResizeWindow( (Display*)maSystemChildData.pDisplay,
390cdf0e10cSrcweir                            maSecondary,
391cdf0e10cSrcweir  						   0, 0, nWidth, nHeight );
392cdf0e10cSrcweir 	}
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 
396cdf0e10cSrcweir void
Show(sal_Bool bVisible)397cdf0e10cSrcweir X11SalObject::Show( sal_Bool bVisible )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir 	if	( ! maSystemChildData.aWindow )
400cdf0e10cSrcweir 		return;
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 	if ( bVisible ) {
403cdf0e10cSrcweir 		XMapWindow( (Display*)maSystemChildData.pDisplay,
404cdf0e10cSrcweir                     maSecondary );
405cdf0e10cSrcweir 		XMapWindow( (Display*)maSystemChildData.pDisplay,
406cdf0e10cSrcweir                     maPrimary );
407cdf0e10cSrcweir 	} else {
408cdf0e10cSrcweir 		XUnmapWindow( (Display*)maSystemChildData.pDisplay,
409cdf0e10cSrcweir                       maPrimary );
410cdf0e10cSrcweir 		XUnmapWindow( (Display*)maSystemChildData.pDisplay,
411cdf0e10cSrcweir                       maSecondary );
412cdf0e10cSrcweir     }
413cdf0e10cSrcweir 	mbVisible = bVisible;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir // -----------------------------------------------------------------------
417cdf0e10cSrcweir 
Enable(sal_Bool)418cdf0e10cSrcweir void X11SalObject::Enable( sal_Bool )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir // -----------------------------------------------------------------------
423cdf0e10cSrcweir 
GrabFocus()424cdf0e10cSrcweir void X11SalObject::GrabFocus()
425cdf0e10cSrcweir {
426cdf0e10cSrcweir 	if( mbVisible )
427cdf0e10cSrcweir  		XSetInputFocus( (Display*)maSystemChildData.pDisplay,
428cdf0e10cSrcweir  						maSystemChildData.aWindow,
429cdf0e10cSrcweir  						RevertToNone,
430cdf0e10cSrcweir  						CurrentTime );
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir // -----------------------------------------------------------------------
434cdf0e10cSrcweir 
SetBackground()435cdf0e10cSrcweir void X11SalObject::SetBackground()
436cdf0e10cSrcweir {
437cdf0e10cSrcweir }
438cdf0e10cSrcweir 
439cdf0e10cSrcweir // -----------------------------------------------------------------------
440cdf0e10cSrcweir 
SetBackground(SalColor)441cdf0e10cSrcweir void X11SalObject::SetBackground( SalColor )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir // -----------------------------------------------------------------------
446cdf0e10cSrcweir 
GetSystemData() const447cdf0e10cSrcweir const SystemChildData* X11SalObject::GetSystemData() const
448cdf0e10cSrcweir {
449cdf0e10cSrcweir 	return &maSystemChildData;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
sal_GetCode(int state)452cdf0e10cSrcweir static sal_uInt16 sal_GetCode( int state )
453cdf0e10cSrcweir {
454cdf0e10cSrcweir 	sal_uInt16 nCode = 0;
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 	if( state & Button1Mask )
457cdf0e10cSrcweir 		nCode |= MOUSE_LEFT;
458cdf0e10cSrcweir 	if( state & Button2Mask )
459cdf0e10cSrcweir 		nCode |= MOUSE_MIDDLE;
460cdf0e10cSrcweir 	if( state & Button3Mask )
461cdf0e10cSrcweir 		nCode |= MOUSE_RIGHT;
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 	if( state & ShiftMask )
464cdf0e10cSrcweir 		nCode |= KEY_SHIFT;
465cdf0e10cSrcweir 	if( state & ControlMask )
466cdf0e10cSrcweir 		nCode |= KEY_MOD1;
467cdf0e10cSrcweir 	if( state & Mod1Mask )
468cdf0e10cSrcweir 		nCode |= KEY_MOD2;
469cdf0e10cSrcweir         if( state & Mod3Mask )
470cdf0e10cSrcweir                 nCode |= KEY_MOD3;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir 	return nCode;
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
Dispatch(XEvent * pEvent)475cdf0e10cSrcweir long X11SalObject::Dispatch( XEvent* pEvent )
476cdf0e10cSrcweir {
477cdf0e10cSrcweir     std::list< SalObject* >& rObjects = GetX11SalData()->GetDisplay()->getSalObjects();
478cdf0e10cSrcweir 
479cdf0e10cSrcweir 	for( std::list< SalObject* >::iterator it = rObjects.begin(); it != rObjects.end(); ++it )
480cdf0e10cSrcweir 	{
481cdf0e10cSrcweir 		X11SalObject* pObject = static_cast<X11SalObject*>(*it);
482cdf0e10cSrcweir 		if( pEvent->xany.window == pObject->maPrimary ||
483cdf0e10cSrcweir 			pEvent->xany.window == pObject->maSecondary )
484cdf0e10cSrcweir 		{
485cdf0e10cSrcweir             if( pObject->IsMouseTransparent() && (
486cdf0e10cSrcweir                     pEvent->type == ButtonPress     ||
487cdf0e10cSrcweir                     pEvent->type == ButtonRelease   ||
488cdf0e10cSrcweir                     pEvent->type == EnterNotify     ||
489cdf0e10cSrcweir                     pEvent->type == LeaveNotify     ||
490cdf0e10cSrcweir                     pEvent->type == MotionNotify
491cdf0e10cSrcweir                     )
492cdf0e10cSrcweir                )
493cdf0e10cSrcweir             {
494cdf0e10cSrcweir                 SalMouseEvent aEvt;
495cdf0e10cSrcweir                 const SystemEnvData* pParentData = pObject->mpParent->GetSystemData();
496cdf0e10cSrcweir                 int dest_x, dest_y;
497cdf0e10cSrcweir                 XLIB_Window aChild = None;
498cdf0e10cSrcweir                 XTranslateCoordinates( pEvent->xbutton.display,
499cdf0e10cSrcweir                                        pEvent->xbutton.root,
500cdf0e10cSrcweir                                        pParentData->aWindow,
501cdf0e10cSrcweir                                        pEvent->xbutton.x_root,
502cdf0e10cSrcweir                                        pEvent->xbutton.y_root,
503cdf0e10cSrcweir                                        &dest_x, &dest_y,
504cdf0e10cSrcweir                                        &aChild );
505cdf0e10cSrcweir                 aEvt.mnX        = dest_x;
506cdf0e10cSrcweir                 aEvt.mnY        = dest_y;
507cdf0e10cSrcweir                 aEvt.mnTime     = pEvent->xbutton.time;
508cdf0e10cSrcweir                 aEvt.mnCode     = sal_GetCode( pEvent->xbutton.state );
509cdf0e10cSrcweir                 aEvt.mnButton   = 0;
510cdf0e10cSrcweir                 sal_uInt16 nEvent = 0;
511cdf0e10cSrcweir                 if( pEvent->type == ButtonPress ||
512cdf0e10cSrcweir                     pEvent->type == ButtonRelease )
513cdf0e10cSrcweir                 {
514cdf0e10cSrcweir                     switch( pEvent->xbutton.button )
515cdf0e10cSrcweir                     {
516cdf0e10cSrcweir                         case Button1: aEvt.mnButton = MOUSE_LEFT;break;
517cdf0e10cSrcweir                         case Button2: aEvt.mnButton = MOUSE_MIDDLE;break;
518cdf0e10cSrcweir                         case Button3: aEvt.mnButton = MOUSE_RIGHT;break;
519cdf0e10cSrcweir                     }
520cdf0e10cSrcweir                     nEvent = (pEvent->type == ButtonPress) ?
521cdf0e10cSrcweir                              SALEVENT_MOUSEBUTTONDOWN :
522cdf0e10cSrcweir                              SALEVENT_MOUSEBUTTONUP;
523cdf0e10cSrcweir                 }
524cdf0e10cSrcweir                 else if( pEvent->type == EnterNotify )
525cdf0e10cSrcweir                     nEvent = SALEVENT_MOUSELEAVE;
526cdf0e10cSrcweir                 else
527cdf0e10cSrcweir                     nEvent = SALEVENT_MOUSEMOVE;
528cdf0e10cSrcweir                 pObject->mpParent->CallCallback( nEvent, &aEvt );
529cdf0e10cSrcweir             }
530cdf0e10cSrcweir             else
531cdf0e10cSrcweir             {
532cdf0e10cSrcweir                 switch( pEvent->type )
533cdf0e10cSrcweir                 {
534cdf0e10cSrcweir                     case UnmapNotify:
535cdf0e10cSrcweir 					pObject->mbVisible = sal_False;
536cdf0e10cSrcweir 					return 1;
537cdf0e10cSrcweir                     case MapNotify:
538cdf0e10cSrcweir 					pObject->mbVisible = sal_True;
539cdf0e10cSrcweir 					return 1;
540cdf0e10cSrcweir                     case ButtonPress:
541cdf0e10cSrcweir 					pObject->CallCallback( SALOBJ_EVENT_TOTOP, NULL );
542cdf0e10cSrcweir 					return 1;
543cdf0e10cSrcweir                     case FocusIn:
544cdf0e10cSrcweir 					pObject->CallCallback( SALOBJ_EVENT_GETFOCUS, NULL );
545cdf0e10cSrcweir 					return 1;
546cdf0e10cSrcweir                     case FocusOut:
547cdf0e10cSrcweir 					pObject->CallCallback( SALOBJ_EVENT_LOSEFOCUS, NULL );
548cdf0e10cSrcweir 					return 1;
549cdf0e10cSrcweir                     default: break;
550cdf0e10cSrcweir                 }
551cdf0e10cSrcweir             }
552cdf0e10cSrcweir 			return 0;
553cdf0e10cSrcweir 		}
554cdf0e10cSrcweir 	}
555cdf0e10cSrcweir 	return 0;
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir // -----------------------------------------------------------------------
559cdf0e10cSrcweir 
InterceptChildWindowKeyDown(sal_Bool)560cdf0e10cSrcweir void X11SalObject::InterceptChildWindowKeyDown( sal_Bool /*bIntercept*/ )
561cdf0e10cSrcweir {
562cdf0e10cSrcweir }
563cdf0e10cSrcweir 
564