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