xref: /aoo41x/main/vcl/unx/generic/window/salframe.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 #include <string.h>
28cdf0e10cSrcweir #include <stdio.h>
29cdf0e10cSrcweir #include <stdlib.h>
30cdf0e10cSrcweir #include <unistd.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "tools/debug.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include "sal/alloca.h"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include "vcl/floatwin.hxx"
37cdf0e10cSrcweir #include "vcl/svapp.hxx"
38cdf0e10cSrcweir #include "vcl/keycodes.hxx"
39cdf0e10cSrcweir #include "vcl/printerinfomanager.hxx"
40cdf0e10cSrcweir #include "vcl/settings.hxx"
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <tools/prex.h>
43cdf0e10cSrcweir #include <X11/Xatom.h>
44cdf0e10cSrcweir #include <X11/keysym.h>
45cdf0e10cSrcweir #include "FWS.hxx"
46cdf0e10cSrcweir #include <X11/extensions/shape.h>
47cdf0e10cSrcweir #ifndef SOLARIS
48cdf0e10cSrcweir #include <X11/extensions/dpms.h>
49cdf0e10cSrcweir #endif
50cdf0e10cSrcweir #include <tools/postx.h>
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #include "unx/salunx.h"
53cdf0e10cSrcweir #include "unx/saldata.hxx"
54cdf0e10cSrcweir #include "unx/saldisp.hxx"
55cdf0e10cSrcweir #include "unx/salgdi.h"
56cdf0e10cSrcweir #include "unx/salframe.h"
57cdf0e10cSrcweir #include "unx/soicon.hxx"
58cdf0e10cSrcweir #include "unx/dtint.hxx"
59cdf0e10cSrcweir #include "unx/sm.hxx"
60cdf0e10cSrcweir #include "unx/wmadaptor.hxx"
61cdf0e10cSrcweir #include "unx/salprn.h"
62cdf0e10cSrcweir #include "unx/salbmp.h"
63cdf0e10cSrcweir #include "unx/i18n_ic.hxx"
64cdf0e10cSrcweir #include "unx/i18n_keysym.hxx"
65cdf0e10cSrcweir #include "unx/i18n_status.hxx"
66cdf0e10cSrcweir 
67cdf0e10cSrcweir #include "salinst.hxx"
68cdf0e10cSrcweir #include "sallayout.hxx"
69cdf0e10cSrcweir 
70cdf0e10cSrcweir #include <com/sun/star/uno/Exception.hpp>
71cdf0e10cSrcweir 
72cdf0e10cSrcweir #include <algorithm>
73cdf0e10cSrcweir 
74cdf0e10cSrcweir #ifndef Button6
75cdf0e10cSrcweir # define Button6 6
76cdf0e10cSrcweir #endif
77cdf0e10cSrcweir #ifndef Button7
78cdf0e10cSrcweir # define Button7 7
79cdf0e10cSrcweir #endif
80cdf0e10cSrcweir 
81cdf0e10cSrcweir using namespace vcl_sal;
82cdf0e10cSrcweir using namespace vcl;
83cdf0e10cSrcweir 
84cdf0e10cSrcweir // -=-= #defines -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
85cdf0e10cSrcweir #define CLIENT_EVENTS			StructureNotifyMask \
86cdf0e10cSrcweir 								| SubstructureNotifyMask \
87cdf0e10cSrcweir 								| KeyPressMask \
88cdf0e10cSrcweir 								| KeyReleaseMask \
89cdf0e10cSrcweir 								| ButtonPressMask \
90cdf0e10cSrcweir 								| ButtonReleaseMask \
91cdf0e10cSrcweir 								| PointerMotionMask \
92cdf0e10cSrcweir 								| EnterWindowMask \
93cdf0e10cSrcweir 								| LeaveWindowMask \
94cdf0e10cSrcweir 								| FocusChangeMask \
95cdf0e10cSrcweir 								| ExposureMask \
96cdf0e10cSrcweir 								| VisibilityChangeMask \
97cdf0e10cSrcweir 								| PropertyChangeMask \
98cdf0e10cSrcweir 								| ColormapChangeMask
99cdf0e10cSrcweir 
100cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
101cdf0e10cSrcweir 
102cdf0e10cSrcweir static XLIB_Window	hPresentationWindow = None, hPresFocusWindow = None;
103cdf0e10cSrcweir static ::std::list< XLIB_Window > aPresentationReparentList;
104cdf0e10cSrcweir static int			nVisibleFloats		= 0;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir X11SalFrame* X11SalFrame::s_pSaveYourselfFrame = NULL;
107cdf0e10cSrcweir 
108cdf0e10cSrcweir // -=-= C++ statics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
109cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
doReparentPresentationDialogues(SalDisplay * pDisplay)110cdf0e10cSrcweir static void doReparentPresentationDialogues( SalDisplay* pDisplay )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir     pDisplay->GetXLib()->PushXErrorLevel( true );
113cdf0e10cSrcweir     while( aPresentationReparentList.begin() != aPresentationReparentList.end() )
114cdf0e10cSrcweir     {
115cdf0e10cSrcweir         int x, y;
116cdf0e10cSrcweir         XLIB_Window aRoot, aChild;
117cdf0e10cSrcweir         unsigned int w, h, bw, d;
118cdf0e10cSrcweir         XGetGeometry( pDisplay->GetDisplay(),
119cdf0e10cSrcweir                       aPresentationReparentList.front(),
120cdf0e10cSrcweir                       &aRoot,
121cdf0e10cSrcweir                       &x, &y, &w, &h, &bw, &d );
122cdf0e10cSrcweir         XTranslateCoordinates( pDisplay->GetDisplay(),
123cdf0e10cSrcweir                                hPresentationWindow,
124cdf0e10cSrcweir                                aRoot,
125cdf0e10cSrcweir                                x, y,
126cdf0e10cSrcweir                                &x, &y,
127cdf0e10cSrcweir                                &aChild );
128cdf0e10cSrcweir         XReparentWindow( pDisplay->GetDisplay(),
129cdf0e10cSrcweir                          aPresentationReparentList.front(),
130cdf0e10cSrcweir                          aRoot,
131cdf0e10cSrcweir                          x, y );
132cdf0e10cSrcweir         aPresentationReparentList.pop_front();
133cdf0e10cSrcweir     }
134cdf0e10cSrcweir     if( hPresFocusWindow )
135cdf0e10cSrcweir         XSetInputFocus( pDisplay->GetDisplay(), hPresFocusWindow, PointerRoot, CurrentTime );
136cdf0e10cSrcweir     XSync( pDisplay->GetDisplay(), False );
137cdf0e10cSrcweir     pDisplay->GetXLib()->PopXErrorLevel();
138cdf0e10cSrcweir }
139cdf0e10cSrcweir 
140cdf0e10cSrcweir // -=-= SalFrame / X11SalFrame =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
141cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
142cdf0e10cSrcweir 
IsOverrideRedirect() const143cdf0e10cSrcweir bool X11SalFrame::IsOverrideRedirect() const
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     return
146cdf0e10cSrcweir         ((nStyle_ & SAL_FRAME_STYLE_INTRO) && !pDisplay_->getWMAdaptor()->supportsSplash())
147cdf0e10cSrcweir         ||
148cdf0e10cSrcweir         (!( nStyle_ & ~SAL_FRAME_STYLE_DEFAULT ) && !pDisplay_->getWMAdaptor()->supportsFullScreen())
149cdf0e10cSrcweir         ;
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
IsFloatGrabWindow() const152cdf0e10cSrcweir bool X11SalFrame::IsFloatGrabWindow() const
153cdf0e10cSrcweir {
154cdf0e10cSrcweir     static const char* pDisableGrab = getenv( "SAL_DISABLE_FLOATGRAB" );
155cdf0e10cSrcweir 
156cdf0e10cSrcweir     return
157cdf0e10cSrcweir         ( ( !pDisableGrab || !*pDisableGrab ) &&
158cdf0e10cSrcweir           (
159cdf0e10cSrcweir            (nStyle_ & SAL_FRAME_STYLE_FLOAT)	&&
160cdf0e10cSrcweir            ! (nStyle_ & SAL_FRAME_STYLE_TOOLTIP)	&&
161cdf0e10cSrcweir            ! (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION)
162cdf0e10cSrcweir            )
163cdf0e10cSrcweir           );
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
setXEmbedInfo()166cdf0e10cSrcweir void X11SalFrame::setXEmbedInfo()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     if( m_bXEmbed )
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         long aInfo[2];
171cdf0e10cSrcweir         aInfo[0] = 1; // XEMBED protocol version
172cdf0e10cSrcweir         aInfo[1] = (bMapped_ ? 1 : 0); // XEMBED_MAPPED
173cdf0e10cSrcweir         XChangeProperty( pDisplay_->GetDisplay(),
174cdf0e10cSrcweir                          mhWindow,
175cdf0e10cSrcweir                          pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::XEMBED_INFO ),
176cdf0e10cSrcweir                          pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::XEMBED_INFO ),
177cdf0e10cSrcweir                          32,
178cdf0e10cSrcweir                          PropModeReplace,
179cdf0e10cSrcweir                          reinterpret_cast<unsigned char*>(aInfo),
180cdf0e10cSrcweir                          sizeof(aInfo)/sizeof(aInfo[0]) );
181cdf0e10cSrcweir     }
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
askForXEmbedFocus(sal_Int32 i_nTimeCode)184cdf0e10cSrcweir void X11SalFrame::askForXEmbedFocus( sal_Int32 i_nTimeCode )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir     XEvent aEvent;
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     rtl_zeroMemory( &aEvent, sizeof(aEvent) );
189cdf0e10cSrcweir     aEvent.xclient.window = mhForeignParent;
190cdf0e10cSrcweir     aEvent.xclient.type = ClientMessage;
191cdf0e10cSrcweir     aEvent.xclient.message_type = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::XEMBED );
192cdf0e10cSrcweir     aEvent.xclient.format = 32;
193cdf0e10cSrcweir     aEvent.xclient.data.l[0] = i_nTimeCode ? i_nTimeCode : CurrentTime;
194cdf0e10cSrcweir     aEvent.xclient.data.l[1] = 3; // XEMBED_REQUEST_FOCUS
195cdf0e10cSrcweir     aEvent.xclient.data.l[2] = 0;
196cdf0e10cSrcweir     aEvent.xclient.data.l[3] = 0;
197cdf0e10cSrcweir     aEvent.xclient.data.l[4] = 0;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     GetDisplay()->GetXLib()->PushXErrorLevel( true );
200cdf0e10cSrcweir     XSendEvent( pDisplay_->GetDisplay(),
201cdf0e10cSrcweir                 mhForeignParent,
202cdf0e10cSrcweir                 False, NoEventMask, &aEvent );
203cdf0e10cSrcweir     XSync( pDisplay_->GetDisplay(), False );
204cdf0e10cSrcweir     GetDisplay()->GetXLib()->PopXErrorLevel();
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 
208cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
209cdf0e10cSrcweir 
Init(sal_uLong nSalFrameStyle,int nScreen,SystemParentData * pParentData,bool bUseGeometry)210cdf0e10cSrcweir void X11SalFrame::Init( sal_uLong nSalFrameStyle, int nScreen, SystemParentData* pParentData, bool bUseGeometry )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     if( nScreen < 0 || nScreen >= GetDisplay()->GetScreenCount() )
213cdf0e10cSrcweir         nScreen = GetDisplay()->GetDefaultScreenNumber();
214cdf0e10cSrcweir     if( mpParent )
215cdf0e10cSrcweir         nScreen = mpParent->m_nScreen;
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     m_nScreen   = nScreen;
218cdf0e10cSrcweir 	nStyle_ 	= nSalFrameStyle;
219cdf0e10cSrcweir 	XWMHints Hints;
220cdf0e10cSrcweir     Hints.flags = InputHint;
221cdf0e10cSrcweir     Hints.input = (nSalFrameStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ? False : True;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     int x = 0, y = 0;
224cdf0e10cSrcweir     unsigned int w = 500, h = 500;
225cdf0e10cSrcweir     XSetWindowAttributes Attributes;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     int nAttrMask =   CWBorderPixel
228cdf0e10cSrcweir                     | CWBackPixmap
229cdf0e10cSrcweir                     | CWColormap
230cdf0e10cSrcweir                     | CWOverrideRedirect
231cdf0e10cSrcweir                     | CWEventMask
232cdf0e10cSrcweir                     ;
233cdf0e10cSrcweir     Attributes.border_pixel             = 0;
234cdf0e10cSrcweir     Attributes.background_pixmap		= None;
235cdf0e10cSrcweir     Attributes.colormap					= GetDisplay()->GetColormap( m_nScreen ).GetXColormap();
236cdf0e10cSrcweir     Attributes.override_redirect		= False;
237cdf0e10cSrcweir     Attributes.event_mask				= CLIENT_EVENTS;
238cdf0e10cSrcweir 
239cdf0e10cSrcweir     const SalVisual& rVis = GetDisplay()->GetVisual( m_nScreen );
240cdf0e10cSrcweir     XLIB_Window aFrameParent = pParentData ? pParentData->aWindow : GetDisplay()->GetRootWindow( m_nScreen );
241cdf0e10cSrcweir     XLIB_Window aClientLeader = None;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     if( bUseGeometry )
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         x = maGeometry.nX;
246cdf0e10cSrcweir         y = maGeometry.nY;
247cdf0e10cSrcweir         w = maGeometry.nWidth;
248cdf0e10cSrcweir         h = maGeometry.nHeight;
249cdf0e10cSrcweir     }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     if( (nSalFrameStyle & SAL_FRAME_STYLE_FLOAT) &&
252cdf0e10cSrcweir         ! (nSalFrameStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION)
253cdf0e10cSrcweir         )
254cdf0e10cSrcweir 	{
255cdf0e10cSrcweir         if( nShowState_ == SHOWSTATE_UNKNOWN )
256cdf0e10cSrcweir         {
257cdf0e10cSrcweir             w = 10;
258cdf0e10cSrcweir             h = 10;
259cdf0e10cSrcweir         }
260cdf0e10cSrcweir         Attributes.override_redirect = True;
261cdf0e10cSrcweir 	}
262cdf0e10cSrcweir     else if( (nSalFrameStyle & SAL_FRAME_STYLE_SYSTEMCHILD ) )
263cdf0e10cSrcweir     {
264cdf0e10cSrcweir         DBG_ASSERT( mpParent, "SAL_FRAME_STYLE_SYSTEMCHILD window without parent" );
265cdf0e10cSrcweir         if( mpParent )
266cdf0e10cSrcweir         {
267cdf0e10cSrcweir             aFrameParent = mpParent->mhWindow;
268cdf0e10cSrcweir             // FIXME: since with SAL_FRAME_STYLE_SYSTEMCHILD
269cdf0e10cSrcweir             // multiple X11SalFrame objects can have the same shell window
270cdf0e10cSrcweir             // dispatching events in saldisp.cxx is unclear (the first frame)
271cdf0e10cSrcweir             // wins. HTH this correctly is unclear yet
272cdf0e10cSrcweir             // for the time being, treat set the shell window to own window
273cdf0e10cSrcweir             // like for a normal frame
274cdf0e10cSrcweir             // mhShellWindow = mpParent->GetShellWindow();
275cdf0e10cSrcweir         }
276cdf0e10cSrcweir     }
277cdf0e10cSrcweir 	else if( pParentData )
278cdf0e10cSrcweir 	{
279cdf0e10cSrcweir         // plugin parent may be killed unexpectedly by
280cdf0e10cSrcweir         // plugging process; ignore XErrors in that case
281cdf0e10cSrcweir         GetDisplay()->setHaveSystemChildFrame();
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 		nStyle_ |= SAL_FRAME_STYLE_PLUG;
284cdf0e10cSrcweir         Attributes.override_redirect = True;
285cdf0e10cSrcweir         if( pParentData->nSize >= sizeof(SystemParentData) )
286cdf0e10cSrcweir             m_bXEmbed = pParentData->bXEmbedSupport;
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 		int x_ret, y_ret;
289cdf0e10cSrcweir 		unsigned int bw, d;
290cdf0e10cSrcweir 		XLIB_Window aRoot, aParent;
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 		XGetGeometry( GetXDisplay(), pParentData->aWindow,
293cdf0e10cSrcweir 					  &aRoot, &x_ret, &y_ret, &w, &h, &bw, &d );
294cdf0e10cSrcweir 		mhForeignParent = pParentData->aWindow;
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 		mhShellWindow = aParent = mhForeignParent;
297cdf0e10cSrcweir 		XLIB_Window* pChildren;
298cdf0e10cSrcweir 		unsigned int nChildren;
299cdf0e10cSrcweir         bool bBreak = false;
300cdf0e10cSrcweir 		do
301cdf0e10cSrcweir 		{
302cdf0e10cSrcweir 			XQueryTree( GetDisplay()->GetDisplay(), mhShellWindow,
303cdf0e10cSrcweir 						&aRoot, &aParent, &pChildren, &nChildren );
304cdf0e10cSrcweir 			XFree( pChildren );
305cdf0e10cSrcweir 			if( aParent != aRoot )
306cdf0e10cSrcweir 				mhShellWindow = aParent;
307cdf0e10cSrcweir             int nCount = 0;
308cdf0e10cSrcweir             Atom* pProps = XListProperties( GetDisplay()->GetDisplay(),
309cdf0e10cSrcweir                                             mhShellWindow,
310cdf0e10cSrcweir                                             &nCount );
311cdf0e10cSrcweir             for( int i = 0; i < nCount && ! bBreak; ++i )
312cdf0e10cSrcweir                 bBreak = (pProps[i] == XA_WM_HINTS);
313cdf0e10cSrcweir             if( pProps )
314cdf0e10cSrcweir                 XFree( pProps );
315cdf0e10cSrcweir 		} while( aParent != aRoot && ! bBreak );
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 		// check if this is really one of our own frames
318cdf0e10cSrcweir 		// do not change the input mask in that case
319cdf0e10cSrcweir         const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames();
320cdf0e10cSrcweir         std::list< SalFrame* >::const_iterator it = rFrames.begin();
321cdf0e10cSrcweir         while( it != rFrames.end() && mhForeignParent != static_cast<const X11SalFrame*>(*it)->GetWindow() )
322cdf0e10cSrcweir             ++it;
323cdf0e10cSrcweir 
324cdf0e10cSrcweir 		if( it == rFrames.end() )
325cdf0e10cSrcweir 		{
326cdf0e10cSrcweir 			XSelectInput( GetDisplay()->GetDisplay(), mhForeignParent, StructureNotifyMask | FocusChangeMask );
327cdf0e10cSrcweir 			XSelectInput( GetDisplay()->GetDisplay(), mhShellWindow, StructureNotifyMask | FocusChangeMask );
328cdf0e10cSrcweir 		}
329cdf0e10cSrcweir     }
330cdf0e10cSrcweir     else
331cdf0e10cSrcweir     {
332cdf0e10cSrcweir         if( ! bUseGeometry )
333cdf0e10cSrcweir         {
334cdf0e10cSrcweir             Size aScreenSize( GetDisplay()->getDataForScreen( m_nScreen ).m_aSize );
335cdf0e10cSrcweir             w = aScreenSize.Width();
336cdf0e10cSrcweir             h = aScreenSize.Height();
337cdf0e10cSrcweir             if( nSalFrameStyle & SAL_FRAME_STYLE_SIZEABLE &&
338cdf0e10cSrcweir                 nSalFrameStyle & SAL_FRAME_STYLE_MOVEABLE )
339cdf0e10cSrcweir             {
340cdf0e10cSrcweir                 // fill in holy default values brought to us by product management
341cdf0e10cSrcweir                 if( aScreenSize.Width() >= 800 )
342cdf0e10cSrcweir                     w = 785;
343cdf0e10cSrcweir                 if( aScreenSize.Width() >= 1024 )
344cdf0e10cSrcweir                     w = 920;
345cdf0e10cSrcweir 
346cdf0e10cSrcweir                 if( aScreenSize.Height() >= 600 )
347cdf0e10cSrcweir                     h = 550;
348cdf0e10cSrcweir                 if( aScreenSize.Height() >= 768 )
349cdf0e10cSrcweir                     h = 630;
350cdf0e10cSrcweir                 if( aScreenSize.Height() >= 1024 )
351cdf0e10cSrcweir                     h = 875;
352cdf0e10cSrcweir             }
353cdf0e10cSrcweir             if( ! mpParent )
354cdf0e10cSrcweir             {
355cdf0e10cSrcweir                 // find the last document window (if any)
356cdf0e10cSrcweir                 const X11SalFrame* pFrame = NULL;
357cdf0e10cSrcweir                 const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames();
358cdf0e10cSrcweir                 std::list< SalFrame* >::const_iterator it = rFrames.begin();
359cdf0e10cSrcweir                 while( it != rFrames.end() )
360cdf0e10cSrcweir                 {
361cdf0e10cSrcweir                     pFrame = static_cast< const X11SalFrame* >(*it);
362cdf0e10cSrcweir                     if( ! ( pFrame->mpParent
363cdf0e10cSrcweir                             || pFrame->mbFullScreen
364cdf0e10cSrcweir                             || ! ( pFrame->nStyle_ & SAL_FRAME_STYLE_SIZEABLE )
365cdf0e10cSrcweir                             || ! pFrame->GetUnmirroredGeometry().nWidth
366cdf0e10cSrcweir                             || ! pFrame->GetUnmirroredGeometry().nHeight
367cdf0e10cSrcweir                             )
368cdf0e10cSrcweir                         )
369cdf0e10cSrcweir                         break;
370cdf0e10cSrcweir                     ++it;
371cdf0e10cSrcweir                 }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir                 if( it != rFrames.end() )
374cdf0e10cSrcweir                 {
375cdf0e10cSrcweir                     // set a document position and size
376cdf0e10cSrcweir                     // the first frame gets positioned by the window manager
377cdf0e10cSrcweir                     const SalFrameGeometry& rGeom( pFrame->GetUnmirroredGeometry() );
378cdf0e10cSrcweir                     x = rGeom.nX;
379cdf0e10cSrcweir                     y = rGeom.nY;
380cdf0e10cSrcweir                     if( x+(int)w+40 <= (int)aScreenSize.Width() &&
381cdf0e10cSrcweir                         y+(int)h+40 <= (int)aScreenSize.Height()
382cdf0e10cSrcweir                         )
383cdf0e10cSrcweir                     {
384cdf0e10cSrcweir                         y += 40;
385cdf0e10cSrcweir                         x += 40;
386cdf0e10cSrcweir                     }
387cdf0e10cSrcweir                     else
388cdf0e10cSrcweir                     {
389cdf0e10cSrcweir                         x = 10; // leave some space for decoration
390cdf0e10cSrcweir                         y = 20;
391cdf0e10cSrcweir                     }
392cdf0e10cSrcweir                 }
393cdf0e10cSrcweir                 else if( GetDisplay()->IsXinerama() )
394cdf0e10cSrcweir                 {
395cdf0e10cSrcweir                     // place frame on same screen as mouse pointer
396cdf0e10cSrcweir                     XLIB_Window aRoot, aChild;
397cdf0e10cSrcweir                     int root_x = 0, root_y = 0, lx, ly;
398cdf0e10cSrcweir                     unsigned int mask;
399cdf0e10cSrcweir                     XQueryPointer( GetXDisplay(),
400cdf0e10cSrcweir                                    GetDisplay()->GetRootWindow( m_nScreen ),
401cdf0e10cSrcweir                                    &aRoot, &aChild,
402cdf0e10cSrcweir                                    &root_x, &root_y, &lx, &ly, &mask );
403cdf0e10cSrcweir                     const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreens();
404cdf0e10cSrcweir                     for( unsigned int i = 0; i < rScreens.size(); i++ )
405cdf0e10cSrcweir                         if( rScreens[i].IsInside( Point( root_x, root_y ) ) )
406cdf0e10cSrcweir                         {
407cdf0e10cSrcweir                             x = rScreens[i].Left();
408cdf0e10cSrcweir                             y = rScreens[i].Top();
409cdf0e10cSrcweir                             break;
410cdf0e10cSrcweir                         }
411cdf0e10cSrcweir                 }
412cdf0e10cSrcweir             }
413cdf0e10cSrcweir         }
414cdf0e10cSrcweir         Attributes.win_gravity = pDisplay_->getWMAdaptor()->getInitWinGravity();
415cdf0e10cSrcweir         nAttrMask |= CWWinGravity;
416cdf0e10cSrcweir         if( mpParent )
417cdf0e10cSrcweir         {
418cdf0e10cSrcweir             Attributes.save_under = True;
419cdf0e10cSrcweir             nAttrMask |= CWSaveUnder;
420cdf0e10cSrcweir         }
421cdf0e10cSrcweir         if( IsOverrideRedirect() )
422cdf0e10cSrcweir             Attributes.override_redirect = True;
423cdf0e10cSrcweir         // default icon
424cdf0e10cSrcweir         if( (nStyle_ & SAL_FRAME_STYLE_INTRO) == 0 )
425cdf0e10cSrcweir         {
426cdf0e10cSrcweir             bool bOk=false;
427cdf0e10cSrcweir             try
428cdf0e10cSrcweir             {
429cdf0e10cSrcweir                 bOk=SelectAppIconPixmap( pDisplay_, m_nScreen,
430cdf0e10cSrcweir                                          mnIconID != 1 ? mnIconID :
431cdf0e10cSrcweir                                          (mpParent ? mpParent->mnIconID : 1), 32,
432cdf0e10cSrcweir                                          Hints.icon_pixmap, Hints.icon_mask );
433cdf0e10cSrcweir             }
434cdf0e10cSrcweir             catch( com::sun::star::uno::Exception& )
435cdf0e10cSrcweir             {
436cdf0e10cSrcweir                 // can happen - no ucb during early startup
437cdf0e10cSrcweir             }
438cdf0e10cSrcweir             if( bOk )
439cdf0e10cSrcweir             {
440cdf0e10cSrcweir                 Hints.flags		|= IconPixmapHint;
441cdf0e10cSrcweir                 if( Hints.icon_mask )
442cdf0e10cSrcweir                     Hints.flags	|= IconMaskHint;
443cdf0e10cSrcweir             }
444cdf0e10cSrcweir         }
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 		// find the top level frame of the transience hierarchy
447cdf0e10cSrcweir         X11SalFrame* pFrame = this;
448cdf0e10cSrcweir         while( pFrame->mpParent )
449cdf0e10cSrcweir             pFrame = pFrame->mpParent;
450cdf0e10cSrcweir 		if( (pFrame->nStyle_ & SAL_FRAME_STYLE_PLUG ) )
451cdf0e10cSrcweir 		{
452cdf0e10cSrcweir 			// if the top level window is a plugin window,
453cdf0e10cSrcweir 			// then we should place us in the same window group as
454cdf0e10cSrcweir 			// the parent application (or none if there is no window group
455cdf0e10cSrcweir 			// hint in the parent).
456cdf0e10cSrcweir 			if( pFrame->GetShellWindow() )
457cdf0e10cSrcweir 			{
458cdf0e10cSrcweir 				XWMHints* pWMHints = XGetWMHints( pDisplay_->GetDisplay(),
459cdf0e10cSrcweir 					pFrame->GetShellWindow() );
460cdf0e10cSrcweir 				if( pWMHints )
461cdf0e10cSrcweir 				{
462cdf0e10cSrcweir 					if( (pWMHints->flags & WindowGroupHint) )
463cdf0e10cSrcweir 					{
464cdf0e10cSrcweir 						Hints.flags |= WindowGroupHint;
465cdf0e10cSrcweir 						Hints.window_group = pWMHints->window_group;
466cdf0e10cSrcweir 					}
467cdf0e10cSrcweir 					XFree( pWMHints );
468cdf0e10cSrcweir 				}
469cdf0e10cSrcweir 			}
470cdf0e10cSrcweir 		}
471cdf0e10cSrcweir 		else
472cdf0e10cSrcweir 		{
473cdf0e10cSrcweir 			Hints.flags			|= WindowGroupHint;
474cdf0e10cSrcweir 			Hints.window_group	= pFrame->GetShellWindow();
475cdf0e10cSrcweir 			// note: for a normal document window this will produce None
476cdf0e10cSrcweir 			// as the window is not yet created and the shell window is
477cdf0e10cSrcweir 			// initialized to None. This must be corrected after window creation.
478cdf0e10cSrcweir 			aClientLeader = GetDisplay()->GetDrawable( m_nScreen );
479cdf0e10cSrcweir 		}
480cdf0e10cSrcweir     }
481cdf0e10cSrcweir 
482cdf0e10cSrcweir 	nShowState_ 				= SHOWSTATE_UNKNOWN;
483cdf0e10cSrcweir 	bViewable_					= sal_True;
484cdf0e10cSrcweir 	bMapped_					= sal_False;
485cdf0e10cSrcweir 	nVisibility_				= VisibilityFullyObscured;
486cdf0e10cSrcweir     mhWindow = XCreateWindow( GetXDisplay(),
487cdf0e10cSrcweir                               aFrameParent,
488cdf0e10cSrcweir                               x, y,
489cdf0e10cSrcweir                               w, h,
490cdf0e10cSrcweir                               0,
491cdf0e10cSrcweir                               rVis.GetDepth(),
492cdf0e10cSrcweir                               InputOutput,
493cdf0e10cSrcweir                               rVis.GetVisual(),
494cdf0e10cSrcweir                               nAttrMask,
495cdf0e10cSrcweir                               &Attributes );
496cdf0e10cSrcweir     // FIXME: see above: fake shell window for now to own window
497cdf0e10cSrcweir     if( /*! IsSysChildWindow() &&*/ pParentData == NULL )
498cdf0e10cSrcweir     {
499cdf0e10cSrcweir         mhShellWindow = mhWindow;
500cdf0e10cSrcweir     }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 	// correct window group if necessary
503cdf0e10cSrcweir 	if( (Hints.flags & WindowGroupHint) == WindowGroupHint )
504cdf0e10cSrcweir 	{
505cdf0e10cSrcweir 		if( Hints.window_group == None )
506cdf0e10cSrcweir 			Hints.window_group = GetShellWindow();
507cdf0e10cSrcweir 	}
508cdf0e10cSrcweir 
509cdf0e10cSrcweir     maGeometry.nX		= x;
510cdf0e10cSrcweir     maGeometry.nY		= y;
511cdf0e10cSrcweir     maGeometry.nWidth	= w;
512cdf0e10cSrcweir     maGeometry.nHeight	= h;
513cdf0e10cSrcweir     updateScreenNumber();
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     XSync( GetXDisplay(), False );
516cdf0e10cSrcweir     setXEmbedInfo();
517cdf0e10cSrcweir 
518cdf0e10cSrcweir     XLIB_Time nUserTime = (nStyle_ & (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_TOOLWINDOW) ) == 0 ?
519cdf0e10cSrcweir         pDisplay_->GetLastUserEventTime() : 0;
520cdf0e10cSrcweir     pDisplay_->getWMAdaptor()->setUserTime( this, nUserTime );
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 	if( ! pParentData && ! IsChildWindow() && ! Attributes.override_redirect )
523cdf0e10cSrcweir 	{
524cdf0e10cSrcweir         XSetWMHints( GetXDisplay(), mhWindow, &Hints );
525cdf0e10cSrcweir 		// WM Protocols && internals
526cdf0e10cSrcweir 		Atom a[4];
527cdf0e10cSrcweir 		int  n = 0;
528cdf0e10cSrcweir 		a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_DELETE_WINDOW );
529cdf0e10cSrcweir         if( pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::NET_WM_PING ) )
530cdf0e10cSrcweir             a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::NET_WM_PING );
531cdf0e10cSrcweir         if( ! s_pSaveYourselfFrame && ! mpParent)
532cdf0e10cSrcweir         {
533cdf0e10cSrcweir             // at all times have only one frame with SaveYourself
534cdf0e10cSrcweir             a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_SAVE_YOURSELF );
535cdf0e10cSrcweir             s_pSaveYourselfFrame = this;
536cdf0e10cSrcweir         }
537cdf0e10cSrcweir         if( (nSalFrameStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) )
538cdf0e10cSrcweir             a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_TAKE_FOCUS );
539cdf0e10cSrcweir 		XSetWMProtocols( GetXDisplay(), GetShellWindow(), a, n );
540cdf0e10cSrcweir 
541cdf0e10cSrcweir         XClassHint* pClass = XAllocClassHint();
542cdf0e10cSrcweir         pClass->res_name  = const_cast<char*>(X11SalData::getFrameResName());
543cdf0e10cSrcweir         pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName());
544cdf0e10cSrcweir         XSetClassHint( GetXDisplay(), GetShellWindow(), pClass );
545cdf0e10cSrcweir         XFree( pClass );
546cdf0e10cSrcweir 
547cdf0e10cSrcweir         XSizeHints* pHints = XAllocSizeHints();
548cdf0e10cSrcweir         pHints->flags       = PWinGravity | PPosition;
549cdf0e10cSrcweir         pHints->win_gravity = GetDisplay()->getWMAdaptor()->getPositionWinGravity();
550cdf0e10cSrcweir         pHints->x           = 0;
551cdf0e10cSrcweir         pHints->y           = 0;
552cdf0e10cSrcweir         if( mbFullScreen )
553cdf0e10cSrcweir         {
554cdf0e10cSrcweir             pHints->flags |= PMaxSize | PMinSize;
555cdf0e10cSrcweir             pHints->max_width = w+100;
556cdf0e10cSrcweir             pHints->max_height = h+100;
557cdf0e10cSrcweir             pHints->min_width  = w;
558cdf0e10cSrcweir             pHints->min_height = h;
559cdf0e10cSrcweir         }
560cdf0e10cSrcweir         XSetWMNormalHints( GetXDisplay(),
561cdf0e10cSrcweir                            GetShellWindow(),
562cdf0e10cSrcweir                            pHints );
563cdf0e10cSrcweir         XFree (pHints);
564cdf0e10cSrcweir 
565cdf0e10cSrcweir         // set PID and WM_CLIENT_MACHINE
566cdf0e10cSrcweir         pDisplay_->getWMAdaptor()->setClientMachine( this );
567cdf0e10cSrcweir         pDisplay_->getWMAdaptor()->setPID( this );
568cdf0e10cSrcweir 
569cdf0e10cSrcweir         // set client leader
570cdf0e10cSrcweir 		if( aClientLeader )
571cdf0e10cSrcweir 		{
572cdf0e10cSrcweir 			XChangeProperty( GetXDisplay(),
573cdf0e10cSrcweir             	             mhWindow,
574cdf0e10cSrcweir 							 pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_CLIENT_LEADER),
575cdf0e10cSrcweir 							 XA_WINDOW,
576cdf0e10cSrcweir 							 32,
577cdf0e10cSrcweir 							 PropModeReplace,
578cdf0e10cSrcweir 							 (unsigned char*)&aClientLeader,
579cdf0e10cSrcweir 							 1
580cdf0e10cSrcweir 							 );
581cdf0e10cSrcweir 		}
582cdf0e10cSrcweir #define DECOFLAGS (SAL_FRAME_STYLE_MOVEABLE | SAL_FRAME_STYLE_SIZEABLE | SAL_FRAME_STYLE_CLOSEABLE)
583cdf0e10cSrcweir         int nDecoFlags = WMAdaptor::decoration_All;
584cdf0e10cSrcweir         if( (nStyle_ & SAL_FRAME_STYLE_PARTIAL_FULLSCREEN) ||
585cdf0e10cSrcweir             (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION)
586cdf0e10cSrcweir             )
587cdf0e10cSrcweir             nDecoFlags = 0;
588cdf0e10cSrcweir         else if( (nStyle_ & DECOFLAGS ) != DECOFLAGS || (nStyle_ & SAL_FRAME_STYLE_TOOLWINDOW) )
589cdf0e10cSrcweir         {
590cdf0e10cSrcweir             if( nStyle_ & DECOFLAGS )
591cdf0e10cSrcweir                 // if any decoration, then show a border
592cdf0e10cSrcweir                 nDecoFlags = WMAdaptor::decoration_Border;
593cdf0e10cSrcweir             else
594cdf0e10cSrcweir                 nDecoFlags = 0;
595cdf0e10cSrcweir 
596cdf0e10cSrcweir             if( ! mpParent && (nStyle_ & DECOFLAGS) )
597cdf0e10cSrcweir                 // don't add a min button if window should be decorationless
598cdf0e10cSrcweir                 nDecoFlags |= WMAdaptor::decoration_MinimizeBtn;
599cdf0e10cSrcweir             if( nStyle_ & SAL_FRAME_STYLE_CLOSEABLE )
600cdf0e10cSrcweir                 nDecoFlags |= WMAdaptor::decoration_CloseBtn;
601cdf0e10cSrcweir             if( nStyle_ & SAL_FRAME_STYLE_SIZEABLE )
602cdf0e10cSrcweir             {
603cdf0e10cSrcweir                 nDecoFlags |= WMAdaptor::decoration_Resize;
604cdf0e10cSrcweir                 if( ! (nStyle_ & SAL_FRAME_STYLE_TOOLWINDOW) )
605cdf0e10cSrcweir                     nDecoFlags |= WMAdaptor::decoration_MaximizeBtn;
606cdf0e10cSrcweir             }
607cdf0e10cSrcweir             if( nStyle_ & SAL_FRAME_STYLE_MOVEABLE )
608cdf0e10cSrcweir                 nDecoFlags |= WMAdaptor::decoration_Title;
609cdf0e10cSrcweir         }
610cdf0e10cSrcweir 
611cdf0e10cSrcweir         WMAdaptor::WMWindowType eType = WMAdaptor::windowType_Normal;
612cdf0e10cSrcweir         if( nStyle_ & SAL_FRAME_STYLE_INTRO )
613cdf0e10cSrcweir             eType = WMAdaptor::windowType_Splash;
614cdf0e10cSrcweir         if( (nStyle_ & SAL_FRAME_STYLE_DIALOG) && hPresentationWindow == None )
615cdf0e10cSrcweir             eType = WMAdaptor::windowType_ModelessDialogue;
616cdf0e10cSrcweir         if( nStyle_ & SAL_FRAME_STYLE_TOOLWINDOW )
617cdf0e10cSrcweir             eType = WMAdaptor::windowType_Utility;
618cdf0e10cSrcweir         if( nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION )
619cdf0e10cSrcweir             eType = WMAdaptor::windowType_Toolbar;
620cdf0e10cSrcweir         if(    (nStyle_ & SAL_FRAME_STYLE_PARTIAL_FULLSCREEN)
621cdf0e10cSrcweir             && GetDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() )
622cdf0e10cSrcweir             eType = WMAdaptor::windowType_Dock;
623cdf0e10cSrcweir 
624cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->
625cdf0e10cSrcweir             setFrameTypeAndDecoration( this,
626cdf0e10cSrcweir                                        eType,
627cdf0e10cSrcweir                                        nDecoFlags,
628cdf0e10cSrcweir                                        hPresentationWindow ? NULL : mpParent );
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 	    if( (nStyle_ & (SAL_FRAME_STYLE_DEFAULT |
631cdf0e10cSrcweir                         SAL_FRAME_STYLE_OWNERDRAWDECORATION|
632cdf0e10cSrcweir                         SAL_FRAME_STYLE_FLOAT |
633cdf0e10cSrcweir                         SAL_FRAME_STYLE_INTRO |
634cdf0e10cSrcweir                         SAL_FRAME_STYLE_PARTIAL_FULLSCREEN) )
635cdf0e10cSrcweir              == SAL_FRAME_STYLE_DEFAULT )
636cdf0e10cSrcweir             pDisplay_->getWMAdaptor()->maximizeFrame( this, true, true );
637cdf0e10cSrcweir 	}
638cdf0e10cSrcweir 
639cdf0e10cSrcweir     m_nWorkArea = GetDisplay()->getWMAdaptor()->getCurrentWorkArea();
640cdf0e10cSrcweir 
641cdf0e10cSrcweir 	// Pointer
642cdf0e10cSrcweir 	SetPointer( POINTER_ARROW );
643cdf0e10cSrcweir }
644cdf0e10cSrcweir 
645cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
X11SalFrame(SalFrame * pParent,sal_uLong nSalFrameStyle,SystemParentData * pSystemParent)646cdf0e10cSrcweir X11SalFrame::X11SalFrame( SalFrame *pParent, sal_uLong nSalFrameStyle, SystemParentData* pSystemParent )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir 	X11SalData* pSalData = GetX11SalData();
649cdf0e10cSrcweir 
650cdf0e10cSrcweir     // initialize frame geometry
651cdf0e10cSrcweir     memset( &maGeometry, 0, sizeof(maGeometry) );
652cdf0e10cSrcweir 
653cdf0e10cSrcweir     mpParent					= static_cast< X11SalFrame* >( pParent );
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     mbTransientForRoot			= false;
656cdf0e10cSrcweir 
657cdf0e10cSrcweir 	pDisplay_					= pSalData->GetDisplay();
658cdf0e10cSrcweir 	// insert frame in framelist
659cdf0e10cSrcweir     pDisplay_->registerFrame( this );
660cdf0e10cSrcweir 
661cdf0e10cSrcweir     mhWindow					= None;
662cdf0e10cSrcweir     mhShellWindow				= None;
663cdf0e10cSrcweir     mhStackingWindow			= None;
664cdf0e10cSrcweir     mhForeignParent				= None;
665cdf0e10cSrcweir     mhBackgroundPixmap          = None;
666cdf0e10cSrcweir     m_bSetFocusOnMap            = false;
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 	pGraphics_					= NULL;
669cdf0e10cSrcweir 	pFreeGraphics_				= NULL;
670cdf0e10cSrcweir 
671cdf0e10cSrcweir 	hCursor_					= None;
672cdf0e10cSrcweir 	nCaptured_					= 0;
673cdf0e10cSrcweir 
674cdf0e10cSrcweir  	nReleaseTime_				= 0;
675cdf0e10cSrcweir 	nKeyCode_					= 0;
676cdf0e10cSrcweir 	nKeyState_					= 0;
677cdf0e10cSrcweir 	nCompose_					= -1;
678cdf0e10cSrcweir     mbKeyMenu					= false;
679cdf0e10cSrcweir     mbSendExtKeyModChange		= false;
680cdf0e10cSrcweir     mnExtKeyMod					= 0;
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 	nShowState_ 				= SHOWSTATE_UNKNOWN;
683cdf0e10cSrcweir 	nWidth_ 					= 0;
684cdf0e10cSrcweir 	nHeight_					= 0;
685cdf0e10cSrcweir 	nStyle_ 					= 0;
686cdf0e10cSrcweir     mnExtStyle                  = 0;
687cdf0e10cSrcweir 	bAlwaysOnTop_				= sal_False;
688cdf0e10cSrcweir 
689cdf0e10cSrcweir     // set bViewable_ to sal_True: hack GetClientSize to report something
690cdf0e10cSrcweir     // different to 0/0 before first map
691cdf0e10cSrcweir 	bViewable_					= sal_True;
692cdf0e10cSrcweir 	bMapped_					= sal_False;
693cdf0e10cSrcweir 	bDefaultPosition_			= sal_True;
694cdf0e10cSrcweir 	nVisibility_				= VisibilityFullyObscured;
695cdf0e10cSrcweir     m_nWorkArea                 = 0;
696cdf0e10cSrcweir     mbInShow					= sal_False;
697cdf0e10cSrcweir     m_bXEmbed                   = false;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 	nScreenSaversTimeout_		= 0;
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 	mpInputContext 				= NULL;
702cdf0e10cSrcweir 	mbInputFocus				= False;
703cdf0e10cSrcweir 
704cdf0e10cSrcweir     maAlwaysOnTopRaiseTimer.SetTimeoutHdl( LINK( this, X11SalFrame, HandleAlwaysOnTopRaise ) );
705cdf0e10cSrcweir     maAlwaysOnTopRaiseTimer.SetTimeout( 100 );
706cdf0e10cSrcweir 
707cdf0e10cSrcweir     meWindowType				= WMAdaptor::windowType_Normal;
708cdf0e10cSrcweir     mnDecorationFlags			= WMAdaptor::decoration_All;
709cdf0e10cSrcweir     mbMaximizedVert				= false;
710cdf0e10cSrcweir     mbMaximizedHorz				= false;
711cdf0e10cSrcweir     mbShaded					= false;
712cdf0e10cSrcweir     mbFullScreen				= false;
713cdf0e10cSrcweir 
714cdf0e10cSrcweir     mnIconID					= 1; // ICON_DEFAULT
715cdf0e10cSrcweir 
716cdf0e10cSrcweir     m_pClipRectangles           = NULL;
717cdf0e10cSrcweir     m_nCurClipRect              = 0;
718cdf0e10cSrcweir     m_nMaxClipRect              = 0;
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 	if( mpParent )
721cdf0e10cSrcweir 		mpParent->maChildren.push_back( this );
722cdf0e10cSrcweir 
723cdf0e10cSrcweir 	Init( nSalFrameStyle, GetDisplay()->GetDefaultScreenNumber(), pSystemParent );
724cdf0e10cSrcweir }
725cdf0e10cSrcweir 
726cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
727cdf0e10cSrcweir 
passOnSaveYourSelf()728cdf0e10cSrcweir void X11SalFrame::passOnSaveYourSelf()
729cdf0e10cSrcweir {
730cdf0e10cSrcweir     if( this == s_pSaveYourselfFrame )
731cdf0e10cSrcweir     {
732cdf0e10cSrcweir         // pass on SaveYourself
733cdf0e10cSrcweir         const X11SalFrame* pFrame = NULL;
734cdf0e10cSrcweir         const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames();
735cdf0e10cSrcweir         std::list< SalFrame* >::const_iterator it = rFrames.begin();
736cdf0e10cSrcweir         while( it != rFrames.end() )
737cdf0e10cSrcweir         {
738cdf0e10cSrcweir             pFrame = static_cast< const X11SalFrame* >(*it);
739cdf0e10cSrcweir             if( ! ( IsChildWindow() || pFrame->mpParent )
740cdf0e10cSrcweir                 && pFrame != s_pSaveYourselfFrame )
741cdf0e10cSrcweir                     break;
742cdf0e10cSrcweir             ++it;
743cdf0e10cSrcweir         }
744cdf0e10cSrcweir 
745cdf0e10cSrcweir         s_pSaveYourselfFrame = (it != rFrames.end() ) ? const_cast<X11SalFrame*>(pFrame) : NULL;
746cdf0e10cSrcweir         if( s_pSaveYourselfFrame )
747cdf0e10cSrcweir         {
748cdf0e10cSrcweir             Atom a[4];
749cdf0e10cSrcweir             int  n = 0;
750cdf0e10cSrcweir             a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_DELETE_WINDOW );
751cdf0e10cSrcweir             a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_SAVE_YOURSELF );
752cdf0e10cSrcweir             if( pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::NET_WM_PING ) )
753cdf0e10cSrcweir                 a[n++] = pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::NET_WM_PING );
754cdf0e10cSrcweir             XSetWMProtocols( GetXDisplay(), s_pSaveYourselfFrame->GetShellWindow(), a, n );
755cdf0e10cSrcweir         }
756cdf0e10cSrcweir     }
757cdf0e10cSrcweir }
758cdf0e10cSrcweir 
~X11SalFrame()759cdf0e10cSrcweir X11SalFrame::~X11SalFrame()
760cdf0e10cSrcweir {
761cdf0e10cSrcweir 	notifyDelete();
762cdf0e10cSrcweir 
763cdf0e10cSrcweir     if( m_pClipRectangles )
764cdf0e10cSrcweir     {
765cdf0e10cSrcweir         delete [] m_pClipRectangles;
766cdf0e10cSrcweir         m_pClipRectangles = NULL;
767cdf0e10cSrcweir         m_nCurClipRect = m_nMaxClipRect = 0;
768cdf0e10cSrcweir     }
769cdf0e10cSrcweir 
770cdf0e10cSrcweir     if( mhBackgroundPixmap )
771cdf0e10cSrcweir     {
772cdf0e10cSrcweir         XSetWindowBackgroundPixmap( GetXDisplay(), GetWindow(), None );
773cdf0e10cSrcweir         XFreePixmap( GetXDisplay(), mhBackgroundPixmap );
774cdf0e10cSrcweir     }
775cdf0e10cSrcweir 
776cdf0e10cSrcweir     if( mhStackingWindow )
777cdf0e10cSrcweir         aPresentationReparentList.remove( mhStackingWindow );
778cdf0e10cSrcweir 
779cdf0e10cSrcweir 	// remove from parent's list
780cdf0e10cSrcweir 	if( mpParent )
781cdf0e10cSrcweir 		mpParent->maChildren.remove( this );
782cdf0e10cSrcweir 
783cdf0e10cSrcweir     // deregister on SalDisplay
784cdf0e10cSrcweir     pDisplay_->deregisterFrame( this );
785cdf0e10cSrcweir 
786cdf0e10cSrcweir 	// unselect all events, some may be still in the queue anyway
787cdf0e10cSrcweir     if( ! IsSysChildWindow() )
788cdf0e10cSrcweir         XSelectInput( GetXDisplay(), GetShellWindow(), 0 );
789cdf0e10cSrcweir 	XSelectInput( GetXDisplay(), GetWindow(), 0 );
790cdf0e10cSrcweir 
791cdf0e10cSrcweir 	ShowFullScreen( sal_False, 0 );
792cdf0e10cSrcweir 
793cdf0e10cSrcweir 	if( bMapped_ )
794cdf0e10cSrcweir 		Show( sal_False );
795cdf0e10cSrcweir 
796cdf0e10cSrcweir     if( mpInputContext )
797cdf0e10cSrcweir     {
798cdf0e10cSrcweir         mpInputContext->UnsetICFocus( this );
799cdf0e10cSrcweir         mpInputContext->Unmap( this );
800cdf0e10cSrcweir         delete mpInputContext;
801cdf0e10cSrcweir     }
802cdf0e10cSrcweir 
803cdf0e10cSrcweir     if( GetWindow() == hPresentationWindow )
804cdf0e10cSrcweir     {
805cdf0e10cSrcweir         hPresentationWindow = None;
806cdf0e10cSrcweir         doReparentPresentationDialogues( GetDisplay() );
807cdf0e10cSrcweir     }
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 	if( pGraphics_ )
810cdf0e10cSrcweir 	{
811cdf0e10cSrcweir 		pGraphics_->DeInit();
812cdf0e10cSrcweir 		delete pGraphics_;
813cdf0e10cSrcweir 	}
814cdf0e10cSrcweir 
815cdf0e10cSrcweir 	if( pFreeGraphics_ )
816cdf0e10cSrcweir 	{
817cdf0e10cSrcweir 		pFreeGraphics_->DeInit();
818cdf0e10cSrcweir 		delete pFreeGraphics_;
819cdf0e10cSrcweir 	}
820cdf0e10cSrcweir 
821cdf0e10cSrcweir 
822cdf0e10cSrcweir     XDestroyWindow( GetXDisplay(), mhWindow );
823cdf0e10cSrcweir 
824cdf0e10cSrcweir     /*
825cdf0e10cSrcweir      *  check if there is only the status frame left
826cdf0e10cSrcweir      *  if so, free it
827cdf0e10cSrcweir      */
828cdf0e10cSrcweir     if( ! GetDisplay()->getFrames().empty() && I18NStatus::exists() )
829cdf0e10cSrcweir     {
830cdf0e10cSrcweir         SalFrame* pStatusFrame = I18NStatus::get().getStatusFrame();
831cdf0e10cSrcweir         std::list< SalFrame* >::const_iterator sit = GetDisplay()->getFrames().begin();
832cdf0e10cSrcweir         if( pStatusFrame
833cdf0e10cSrcweir             && *sit == pStatusFrame
834cdf0e10cSrcweir             && ++sit == GetDisplay()->getFrames().end() )
835cdf0e10cSrcweir             vcl::I18NStatus::free();
836cdf0e10cSrcweir     }
837cdf0e10cSrcweir 
838cdf0e10cSrcweir     passOnSaveYourSelf();
839cdf0e10cSrcweir }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
842cdf0e10cSrcweir 
SetExtendedFrameStyle(SalExtStyle nStyle)843cdf0e10cSrcweir void X11SalFrame::SetExtendedFrameStyle( SalExtStyle nStyle )
844cdf0e10cSrcweir {
845cdf0e10cSrcweir     if( nStyle != mnExtStyle && ! IsChildWindow() )
846cdf0e10cSrcweir     {
847cdf0e10cSrcweir         mnExtStyle = nStyle;
848cdf0e10cSrcweir 
849cdf0e10cSrcweir         XClassHint* pClass = XAllocClassHint();
850cdf0e10cSrcweir         rtl::OString aResHint = X11SalData::getFrameResName( mnExtStyle );
851cdf0e10cSrcweir         pClass->res_name  = const_cast<char*>(aResHint.getStr());
852cdf0e10cSrcweir         pClass->res_class = const_cast<char*>(X11SalData::getFrameClassName());
853cdf0e10cSrcweir         XSetClassHint( GetXDisplay(), GetShellWindow(), pClass );
854cdf0e10cSrcweir         XFree( pClass );
855cdf0e10cSrcweir     }
856cdf0e10cSrcweir }
857cdf0e10cSrcweir 
858cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
859cdf0e10cSrcweir 
SetBackgroundBitmap(SalBitmap * pBitmap)860cdf0e10cSrcweir void X11SalFrame::SetBackgroundBitmap( SalBitmap* pBitmap )
861cdf0e10cSrcweir {
862cdf0e10cSrcweir     if( mhBackgroundPixmap )
863cdf0e10cSrcweir     {
864cdf0e10cSrcweir         XSetWindowBackgroundPixmap( GetXDisplay(), GetWindow(), None );
865cdf0e10cSrcweir         XFreePixmap( GetXDisplay(), mhBackgroundPixmap );
866cdf0e10cSrcweir         mhBackgroundPixmap = None;
867cdf0e10cSrcweir     }
868cdf0e10cSrcweir     if( pBitmap )
869cdf0e10cSrcweir     {
870cdf0e10cSrcweir         X11SalBitmap* pBM = static_cast<X11SalBitmap*>(pBitmap);
871cdf0e10cSrcweir         Size aSize = pBM->GetSize();
872cdf0e10cSrcweir         if( aSize.Width() && aSize.Height() )
873cdf0e10cSrcweir         {
874cdf0e10cSrcweir             mhBackgroundPixmap =
875cdf0e10cSrcweir                 XCreatePixmap( GetXDisplay(),
876cdf0e10cSrcweir                                GetWindow(),
877cdf0e10cSrcweir                                aSize.Width(),
878cdf0e10cSrcweir                                aSize.Height(),
879cdf0e10cSrcweir                                GetDisplay()->GetVisual( m_nScreen ).GetDepth() );
880cdf0e10cSrcweir             if( mhBackgroundPixmap )
881cdf0e10cSrcweir             {
882cdf0e10cSrcweir                 SalTwoRect aTwoRect;
883cdf0e10cSrcweir                 aTwoRect.mnSrcX = aTwoRect.mnSrcY = aTwoRect.mnDestX = aTwoRect.mnDestY = 0;
884cdf0e10cSrcweir                 aTwoRect.mnSrcWidth = aTwoRect.mnDestWidth = aSize.Width();
885cdf0e10cSrcweir                 aTwoRect.mnSrcHeight = aTwoRect.mnDestHeight = aSize.Height();
886cdf0e10cSrcweir                 pBM->ImplDraw( mhBackgroundPixmap,
887cdf0e10cSrcweir                                m_nScreen,
888cdf0e10cSrcweir                                GetDisplay()->GetVisual( m_nScreen ).GetDepth(),
889cdf0e10cSrcweir                                aTwoRect, GetDisplay()->GetCopyGC( m_nScreen ) );
890cdf0e10cSrcweir                 XSetWindowBackgroundPixmap( GetXDisplay(), GetWindow(), mhBackgroundPixmap );
891cdf0e10cSrcweir             }
892cdf0e10cSrcweir         }
893cdf0e10cSrcweir     }
894cdf0e10cSrcweir }
895cdf0e10cSrcweir 
896cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
897cdf0e10cSrcweir 
GetSystemData() const898cdf0e10cSrcweir const SystemChildData* X11SalFrame::GetSystemData() const
899cdf0e10cSrcweir {
900cdf0e10cSrcweir 	X11SalFrame *pFrame = const_cast<X11SalFrame*>(this);
901cdf0e10cSrcweir 	pFrame->maSystemChildData.nSize 		= sizeof( SystemChildData );
902cdf0e10cSrcweir 	pFrame->maSystemChildData.pDisplay		= GetXDisplay();
903cdf0e10cSrcweir 	pFrame->maSystemChildData.aWindow		= pFrame->GetWindow();
904cdf0e10cSrcweir 	pFrame->maSystemChildData.pSalFrame 	= pFrame;
905cdf0e10cSrcweir 	pFrame->maSystemChildData.pWidget		= NULL;
906cdf0e10cSrcweir 	pFrame->maSystemChildData.pVisual		= GetDisplay()->GetVisual( m_nScreen ).GetVisual();
907cdf0e10cSrcweir 	pFrame->maSystemChildData.nScreen		= m_nScreen;
908cdf0e10cSrcweir 	pFrame->maSystemChildData.nDepth		= GetDisplay()->GetVisual( m_nScreen ).GetDepth();
909cdf0e10cSrcweir 	pFrame->maSystemChildData.aColormap		= GetDisplay()->GetColormap( m_nScreen ).GetXColormap();
910cdf0e10cSrcweir 	pFrame->maSystemChildData.pAppContext	= NULL;
911cdf0e10cSrcweir 	pFrame->maSystemChildData.aShellWindow	= pFrame->GetShellWindow();
912cdf0e10cSrcweir 	pFrame->maSystemChildData.pShellWidget	= NULL;
913cdf0e10cSrcweir 	return &maSystemChildData;
914cdf0e10cSrcweir }
915cdf0e10cSrcweir 
GetGraphics()916cdf0e10cSrcweir SalGraphics *X11SalFrame::GetGraphics()
917cdf0e10cSrcweir {
918cdf0e10cSrcweir 	if( pGraphics_ )
919cdf0e10cSrcweir 		return NULL;
920cdf0e10cSrcweir 
921cdf0e10cSrcweir 	if( pFreeGraphics_ )
922cdf0e10cSrcweir 	{
923cdf0e10cSrcweir 		pGraphics_		= pFreeGraphics_;
924cdf0e10cSrcweir 		pFreeGraphics_	= NULL;
925cdf0e10cSrcweir 	}
926cdf0e10cSrcweir 	else
927cdf0e10cSrcweir 	{
928cdf0e10cSrcweir 		pGraphics_ = new X11SalGraphics();
929cdf0e10cSrcweir 		pGraphics_->Init( this, GetWindow(), m_nScreen );
930cdf0e10cSrcweir 	}
931cdf0e10cSrcweir 
932cdf0e10cSrcweir 	return pGraphics_;
933cdf0e10cSrcweir }
934cdf0e10cSrcweir 
ReleaseGraphics(SalGraphics * pGraphics)935cdf0e10cSrcweir void X11SalFrame::ReleaseGraphics( SalGraphics *pGraphics )
936cdf0e10cSrcweir {
937cdf0e10cSrcweir     DBG_ASSERT( pGraphics == pGraphics_, "SalFrame::ReleaseGraphics pGraphics!=pGraphics_" );
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 	if( pGraphics != pGraphics_ )
940cdf0e10cSrcweir 		return;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir 	pFreeGraphics_	= pGraphics_;
943cdf0e10cSrcweir 	pGraphics_		= NULL;
944cdf0e10cSrcweir }
945cdf0e10cSrcweir 
updateGraphics(bool bClear)946cdf0e10cSrcweir void X11SalFrame::updateGraphics( bool bClear )
947cdf0e10cSrcweir {
948cdf0e10cSrcweir     Drawable aDrawable = bClear ? None : GetWindow();
949cdf0e10cSrcweir     if( pGraphics_ )
950cdf0e10cSrcweir         pGraphics_->SetDrawable( aDrawable, m_nScreen );
951cdf0e10cSrcweir     if( pFreeGraphics_ )
952cdf0e10cSrcweir         pFreeGraphics_->SetDrawable( aDrawable, m_nScreen );
953cdf0e10cSrcweir }
954cdf0e10cSrcweir 
955cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
956cdf0e10cSrcweir 
Enable(sal_Bool)957cdf0e10cSrcweir void X11SalFrame::Enable( sal_Bool /*bEnable*/ )
958cdf0e10cSrcweir {
959cdf0e10cSrcweir 	// NYI: enable/disable frame
960cdf0e10cSrcweir }
961cdf0e10cSrcweir 
962cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
963cdf0e10cSrcweir 
SetIcon(sal_uInt16 nIcon)964cdf0e10cSrcweir void X11SalFrame::SetIcon( sal_uInt16 nIcon )
965cdf0e10cSrcweir {
966cdf0e10cSrcweir     if ( ! IsChildWindow() )
967cdf0e10cSrcweir     {
968cdf0e10cSrcweir         // 0 == default icon -> #1
969cdf0e10cSrcweir         if ( nIcon == 0 )
970cdf0e10cSrcweir             nIcon = 1;
971cdf0e10cSrcweir 
972cdf0e10cSrcweir         mnIconID = nIcon;
973cdf0e10cSrcweir 
974cdf0e10cSrcweir         XIconSize *pIconSize = NULL;
975cdf0e10cSrcweir         int nSizes = 0;
976cdf0e10cSrcweir         int iconSize = 32;
977cdf0e10cSrcweir         if ( XGetIconSizes( GetXDisplay(), GetDisplay()->GetRootWindow( m_nScreen ), &pIconSize, &nSizes ) )
978cdf0e10cSrcweir         {
979cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
980cdf0e10cSrcweir             fprintf(stderr, "X11SalFrame::SetIcon(): found %d IconSizes:\n", nSizes);
981cdf0e10cSrcweir #endif
982cdf0e10cSrcweir 
983cdf0e10cSrcweir             const int ourLargestIconSize = 48;
984cdf0e10cSrcweir             bool bFoundIconSize = false;
985cdf0e10cSrcweir 
986cdf0e10cSrcweir             int i;
987cdf0e10cSrcweir             for( i=0; i<nSizes; i++)
988cdf0e10cSrcweir             {
989cdf0e10cSrcweir                // select largest supported icon
990cdf0e10cSrcweir 
991cdf0e10cSrcweir                // Note: olwm/olvwm reports a huge max icon size of
992cdf0e10cSrcweir                // 160x160 pixels; always choosing the max as the
993cdf0e10cSrcweir                // preferred icon size is apparently wrong under olvwm
994cdf0e10cSrcweir                // - so we keep the safe default |iconSize| when we see
995cdf0e10cSrcweir                // unreasonable large max icon sizes (> twice of our
996cdf0e10cSrcweir                // largest available icon) reported by XGetIconSizes.
997cdf0e10cSrcweir                 if( pIconSize[i].max_width > iconSize
998cdf0e10cSrcweir                     && pIconSize[i].max_width <= 2*ourLargestIconSize )
999cdf0e10cSrcweir                 {
1000cdf0e10cSrcweir                     iconSize = pIconSize[i].max_width;
1001cdf0e10cSrcweir                     bFoundIconSize = true;
1002cdf0e10cSrcweir                 }
1003cdf0e10cSrcweir                 iconSize = pIconSize[i].max_width;
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
1006cdf0e10cSrcweir                 fprintf(stderr, "min: %d, %d\nmax: %d, %d\ninc: %d, %d\n\n",
1007cdf0e10cSrcweir                         pIconSize[i].min_width, pIconSize[i].min_height,
1008cdf0e10cSrcweir                         pIconSize[i].max_width, pIconSize[i].max_height,
1009cdf0e10cSrcweir                         pIconSize[i].width_inc, pIconSize[i].height_inc);
1010cdf0e10cSrcweir #endif
1011cdf0e10cSrcweir             }
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir             if ( !bFoundIconSize )
1014cdf0e10cSrcweir             {
1015cdf0e10cSrcweir                // Unless someone has fixed olwm/olvwm, we have rejected
1016cdf0e10cSrcweir                // the max icon size from |XGetIconSizes()|.  Provide a
1017cdf0e10cSrcweir                // better icon size default value, in case our window manager
1018cdf0e10cSrcweir                // is olwm/olvwm.
1019cdf0e10cSrcweir                const String& rWM( pDisplay_->getWMAdaptor()->getWindowManagerName() );
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir                if ( rWM.EqualsAscii( "Olwm" ) )
1022cdf0e10cSrcweir                    iconSize = 48;
1023cdf0e10cSrcweir             }
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir             XFree( pIconSize );
1026cdf0e10cSrcweir         }
1027cdf0e10cSrcweir         else
1028cdf0e10cSrcweir         {
1029cdf0e10cSrcweir             const String& rWM( pDisplay_->getWMAdaptor()->getWindowManagerName() );
1030cdf0e10cSrcweir             if( rWM.EqualsAscii( "KWin" ) )			// assume KDE is running
1031cdf0e10cSrcweir                 iconSize = 48;
1032cdf0e10cSrcweir             static bool bGnomeIconSize = false;
1033cdf0e10cSrcweir             static bool bGnomeChecked = false;
1034cdf0e10cSrcweir             if( ! bGnomeChecked )
1035cdf0e10cSrcweir             {
1036cdf0e10cSrcweir                 bGnomeChecked=true;
1037cdf0e10cSrcweir                 int nCount = 0;
1038cdf0e10cSrcweir                 Atom* pProps = XListProperties( GetXDisplay(),
1039cdf0e10cSrcweir                                                 GetDisplay()->GetRootWindow( m_nScreen ),
1040cdf0e10cSrcweir                                                 &nCount );
1041cdf0e10cSrcweir                 for( int i = 0; i < nCount && !bGnomeIconSize; i++ )
1042cdf0e10cSrcweir                  {
1043cdf0e10cSrcweir                     char* pName = XGetAtomName( GetXDisplay(), pProps[i] );
1044cdf0e10cSrcweir                     if( !strcmp( pName, "GNOME_PANEL_DESKTOP_AREA" ) )
1045cdf0e10cSrcweir                         bGnomeIconSize = true;
1046cdf0e10cSrcweir                     if( pName )
1047cdf0e10cSrcweir                         XFree( pName );
1048cdf0e10cSrcweir                  }
1049cdf0e10cSrcweir                 if( pProps )
1050cdf0e10cSrcweir                     XFree( pProps );
1051cdf0e10cSrcweir             }
1052cdf0e10cSrcweir             if( bGnomeIconSize )
1053cdf0e10cSrcweir                 iconSize = 48;
1054cdf0e10cSrcweir         }
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir         XWMHints Hints;
1057cdf0e10cSrcweir         Hints.flags = 0;
1058cdf0e10cSrcweir 		XWMHints *pHints = XGetWMHints( GetXDisplay(), GetShellWindow() );
1059cdf0e10cSrcweir         if( pHints )
1060cdf0e10cSrcweir         {
1061cdf0e10cSrcweir             memcpy(&Hints, pHints, sizeof( XWMHints ));
1062cdf0e10cSrcweir             XFree( pHints );
1063cdf0e10cSrcweir         }
1064cdf0e10cSrcweir         pHints = &Hints;
1065cdf0e10cSrcweir 
1066cdf0e10cSrcweir 		sal_Bool bOk = SelectAppIconPixmap( GetDisplay(), m_nScreen,
1067cdf0e10cSrcweir                                         nIcon, iconSize,
1068cdf0e10cSrcweir                                         pHints->icon_pixmap, pHints->icon_mask );
1069cdf0e10cSrcweir         if ( !bOk )
1070cdf0e10cSrcweir         {
1071cdf0e10cSrcweir             // load default icon (0)
1072cdf0e10cSrcweir 		    bOk = SelectAppIconPixmap( GetDisplay(), m_nScreen,
1073cdf0e10cSrcweir                                        0, iconSize,
1074cdf0e10cSrcweir                                        pHints->icon_pixmap, pHints->icon_mask );
1075cdf0e10cSrcweir         }
1076cdf0e10cSrcweir 		if( bOk )
1077cdf0e10cSrcweir         {
1078cdf0e10cSrcweir     		pHints->flags 	 |= IconPixmapHint;
1079cdf0e10cSrcweir 		    if( pHints->icon_mask )
1080cdf0e10cSrcweir 			    pHints->flags |= IconMaskHint;
1081cdf0e10cSrcweir 
1082cdf0e10cSrcweir 		    XSetWMHints( GetXDisplay(), GetShellWindow(), pHints );
1083cdf0e10cSrcweir         }
1084cdf0e10cSrcweir 	}
1085cdf0e10cSrcweir }
1086cdf0e10cSrcweir 
1087cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1088cdf0e10cSrcweir 
SetMaxClientSize(long nWidth,long nHeight)1089cdf0e10cSrcweir void X11SalFrame::SetMaxClientSize( long nWidth, long nHeight )
1090cdf0e10cSrcweir {
1091cdf0e10cSrcweir     if( ! IsChildWindow() )
1092cdf0e10cSrcweir     {
1093cdf0e10cSrcweir         if( GetShellWindow() && (nStyle_ & (SAL_FRAME_STYLE_FLOAT|SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) != SAL_FRAME_STYLE_FLOAT )
1094cdf0e10cSrcweir         {
1095cdf0e10cSrcweir             XSizeHints* pHints = XAllocSizeHints();
1096cdf0e10cSrcweir             long nSupplied = 0;
1097cdf0e10cSrcweir             XGetWMNormalHints( GetXDisplay(),
1098cdf0e10cSrcweir                                GetShellWindow(),
1099cdf0e10cSrcweir                                pHints,
1100cdf0e10cSrcweir                                &nSupplied
1101cdf0e10cSrcweir                                );
1102cdf0e10cSrcweir             pHints->max_width	= nWidth;
1103cdf0e10cSrcweir             pHints->max_height	= nHeight;
1104cdf0e10cSrcweir             pHints->flags |= PMaxSize;
1105cdf0e10cSrcweir             XSetWMNormalHints( GetXDisplay(),
1106cdf0e10cSrcweir                                GetShellWindow(),
1107cdf0e10cSrcweir                                pHints );
1108cdf0e10cSrcweir             XFree( pHints );
1109cdf0e10cSrcweir         }
1110cdf0e10cSrcweir     }
1111cdf0e10cSrcweir }
1112cdf0e10cSrcweir 
SetMinClientSize(long nWidth,long nHeight)1113cdf0e10cSrcweir void X11SalFrame::SetMinClientSize( long nWidth, long nHeight )
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir     if( ! IsChildWindow() )
1116cdf0e10cSrcweir     {
1117cdf0e10cSrcweir         if( GetShellWindow() && (nStyle_ & (SAL_FRAME_STYLE_FLOAT|SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) != SAL_FRAME_STYLE_FLOAT )
1118cdf0e10cSrcweir         {
1119cdf0e10cSrcweir             XSizeHints* pHints = XAllocSizeHints();
1120cdf0e10cSrcweir             long nSupplied = 0;
1121cdf0e10cSrcweir             XGetWMNormalHints( GetXDisplay(),
1122cdf0e10cSrcweir                                GetShellWindow(),
1123cdf0e10cSrcweir                                pHints,
1124cdf0e10cSrcweir                                &nSupplied
1125cdf0e10cSrcweir                                );
1126cdf0e10cSrcweir             pHints->min_width	= nWidth;
1127cdf0e10cSrcweir             pHints->min_height	= nHeight;
1128cdf0e10cSrcweir             pHints->flags |= PMinSize;
1129cdf0e10cSrcweir             XSetWMNormalHints( GetXDisplay(),
1130cdf0e10cSrcweir                                GetShellWindow(),
1131cdf0e10cSrcweir                                pHints );
1132cdf0e10cSrcweir             XFree( pHints );
1133cdf0e10cSrcweir         }
1134cdf0e10cSrcweir     }
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir 
1137cdf0e10cSrcweir // Show + Pos (x,y,z) + Size (width,height)
1138cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Show(sal_Bool bVisible,sal_Bool bNoActivate)1139cdf0e10cSrcweir void X11SalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate )
1140cdf0e10cSrcweir {
1141cdf0e10cSrcweir     if( ( bVisible && bMapped_ )
1142cdf0e10cSrcweir         || ( !bVisible && !bMapped_ ) )
1143cdf0e10cSrcweir         return;
1144cdf0e10cSrcweir 
1145cdf0e10cSrcweir     // HACK: this is a workaround for (at least) kwin
1146cdf0e10cSrcweir     // even though transient frames should be kept above their parent
1147cdf0e10cSrcweir     // this does not necessarily hold true for DOCK type windows
1148cdf0e10cSrcweir     // so artificially set ABOVE and remove it again on hide
1149cdf0e10cSrcweir     if( mpParent && (mpParent->nStyle_ & SAL_FRAME_STYLE_PARTIAL_FULLSCREEN ) && pDisplay_->getWMAdaptor()->isLegacyPartialFullscreen())
1150cdf0e10cSrcweir         pDisplay_->getWMAdaptor()->enableAlwaysOnTop( this, bVisible );
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir 	bMapped_   = bVisible;
1153cdf0e10cSrcweir 	bViewable_ = bVisible;
1154cdf0e10cSrcweir     setXEmbedInfo();
1155cdf0e10cSrcweir 	if( bVisible )
1156cdf0e10cSrcweir 	{
1157cdf0e10cSrcweir         SessionManagerClient::open(); // will simply return after the first time
1158cdf0e10cSrcweir 
1159cdf0e10cSrcweir         mbInShow = sal_True;
1160cdf0e10cSrcweir         if( ! (nStyle_ & SAL_FRAME_STYLE_INTRO) )
1161cdf0e10cSrcweir         {
1162cdf0e10cSrcweir             // hide all INTRO frames
1163cdf0e10cSrcweir             const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames();
1164cdf0e10cSrcweir             for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
1165cdf0e10cSrcweir             {
1166cdf0e10cSrcweir                 const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it);
1167cdf0e10cSrcweir                 // look for intro bit map; if present, hide it
1168cdf0e10cSrcweir                 if( pFrame->nStyle_ & SAL_FRAME_STYLE_INTRO )
1169cdf0e10cSrcweir                 {
1170cdf0e10cSrcweir                     if( pFrame->bMapped_ )
1171cdf0e10cSrcweir                         const_cast<X11SalFrame*>(pFrame)->Show( sal_False );
1172cdf0e10cSrcweir                 }
1173cdf0e10cSrcweir             }
1174cdf0e10cSrcweir         }
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir         // update NET_WM_STATE which may have been deleted due to earlier Show(sal_False)
1177cdf0e10cSrcweir         if( nShowState_ == SHOWSTATE_HIDDEN )
1178cdf0e10cSrcweir             GetDisplay()->getWMAdaptor()->frameIsMapping( this );
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir         /*
1181cdf0e10cSrcweir          *  #95097#
1182cdf0e10cSrcweir          *  Actually this is rather exotic and currently happens only in conjunction
1183cdf0e10cSrcweir          *  with the basic dialogue editor,
1184cdf0e10cSrcweir          *  which shows a frame and instantly hides it again. After that the
1185cdf0e10cSrcweir          *  editor window is shown and the WM takes this as an opportunity
1186cdf0e10cSrcweir          *  to show our hidden transient frame also. So Show( sal_False ) must
1187cdf0e10cSrcweir          *  withdraw the frame AND delete the WM_TRANSIENT_FOR property.
1188cdf0e10cSrcweir          *  In case the frame is shown again, the transient hint must be restored here.
1189cdf0e10cSrcweir          */
1190cdf0e10cSrcweir         if(    ! IsChildWindow()
1191cdf0e10cSrcweir             && ! IsOverrideRedirect()
1192cdf0e10cSrcweir             && ! IsFloatGrabWindow()
1193cdf0e10cSrcweir             && mpParent
1194cdf0e10cSrcweir             )
1195cdf0e10cSrcweir         {
1196cdf0e10cSrcweir             GetDisplay()->getWMAdaptor()->changeReferenceFrame( this, mpParent );
1197cdf0e10cSrcweir         }
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir         // #i45160# switch to desktop where a dialog with parent will appear
1200cdf0e10cSrcweir         if( mpParent && mpParent->m_nWorkArea != m_nWorkArea )
1201cdf0e10cSrcweir             GetDisplay()->getWMAdaptor()->switchToWorkArea( mpParent->m_nWorkArea );
1202cdf0e10cSrcweir 
1203cdf0e10cSrcweir         if( IsFloatGrabWindow() &&
1204cdf0e10cSrcweir             mpParent &&
1205cdf0e10cSrcweir             nVisibleFloats == 0 &&
1206cdf0e10cSrcweir             ! GetDisplay()->GetCaptureFrame() )
1207cdf0e10cSrcweir         {
1208cdf0e10cSrcweir             /* #i39420#
1209cdf0e10cSrcweir              * outsmart KWin's "focus strictly under mouse" mode
1210cdf0e10cSrcweir              * which insists on taking the focus from the document
1211cdf0e10cSrcweir              * to the new float. Grab focus to parent frame BEFORE
1212cdf0e10cSrcweir              * showing the float (cannot grab it to the float
1213cdf0e10cSrcweir              * before show).
1214cdf0e10cSrcweir              */
1215cdf0e10cSrcweir             XGrabPointer( GetXDisplay(),
1216cdf0e10cSrcweir                           mpParent->GetWindow(),
1217cdf0e10cSrcweir                           True,
1218cdf0e10cSrcweir                           PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
1219cdf0e10cSrcweir                           GrabModeAsync,
1220cdf0e10cSrcweir                           GrabModeAsync,
1221cdf0e10cSrcweir                           None,
1222cdf0e10cSrcweir                           mpParent ? mpParent->GetCursor() : None,
1223cdf0e10cSrcweir                           CurrentTime
1224cdf0e10cSrcweir                           );
1225cdf0e10cSrcweir         }
1226cdf0e10cSrcweir 
1227cdf0e10cSrcweir         XLIB_Time nUserTime = 0;
1228cdf0e10cSrcweir         if( ! bNoActivate && (nStyle_ & (SAL_FRAME_STYLE_OWNERDRAWDECORATION)) == 0 )
1229cdf0e10cSrcweir             nUserTime = pDisplay_->GetLastUserEventTime( true );
1230cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->setUserTime( this, nUserTime );
1231cdf0e10cSrcweir         if( ! bNoActivate && (nStyle_ & SAL_FRAME_STYLE_TOOLWINDOW) )
1232cdf0e10cSrcweir             m_bSetFocusOnMap = true;
1233cdf0e10cSrcweir 
1234cdf0e10cSrcweir         // actually map the window
1235cdf0e10cSrcweir         if( m_bXEmbed )
1236cdf0e10cSrcweir             askForXEmbedFocus( 0 );
1237cdf0e10cSrcweir         else
1238cdf0e10cSrcweir         {
1239cdf0e10cSrcweir             if( GetWindow() != GetShellWindow() && ! IsSysChildWindow() )
1240cdf0e10cSrcweir             {
1241cdf0e10cSrcweir                 if( IsChildWindow() )
1242cdf0e10cSrcweir                     XMapWindow( GetXDisplay(), GetShellWindow() );
1243cdf0e10cSrcweir                 XSelectInput( GetXDisplay(), GetShellWindow(), CLIENT_EVENTS );
1244cdf0e10cSrcweir             }
1245cdf0e10cSrcweir             if( nStyle_ & SAL_FRAME_STYLE_FLOAT )
1246cdf0e10cSrcweir                 XMapRaised( GetXDisplay(), GetWindow() );
1247cdf0e10cSrcweir             else
1248cdf0e10cSrcweir                 XMapWindow( GetXDisplay(), GetWindow() );
1249cdf0e10cSrcweir         }
1250cdf0e10cSrcweir 		XSelectInput( GetXDisplay(), GetWindow(), CLIENT_EVENTS );
1251cdf0e10cSrcweir 
1252cdf0e10cSrcweir 		if( maGeometry.nWidth > 0
1253cdf0e10cSrcweir             && maGeometry.nHeight > 0
1254cdf0e10cSrcweir 			&& (   nWidth_  != (int)maGeometry.nWidth
1255cdf0e10cSrcweir 				|| nHeight_ != (int)maGeometry.nHeight ) )
1256cdf0e10cSrcweir 		{
1257cdf0e10cSrcweir 			nWidth_  = maGeometry.nWidth;
1258cdf0e10cSrcweir 			nHeight_ = maGeometry.nHeight;
1259cdf0e10cSrcweir 		}
1260cdf0e10cSrcweir 
1261cdf0e10cSrcweir 		XSync( GetXDisplay(), False );
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir         if( IsFloatGrabWindow() )
1264cdf0e10cSrcweir         {
1265cdf0e10cSrcweir             /*
1266cdf0e10cSrcweir              *  #95453#
1267cdf0e10cSrcweir              *  Sawfish and twm can be switched to enter-exit focus behaviour. In this case
1268cdf0e10cSrcweir              *  we must grab the pointer else the dumb WM will put the focus to the
1269cdf0e10cSrcweir              *  override-redirect float window. The application window will be deactivated
1270cdf0e10cSrcweir              *  which causes that the floats are destroyed, so the user can never click on
1271cdf0e10cSrcweir              *  a menu because it vanishes as soon as he enters it.
1272cdf0e10cSrcweir              */
1273cdf0e10cSrcweir             nVisibleFloats++;
1274cdf0e10cSrcweir             if( nVisibleFloats == 1 && ! GetDisplay()->GetCaptureFrame() )
1275cdf0e10cSrcweir             {
1276cdf0e10cSrcweir                 /* #i39420# now move grab to the new float window */
1277cdf0e10cSrcweir                 XGrabPointer( GetXDisplay(),
1278cdf0e10cSrcweir                               GetWindow(),
1279cdf0e10cSrcweir                               True,
1280cdf0e10cSrcweir                               PointerMotionMask | ButtonPressMask | ButtonReleaseMask,
1281cdf0e10cSrcweir                               GrabModeAsync,
1282cdf0e10cSrcweir                               GrabModeAsync,
1283cdf0e10cSrcweir                               None,
1284cdf0e10cSrcweir                               mpParent ? mpParent->GetCursor() : None,
1285cdf0e10cSrcweir                               CurrentTime
1286cdf0e10cSrcweir                               );
1287cdf0e10cSrcweir             }
1288cdf0e10cSrcweir         }
1289cdf0e10cSrcweir 		CallCallback( SALEVENT_RESIZE, NULL );
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir         /*
1292cdf0e10cSrcweir          *  sometimes a message box/dialogue is brought up when a frame is not mapped
1293cdf0e10cSrcweir          *  the corresponding TRANSIENT_FOR hint is then set to the root window
1294cdf0e10cSrcweir          *  so that the dialogue shows in all cases. Correct it here if the
1295cdf0e10cSrcweir          *  frame is shown afterwards.
1296cdf0e10cSrcweir          */
1297cdf0e10cSrcweir         if( ! IsChildWindow()
1298cdf0e10cSrcweir             && ! IsOverrideRedirect()
1299cdf0e10cSrcweir             && ! IsFloatGrabWindow()
1300cdf0e10cSrcweir             )
1301cdf0e10cSrcweir         {
1302cdf0e10cSrcweir             for( std::list< X11SalFrame* >::const_iterator it = maChildren.begin();
1303cdf0e10cSrcweir                  it != maChildren.end(); ++it )
1304cdf0e10cSrcweir             {
1305cdf0e10cSrcweir                 if( (*it)->mbTransientForRoot )
1306cdf0e10cSrcweir                     GetDisplay()->getWMAdaptor()->changeReferenceFrame( *it, this );
1307cdf0e10cSrcweir             }
1308cdf0e10cSrcweir         }
1309cdf0e10cSrcweir         /*
1310cdf0e10cSrcweir          *  leave SHOWSTATE_UNKNOWN as this indicates first mapping
1311cdf0e10cSrcweir          *  and is only reset int HandleSizeEvent
1312cdf0e10cSrcweir          */
1313cdf0e10cSrcweir         if( nShowState_ != SHOWSTATE_UNKNOWN )
1314cdf0e10cSrcweir             nShowState_ = SHOWSTATE_NORMAL;
1315cdf0e10cSrcweir 
1316cdf0e10cSrcweir         /*
1317cdf0e10cSrcweir          *  #98107# plugged windows don't necessarily get the
1318cdf0e10cSrcweir          *  focus on show because the parent may already be mapped
1319cdf0e10cSrcweir          *  and have the focus. So try to set the focus
1320cdf0e10cSrcweir          *  to the child on Show(sal_True)
1321cdf0e10cSrcweir          */
1322cdf0e10cSrcweir         if( (nStyle_ & SAL_FRAME_STYLE_PLUG) && ! m_bXEmbed )
1323cdf0e10cSrcweir             XSetInputFocus( GetXDisplay(),
1324cdf0e10cSrcweir                             GetWindow(),
1325cdf0e10cSrcweir                             RevertToParent,
1326cdf0e10cSrcweir                             CurrentTime );
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir         if( mpParent )
1329cdf0e10cSrcweir         {
1330cdf0e10cSrcweir             // push this frame so it will be in front of its siblings
1331cdf0e10cSrcweir             // only necessary for insane transient behaviour of Dtwm/olwm
1332cdf0e10cSrcweir             mpParent->maChildren.remove( this );
1333cdf0e10cSrcweir             mpParent->maChildren.push_front(this);
1334cdf0e10cSrcweir         }
1335cdf0e10cSrcweir 	}
1336cdf0e10cSrcweir 	else
1337cdf0e10cSrcweir 	{
1338cdf0e10cSrcweir         if( getInputContext() )
1339cdf0e10cSrcweir             getInputContext()->Unmap( this );
1340cdf0e10cSrcweir 
1341cdf0e10cSrcweir         if( ! IsChildWindow() )
1342cdf0e10cSrcweir         {
1343cdf0e10cSrcweir             /*  FIXME: Is deleting the property really necessary ? It hurts
1344cdf0e10cSrcweir              *  owner drawn windows at least.
1345cdf0e10cSrcweir              */
1346cdf0e10cSrcweir             if( mpParent && ! (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION) )
1347cdf0e10cSrcweir                 XDeleteProperty( GetXDisplay(), GetShellWindow(), GetDisplay()->getWMAdaptor()->getAtom( WMAdaptor::WM_TRANSIENT_FOR ) );
1348cdf0e10cSrcweir             XWithdrawWindow( GetXDisplay(), GetShellWindow(), m_nScreen );
1349cdf0e10cSrcweir         }
1350cdf0e10cSrcweir         else if( ! m_bXEmbed )
1351cdf0e10cSrcweir             XUnmapWindow( GetXDisplay(), GetWindow() );
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir         nShowState_ = SHOWSTATE_HIDDEN;
1354cdf0e10cSrcweir         if( IsFloatGrabWindow() && nVisibleFloats )
1355cdf0e10cSrcweir         {
1356cdf0e10cSrcweir             nVisibleFloats--;
1357cdf0e10cSrcweir             if( nVisibleFloats == 0  && ! GetDisplay()->GetCaptureFrame() )
1358cdf0e10cSrcweir                 XUngrabPointer( GetXDisplay(),
1359cdf0e10cSrcweir                                 CurrentTime );
1360cdf0e10cSrcweir         }
1361cdf0e10cSrcweir         // flush here; there may be a very seldom race between
1362cdf0e10cSrcweir         // the display connection used for clipboard and our connection
1363cdf0e10cSrcweir         Flush();
1364cdf0e10cSrcweir 	}
1365cdf0e10cSrcweir }
1366cdf0e10cSrcweir 
1367cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
ToTop(sal_uInt16 nFlags)1368cdf0e10cSrcweir void X11SalFrame::ToTop( sal_uInt16 nFlags )
1369cdf0e10cSrcweir {
1370cdf0e10cSrcweir 	if( ( nFlags & SAL_FRAME_TOTOP_RESTOREWHENMIN )
1371cdf0e10cSrcweir         && ! ( nStyle_ & SAL_FRAME_STYLE_FLOAT )
1372cdf0e10cSrcweir         && nShowState_ != SHOWSTATE_HIDDEN
1373cdf0e10cSrcweir         && nShowState_ != SHOWSTATE_UNKNOWN
1374cdf0e10cSrcweir         )
1375cdf0e10cSrcweir     {
1376cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->frameIsMapping( this );
1377cdf0e10cSrcweir         if( GetWindow() != GetShellWindow() && ! IsSysChildWindow() )
1378cdf0e10cSrcweir             XMapWindow( GetXDisplay(), GetShellWindow() );
1379cdf0e10cSrcweir         XMapWindow( GetXDisplay(), GetWindow() );
1380cdf0e10cSrcweir     }
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir     XLIB_Window aToTopWindow = IsSysChildWindow() ? GetWindow() : GetShellWindow();
1383cdf0e10cSrcweir     if( ! (nFlags & SAL_FRAME_TOTOP_GRABFOCUS_ONLY) )
1384cdf0e10cSrcweir     {
1385cdf0e10cSrcweir         XRaiseWindow( GetXDisplay(), aToTopWindow );
1386cdf0e10cSrcweir         if( ! GetDisplay()->getWMAdaptor()->isTransientBehaviourAsExpected() )
1387cdf0e10cSrcweir             for( std::list< X11SalFrame* >::const_iterator it = maChildren.begin();
1388cdf0e10cSrcweir                  it != maChildren.end(); ++it )
1389cdf0e10cSrcweir                 (*it)->ToTop( nFlags & ~SAL_FRAME_TOTOP_GRABFOCUS );
1390cdf0e10cSrcweir     }
1391cdf0e10cSrcweir 
1392cdf0e10cSrcweir     if( ( ( nFlags & SAL_FRAME_TOTOP_GRABFOCUS ) || ( nFlags & SAL_FRAME_TOTOP_GRABFOCUS_ONLY ) )
1393cdf0e10cSrcweir         && bMapped_ )
1394cdf0e10cSrcweir     {
1395cdf0e10cSrcweir         if( m_bXEmbed )
1396cdf0e10cSrcweir             askForXEmbedFocus( 0 );
1397cdf0e10cSrcweir         else
1398cdf0e10cSrcweir             XSetInputFocus( GetXDisplay(), aToTopWindow, RevertToParent, CurrentTime );
1399cdf0e10cSrcweir     }
1400cdf0e10cSrcweir }
1401cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetWorkArea(Rectangle & rWorkArea)1402cdf0e10cSrcweir void X11SalFrame::GetWorkArea( Rectangle& rWorkArea )
1403cdf0e10cSrcweir {
1404cdf0e10cSrcweir     rWorkArea = pDisplay_->getWMAdaptor()->getWorkArea( 0 );
1405cdf0e10cSrcweir }
1406cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetClientSize(long & rWidth,long & rHeight)1407cdf0e10cSrcweir void X11SalFrame::GetClientSize( long &rWidth, long &rHeight )
1408cdf0e10cSrcweir {
1409cdf0e10cSrcweir 	if( ! bViewable_  )
1410cdf0e10cSrcweir 	{
1411cdf0e10cSrcweir 		rWidth = rHeight = 0;
1412cdf0e10cSrcweir 		return;
1413cdf0e10cSrcweir 	}
1414cdf0e10cSrcweir 
1415cdf0e10cSrcweir 	rWidth	= maGeometry.nWidth;
1416cdf0e10cSrcweir 	rHeight = maGeometry.nHeight;
1417cdf0e10cSrcweir 
1418cdf0e10cSrcweir 	if( !rWidth || !rHeight )
1419cdf0e10cSrcweir 	{
1420cdf0e10cSrcweir 		XWindowAttributes aAttrib;
1421cdf0e10cSrcweir 
1422cdf0e10cSrcweir 		XGetWindowAttributes( GetXDisplay(), GetWindow(), &aAttrib );
1423cdf0e10cSrcweir 
1424cdf0e10cSrcweir 		maGeometry.nWidth = rWidth = aAttrib.width;
1425cdf0e10cSrcweir 		maGeometry.nHeight = rHeight = aAttrib.height;
1426cdf0e10cSrcweir 	}
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir 
1429cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1430cdf0e10cSrcweir 
SetWindowGravity(int nGravity) const1431cdf0e10cSrcweir void X11SalFrame::SetWindowGravity (int nGravity) const
1432cdf0e10cSrcweir {
1433cdf0e10cSrcweir     if( ! IsChildWindow() )
1434cdf0e10cSrcweir     {
1435cdf0e10cSrcweir         XSizeHints* pHint = XAllocSizeHints();
1436cdf0e10cSrcweir         long        nFlag;
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir         XGetWMNormalHints (GetXDisplay(), GetShellWindow(), pHint, &nFlag);
1439cdf0e10cSrcweir         pHint->flags       |= PWinGravity;
1440cdf0e10cSrcweir         pHint->win_gravity  = nGravity;
1441cdf0e10cSrcweir 
1442cdf0e10cSrcweir         XSetWMNormalHints (GetXDisplay(), GetShellWindow(), pHint);
1443cdf0e10cSrcweir         XSync (GetXDisplay(), False);
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir         XFree (pHint);
1446cdf0e10cSrcweir     }
1447cdf0e10cSrcweir }
1448cdf0e10cSrcweir 
Center()1449cdf0e10cSrcweir void X11SalFrame::Center( )
1450cdf0e10cSrcweir {
1451cdf0e10cSrcweir 	int 			nX, nY, nScreenWidth, nScreenHeight;
1452cdf0e10cSrcweir 	int				nRealScreenWidth, nRealScreenHeight;
1453cdf0e10cSrcweir 	int				nScreenX = 0, nScreenY = 0;
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir     const Size& aScreenSize = GetDisplay()->getDataForScreen( m_nScreen ).m_aSize;
1456cdf0e10cSrcweir     nScreenWidth		= aScreenSize.Width();
1457cdf0e10cSrcweir     nScreenHeight		= aScreenSize.Height();
1458cdf0e10cSrcweir     nRealScreenWidth	= nScreenWidth;
1459cdf0e10cSrcweir     nRealScreenHeight	= nScreenHeight;
1460cdf0e10cSrcweir 
1461cdf0e10cSrcweir     if( GetDisplay()->IsXinerama() )
1462cdf0e10cSrcweir     {
1463cdf0e10cSrcweir         // get xinerama screen we are on
1464cdf0e10cSrcweir         // if there is a parent, use its center for screen determination
1465cdf0e10cSrcweir         // else use the pointer
1466cdf0e10cSrcweir         XLIB_Window aRoot, aChild;
1467cdf0e10cSrcweir         int root_x, root_y, x, y;
1468cdf0e10cSrcweir         unsigned int mask;
1469cdf0e10cSrcweir         if( mpParent )
1470cdf0e10cSrcweir         {
1471cdf0e10cSrcweir             root_x = mpParent->maGeometry.nX + mpParent->maGeometry.nWidth/2;
1472cdf0e10cSrcweir             root_y = mpParent->maGeometry.nY + mpParent->maGeometry.nHeight/2;
1473cdf0e10cSrcweir         }
1474cdf0e10cSrcweir         else
1475cdf0e10cSrcweir             XQueryPointer( GetXDisplay(),
1476cdf0e10cSrcweir                            GetShellWindow(),
1477cdf0e10cSrcweir                            &aRoot, &aChild,
1478cdf0e10cSrcweir                            &root_x, &root_y,
1479cdf0e10cSrcweir                            &x, &y,
1480cdf0e10cSrcweir                            &mask );
1481cdf0e10cSrcweir         const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreens();
1482cdf0e10cSrcweir         for( unsigned int i = 0; i < rScreens.size(); i++ )
1483cdf0e10cSrcweir             if( rScreens[i].IsInside( Point( root_x, root_y ) ) )
1484cdf0e10cSrcweir             {
1485cdf0e10cSrcweir                 nScreenX			= rScreens[i].Left();
1486cdf0e10cSrcweir                 nScreenY			= rScreens[i].Top();
1487cdf0e10cSrcweir                 nRealScreenWidth	= rScreens[i].GetWidth();
1488cdf0e10cSrcweir                 nRealScreenHeight	= rScreens[i].GetHeight();
1489cdf0e10cSrcweir                 break;
1490cdf0e10cSrcweir             }
1491cdf0e10cSrcweir     }
1492cdf0e10cSrcweir 
1493cdf0e10cSrcweir 	if( mpParent )
1494cdf0e10cSrcweir 	{
1495cdf0e10cSrcweir 		X11SalFrame* pFrame = mpParent;
1496cdf0e10cSrcweir 		while( pFrame->mpParent )
1497cdf0e10cSrcweir 			pFrame = pFrame->mpParent;
1498cdf0e10cSrcweir 		if( pFrame->maGeometry.nWidth < 1  || pFrame->maGeometry.nHeight < 1 )
1499cdf0e10cSrcweir         {
1500cdf0e10cSrcweir             Rectangle aRect;
1501cdf0e10cSrcweir 			pFrame->GetPosSize( aRect );
1502cdf0e10cSrcweir             pFrame->maGeometry.nX		= aRect.Left();
1503cdf0e10cSrcweir             pFrame->maGeometry.nY		= aRect.Top();
1504cdf0e10cSrcweir             pFrame->maGeometry.nWidth	= aRect.GetWidth();
1505cdf0e10cSrcweir             pFrame->maGeometry.nHeight	= aRect.GetHeight();
1506cdf0e10cSrcweir         }
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir 		if( pFrame->nStyle_ & SAL_FRAME_STYLE_PLUG )
1509cdf0e10cSrcweir 		{
1510cdf0e10cSrcweir 			XLIB_Window aRoot;
1511cdf0e10cSrcweir 			unsigned int bw, depth;
1512cdf0e10cSrcweir 			XGetGeometry( GetXDisplay(),
1513cdf0e10cSrcweir 						  pFrame->GetShellWindow(),
1514cdf0e10cSrcweir 						  &aRoot,
1515cdf0e10cSrcweir 						  &nScreenX, &nScreenY,
1516cdf0e10cSrcweir 						  (unsigned int*)&nScreenWidth,
1517cdf0e10cSrcweir 						  (unsigned int*)&nScreenHeight,
1518cdf0e10cSrcweir 						  &bw, &depth );
1519cdf0e10cSrcweir 		}
1520cdf0e10cSrcweir 		else
1521cdf0e10cSrcweir 		{
1522cdf0e10cSrcweir 			nScreenX		= pFrame->maGeometry.nX;
1523cdf0e10cSrcweir 			nScreenY		= pFrame->maGeometry.nY;
1524cdf0e10cSrcweir 			nScreenWidth	= pFrame->maGeometry.nWidth;
1525cdf0e10cSrcweir 			nScreenHeight	= pFrame->maGeometry.nHeight;
1526cdf0e10cSrcweir 		}
1527cdf0e10cSrcweir 	}
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir 	if( mpParent && mpParent->nShowState_ == SHOWSTATE_NORMAL )
1530cdf0e10cSrcweir 	{
1531cdf0e10cSrcweir 		if( maGeometry.nWidth >= mpParent->maGeometry.nWidth &&
1532cdf0e10cSrcweir 			maGeometry.nHeight >= mpParent->maGeometry.nHeight )
1533cdf0e10cSrcweir 		{
1534cdf0e10cSrcweir 			nX = nScreenX + 40;
1535cdf0e10cSrcweir 			nY = nScreenY + 40;
1536cdf0e10cSrcweir 		}
1537cdf0e10cSrcweir 		else
1538cdf0e10cSrcweir 		{
1539cdf0e10cSrcweir 			// center the window relative to the top level frame
1540cdf0e10cSrcweir 			nX = (nScreenWidth	- (int)maGeometry.nWidth ) / 2 + nScreenX;
1541cdf0e10cSrcweir 			nY = (nScreenHeight - (int)maGeometry.nHeight) / 2 + nScreenY;
1542cdf0e10cSrcweir 		}
1543cdf0e10cSrcweir 	}
1544cdf0e10cSrcweir 	else
1545cdf0e10cSrcweir 	{
1546cdf0e10cSrcweir 		// center the window relative to screen
1547cdf0e10cSrcweir 		nX = (nRealScreenWidth	- (int)maGeometry.nWidth ) / 2 + nScreenX;
1548cdf0e10cSrcweir 		nY = (nRealScreenHeight - (int)maGeometry.nHeight) / 2 + nScreenY;
1549cdf0e10cSrcweir 	}
1550cdf0e10cSrcweir     nX = nX < 0 ? 0 : nX;
1551cdf0e10cSrcweir     nY = nY < 0 ? 0 : nY;
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir 	bDefaultPosition_ = False;
1554cdf0e10cSrcweir     if( mpParent )
1555cdf0e10cSrcweir     {
1556cdf0e10cSrcweir         nX -= mpParent->maGeometry.nX;
1557cdf0e10cSrcweir         nY -= mpParent->maGeometry.nY;
1558cdf0e10cSrcweir     }
1559cdf0e10cSrcweir 
1560cdf0e10cSrcweir     Point aPoint(nX, nY);
1561cdf0e10cSrcweir 	SetPosSize( Rectangle( aPoint, Size( maGeometry.nWidth, maGeometry.nHeight ) ) );
1562cdf0e10cSrcweir }
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
updateScreenNumber()1565cdf0e10cSrcweir void X11SalFrame::updateScreenNumber()
1566cdf0e10cSrcweir {
1567cdf0e10cSrcweir     if( GetDisplay()->IsXinerama() && GetDisplay()->GetXineramaScreens().size() > 1 )
1568cdf0e10cSrcweir     {
1569cdf0e10cSrcweir         Point aPoint( maGeometry.nX, maGeometry.nY );
1570cdf0e10cSrcweir         const std::vector<Rectangle>& rScreenRects( GetDisplay()->GetXineramaScreens() );
1571cdf0e10cSrcweir         size_t nScreens = rScreenRects.size();
1572cdf0e10cSrcweir         for( size_t i = 0; i < nScreens; i++ )
1573cdf0e10cSrcweir         {
1574cdf0e10cSrcweir             if( rScreenRects[i].IsInside( aPoint ) )
1575cdf0e10cSrcweir             {
1576cdf0e10cSrcweir                 maGeometry.nScreenNumber = static_cast<unsigned int>(i);
1577cdf0e10cSrcweir                 break;
1578cdf0e10cSrcweir             }
1579cdf0e10cSrcweir         }
1580cdf0e10cSrcweir     }
1581cdf0e10cSrcweir     else
1582cdf0e10cSrcweir         maGeometry.nScreenNumber = static_cast<unsigned int>(m_nScreen);
1583cdf0e10cSrcweir }
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetPosSize(long nX,long nY,long nWidth,long nHeight,sal_uInt16 nFlags)1586cdf0e10cSrcweir void X11SalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags )
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir     if( nStyle_ & SAL_FRAME_STYLE_PLUG )
1589cdf0e10cSrcweir         return;
1590cdf0e10cSrcweir 
1591cdf0e10cSrcweir     // relative positioning in X11SalFrame::SetPosSize
1592cdf0e10cSrcweir     Rectangle aPosSize( Point( maGeometry.nX, maGeometry.nY ), Size( maGeometry.nWidth, maGeometry.nHeight ) );
1593cdf0e10cSrcweir     aPosSize.Justify();
1594cdf0e10cSrcweir 
1595cdf0e10cSrcweir     if( ! ( nFlags & SAL_FRAME_POSSIZE_X ) )
1596cdf0e10cSrcweir     {
1597cdf0e10cSrcweir         nX = aPosSize.Left();
1598cdf0e10cSrcweir         if( mpParent )
1599cdf0e10cSrcweir             nX -= mpParent->maGeometry.nX;
1600cdf0e10cSrcweir     }
1601cdf0e10cSrcweir     if( ! ( nFlags & SAL_FRAME_POSSIZE_Y ) )
1602cdf0e10cSrcweir     {
1603cdf0e10cSrcweir         nY = aPosSize.Top();
1604cdf0e10cSrcweir         if( mpParent )
1605cdf0e10cSrcweir             nY -= mpParent->maGeometry.nY;
1606cdf0e10cSrcweir     }
1607cdf0e10cSrcweir     if( ! ( nFlags & SAL_FRAME_POSSIZE_WIDTH ) )
1608cdf0e10cSrcweir         nWidth = aPosSize.GetWidth();
1609cdf0e10cSrcweir     if( ! ( nFlags & SAL_FRAME_POSSIZE_HEIGHT ) )
1610cdf0e10cSrcweir         nHeight = aPosSize.GetHeight();
1611cdf0e10cSrcweir 
1612cdf0e10cSrcweir     aPosSize = Rectangle( Point( nX, nY ), Size( nWidth, nHeight ) );
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir     if( ! ( nFlags & ( SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ) ) )
1615cdf0e10cSrcweir     {
1616cdf0e10cSrcweir         if( bDefaultPosition_ )
1617cdf0e10cSrcweir         {
1618cdf0e10cSrcweir             maGeometry.nWidth = aPosSize.GetWidth();
1619cdf0e10cSrcweir             maGeometry.nHeight = aPosSize.GetHeight();
1620cdf0e10cSrcweir             Center();
1621cdf0e10cSrcweir         }
1622cdf0e10cSrcweir         else
1623cdf0e10cSrcweir             SetSize( Size( nWidth, nHeight ) );
1624cdf0e10cSrcweir     }
1625cdf0e10cSrcweir     else
1626cdf0e10cSrcweir         SetPosSize( aPosSize );
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir     bDefaultPosition_ = False;
1629cdf0e10cSrcweir }
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetAlwaysOnTop(sal_Bool bOnTop)1632cdf0e10cSrcweir void X11SalFrame::SetAlwaysOnTop( sal_Bool bOnTop )
1633cdf0e10cSrcweir {
1634cdf0e10cSrcweir     if( ! IsOverrideRedirect() )
1635cdf0e10cSrcweir     {
1636cdf0e10cSrcweir         bAlwaysOnTop_ = bOnTop;
1637cdf0e10cSrcweir         pDisplay_->getWMAdaptor()->enableAlwaysOnTop( this, bOnTop );
1638cdf0e10cSrcweir     }
1639cdf0e10cSrcweir }
1640cdf0e10cSrcweir 
1641cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1642cdf0e10cSrcweir 
1643cdf0e10cSrcweir #define _FRAMESTATE_MASK_GEOMETRY \
1644cdf0e10cSrcweir      (SAL_FRAMESTATE_MASK_X     | SAL_FRAMESTATE_MASK_Y |   \
1645cdf0e10cSrcweir       SAL_FRAMESTATE_MASK_WIDTH | SAL_FRAMESTATE_MASK_HEIGHT)
1646cdf0e10cSrcweir #define _FRAMESTATE_MASK_MAXIMIZED_GEOMETRY \
1647cdf0e10cSrcweir      (SAL_FRAMESTATE_MASK_MAXIMIZED_X     | SAL_FRAMESTATE_MASK_MAXIMIZED_Y |   \
1648cdf0e10cSrcweir       SAL_FRAMESTATE_MASK_MAXIMIZED_WIDTH | SAL_FRAMESTATE_MASK_MAXIMIZED_HEIGHT)
1649cdf0e10cSrcweir 
SetWindowState(const SalFrameState * pState)1650cdf0e10cSrcweir void X11SalFrame::SetWindowState( const SalFrameState *pState )
1651cdf0e10cSrcweir {
1652cdf0e10cSrcweir     if (pState == NULL)
1653cdf0e10cSrcweir         return;
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir     // Request for position or size change
1656cdf0e10cSrcweir     if (pState->mnMask & _FRAMESTATE_MASK_GEOMETRY)
1657cdf0e10cSrcweir     {
1658cdf0e10cSrcweir         Rectangle aPosSize;
1659cdf0e10cSrcweir         bool bDoAdjust = false;
1660cdf0e10cSrcweir 
1661cdf0e10cSrcweir         /* #i44325#
1662cdf0e10cSrcweir          * if maximized, set restore size and guess maximized size from last time
1663cdf0e10cSrcweir          * in state change below maximize window
1664cdf0e10cSrcweir          */
1665cdf0e10cSrcweir         if( ! IsChildWindow() &&
1666cdf0e10cSrcweir             (pState->mnMask & SAL_FRAMESTATE_MASK_STATE) &&
1667cdf0e10cSrcweir             (pState->mnState & SAL_FRAMESTATE_MAXIMIZED) &&
1668cdf0e10cSrcweir             (pState->mnMask & _FRAMESTATE_MASK_GEOMETRY) == _FRAMESTATE_MASK_GEOMETRY &&
1669cdf0e10cSrcweir             (pState->mnMask & _FRAMESTATE_MASK_MAXIMIZED_GEOMETRY) == _FRAMESTATE_MASK_MAXIMIZED_GEOMETRY
1670cdf0e10cSrcweir             )
1671cdf0e10cSrcweir         {
1672cdf0e10cSrcweir             XSizeHints* pHints = XAllocSizeHints();
1673cdf0e10cSrcweir             long nSupplied = 0;
1674cdf0e10cSrcweir             XGetWMNormalHints( GetXDisplay(),
1675cdf0e10cSrcweir                                GetShellWindow(),
1676cdf0e10cSrcweir                                pHints,
1677cdf0e10cSrcweir                                &nSupplied );
1678cdf0e10cSrcweir             pHints->flags |= PPosition | PWinGravity;
1679cdf0e10cSrcweir             pHints->x			= pState->mnX;
1680cdf0e10cSrcweir             pHints->y			= pState->mnY;
1681cdf0e10cSrcweir             pHints->win_gravity	= pDisplay_->getWMAdaptor()->getPositionWinGravity();
1682cdf0e10cSrcweir             XSetWMNormalHints( GetXDisplay(),
1683cdf0e10cSrcweir                                GetShellWindow(),
1684cdf0e10cSrcweir                                pHints );
1685cdf0e10cSrcweir             XFree( pHints );
1686cdf0e10cSrcweir 
1687cdf0e10cSrcweir             XMoveResizeWindow( GetXDisplay(), GetShellWindow(),
1688cdf0e10cSrcweir                                pState->mnX, pState->mnY,
1689cdf0e10cSrcweir                                pState->mnWidth, pState->mnHeight );
1690cdf0e10cSrcweir             // guess maximized geometry from last time
1691cdf0e10cSrcweir             maGeometry.nX      = pState->mnMaximizedX;
1692cdf0e10cSrcweir             maGeometry.nY      = pState->mnMaximizedY;
1693cdf0e10cSrcweir             maGeometry.nWidth  = pState->mnMaximizedWidth;
1694cdf0e10cSrcweir             maGeometry.nHeight = pState->mnMaximizedHeight;
1695cdf0e10cSrcweir             updateScreenNumber();
1696cdf0e10cSrcweir         }
1697cdf0e10cSrcweir         else
1698cdf0e10cSrcweir         {
1699cdf0e10cSrcweir             // initialize with current geometry
1700cdf0e10cSrcweir             if ((pState->mnMask & _FRAMESTATE_MASK_GEOMETRY) != _FRAMESTATE_MASK_GEOMETRY)
1701cdf0e10cSrcweir                 GetPosSize (aPosSize);
1702cdf0e10cSrcweir 
1703cdf0e10cSrcweir             // change requested properties
1704cdf0e10cSrcweir             if (pState->mnMask & SAL_FRAMESTATE_MASK_X)
1705cdf0e10cSrcweir             {
1706cdf0e10cSrcweir                 aPosSize.setX (pState->mnX);
1707cdf0e10cSrcweir             }
1708cdf0e10cSrcweir             if (pState->mnMask & SAL_FRAMESTATE_MASK_Y)
1709cdf0e10cSrcweir             {
1710cdf0e10cSrcweir                 aPosSize.setY (pState->mnY);
1711cdf0e10cSrcweir             }
1712cdf0e10cSrcweir             if (pState->mnMask & SAL_FRAMESTATE_MASK_WIDTH)
1713cdf0e10cSrcweir             {
1714cdf0e10cSrcweir                 long nWidth = pState->mnWidth > 0 ? pState->mnWidth  - 1 : 0;
1715cdf0e10cSrcweir                 aPosSize.setWidth (nWidth);
1716cdf0e10cSrcweir                 bDoAdjust = true;
1717cdf0e10cSrcweir             }
1718cdf0e10cSrcweir             if (pState->mnMask & SAL_FRAMESTATE_MASK_HEIGHT)
1719cdf0e10cSrcweir             {
1720cdf0e10cSrcweir                 int nHeight = pState->mnHeight > 0 ? pState->mnHeight - 1 : 0;
1721cdf0e10cSrcweir                 aPosSize.setHeight (nHeight);
1722cdf0e10cSrcweir                 bDoAdjust = true;
1723cdf0e10cSrcweir             }
1724cdf0e10cSrcweir 
1725cdf0e10cSrcweir             const Size& aScreenSize = pDisplay_->getDataForScreen( m_nScreen ).m_aSize;
1726cdf0e10cSrcweir             const WMAdaptor *pWM = GetDisplay()->getWMAdaptor();
1727cdf0e10cSrcweir 
1728cdf0e10cSrcweir             if( bDoAdjust && aPosSize.GetWidth() <= aScreenSize.Width()
1729cdf0e10cSrcweir                 && aPosSize.GetHeight() <= aScreenSize.Height() )
1730cdf0e10cSrcweir             {
1731cdf0e10cSrcweir                 SalFrameGeometry aGeom = maGeometry;
1732cdf0e10cSrcweir 
1733cdf0e10cSrcweir                 if( ! (nStyle_ & ( SAL_FRAME_STYLE_FLOAT | SAL_FRAME_STYLE_PLUG ) ) &&
1734cdf0e10cSrcweir                     mpParent &&
1735cdf0e10cSrcweir                 aGeom.nLeftDecoration == 0 &&
1736cdf0e10cSrcweir                 aGeom.nTopDecoration == 0 )
1737cdf0e10cSrcweir                 {
1738cdf0e10cSrcweir                     aGeom = mpParent->maGeometry;
1739cdf0e10cSrcweir                     if( aGeom.nLeftDecoration == 0 &&
1740cdf0e10cSrcweir                         aGeom.nTopDecoration == 0 )
1741cdf0e10cSrcweir                     {
1742cdf0e10cSrcweir                         aGeom.nLeftDecoration = 5;
1743cdf0e10cSrcweir                         aGeom.nTopDecoration = 20;
1744cdf0e10cSrcweir                         aGeom.nRightDecoration = 5;
1745cdf0e10cSrcweir                         aGeom.nBottomDecoration = 5;
1746cdf0e10cSrcweir                     }
1747cdf0e10cSrcweir                 }
1748cdf0e10cSrcweir 
1749cdf0e10cSrcweir                 // adjust position so that frame fits onto screen
1750cdf0e10cSrcweir                 if( aPosSize.Right()+(long)aGeom.nRightDecoration > aScreenSize.Width()-1 )
1751cdf0e10cSrcweir                     aPosSize.Move( (long)aScreenSize.Width() - (long)aPosSize.Right() - (long)aGeom.nRightDecoration, 0 );
1752cdf0e10cSrcweir                 if( aPosSize.Bottom()+(long)aGeom.nBottomDecoration > aScreenSize.Height()-1 )
1753cdf0e10cSrcweir                     aPosSize.Move( 0, (long)aScreenSize.Height() - (long)aPosSize.Bottom() - (long)aGeom.nBottomDecoration );
1754cdf0e10cSrcweir                 if( aPosSize.Left() < (long)aGeom.nLeftDecoration )
1755cdf0e10cSrcweir                     aPosSize.Move( (long)aGeom.nLeftDecoration - (long)aPosSize.Left(), 0 );
1756cdf0e10cSrcweir                 if( aPosSize.Top() < (long)aGeom.nTopDecoration )
1757cdf0e10cSrcweir                     aPosSize.Move( 0, (long)aGeom.nTopDecoration - (long)aPosSize.Top() );
1758cdf0e10cSrcweir             }
1759cdf0e10cSrcweir 
1760cdf0e10cSrcweir             // resize with new args
1761cdf0e10cSrcweir             if (pWM->supportsICCCMPos())
1762cdf0e10cSrcweir             {
1763cdf0e10cSrcweir                 if( mpParent )
1764cdf0e10cSrcweir                     aPosSize.Move( -mpParent->maGeometry.nX,
1765cdf0e10cSrcweir                 -mpParent->maGeometry.nY );
1766cdf0e10cSrcweir                 SetPosSize( aPosSize );
1767cdf0e10cSrcweir                 bDefaultPosition_ = False;
1768cdf0e10cSrcweir             }
1769cdf0e10cSrcweir             else
1770cdf0e10cSrcweir                 SetPosSize( 0, 0, aPosSize.GetWidth(), aPosSize.GetHeight(), SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
1771cdf0e10cSrcweir         }
1772cdf0e10cSrcweir     }
1773cdf0e10cSrcweir 
1774cdf0e10cSrcweir     // request for status change
1775cdf0e10cSrcweir     if (pState->mnMask & SAL_FRAMESTATE_MASK_STATE)
1776cdf0e10cSrcweir     {
1777cdf0e10cSrcweir 	    if (pState->mnState & SAL_FRAMESTATE_MAXIMIZED)
1778cdf0e10cSrcweir 	    {
1779cdf0e10cSrcweir 		    nShowState_ = SHOWSTATE_NORMAL;
1780cdf0e10cSrcweir             if( ! (pState->mnState & (SAL_FRAMESTATE_MAXIMIZED_HORZ|SAL_FRAMESTATE_MAXIMIZED_VERT) ) )
1781cdf0e10cSrcweir                 Maximize();
1782cdf0e10cSrcweir             else
1783cdf0e10cSrcweir             {
1784cdf0e10cSrcweir                 bool bHorz = (pState->mnState & SAL_FRAMESTATE_MAXIMIZED_HORZ) ? true : false;
1785cdf0e10cSrcweir                 bool bVert = (pState->mnState & SAL_FRAMESTATE_MAXIMIZED_VERT) ? true : false;
1786cdf0e10cSrcweir                 GetDisplay()->getWMAdaptor()->maximizeFrame( this, bHorz, bVert );
1787cdf0e10cSrcweir             }
1788cdf0e10cSrcweir             maRestorePosSize.Left() = pState->mnX;
1789cdf0e10cSrcweir             maRestorePosSize.Top() = pState->mnY;
1790cdf0e10cSrcweir             maRestorePosSize.Right() = maRestorePosSize.Left() + pState->mnWidth;
1791cdf0e10cSrcweir             maRestorePosSize.Right() = maRestorePosSize.Left() + pState->mnHeight;
1792cdf0e10cSrcweir 	    }
1793cdf0e10cSrcweir         else if( mbMaximizedHorz || mbMaximizedVert )
1794cdf0e10cSrcweir             GetDisplay()->getWMAdaptor()->maximizeFrame( this, false, false );
1795cdf0e10cSrcweir 
1796cdf0e10cSrcweir 	    if (pState->mnState & SAL_FRAMESTATE_MINIMIZED)
1797cdf0e10cSrcweir 	    {
1798cdf0e10cSrcweir 		    if (nShowState_ == SHOWSTATE_UNKNOWN)
1799cdf0e10cSrcweir 			    nShowState_ = SHOWSTATE_NORMAL;
1800cdf0e10cSrcweir 		    Minimize();
1801cdf0e10cSrcweir         }
1802cdf0e10cSrcweir         if (pState->mnState & SAL_FRAMESTATE_NORMAL)
1803cdf0e10cSrcweir         {
1804cdf0e10cSrcweir             if (nShowState_ != SHOWSTATE_NORMAL)
1805cdf0e10cSrcweir                 Restore();
1806cdf0e10cSrcweir         }
1807cdf0e10cSrcweir         if (pState->mnState & SAL_FRAMESTATE_ROLLUP)
1808cdf0e10cSrcweir             GetDisplay()->getWMAdaptor()->shade( this, true );
1809cdf0e10cSrcweir 	}
1810cdf0e10cSrcweir }
1811cdf0e10cSrcweir 
1812cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetWindowState(SalFrameState * pState)1813cdf0e10cSrcweir sal_Bool X11SalFrame::GetWindowState( SalFrameState* pState )
1814cdf0e10cSrcweir {
1815cdf0e10cSrcweir 	if( SHOWSTATE_MINIMIZED == nShowState_ )
1816cdf0e10cSrcweir 		pState->mnState = SAL_FRAMESTATE_MINIMIZED;
1817cdf0e10cSrcweir 	else
1818cdf0e10cSrcweir 		pState->mnState = SAL_FRAMESTATE_NORMAL;
1819cdf0e10cSrcweir 
1820cdf0e10cSrcweir 	Rectangle aPosSize;
1821cdf0e10cSrcweir     if( maRestorePosSize.IsEmpty() )
1822cdf0e10cSrcweir         GetPosSize( aPosSize );
1823cdf0e10cSrcweir     else
1824cdf0e10cSrcweir         aPosSize = maRestorePosSize;
1825cdf0e10cSrcweir 
1826cdf0e10cSrcweir     if( mbMaximizedHorz )
1827cdf0e10cSrcweir         pState->mnState |= SAL_FRAMESTATE_MAXIMIZED_HORZ;
1828cdf0e10cSrcweir     if( mbMaximizedVert )
1829cdf0e10cSrcweir         pState->mnState |= SAL_FRAMESTATE_MAXIMIZED_VERT;
1830cdf0e10cSrcweir     if( mbShaded )
1831cdf0e10cSrcweir         pState->mnState |= SAL_FRAMESTATE_ROLLUP;
1832cdf0e10cSrcweir 
1833cdf0e10cSrcweir 	pState->mnX 	 = aPosSize.Left();
1834cdf0e10cSrcweir 	pState->mnY 	 = aPosSize.Top();
1835cdf0e10cSrcweir 	pState->mnWidth  = aPosSize.GetWidth();
1836cdf0e10cSrcweir 	pState->mnHeight = aPosSize.GetHeight();
1837cdf0e10cSrcweir 
1838cdf0e10cSrcweir     pState->mnMask   = _FRAMESTATE_MASK_GEOMETRY | SAL_FRAMESTATE_MASK_STATE;
1839cdf0e10cSrcweir 
1840cdf0e10cSrcweir 
1841cdf0e10cSrcweir 	if (! maRestorePosSize.IsEmpty() )
1842cdf0e10cSrcweir 	{
1843cdf0e10cSrcweir         GetPosSize( aPosSize );
1844cdf0e10cSrcweir 		pState->mnState |= SAL_FRAMESTATE_MAXIMIZED;
1845cdf0e10cSrcweir         pState->mnMaximizedX      = aPosSize.Left();
1846cdf0e10cSrcweir         pState->mnMaximizedY      = aPosSize.Top();
1847cdf0e10cSrcweir         pState->mnMaximizedWidth  = aPosSize.GetWidth();
1848cdf0e10cSrcweir         pState->mnMaximizedHeight = aPosSize.GetHeight();
1849cdf0e10cSrcweir         pState->mnMask |= _FRAMESTATE_MASK_MAXIMIZED_GEOMETRY;
1850cdf0e10cSrcweir 	}
1851cdf0e10cSrcweir 
1852cdf0e10cSrcweir 	return sal_True;
1853cdf0e10cSrcweir }
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir // ----------------------------------------------------------------------------
1856cdf0e10cSrcweir // get a screenshot of the current frame including window manager decoration
SnapShot()1857cdf0e10cSrcweir SalBitmap* X11SalFrame::SnapShot()
1858cdf0e10cSrcweir {
1859cdf0e10cSrcweir     Display* pDisplay = GetXDisplay();
1860cdf0e10cSrcweir 
1861cdf0e10cSrcweir     // make sure the frame has been reparented and all paint timer have been
1862cdf0e10cSrcweir     // expired
1863cdf0e10cSrcweir     do
1864cdf0e10cSrcweir     {
1865cdf0e10cSrcweir         XSync(pDisplay, False);
1866cdf0e10cSrcweir         Application::Reschedule ();
1867cdf0e10cSrcweir     }
1868cdf0e10cSrcweir     while (XPending(pDisplay));
1869cdf0e10cSrcweir     TimeValue aVal;
1870cdf0e10cSrcweir     aVal.Seconds = 0;
1871cdf0e10cSrcweir     aVal.Nanosec = 50000000;
1872cdf0e10cSrcweir     osl_waitThread( &aVal );
1873cdf0e10cSrcweir     do
1874cdf0e10cSrcweir     {
1875cdf0e10cSrcweir         XSync(pDisplay, False);
1876cdf0e10cSrcweir         Application::Reschedule ();
1877cdf0e10cSrcweir     }
1878cdf0e10cSrcweir     while (XPending(pDisplay));
1879cdf0e10cSrcweir 
1880cdf0e10cSrcweir     // get the most outer window, usually the window manager decoration
1881cdf0e10cSrcweir     Drawable hWindow = None;
1882cdf0e10cSrcweir     if (IsOverrideRedirect())
1883cdf0e10cSrcweir         hWindow = GetDrawable();
1884cdf0e10cSrcweir     else
1885cdf0e10cSrcweir     if (hPresentationWindow != None)
1886cdf0e10cSrcweir         hWindow = hPresentationWindow;
1887cdf0e10cSrcweir     else
1888cdf0e10cSrcweir         hWindow = GetStackingWindow();
1889cdf0e10cSrcweir 
1890cdf0e10cSrcweir     // query the contents of the window
1891cdf0e10cSrcweir     if (hWindow != None)
1892cdf0e10cSrcweir     {
1893cdf0e10cSrcweir         X11SalBitmap *pBmp = new X11SalBitmap;
1894cdf0e10cSrcweir         if (pBmp->SnapShot (pDisplay, hWindow))
1895cdf0e10cSrcweir             return pBmp;
1896cdf0e10cSrcweir         else
1897cdf0e10cSrcweir             delete pBmp;
1898cdf0e10cSrcweir     }
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir     return NULL;
1901cdf0e10cSrcweir }
1902cdf0e10cSrcweir 
1903cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir // native menu implementation - currently empty
DrawMenuBar()1906cdf0e10cSrcweir void X11SalFrame::DrawMenuBar()
1907cdf0e10cSrcweir {
1908cdf0e10cSrcweir }
1909cdf0e10cSrcweir 
SetMenu(SalMenu *)1910cdf0e10cSrcweir void X11SalFrame::SetMenu( SalMenu* )
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir }
1913cdf0e10cSrcweir 
1914cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetPosSize(Rectangle & rPosSize)1915cdf0e10cSrcweir void X11SalFrame::GetPosSize( Rectangle &rPosSize )
1916cdf0e10cSrcweir {
1917cdf0e10cSrcweir 	if( maGeometry.nWidth < 1 || maGeometry.nHeight < 1 )
1918cdf0e10cSrcweir 	{
1919cdf0e10cSrcweir         const Size& aScreenSize = pDisplay_->getDataForScreen( m_nScreen ).m_aSize;
1920cdf0e10cSrcweir 		long w = aScreenSize.Width()  - maGeometry.nLeftDecoration - maGeometry.nRightDecoration;
1921cdf0e10cSrcweir 		long h = aScreenSize.Height() - maGeometry.nTopDecoration - maGeometry.nBottomDecoration;
1922cdf0e10cSrcweir 
1923cdf0e10cSrcweir 		rPosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ), Size( w, h ) );
1924cdf0e10cSrcweir 	}
1925cdf0e10cSrcweir 	else
1926cdf0e10cSrcweir 		rPosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ),
1927cdf0e10cSrcweir                               Size( maGeometry.nWidth, maGeometry.nHeight ) );
1928cdf0e10cSrcweir }
1929cdf0e10cSrcweir 
1930cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetSize(const Size & rSize)1931cdf0e10cSrcweir void X11SalFrame::SetSize( const Size &rSize )
1932cdf0e10cSrcweir {
1933cdf0e10cSrcweir 	if( rSize.Width() > 0 && rSize.Height() > 0 )
1934cdf0e10cSrcweir 	{
1935cdf0e10cSrcweir  		if( ! ( nStyle_ & SAL_FRAME_STYLE_SIZEABLE )
1936cdf0e10cSrcweir             && ! IsChildWindow()
1937cdf0e10cSrcweir             && ( nStyle_ & (SAL_FRAME_STYLE_FLOAT|SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) != SAL_FRAME_STYLE_FLOAT )
1938cdf0e10cSrcweir  		{
1939cdf0e10cSrcweir             XSizeHints* pHints = XAllocSizeHints();
1940cdf0e10cSrcweir             long nSupplied = 0;
1941cdf0e10cSrcweir             XGetWMNormalHints( GetXDisplay(),
1942cdf0e10cSrcweir                                GetShellWindow(),
1943cdf0e10cSrcweir                                pHints,
1944cdf0e10cSrcweir                                &nSupplied
1945cdf0e10cSrcweir                                );
1946cdf0e10cSrcweir             pHints->min_width	= rSize.Width();
1947cdf0e10cSrcweir             pHints->min_height	= rSize.Height();
1948cdf0e10cSrcweir             pHints->max_width	= rSize.Width();
1949cdf0e10cSrcweir             pHints->max_height	= rSize.Height();
1950cdf0e10cSrcweir             pHints->flags |= PMinSize | PMaxSize;
1951cdf0e10cSrcweir             XSetWMNormalHints( GetXDisplay(),
1952cdf0e10cSrcweir                                GetShellWindow(),
1953cdf0e10cSrcweir                                pHints );
1954cdf0e10cSrcweir             XFree( pHints );
1955cdf0e10cSrcweir  		}
1956cdf0e10cSrcweir         XResizeWindow( GetXDisplay(), IsSysChildWindow() ? GetWindow() : GetShellWindow(), rSize.Width(), rSize.Height() );
1957cdf0e10cSrcweir         if( GetWindow() != GetShellWindow() )
1958cdf0e10cSrcweir         {
1959cdf0e10cSrcweir             if( (nStyle_ & SAL_FRAME_STYLE_PLUG ) )
1960cdf0e10cSrcweir                 XMoveResizeWindow( GetXDisplay(), GetWindow(), 0, 0, rSize.Width(), rSize.Height() );
1961cdf0e10cSrcweir             else
1962cdf0e10cSrcweir                 XResizeWindow( GetXDisplay(), GetWindow(), rSize.Width(), rSize.Height() );
1963cdf0e10cSrcweir         }
1964cdf0e10cSrcweir 
1965cdf0e10cSrcweir         maGeometry.nWidth  = rSize.Width();
1966cdf0e10cSrcweir         maGeometry.nHeight = rSize.Height();
1967cdf0e10cSrcweir 
1968cdf0e10cSrcweir 		// allow the external status window to reposition
1969cdf0e10cSrcweir 		if (mbInputFocus && mpInputContext != NULL)
1970cdf0e10cSrcweir 			mpInputContext->SetICFocus ( this );
1971cdf0e10cSrcweir 	}
1972cdf0e10cSrcweir }
1973cdf0e10cSrcweir 
1974cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1975cdf0e10cSrcweir 
1976cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1977cdf0e10cSrcweir 
SetPosSize(const Rectangle & rPosSize)1978cdf0e10cSrcweir void X11SalFrame::SetPosSize( const Rectangle &rPosSize )
1979cdf0e10cSrcweir {
1980cdf0e10cSrcweir 	XWindowChanges values;
1981cdf0e10cSrcweir 	values.x		= rPosSize.Left();
1982cdf0e10cSrcweir 	values.y		= rPosSize.Top();
1983cdf0e10cSrcweir 	values.width	= rPosSize.GetWidth();
1984cdf0e10cSrcweir 	values.height	= rPosSize.GetHeight();
1985cdf0e10cSrcweir 
1986cdf0e10cSrcweir     if( !values.width || !values.height )
1987cdf0e10cSrcweir         return;
1988cdf0e10cSrcweir 
1989cdf0e10cSrcweir  	if( mpParent && ! IsSysChildWindow() )
1990cdf0e10cSrcweir  	{
1991cdf0e10cSrcweir         // --- RTL --- (mirror window pos)
1992cdf0e10cSrcweir         if( Application::GetSettings().GetLayoutRTL() )
1993cdf0e10cSrcweir             values.x = mpParent->maGeometry.nWidth-values.width-1-values.x;
1994cdf0e10cSrcweir 
1995cdf0e10cSrcweir  		XLIB_Window aChild;
1996cdf0e10cSrcweir  		// coordinates are relative to parent, so translate to root coordinates
1997cdf0e10cSrcweir  		XTranslateCoordinates( GetDisplay()->GetDisplay(),
1998cdf0e10cSrcweir  							   mpParent->GetWindow(),
1999cdf0e10cSrcweir  							   GetDisplay()->GetRootWindow( m_nScreen ),
2000cdf0e10cSrcweir  							   values.x, values.y,
2001cdf0e10cSrcweir  							   &values.x, &values.y,
2002cdf0e10cSrcweir  							   & aChild );
2003cdf0e10cSrcweir  	}
2004cdf0e10cSrcweir 
2005cdf0e10cSrcweir     bool bMoved = false;
2006cdf0e10cSrcweir     bool bSized = false;
2007cdf0e10cSrcweir     if( values.x != maGeometry.nX || values.y != maGeometry.nY )
2008cdf0e10cSrcweir         bMoved = true;
2009cdf0e10cSrcweir     if( values.width != (int)maGeometry.nWidth || values.height != (int)maGeometry.nHeight )
2010cdf0e10cSrcweir         bSized = true;
2011cdf0e10cSrcweir 
2012cdf0e10cSrcweir 	if( ! ( nStyle_ & ( SAL_FRAME_STYLE_PLUG | SAL_FRAME_STYLE_FLOAT ) )
2013cdf0e10cSrcweir         && !(pDisplay_->GetProperties() & PROPERTY_SUPPORT_WM_ClientPos) )
2014cdf0e10cSrcweir     {
2015cdf0e10cSrcweir         values.x	-= maGeometry.nLeftDecoration;
2016cdf0e10cSrcweir         values.y	-= maGeometry.nTopDecoration;
2017cdf0e10cSrcweir     }
2018cdf0e10cSrcweir 
2019cdf0e10cSrcweir     // do net set WMNormalHints for ..
2020cdf0e10cSrcweir     if(
2021cdf0e10cSrcweir         // child windows
2022cdf0e10cSrcweir         ! IsChildWindow()
2023cdf0e10cSrcweir         // popups (menu, help window, etc.)
2024cdf0e10cSrcweir         && 	(nStyle_ & (SAL_FRAME_STYLE_FLOAT|SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) != SAL_FRAME_STYLE_FLOAT
2025cdf0e10cSrcweir         // shown, sizeable windows
2026cdf0e10cSrcweir         && ( nShowState_ == SHOWSTATE_UNKNOWN ||
2027cdf0e10cSrcweir              nShowState_ == SHOWSTATE_HIDDEN ||
2028cdf0e10cSrcweir              ! ( nStyle_ & SAL_FRAME_STYLE_SIZEABLE )
2029cdf0e10cSrcweir              )
2030cdf0e10cSrcweir         )
2031cdf0e10cSrcweir     {
2032cdf0e10cSrcweir         XSizeHints* pHints = XAllocSizeHints();
2033cdf0e10cSrcweir         long nSupplied = 0;
2034cdf0e10cSrcweir         XGetWMNormalHints( GetXDisplay(),
2035cdf0e10cSrcweir                            GetShellWindow(),
2036cdf0e10cSrcweir                            pHints,
2037cdf0e10cSrcweir                            &nSupplied
2038cdf0e10cSrcweir                            );
2039cdf0e10cSrcweir         if( ! ( nStyle_ & SAL_FRAME_STYLE_SIZEABLE ) )
2040cdf0e10cSrcweir         {
2041cdf0e10cSrcweir             pHints->min_width	= rPosSize.GetWidth();
2042cdf0e10cSrcweir             pHints->min_height	= rPosSize.GetHeight();
2043cdf0e10cSrcweir             pHints->max_width	= rPosSize.GetWidth();
2044cdf0e10cSrcweir             pHints->max_height	= rPosSize.GetHeight();
2045cdf0e10cSrcweir             pHints->flags |= PMinSize | PMaxSize;
2046cdf0e10cSrcweir         }
2047cdf0e10cSrcweir         if( nShowState_ == SHOWSTATE_UNKNOWN || nShowState_ == SHOWSTATE_HIDDEN )
2048cdf0e10cSrcweir         {
2049cdf0e10cSrcweir             pHints->flags |= PPosition | PWinGravity;
2050cdf0e10cSrcweir             pHints->x			= values.x;
2051cdf0e10cSrcweir             pHints->y			= values.y;
2052cdf0e10cSrcweir             pHints->win_gravity	= pDisplay_->getWMAdaptor()->getPositionWinGravity();
2053cdf0e10cSrcweir         }
2054cdf0e10cSrcweir         if( mbFullScreen )
2055cdf0e10cSrcweir         {
2056cdf0e10cSrcweir             pHints->max_width	= 10000;
2057cdf0e10cSrcweir             pHints->max_height	= 10000;
2058cdf0e10cSrcweir             pHints->flags |= PMaxSize;
2059cdf0e10cSrcweir         }
2060cdf0e10cSrcweir         XSetWMNormalHints( GetXDisplay(),
2061cdf0e10cSrcweir                            GetShellWindow(),
2062cdf0e10cSrcweir                            pHints );
2063cdf0e10cSrcweir         XFree( pHints );
2064cdf0e10cSrcweir     }
2065cdf0e10cSrcweir 
2066cdf0e10cSrcweir     XMoveResizeWindow( GetXDisplay(), IsSysChildWindow() ? GetWindow() : GetShellWindow(), values.x, values.y, values.width, values.height );
2067cdf0e10cSrcweir     if( GetShellWindow() != GetWindow() )
2068cdf0e10cSrcweir     {
2069cdf0e10cSrcweir         if( (nStyle_ & SAL_FRAME_STYLE_PLUG ) )
2070cdf0e10cSrcweir             XMoveResizeWindow( GetXDisplay(), GetWindow(), 0, 0, values.width, values.height );
2071cdf0e10cSrcweir         else
2072cdf0e10cSrcweir             XMoveResizeWindow( GetXDisplay(), GetWindow(), values.x, values.y, values.width, values.height );
2073cdf0e10cSrcweir     }
2074cdf0e10cSrcweir 
2075cdf0e10cSrcweir     maGeometry.nX		= values.x;
2076cdf0e10cSrcweir     maGeometry.nY		= values.y;
2077cdf0e10cSrcweir     maGeometry.nWidth	= values.width;
2078cdf0e10cSrcweir     maGeometry.nHeight	= values.height;
2079cdf0e10cSrcweir     if( IsSysChildWindow() && mpParent )
2080cdf0e10cSrcweir     {
2081cdf0e10cSrcweir         // translate back to root coordinates
2082cdf0e10cSrcweir         maGeometry.nX += mpParent->maGeometry.nX;
2083cdf0e10cSrcweir         maGeometry.nY += mpParent->maGeometry.nY;
2084cdf0e10cSrcweir     }
2085cdf0e10cSrcweir 
2086cdf0e10cSrcweir     updateScreenNumber();
2087cdf0e10cSrcweir     if( bSized && ! bMoved )
2088cdf0e10cSrcweir         CallCallback( SALEVENT_RESIZE, NULL );
2089cdf0e10cSrcweir     else if( bMoved && ! bSized )
2090cdf0e10cSrcweir         CallCallback( SALEVENT_MOVE, NULL );
2091cdf0e10cSrcweir     else
2092cdf0e10cSrcweir         CallCallback( SALEVENT_MOVERESIZE, NULL );
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir 	// allow the external status window to reposition
2095cdf0e10cSrcweir 	if (mbInputFocus && mpInputContext != NULL)
2096cdf0e10cSrcweir 		mpInputContext->SetICFocus ( this );
2097cdf0e10cSrcweir }
2098cdf0e10cSrcweir 
2099cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Minimize()2100cdf0e10cSrcweir void X11SalFrame::Minimize()
2101cdf0e10cSrcweir {
2102cdf0e10cSrcweir     if( IsSysChildWindow() )
2103cdf0e10cSrcweir         return;
2104cdf0e10cSrcweir 
2105cdf0e10cSrcweir 	if( SHOWSTATE_UNKNOWN == nShowState_ || SHOWSTATE_HIDDEN == nShowState_ )
2106cdf0e10cSrcweir 	{
2107cdf0e10cSrcweir 		stderr0( "X11SalFrame::Minimize on withdrawn window\n" );
2108cdf0e10cSrcweir 		return;
2109cdf0e10cSrcweir 	}
2110cdf0e10cSrcweir 
2111cdf0e10cSrcweir 	if( XIconifyWindow( GetXDisplay(),
2112cdf0e10cSrcweir 						GetShellWindow(),
2113cdf0e10cSrcweir 						pDisplay_->GetDefaultScreenNumber() ) )
2114cdf0e10cSrcweir 		nShowState_ = SHOWSTATE_MINIMIZED;
2115cdf0e10cSrcweir }
2116cdf0e10cSrcweir 
2117cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Maximize()2118cdf0e10cSrcweir void X11SalFrame::Maximize()
2119cdf0e10cSrcweir {
2120cdf0e10cSrcweir     if( IsSysChildWindow() )
2121cdf0e10cSrcweir         return;
2122cdf0e10cSrcweir 
2123cdf0e10cSrcweir 	if( SHOWSTATE_MINIMIZED == nShowState_ )
2124cdf0e10cSrcweir 	{
2125cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->frameIsMapping( this );
2126cdf0e10cSrcweir 		XMapWindow( GetXDisplay(), GetShellWindow() );
2127cdf0e10cSrcweir 		nShowState_ = SHOWSTATE_NORMAL;
2128cdf0e10cSrcweir 	}
2129cdf0e10cSrcweir 
2130cdf0e10cSrcweir     pDisplay_->getWMAdaptor()->maximizeFrame( this, true, true );
2131cdf0e10cSrcweir }
2132cdf0e10cSrcweir 
2133cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Restore()2134cdf0e10cSrcweir void X11SalFrame::Restore()
2135cdf0e10cSrcweir {
2136cdf0e10cSrcweir     if( IsSysChildWindow() )
2137cdf0e10cSrcweir         return;
2138cdf0e10cSrcweir 
2139cdf0e10cSrcweir 	if( SHOWSTATE_UNKNOWN == nShowState_ || SHOWSTATE_HIDDEN == nShowState_ )
2140cdf0e10cSrcweir 	{
2141cdf0e10cSrcweir 		stderr0( "X11SalFrame::Restore on withdrawn window\n" );
2142cdf0e10cSrcweir 		return;
2143cdf0e10cSrcweir 	}
2144cdf0e10cSrcweir 
2145cdf0e10cSrcweir 	if( SHOWSTATE_MINIMIZED == nShowState_ )
2146cdf0e10cSrcweir 	{
2147cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->frameIsMapping( this );
2148cdf0e10cSrcweir 		XMapWindow( GetXDisplay(), GetShellWindow() );
2149cdf0e10cSrcweir 		nShowState_ = SHOWSTATE_NORMAL;
2150cdf0e10cSrcweir 	}
2151cdf0e10cSrcweir 
2152cdf0e10cSrcweir     pDisplay_->getWMAdaptor()->maximizeFrame( this, false, false );
2153cdf0e10cSrcweir }
2154cdf0e10cSrcweir 
2155cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2156cdf0e10cSrcweir 
SetScreenNumber(unsigned int nNewScreen)2157cdf0e10cSrcweir void X11SalFrame::SetScreenNumber( unsigned int nNewScreen )
2158cdf0e10cSrcweir {
2159cdf0e10cSrcweir     if( nNewScreen == maGeometry.nScreenNumber )
2160cdf0e10cSrcweir         return;
2161cdf0e10cSrcweir 
2162cdf0e10cSrcweir     if( GetDisplay()->IsXinerama() && GetDisplay()->GetXineramaScreens().size() > 1 )
2163cdf0e10cSrcweir     {
2164cdf0e10cSrcweir         if( nNewScreen >= GetDisplay()->GetXineramaScreens().size() )
2165cdf0e10cSrcweir             return;
2166cdf0e10cSrcweir 
2167cdf0e10cSrcweir         Rectangle aOldScreenRect( GetDisplay()->GetXineramaScreens()[maGeometry.nScreenNumber] );
2168cdf0e10cSrcweir         Rectangle aNewScreenRect( GetDisplay()->GetXineramaScreens()[nNewScreen] );
2169cdf0e10cSrcweir         bool bVisible = bMapped_;
2170cdf0e10cSrcweir         if( bVisible )
2171cdf0e10cSrcweir             Show( sal_False );
2172cdf0e10cSrcweir         maGeometry.nX = aNewScreenRect.Left() + (maGeometry.nX - aOldScreenRect.Left());
2173cdf0e10cSrcweir         maGeometry.nY = aNewScreenRect.Top() + (maGeometry.nY - aOldScreenRect.Top());
2174cdf0e10cSrcweir         createNewWindow( None, m_nScreen );
2175cdf0e10cSrcweir         if( bVisible )
2176cdf0e10cSrcweir             Show( sal_True );
2177cdf0e10cSrcweir         maGeometry.nScreenNumber = nNewScreen;
2178cdf0e10cSrcweir     }
2179cdf0e10cSrcweir     else if( sal_Int32(nNewScreen) < GetDisplay()->GetScreenCount() )
2180cdf0e10cSrcweir     {
2181cdf0e10cSrcweir         bool bVisible = bMapped_;
2182cdf0e10cSrcweir         if( bVisible )
2183cdf0e10cSrcweir             Show( sal_False );
2184cdf0e10cSrcweir         createNewWindow( None, nNewScreen );
2185cdf0e10cSrcweir         if( bVisible )
2186cdf0e10cSrcweir             Show( sal_True );
2187cdf0e10cSrcweir         maGeometry.nScreenNumber = nNewScreen;
2188cdf0e10cSrcweir     }
2189cdf0e10cSrcweir }
2190cdf0e10cSrcweir 
2191cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2192cdf0e10cSrcweir 
ShowFullScreen(sal_Bool bFullScreen,sal_Int32 nScreen)2193cdf0e10cSrcweir void X11SalFrame::ShowFullScreen( sal_Bool bFullScreen, sal_Int32 nScreen )
2194cdf0e10cSrcweir {
2195cdf0e10cSrcweir     if( GetDisplay()->IsXinerama() && GetDisplay()->GetXineramaScreens().size() > 1 )
2196cdf0e10cSrcweir     {
2197cdf0e10cSrcweir         if( mbFullScreen == (bool)bFullScreen )
2198cdf0e10cSrcweir             return;
2199cdf0e10cSrcweir         if( bFullScreen )
2200cdf0e10cSrcweir         {
2201cdf0e10cSrcweir             maRestorePosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ),
2202cdf0e10cSrcweir                                           Size( maGeometry.nWidth, maGeometry.nHeight ) );
2203cdf0e10cSrcweir             Rectangle aRect;
2204cdf0e10cSrcweir             if( nScreen < 0 || nScreen >= static_cast<int>(GetDisplay()->GetXineramaScreens().size()) )
2205cdf0e10cSrcweir                 aRect = Rectangle( Point(0,0), GetDisplay()->GetScreenSize( m_nScreen ) );
2206cdf0e10cSrcweir             else
2207cdf0e10cSrcweir                 aRect = GetDisplay()->GetXineramaScreens()[nScreen];
2208cdf0e10cSrcweir             nStyle_ |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN;
2209cdf0e10cSrcweir             bool bVisible = bMapped_;
2210cdf0e10cSrcweir             if( bVisible )
2211cdf0e10cSrcweir                 Show( sal_False );
2212cdf0e10cSrcweir             maGeometry.nX = aRect.Left();
2213cdf0e10cSrcweir             maGeometry.nY = aRect.Top();
2214cdf0e10cSrcweir             maGeometry.nWidth = aRect.GetWidth();
2215cdf0e10cSrcweir             maGeometry.nHeight = aRect.GetHeight();
2216cdf0e10cSrcweir             mbMaximizedHorz = mbMaximizedVert = false;
2217cdf0e10cSrcweir             mbFullScreen = true;
2218cdf0e10cSrcweir             createNewWindow( None, m_nScreen );
2219cdf0e10cSrcweir             if( GetDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() )
2220cdf0e10cSrcweir                 GetDisplay()->getWMAdaptor()->enableAlwaysOnTop( this, true );
2221cdf0e10cSrcweir             else
2222cdf0e10cSrcweir             {
2223cdf0e10cSrcweir                 GetDisplay()->getWMAdaptor()->setFullScreenMonitors( GetShellWindow(), nScreen );
2224cdf0e10cSrcweir                 GetDisplay()->getWMAdaptor()->showFullScreen( this, true );
2225cdf0e10cSrcweir             }
2226cdf0e10cSrcweir             if( bVisible )
2227cdf0e10cSrcweir                 Show(sal_True);
2228cdf0e10cSrcweir 
2229cdf0e10cSrcweir         }
2230cdf0e10cSrcweir         else
2231cdf0e10cSrcweir         {
2232cdf0e10cSrcweir             mbFullScreen = false;
2233cdf0e10cSrcweir             nStyle_ &= ~SAL_FRAME_STYLE_PARTIAL_FULLSCREEN;
2234cdf0e10cSrcweir             bool bVisible = bMapped_;
2235cdf0e10cSrcweir             Rectangle aRect = maRestorePosSize;
2236cdf0e10cSrcweir             maRestorePosSize = Rectangle();
2237cdf0e10cSrcweir             if( bVisible )
2238cdf0e10cSrcweir                 Show( sal_False );
2239cdf0e10cSrcweir             createNewWindow( None, m_nScreen );
2240cdf0e10cSrcweir             if( !aRect.IsEmpty() )
2241cdf0e10cSrcweir                 SetPosSize( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(),
2242cdf0e10cSrcweir                             SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y |
2243cdf0e10cSrcweir                             SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
2244cdf0e10cSrcweir             if( bVisible )
2245cdf0e10cSrcweir                 Show( sal_True );
2246cdf0e10cSrcweir         }
2247cdf0e10cSrcweir     }
2248cdf0e10cSrcweir     else
2249cdf0e10cSrcweir     {
2250cdf0e10cSrcweir         if( nScreen < 0 || nScreen >= GetDisplay()->GetScreenCount() )
2251cdf0e10cSrcweir             nScreen = m_nScreen;
2252cdf0e10cSrcweir         if( nScreen != m_nScreen )
2253cdf0e10cSrcweir         {
2254cdf0e10cSrcweir             bool bVisible = bMapped_;
2255cdf0e10cSrcweir             if( mbFullScreen )
2256cdf0e10cSrcweir                 pDisplay_->getWMAdaptor()->showFullScreen( this, false );
2257cdf0e10cSrcweir             if( bVisible )
2258cdf0e10cSrcweir                 Show( sal_False );
2259cdf0e10cSrcweir             createNewWindow( None, nScreen );
2260cdf0e10cSrcweir             if( mbFullScreen )
2261cdf0e10cSrcweir                 pDisplay_->getWMAdaptor()->showFullScreen( this, true );
2262cdf0e10cSrcweir             if( bVisible )
2263cdf0e10cSrcweir                 Show( sal_True );
2264cdf0e10cSrcweir         }
2265cdf0e10cSrcweir         if( mbFullScreen == (bool)bFullScreen )
2266cdf0e10cSrcweir             return;
2267cdf0e10cSrcweir 
2268cdf0e10cSrcweir         pDisplay_->getWMAdaptor()->showFullScreen( this, bFullScreen );
2269cdf0e10cSrcweir         if( IsOverrideRedirect()
2270cdf0e10cSrcweir             && WMSupportsFWS( GetXDisplay(), GetDisplay()->GetRootWindow( m_nScreen ) ) )
2271cdf0e10cSrcweir         {
2272cdf0e10cSrcweir             AddFwsProtocols( GetXDisplay(), GetShellWindow() );
2273cdf0e10cSrcweir             RegisterFwsWindow( GetXDisplay(), GetShellWindow() );
2274cdf0e10cSrcweir         }
2275cdf0e10cSrcweir     }
2276cdf0e10cSrcweir }
2277cdf0e10cSrcweir 
2278cdf0e10cSrcweir /* ---------------------------------------------------------------------
2279cdf0e10cSrcweir    the xautolock pseudo screen saver needs special treatment since it
2280cdf0e10cSrcweir    doesn't cooperate with XxxxScreenSaver settings
2281cdf0e10cSrcweir    ------------------------------------------------------------------- */
2282cdf0e10cSrcweir 
2283cdf0e10cSrcweir static Bool
IsRunningXAutoLock(Display * p_display,XLIB_Window a_window)2284cdf0e10cSrcweir IsRunningXAutoLock( Display *p_display, XLIB_Window a_window )
2285cdf0e10cSrcweir {
2286cdf0e10cSrcweir 	const char *p_atomname = "XAUTOLOCK_SEMAPHORE_PID";
2287cdf0e10cSrcweir 	Atom		a_pidatom;
2288cdf0e10cSrcweir 
2289cdf0e10cSrcweir 	// xautolock interns this atom
2290cdf0e10cSrcweir 	a_pidatom    = XInternAtom( p_display, p_atomname, True );
2291cdf0e10cSrcweir 	if ( a_pidatom == None )
2292cdf0e10cSrcweir 		return False;
2293cdf0e10cSrcweir 
2294cdf0e10cSrcweir 	Atom          a_type;
2295cdf0e10cSrcweir 	int           n_format;
2296cdf0e10cSrcweir 	unsigned long n_items;
2297cdf0e10cSrcweir 	unsigned long n_bytes_after;
2298cdf0e10cSrcweir 	pid_t		 *p_pid;
2299cdf0e10cSrcweir 	pid_t         n_pid;
2300cdf0e10cSrcweir 	// get pid of running xautolock
2301cdf0e10cSrcweir 	XGetWindowProperty (p_display, a_window, a_pidatom, 0L, 2L, False,
2302cdf0e10cSrcweir     		AnyPropertyType, &a_type, &n_format, &n_items, &n_bytes_after,
2303cdf0e10cSrcweir             (unsigned char**) &p_pid );
2304cdf0e10cSrcweir 	n_pid = *p_pid;
2305cdf0e10cSrcweir 	XFree( p_pid );
2306cdf0e10cSrcweir 
2307cdf0e10cSrcweir   	if ( a_type == XA_INTEGER )
2308cdf0e10cSrcweir   	{
2309cdf0e10cSrcweir 		// check if xautolock pid points to a running process
2310cdf0e10cSrcweir 		if ( kill(n_pid, 0) == -1 )
2311cdf0e10cSrcweir 			return False;
2312cdf0e10cSrcweir 		else
2313cdf0e10cSrcweir 			return True;
2314cdf0e10cSrcweir 	}
2315cdf0e10cSrcweir 
2316cdf0e10cSrcweir 	return False;
2317cdf0e10cSrcweir }
2318cdf0e10cSrcweir 
2319cdf0e10cSrcweir /* definitions from xautolock.c (pl15) */
2320cdf0e10cSrcweir #define XAUTOLOCK_DISABLE 1
2321cdf0e10cSrcweir #define XAUTOLOCK_ENABLE  2
2322cdf0e10cSrcweir 
2323cdf0e10cSrcweir static Bool
MessageToXAutoLock(Display * p_display,int n_message)2324cdf0e10cSrcweir MessageToXAutoLock( Display *p_display, int n_message )
2325cdf0e10cSrcweir {
2326cdf0e10cSrcweir 	const char *p_atomname = "XAUTOLOCK_MESSAGE" ;
2327cdf0e10cSrcweir 	Atom        a_messageatom;
2328cdf0e10cSrcweir 	XLIB_Window a_rootwindow;
2329cdf0e10cSrcweir 
2330cdf0e10cSrcweir 	a_rootwindow = RootWindowOfScreen( ScreenOfDisplay(p_display, 0) );
2331cdf0e10cSrcweir 	if ( ! IsRunningXAutoLock(p_display, a_rootwindow) )
2332cdf0e10cSrcweir 	{
2333cdf0e10cSrcweir 		// remove any pending messages
2334cdf0e10cSrcweir 		a_messageatom = XInternAtom( p_display, p_atomname, True );
2335cdf0e10cSrcweir 		if ( a_messageatom != None )
2336cdf0e10cSrcweir 			XDeleteProperty( p_display, a_rootwindow, a_messageatom );
2337cdf0e10cSrcweir 		return False;
2338cdf0e10cSrcweir 	}
2339cdf0e10cSrcweir 
2340cdf0e10cSrcweir 	a_messageatom = XInternAtom( p_display, p_atomname, False );
2341cdf0e10cSrcweir 	XChangeProperty (p_display, a_rootwindow, a_messageatom, XA_INTEGER,
2342cdf0e10cSrcweir     		8, PropModeReplace, (unsigned char*)&n_message, sizeof(n_message) );
2343cdf0e10cSrcweir 
2344cdf0e10cSrcweir 	return True;
2345cdf0e10cSrcweir }
2346cdf0e10cSrcweir 
2347cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
StartPresentation(sal_Bool bStart)2348cdf0e10cSrcweir void X11SalFrame::StartPresentation( sal_Bool bStart )
2349cdf0e10cSrcweir {
2350cdf0e10cSrcweir     I18NStatus::get().show( !bStart, I18NStatus::presentation );
2351cdf0e10cSrcweir 	if ( bStart )
2352cdf0e10cSrcweir 		MessageToXAutoLock( GetXDisplay(), XAUTOLOCK_DISABLE );
2353cdf0e10cSrcweir 	else
2354cdf0e10cSrcweir 		MessageToXAutoLock( GetXDisplay(), XAUTOLOCK_ENABLE );
2355cdf0e10cSrcweir 
2356cdf0e10cSrcweir     if( ! bStart && hPresentationWindow != None )
2357cdf0e10cSrcweir         doReparentPresentationDialogues( GetDisplay() );
2358cdf0e10cSrcweir     hPresentationWindow = (bStart && IsOverrideRedirect() ) ? GetWindow() : None;
2359cdf0e10cSrcweir 
2360cdf0e10cSrcweir 
2361cdf0e10cSrcweir 	// needs static here to save DPMS settings
2362cdf0e10cSrcweir     int dummy;
2363cdf0e10cSrcweir     static bool DPMSExtensionAvailable =
2364cdf0e10cSrcweir #ifndef SOLARIS
2365cdf0e10cSrcweir         (DPMSQueryExtension(GetXDisplay(), &dummy, &dummy) != 0);
2366cdf0e10cSrcweir 	static sal_Bool DPMSEnabled = false;
2367cdf0e10cSrcweir #else
2368cdf0e10cSrcweir         false;
2369cdf0e10cSrcweir     bool DPMSEnabled = false;
2370cdf0e10cSrcweir     (void)dummy;
2371cdf0e10cSrcweir #define CARD16 unsigned short
2372cdf0e10cSrcweir #endif
2373cdf0e10cSrcweir 	static CARD16 dpms_standby_timeout=0;
2374cdf0e10cSrcweir 	static CARD16 dpms_suspend_timeout=0;
2375cdf0e10cSrcweir 	static CARD16 dpms_off_timeout=0;
2376cdf0e10cSrcweir 
2377cdf0e10cSrcweir 
2378cdf0e10cSrcweir 	if( bStart || nScreenSaversTimeout_ || DPMSEnabled)
2379cdf0e10cSrcweir 	{
2380cdf0e10cSrcweir         if( hPresentationWindow )
2381cdf0e10cSrcweir         {
2382cdf0e10cSrcweir             /*  #i10559# workaround for WindowMaker: try to restore
2383cdf0e10cSrcweir              *  current focus after presentation window is gone
2384cdf0e10cSrcweir              */
2385cdf0e10cSrcweir             int revert_to = 0;
2386cdf0e10cSrcweir             XGetInputFocus( GetXDisplay(), &hPresFocusWindow, &revert_to );
2387cdf0e10cSrcweir         }
2388cdf0e10cSrcweir 		int timeout, interval, prefer_blanking, allow_exposures;
2389cdf0e10cSrcweir 		XGetScreenSaver( GetXDisplay(),
2390cdf0e10cSrcweir 						 &timeout,
2391cdf0e10cSrcweir 						 &interval,
2392cdf0e10cSrcweir 						 &prefer_blanking,
2393cdf0e10cSrcweir 						 &allow_exposures );
2394cdf0e10cSrcweir 
2395cdf0e10cSrcweir 
2396cdf0e10cSrcweir 		// get the DPMS state right before the start
2397cdf0e10cSrcweir 		if (DPMSExtensionAvailable)
2398cdf0e10cSrcweir         {
2399cdf0e10cSrcweir #ifndef SOLARIS
2400cdf0e10cSrcweir 			CARD16 state; // card16 is defined in Xdm.h
2401cdf0e10cSrcweir 			DPMSInfo(	GetXDisplay(),
2402cdf0e10cSrcweir 						&state,
2403cdf0e10cSrcweir 						&DPMSEnabled);
2404cdf0e10cSrcweir #endif
2405cdf0e10cSrcweir 		}
2406cdf0e10cSrcweir 		if( bStart ) // start show
2407cdf0e10cSrcweir 		{
2408cdf0e10cSrcweir 			if ( timeout )
2409cdf0e10cSrcweir 			{
2410cdf0e10cSrcweir 				nScreenSaversTimeout_ = timeout;
2411cdf0e10cSrcweir 				XResetScreenSaver( GetXDisplay() );
2412cdf0e10cSrcweir 				XSetScreenSaver( GetXDisplay(),
2413cdf0e10cSrcweir 								 0,
2414cdf0e10cSrcweir 								 interval,
2415cdf0e10cSrcweir 								 prefer_blanking,
2416cdf0e10cSrcweir 								 allow_exposures );
2417cdf0e10cSrcweir 			}
2418cdf0e10cSrcweir #ifndef SOLARIS
2419cdf0e10cSrcweir 			if( DPMSEnabled )
2420cdf0e10cSrcweir 			{
2421cdf0e10cSrcweir 				if ( DPMSExtensionAvailable )
2422cdf0e10cSrcweir 				{
2423cdf0e10cSrcweir 					DPMSGetTimeouts(	GetXDisplay(),
2424cdf0e10cSrcweir 										&dpms_standby_timeout,
2425cdf0e10cSrcweir 										&dpms_suspend_timeout,
2426cdf0e10cSrcweir 										&dpms_off_timeout);
2427cdf0e10cSrcweir 					DPMSSetTimeouts(GetXDisplay(), 0,0,0);
2428cdf0e10cSrcweir 				}
2429cdf0e10cSrcweir 			}
2430cdf0e10cSrcweir #endif
2431cdf0e10cSrcweir 		}
2432cdf0e10cSrcweir 		else // if( !bStart ) // end of show
2433cdf0e10cSrcweir 		{
2434cdf0e10cSrcweir 			if( nScreenSaversTimeout_ )
2435cdf0e10cSrcweir 			{
2436cdf0e10cSrcweir 				XSetScreenSaver( GetXDisplay(),
2437cdf0e10cSrcweir 							 nScreenSaversTimeout_,
2438cdf0e10cSrcweir 							 interval,
2439cdf0e10cSrcweir 							 prefer_blanking,
2440cdf0e10cSrcweir 							 allow_exposures );
2441cdf0e10cSrcweir 				nScreenSaversTimeout_ = 0;
2442cdf0e10cSrcweir 			}
2443cdf0e10cSrcweir #ifndef SOLARIS
2444cdf0e10cSrcweir 			if ( DPMSEnabled )
2445cdf0e10cSrcweir 			{
2446cdf0e10cSrcweir 				if ( DPMSExtensionAvailable )
2447cdf0e10cSrcweir 				{
2448cdf0e10cSrcweir 				// restore timeouts
2449cdf0e10cSrcweir 					DPMSSetTimeouts(GetXDisplay(), dpms_standby_timeout,
2450cdf0e10cSrcweir 						dpms_suspend_timeout, dpms_off_timeout);
2451cdf0e10cSrcweir 				}
2452cdf0e10cSrcweir 			}
2453cdf0e10cSrcweir #endif
2454cdf0e10cSrcweir 		}
2455cdf0e10cSrcweir 	}
2456cdf0e10cSrcweir }
2457cdf0e10cSrcweir 
2458cdf0e10cSrcweir // Pointer
2459cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetPointer(PointerStyle ePointerStyle)2460cdf0e10cSrcweir void X11SalFrame::SetPointer( PointerStyle ePointerStyle )
2461cdf0e10cSrcweir {
2462cdf0e10cSrcweir 	hCursor_ = pDisplay_->GetPointer( ePointerStyle );
2463cdf0e10cSrcweir 	XDefineCursor( GetXDisplay(), GetWindow(), hCursor_ );
2464cdf0e10cSrcweir 
2465cdf0e10cSrcweir 	if( IsCaptured() || nVisibleFloats > 0 )
2466cdf0e10cSrcweir 		XChangeActivePointerGrab( GetXDisplay(),
2467cdf0e10cSrcweir 						PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
2468cdf0e10cSrcweir 						hCursor_,
2469cdf0e10cSrcweir 						CurrentTime );
2470cdf0e10cSrcweir }
2471cdf0e10cSrcweir 
SetPointerPos(long nX,long nY)2472cdf0e10cSrcweir void X11SalFrame::SetPointerPos(long nX, long nY)
2473cdf0e10cSrcweir {
2474cdf0e10cSrcweir     /* #87921# when the application tries to center the mouse in the dialog the
2475cdf0e10cSrcweir      * window isn't mapped already. So use coordinates relative to the root window.
2476cdf0e10cSrcweir      */
2477cdf0e10cSrcweir     unsigned int nWindowLeft = maGeometry.nX + nX;
2478cdf0e10cSrcweir     unsigned int nWindowTop  = maGeometry.nY + nY;
2479cdf0e10cSrcweir 
2480cdf0e10cSrcweir     XWarpPointer( GetXDisplay(), None, pDisplay_->GetRootWindow( pDisplay_->GetDefaultScreenNumber() ),
2481cdf0e10cSrcweir                   0, 0, 0, 0, nWindowLeft, nWindowTop);
2482cdf0e10cSrcweir }
2483cdf0e10cSrcweir 
2484cdf0e10cSrcweir // delay handling of extended text input
2485cdf0e10cSrcweir #if !defined(__synchronous_extinput__)
2486cdf0e10cSrcweir void
PostExtTextEvent(sal_uInt16 nExtTextEventType,void * pExtTextEvent)2487cdf0e10cSrcweir X11SalFrame::PostExtTextEvent (sal_uInt16 nExtTextEventType, void *pExtTextEvent)
2488cdf0e10cSrcweir {
2489cdf0e10cSrcweir 	XLIB_Window nFocusWindow = GetWindow();
2490cdf0e10cSrcweir 	Atom 		nEventAtom	 = GetDisplay()->getWMAdaptor()->getAtom( WMAdaptor::SAL_EXTTEXTEVENT );
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir     XEvent aEvent;
2493cdf0e10cSrcweir     aEvent.xclient.type			= ClientMessage;
2494cdf0e10cSrcweir     aEvent.xclient.serial		= 0;
2495cdf0e10cSrcweir     aEvent.xclient.send_event	= True;
2496cdf0e10cSrcweir     aEvent.xclient.display		= GetXDisplay();
2497cdf0e10cSrcweir     aEvent.xclient.window		= nFocusWindow;
2498cdf0e10cSrcweir     aEvent.xclient.message_type	= nEventAtom;
2499cdf0e10cSrcweir     aEvent.xclient.format		= 32;
2500cdf0e10cSrcweir 
2501cdf0e10cSrcweir #if SAL_TYPES_SIZEOFLONG > 4
2502cdf0e10cSrcweir     aEvent.xclient.data.l[0] = (sal_uInt32)((long)pExtTextEvent & 0xffffffff);
2503cdf0e10cSrcweir     aEvent.xclient.data.l[1] = (sal_uInt32)((long)pExtTextEvent >> 32);
2504cdf0e10cSrcweir #else
2505cdf0e10cSrcweir     aEvent.xclient.data.l[0] = (sal_uInt32)((long)pExtTextEvent);
2506cdf0e10cSrcweir     aEvent.xclient.data.l[1] = 0;
2507cdf0e10cSrcweir #endif
2508cdf0e10cSrcweir     aEvent.xclient.data.l[2] = (sal_uInt32)nExtTextEventType;
2509cdf0e10cSrcweir     aEvent.xclient.data.l[3] = 0;
2510cdf0e10cSrcweir     aEvent.xclient.data.l[4] = 0;
2511cdf0e10cSrcweir 
2512cdf0e10cSrcweir     XPutBackEvent( GetXDisplay(), &aEvent );
2513cdf0e10cSrcweir }
2514cdf0e10cSrcweir 
2515cdf0e10cSrcweir void
HandleExtTextEvent(XClientMessageEvent * pEvent)2516cdf0e10cSrcweir X11SalFrame::HandleExtTextEvent (XClientMessageEvent *pEvent)
2517cdf0e10cSrcweir {
2518cdf0e10cSrcweir 	#if SAL_TYPES_SIZEOFLONG > 4
2519cdf0e10cSrcweir 	void* pExtTextEvent = (void*)(  (pEvent->data.l[0] & 0xffffffff)
2520cdf0e10cSrcweir 								  | (pEvent->data.l[1] << 32) );
2521cdf0e10cSrcweir 	#else
2522cdf0e10cSrcweir 	void* pExtTextEvent = (void*)(pEvent->data.l[0]);
2523cdf0e10cSrcweir 	#endif
2524cdf0e10cSrcweir 	sal_uInt16 nExtTextEventType = sal_uInt16(pEvent->data.l[2]);
2525cdf0e10cSrcweir 
2526cdf0e10cSrcweir 	CallCallback(nExtTextEventType, pExtTextEvent);
2527cdf0e10cSrcweir 
2528cdf0e10cSrcweir 	switch (nExtTextEventType)
2529cdf0e10cSrcweir 	{
2530cdf0e10cSrcweir 		case SALEVENT_ENDEXTTEXTINPUT:
2531cdf0e10cSrcweir 			break;
2532cdf0e10cSrcweir 
2533cdf0e10cSrcweir 		case SALEVENT_EXTTEXTINPUT:
2534cdf0e10cSrcweir 			break;
2535cdf0e10cSrcweir 
2536cdf0e10cSrcweir 		default:
2537cdf0e10cSrcweir 
2538cdf0e10cSrcweir 			fprintf(stderr, "X11SalFrame::HandleExtTextEvent: invalid extended input\n");
2539cdf0e10cSrcweir 	}
2540cdf0e10cSrcweir }
2541cdf0e10cSrcweir #endif /* defined(__synchronous_extinput__) */
2542cdf0e10cSrcweir 
2543cdf0e10cSrcweir // PostEvent
2544cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
PostEvent(void * pData)2545cdf0e10cSrcweir sal_Bool X11SalFrame::PostEvent( void *pData )
2546cdf0e10cSrcweir {
2547cdf0e10cSrcweir     GetDisplay()->SendInternalEvent( this, pData );
2548cdf0e10cSrcweir 	return sal_True;
2549cdf0e10cSrcweir }
2550cdf0e10cSrcweir 
2551cdf0e10cSrcweir // Title
2552cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetTitle(const XubString & rTitle)2553cdf0e10cSrcweir void X11SalFrame::SetTitle( const XubString& rTitle )
2554cdf0e10cSrcweir {
2555cdf0e10cSrcweir     if( ! ( IsChildWindow() || (nStyle_ & SAL_FRAME_STYLE_FLOAT ) ) )
2556cdf0e10cSrcweir     {
2557cdf0e10cSrcweir         m_aTitle = rTitle;
2558cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->setWMName( this, rTitle );
2559cdf0e10cSrcweir     }
2560cdf0e10cSrcweir }
2561cdf0e10cSrcweir 
2562cdf0e10cSrcweir // -----------------------------------------------------------------------
2563cdf0e10cSrcweir 
Flush()2564cdf0e10cSrcweir void X11SalFrame::Flush()
2565cdf0e10cSrcweir {
2566cdf0e10cSrcweir 	XFlush( GetDisplay()->GetDisplay() );
2567cdf0e10cSrcweir }
2568cdf0e10cSrcweir 
2569cdf0e10cSrcweir // -----------------------------------------------------------------------
2570cdf0e10cSrcweir 
Sync()2571cdf0e10cSrcweir void X11SalFrame::Sync()
2572cdf0e10cSrcweir {
2573cdf0e10cSrcweir 	XSync( GetDisplay()->GetDisplay(), False );
2574cdf0e10cSrcweir }
2575cdf0e10cSrcweir 
2576cdf0e10cSrcweir // Keyboard
2577cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2578cdf0e10cSrcweir 
2579cdf0e10cSrcweir // -----------------------------------------------------------------------
2580cdf0e10cSrcweir 
SetInputContext(SalInputContext * pContext)2581cdf0e10cSrcweir void X11SalFrame::SetInputContext( SalInputContext* pContext )
2582cdf0e10cSrcweir {
2583cdf0e10cSrcweir   	if (pContext == NULL)
2584cdf0e10cSrcweir 		return;
2585cdf0e10cSrcweir 
2586cdf0e10cSrcweir   	// 1. We should create an input context for this frame
2587cdf0e10cSrcweir   	//    only when SAL_INPUTCONTEXT_TEXT is set.
2588cdf0e10cSrcweir 
2589cdf0e10cSrcweir   	if (!(pContext->mnOptions & SAL_INPUTCONTEXT_TEXT))
2590cdf0e10cSrcweir     {
2591cdf0e10cSrcweir         if( mpInputContext )
2592cdf0e10cSrcweir             mpInputContext->Unmap( this );
2593cdf0e10cSrcweir 		return;
2594cdf0e10cSrcweir     }
2595cdf0e10cSrcweir 
2596cdf0e10cSrcweir 	// 2. We should use on-the-spot inputstyle
2597cdf0e10cSrcweir   	//    only when SAL_INPUTCONTEXT_EXTTEXTINPUT is set.
2598cdf0e10cSrcweir 
2599cdf0e10cSrcweir   	if (mpInputContext == NULL)
2600cdf0e10cSrcweir 	{
2601cdf0e10cSrcweir         I18NStatus& rStatus( I18NStatus::get() );
2602cdf0e10cSrcweir         rStatus.setParent( this );
2603cdf0e10cSrcweir         mpInputContext = new SalI18N_InputContext( this );
2604cdf0e10cSrcweir 		if (mpInputContext->UseContext())
2605cdf0e10cSrcweir 		{
2606cdf0e10cSrcweir 	  		mpInputContext->ExtendEventMask( GetShellWindow() );
2607cdf0e10cSrcweir 	  		if (pContext->mnOptions & SAL_INPUTCONTEXT_CHANGELANGUAGE)
2608cdf0e10cSrcweir 				mpInputContext->SetLanguage(pContext->meLanguage);
2609cdf0e10cSrcweir 			if (mbInputFocus)
2610cdf0e10cSrcweir 				mpInputContext->SetICFocus( this );
2611cdf0e10cSrcweir 		}
2612cdf0e10cSrcweir   	}
2613cdf0e10cSrcweir     else
2614cdf0e10cSrcweir         mpInputContext->Map( this );
2615cdf0e10cSrcweir   	return;
2616cdf0e10cSrcweir }
2617cdf0e10cSrcweir 
2618cdf0e10cSrcweir // -----------------------------------------------------------------------
2619cdf0e10cSrcweir 
EndExtTextInput(sal_uInt16 nFlags)2620cdf0e10cSrcweir void X11SalFrame::EndExtTextInput( sal_uInt16 nFlags )
2621cdf0e10cSrcweir {
2622cdf0e10cSrcweir     if (mpInputContext != NULL)
2623cdf0e10cSrcweir   	    mpInputContext->EndExtTextInput( nFlags );
2624cdf0e10cSrcweir }
2625cdf0e10cSrcweir 
2626cdf0e10cSrcweir // -----------------------------------------------------------------------
2627cdf0e10cSrcweir 
GetKeyName(sal_uInt16 nKeyCode)2628cdf0e10cSrcweir XubString X11SalFrame::GetKeyName( sal_uInt16 nKeyCode )
2629cdf0e10cSrcweir {
2630cdf0e10cSrcweir 	return GetDisplay()->GetKeyName( nKeyCode );
2631cdf0e10cSrcweir }
2632cdf0e10cSrcweir 
GetSymbolKeyName(const XubString &,sal_uInt16 nKeyCode)2633cdf0e10cSrcweir XubString X11SalFrame::GetSymbolKeyName( const XubString&, sal_uInt16 nKeyCode )
2634cdf0e10cSrcweir {
2635cdf0e10cSrcweir   return GetKeyName( nKeyCode );
2636cdf0e10cSrcweir }
2637cdf0e10cSrcweir 
MapUnicodeToKeyCode(sal_Unicode,LanguageType,KeyCode &)2638cdf0e10cSrcweir sal_Bool X11SalFrame::MapUnicodeToKeyCode( sal_Unicode , LanguageType , KeyCode& )
2639cdf0e10cSrcweir {
2640cdf0e10cSrcweir     // not supported yet
2641cdf0e10cSrcweir     return sal_False;
2642cdf0e10cSrcweir }
2643cdf0e10cSrcweir 
GetInputLanguage()2644cdf0e10cSrcweir LanguageType X11SalFrame::GetInputLanguage()
2645cdf0e10cSrcweir {
2646cdf0e10cSrcweir     // could be improved by checking unicode ranges of the last input
2647cdf0e10cSrcweir     return LANGUAGE_DONTKNOW;
2648cdf0e10cSrcweir }
2649cdf0e10cSrcweir 
2650cdf0e10cSrcweir // Settings
2651cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2652cdf0e10cSrcweir 
getColorFromLong(long nColor)2653cdf0e10cSrcweir inline Color getColorFromLong( long nColor )
2654cdf0e10cSrcweir {
2655cdf0e10cSrcweir 	return Color( (nColor & 0xff), (nColor & 0xff00)>>8, (nColor & 0xff0000)>>16);
2656cdf0e10cSrcweir }
2657cdf0e10cSrcweir 
UpdateSettings(AllSettings & rSettings)2658cdf0e10cSrcweir void X11SalFrame::UpdateSettings( AllSettings& rSettings )
2659cdf0e10cSrcweir {
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir     DtIntegrator* pIntegrator = GetDisplay()->getDtIntegrator();
2662cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
2663cdf0e10cSrcweir     fprintf( stderr, "DtIntegrator: %d\n", pIntegrator ? pIntegrator->GetDtType() : -1 );
2664cdf0e10cSrcweir #endif
2665cdf0e10cSrcweir     if( pIntegrator )
2666cdf0e10cSrcweir         pIntegrator->GetSystemLook( rSettings );
2667cdf0e10cSrcweir }
2668cdf0e10cSrcweir 
CaptureMouse(sal_Bool bCapture)2669cdf0e10cSrcweir void X11SalFrame::CaptureMouse( sal_Bool bCapture )
2670cdf0e10cSrcweir {
2671cdf0e10cSrcweir     nCaptured_ = pDisplay_->CaptureMouse( bCapture ? this : NULL );
2672cdf0e10cSrcweir }
2673cdf0e10cSrcweir 
2674cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2675cdf0e10cSrcweir 
SetParent(SalFrame * pNewParent)2676cdf0e10cSrcweir void X11SalFrame::SetParent( SalFrame* pNewParent )
2677cdf0e10cSrcweir {
2678cdf0e10cSrcweir     if( mpParent != pNewParent )
2679cdf0e10cSrcweir     {
2680cdf0e10cSrcweir         if( mpParent )
2681cdf0e10cSrcweir             mpParent->maChildren.remove( this );
2682cdf0e10cSrcweir 
2683cdf0e10cSrcweir         mpParent = static_cast<X11SalFrame*>(pNewParent);
2684cdf0e10cSrcweir         mpParent->maChildren.push_back( this );
2685cdf0e10cSrcweir         if( mpParent->m_nScreen != m_nScreen )
2686cdf0e10cSrcweir             createNewWindow( None, mpParent->m_nScreen );
2687cdf0e10cSrcweir         GetDisplay()->getWMAdaptor()->changeReferenceFrame( this, mpParent );
2688cdf0e10cSrcweir     }
2689cdf0e10cSrcweir }
2690cdf0e10cSrcweir 
GetParent() const2691cdf0e10cSrcweir SalFrame* X11SalFrame::GetParent() const
2692cdf0e10cSrcweir {
2693cdf0e10cSrcweir     return mpParent;
2694cdf0e10cSrcweir }
2695cdf0e10cSrcweir 
createNewWindow(XLIB_Window aNewParent,int nScreen)2696cdf0e10cSrcweir void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen )
2697cdf0e10cSrcweir {
2698cdf0e10cSrcweir     bool bWasVisible = bMapped_;
2699cdf0e10cSrcweir     if( bWasVisible )
2700cdf0e10cSrcweir         Show( sal_False );
2701cdf0e10cSrcweir 
2702cdf0e10cSrcweir     if( nScreen < 0 || nScreen >= GetDisplay()->GetScreenCount() )
2703cdf0e10cSrcweir         nScreen = m_nScreen;
2704cdf0e10cSrcweir 
2705cdf0e10cSrcweir     SystemParentData aParentData;
2706cdf0e10cSrcweir     aParentData.aWindow = aNewParent;
2707cdf0e10cSrcweir     aParentData.bXEmbedSupport = (aNewParent != None && m_bXEmbed); // caution: this is guesswork
2708cdf0e10cSrcweir     if( aNewParent == None )
2709cdf0e10cSrcweir     {
2710cdf0e10cSrcweir         aNewParent = GetDisplay()->GetRootWindow(nScreen);
2711cdf0e10cSrcweir         aParentData.aWindow = None;
2712cdf0e10cSrcweir         m_bXEmbed = false;
2713cdf0e10cSrcweir     }
2714cdf0e10cSrcweir     else
2715cdf0e10cSrcweir     {
2716cdf0e10cSrcweir         // is new parent a root window ?
2717cdf0e10cSrcweir         Display* pDisp = GetDisplay()->GetDisplay();
2718cdf0e10cSrcweir         int nScreens = GetDisplay()->GetScreenCount();
2719cdf0e10cSrcweir         for( int i = 0; i < nScreens; i++ )
2720cdf0e10cSrcweir         {
2721cdf0e10cSrcweir             if( aNewParent == RootWindow( pDisp, i ) )
2722cdf0e10cSrcweir             {
2723cdf0e10cSrcweir                 nScreen = i;
2724cdf0e10cSrcweir                 aParentData.aWindow = None;
2725cdf0e10cSrcweir                 m_bXEmbed = false;
2726cdf0e10cSrcweir                 break;
2727cdf0e10cSrcweir             }
2728cdf0e10cSrcweir         }
2729cdf0e10cSrcweir     }
2730cdf0e10cSrcweir 
2731cdf0e10cSrcweir     // first deinit frame
2732cdf0e10cSrcweir     updateGraphics(true);
2733cdf0e10cSrcweir     if( mpInputContext )
2734cdf0e10cSrcweir     {
2735cdf0e10cSrcweir         mpInputContext->UnsetICFocus( this );
2736cdf0e10cSrcweir         mpInputContext->Unmap( this );
2737cdf0e10cSrcweir     }
2738cdf0e10cSrcweir     if( GetWindow() == hPresentationWindow )
2739cdf0e10cSrcweir     {
2740cdf0e10cSrcweir         hPresentationWindow = None;
2741cdf0e10cSrcweir         doReparentPresentationDialogues( GetDisplay() );
2742cdf0e10cSrcweir     }
2743cdf0e10cSrcweir     XDestroyWindow( GetXDisplay(), mhWindow );
2744cdf0e10cSrcweir     mhWindow = None;
2745cdf0e10cSrcweir 
2746cdf0e10cSrcweir     passOnSaveYourSelf();
2747cdf0e10cSrcweir 
2748cdf0e10cSrcweir     // now init with new parent again
2749cdf0e10cSrcweir     if ( aParentData.aWindow != None )
2750cdf0e10cSrcweir 	    Init( nStyle_ | SAL_FRAME_STYLE_PLUG, nScreen, &aParentData );
2751cdf0e10cSrcweir     else
2752cdf0e10cSrcweir 	    Init( nStyle_ & ~SAL_FRAME_STYLE_PLUG, nScreen, NULL, true );
2753cdf0e10cSrcweir 
2754cdf0e10cSrcweir 	// update graphics if necessary
2755cdf0e10cSrcweir     updateGraphics(false);
2756cdf0e10cSrcweir 
2757cdf0e10cSrcweir     if( m_aTitle.Len() )
2758cdf0e10cSrcweir         SetTitle( m_aTitle );
2759cdf0e10cSrcweir 
2760cdf0e10cSrcweir     if( mpParent )
2761cdf0e10cSrcweir     {
2762cdf0e10cSrcweir         if( mpParent->m_nScreen != m_nScreen )
2763cdf0e10cSrcweir             SetParent( NULL );
2764cdf0e10cSrcweir         else
2765cdf0e10cSrcweir             pDisplay_->getWMAdaptor()->changeReferenceFrame( this, mpParent );
2766cdf0e10cSrcweir     }
2767cdf0e10cSrcweir 
2768cdf0e10cSrcweir     if( bWasVisible )
2769cdf0e10cSrcweir         Show( sal_True );
2770cdf0e10cSrcweir 
2771cdf0e10cSrcweir     std::list< X11SalFrame* > aChildren = maChildren;
2772cdf0e10cSrcweir     for( std::list< X11SalFrame* >::iterator it = aChildren.begin(); it != aChildren.end(); ++it )
2773cdf0e10cSrcweir         (*it)->createNewWindow( None, m_nScreen );
2774cdf0e10cSrcweir 
2775cdf0e10cSrcweir     // FIXME: SalObjects
2776cdf0e10cSrcweir }
2777cdf0e10cSrcweir 
SetPluginParent(SystemParentData * pNewParent)2778cdf0e10cSrcweir bool X11SalFrame::SetPluginParent( SystemParentData* pNewParent )
2779cdf0e10cSrcweir {
2780cdf0e10cSrcweir     if( pNewParent->nSize >= sizeof(SystemParentData) )
2781cdf0e10cSrcweir         m_bXEmbed = pNewParent->aWindow != None && pNewParent->bXEmbedSupport;
2782cdf0e10cSrcweir     createNewWindow( pNewParent ? pNewParent->aWindow : None );
2783cdf0e10cSrcweir 
2784cdf0e10cSrcweir     return true;
2785cdf0e10cSrcweir }
2786cdf0e10cSrcweir 
2787cdf0e10cSrcweir // Sound
2788cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Beep(SoundType eSoundType)2789cdf0e10cSrcweir void X11SalFrame::Beep( SoundType eSoundType ) // not fully suported
2790cdf0e10cSrcweir {
2791cdf0e10cSrcweir     switch( eSoundType )
2792cdf0e10cSrcweir     {
2793cdf0e10cSrcweir         case SOUND_DEFAULT:
2794cdf0e10cSrcweir         case SOUND_ERROR:
2795cdf0e10cSrcweir             GetDisplay()->Beep();
2796cdf0e10cSrcweir             break;
2797cdf0e10cSrcweir         default:
2798cdf0e10cSrcweir             // Excessive beeping averted
2799cdf0e10cSrcweir             break;
2800cdf0e10cSrcweir     }
2801cdf0e10cSrcweir }
2802cdf0e10cSrcweir 
2803cdf0e10cSrcweir // Event Handling
2804cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
sal_GetCode(int state)2805cdf0e10cSrcweir static sal_uInt16 sal_GetCode( int state )
2806cdf0e10cSrcweir {
2807cdf0e10cSrcweir 	sal_uInt16 nCode = 0;
2808cdf0e10cSrcweir 
2809cdf0e10cSrcweir 	if( state & Button1Mask )
2810cdf0e10cSrcweir 		nCode |= MOUSE_LEFT;
2811cdf0e10cSrcweir 	if( state & Button2Mask )
2812cdf0e10cSrcweir 		nCode |= MOUSE_MIDDLE;
2813cdf0e10cSrcweir 	if( state & Button3Mask )
2814cdf0e10cSrcweir 		nCode |= MOUSE_RIGHT;
2815cdf0e10cSrcweir 
2816cdf0e10cSrcweir 	if( state & ShiftMask )
2817cdf0e10cSrcweir 		nCode |= KEY_SHIFT;
2818cdf0e10cSrcweir 	if( state & ControlMask )
2819cdf0e10cSrcweir 		nCode |= KEY_MOD1;
2820cdf0e10cSrcweir 	if( state & Mod1Mask )
2821cdf0e10cSrcweir 		nCode |= KEY_MOD2;
2822cdf0e10cSrcweir 
2823cdf0e10cSrcweir         // Map Meta/Super modifier to MOD3 on all Unix systems
2824cdf0e10cSrcweir         // except Mac OS X
2825cdf0e10cSrcweir         if( (state & Mod3Mask) )
2826cdf0e10cSrcweir             nCode |= KEY_MOD3;
2827cdf0e10cSrcweir 
2828cdf0e10cSrcweir 	return nCode;
2829cdf0e10cSrcweir }
2830cdf0e10cSrcweir 
2831cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2832cdf0e10cSrcweir 
GetPointerState()2833cdf0e10cSrcweir SalFrame::SalPointerState X11SalFrame::GetPointerState()
2834cdf0e10cSrcweir {
2835cdf0e10cSrcweir     SalPointerState aState;
2836cdf0e10cSrcweir     XLIB_Window aRoot, aChild;
2837cdf0e10cSrcweir     int rx, ry, wx, wy;
2838cdf0e10cSrcweir     unsigned int nMask = 0;
2839cdf0e10cSrcweir     XQueryPointer( GetXDisplay(),
2840cdf0e10cSrcweir                    GetShellWindow(),
2841cdf0e10cSrcweir                    &aRoot,
2842cdf0e10cSrcweir                    &aChild,
2843cdf0e10cSrcweir                    &rx, &ry,
2844cdf0e10cSrcweir                    &wx, &wy,
2845cdf0e10cSrcweir                    &nMask
2846cdf0e10cSrcweir                    );
2847cdf0e10cSrcweir 
2848cdf0e10cSrcweir     aState.maPos = Point(wx, wy);
2849cdf0e10cSrcweir     aState.mnState = sal_GetCode( nMask );
2850cdf0e10cSrcweir     return aState;
2851cdf0e10cSrcweir }
2852cdf0e10cSrcweir 
HandleMouseEvent(XEvent * pEvent)2853cdf0e10cSrcweir long X11SalFrame::HandleMouseEvent( XEvent *pEvent )
2854cdf0e10cSrcweir {
2855cdf0e10cSrcweir 	SalMouseEvent		aMouseEvt;
2856cdf0e10cSrcweir 	sal_uInt16				nEvent = 0;
2857cdf0e10cSrcweir     bool				bClosePopups = false;
2858cdf0e10cSrcweir 
2859cdf0e10cSrcweir     if( nVisibleFloats && pEvent->type == EnterNotify )
2860cdf0e10cSrcweir         return 0;
2861cdf0e10cSrcweir 
2862cdf0e10cSrcweir 	// Solaris X86: clicking the right button on a two-button mouse
2863cdf0e10cSrcweir 	// generates a button2 event not a button3 event
2864cdf0e10cSrcweir 	if (pDisplay_->GetProperties() & PROPERTY_SUPPORT_3ButtonMouse )
2865cdf0e10cSrcweir 	{
2866cdf0e10cSrcweir 		switch (pEvent->type)
2867cdf0e10cSrcweir 		{
2868cdf0e10cSrcweir 			case EnterNotify:
2869cdf0e10cSrcweir 			case LeaveNotify:
2870cdf0e10cSrcweir 				if ( pEvent->xcrossing.state & Button2Mask )
2871cdf0e10cSrcweir 				{
2872cdf0e10cSrcweir 					pEvent->xcrossing.state &= ~Button2Mask;
2873cdf0e10cSrcweir 					pEvent->xcrossing.state |=	Button3Mask;
2874cdf0e10cSrcweir 				}
2875cdf0e10cSrcweir 				break;
2876cdf0e10cSrcweir 
2877cdf0e10cSrcweir 			case MotionNotify:
2878cdf0e10cSrcweir 				if ( pEvent->xmotion.state & Button2Mask )
2879cdf0e10cSrcweir 				{
2880cdf0e10cSrcweir 					pEvent->xmotion.state &= ~Button2Mask;
2881cdf0e10cSrcweir 					pEvent->xmotion.state |=  Button3Mask;
2882cdf0e10cSrcweir 				}
2883cdf0e10cSrcweir 				break;
2884cdf0e10cSrcweir 
2885cdf0e10cSrcweir 			default:
2886cdf0e10cSrcweir 				if ( Button2 == pEvent->xbutton.button )
2887cdf0e10cSrcweir 				{
2888cdf0e10cSrcweir 					pEvent->xbutton.state &= ~Button2Mask;
2889cdf0e10cSrcweir 					pEvent->xbutton.state |=  Button3Mask;
2890cdf0e10cSrcweir 					pEvent->xbutton.button =  Button3;
2891cdf0e10cSrcweir 				}
2892cdf0e10cSrcweir 				break;
2893cdf0e10cSrcweir 		}
2894cdf0e10cSrcweir 	}
2895cdf0e10cSrcweir 
2896cdf0e10cSrcweir 
2897cdf0e10cSrcweir 	if( LeaveNotify == pEvent->type || EnterNotify == pEvent->type )
2898cdf0e10cSrcweir 	{
2899cdf0e10cSrcweir         /*
2900cdf0e10cSrcweir          *  #89075# #89335#
2901cdf0e10cSrcweir          *
2902cdf0e10cSrcweir          *  some WMs (and/or) applications  have a passive grab on
2903cdf0e10cSrcweir          *  mouse buttons (XGrabButton). This leads to enter/leave notifies
2904cdf0e10cSrcweir          *  with mouse buttons pressed in the state mask before the actual
2905cdf0e10cSrcweir          *  ButtonPress event gets dispatched. But EnterNotify
2906cdf0e10cSrcweir          *  is reported in vcl as MouseMove event. Some office code
2907cdf0e10cSrcweir          *  decides that a pressed button in a MouseMove belongs to
2908cdf0e10cSrcweir          *  a drag operation which leads to doing things differently.
2909cdf0e10cSrcweir          *
2910cdf0e10cSrcweir          *  #95901#
2911cdf0e10cSrcweir          *  ignore Enter/LeaveNotify resulting from grabs so that
2912cdf0e10cSrcweir          *  help windows do not disappear just after appearing
2913cdf0e10cSrcweir          *
2914cdf0e10cSrcweir          *  hopefully this workaround will not break anything.
2915cdf0e10cSrcweir          */
2916cdf0e10cSrcweir         if( pEvent->xcrossing.mode == NotifyGrab || pEvent->xcrossing.mode == NotifyUngrab  )
2917cdf0e10cSrcweir             return 0;
2918cdf0e10cSrcweir 
2919cdf0e10cSrcweir 		aMouseEvt.mnX		= pEvent->xcrossing.x;
2920cdf0e10cSrcweir 		aMouseEvt.mnY		= pEvent->xcrossing.y;
2921cdf0e10cSrcweir 		aMouseEvt.mnTime	= pEvent->xcrossing.time;
2922cdf0e10cSrcweir         aMouseEvt.mnCode	= sal_GetCode( pEvent->xcrossing.state );
2923cdf0e10cSrcweir 		aMouseEvt.mnButton	= 0;
2924cdf0e10cSrcweir 
2925cdf0e10cSrcweir 		nEvent				= LeaveNotify == pEvent->type
2926cdf0e10cSrcweir 							  ? SALEVENT_MOUSELEAVE
2927cdf0e10cSrcweir 							  : SALEVENT_MOUSEMOVE;
2928cdf0e10cSrcweir 	}
2929cdf0e10cSrcweir 	else if( pEvent->type == MotionNotify )
2930cdf0e10cSrcweir 	{
2931cdf0e10cSrcweir 		aMouseEvt.mnX		= pEvent->xmotion.x;
2932cdf0e10cSrcweir 		aMouseEvt.mnY		= pEvent->xmotion.y;
2933cdf0e10cSrcweir 		aMouseEvt.mnTime	= pEvent->xmotion.time;
2934cdf0e10cSrcweir 		aMouseEvt.mnCode	= sal_GetCode( pEvent->xmotion.state );
2935cdf0e10cSrcweir 
2936cdf0e10cSrcweir 		aMouseEvt.mnButton	= 0;
2937cdf0e10cSrcweir 
2938cdf0e10cSrcweir 		nEvent				= SALEVENT_MOUSEMOVE;
2939cdf0e10cSrcweir         if( nVisibleFloats > 0 && mpParent )
2940cdf0e10cSrcweir         {
2941cdf0e10cSrcweir             XLIB_Cursor aCursor = mpParent->GetCursor();
2942cdf0e10cSrcweir             if( pEvent->xmotion.x >= 0 && pEvent->xmotion.x < (int)maGeometry.nWidth &&
2943cdf0e10cSrcweir                 pEvent->xmotion.y >= 0 && pEvent->xmotion.y < (int)maGeometry.nHeight )
2944cdf0e10cSrcweir                 aCursor = None;
2945cdf0e10cSrcweir 
2946cdf0e10cSrcweir             XChangeActivePointerGrab( GetXDisplay(),
2947cdf0e10cSrcweir                                       PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
2948cdf0e10cSrcweir                                       aCursor,
2949cdf0e10cSrcweir                                       CurrentTime );
2950cdf0e10cSrcweir         }
2951cdf0e10cSrcweir 	}
2952cdf0e10cSrcweir 	else
2953cdf0e10cSrcweir 	{
2954cdf0e10cSrcweir         // let mouse events reach the correct window
2955cdf0e10cSrcweir         if( nVisibleFloats < 1 )
2956cdf0e10cSrcweir         {
2957cdf0e10cSrcweir             if( ! (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION) )
2958cdf0e10cSrcweir                 XUngrabPointer( GetXDisplay(), CurrentTime );
2959cdf0e10cSrcweir         }
2960cdf0e10cSrcweir         else if( pEvent->type == ButtonPress )
2961cdf0e10cSrcweir         {
2962cdf0e10cSrcweir             // see if the user clicks outside all of the floats
2963cdf0e10cSrcweir             // if yes release the grab
2964cdf0e10cSrcweir             bool bInside = false;
2965cdf0e10cSrcweir             const std::list< SalFrame* >& rFrames = GetDisplay()->getFrames();
2966cdf0e10cSrcweir             for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
2967cdf0e10cSrcweir             {
2968cdf0e10cSrcweir                 const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it);
2969cdf0e10cSrcweir                 if( pFrame->IsFloatGrabWindow()										&&
2970cdf0e10cSrcweir                     pFrame->bMapped_												&&
2971cdf0e10cSrcweir                     pEvent->xbutton.x_root >= pFrame->maGeometry.nX								&&
2972cdf0e10cSrcweir                     pEvent->xbutton.x_root < pFrame->maGeometry.nX + (int)pFrame->maGeometry.nWidth	&&
2973cdf0e10cSrcweir                     pEvent->xbutton.y_root >= pFrame->maGeometry.nY								&&
2974cdf0e10cSrcweir                     pEvent->xbutton.y_root < pFrame->maGeometry.nY + (int)pFrame->maGeometry.nHeight )
2975cdf0e10cSrcweir                 {
2976cdf0e10cSrcweir                     bInside = true;
2977cdf0e10cSrcweir                     break;
2978cdf0e10cSrcweir                 }
2979cdf0e10cSrcweir             }
2980cdf0e10cSrcweir             if( ! bInside )
2981cdf0e10cSrcweir             {
2982cdf0e10cSrcweir                 // need not take care of the XUngrabPointer in Show( sal_False )
2983cdf0e10cSrcweir                 // because XUngrabPointer does not produce errors if pointer
2984cdf0e10cSrcweir                 // is not grabbed
2985cdf0e10cSrcweir                 XUngrabPointer( GetXDisplay(), CurrentTime );
2986cdf0e10cSrcweir                 bClosePopups = true;
2987cdf0e10cSrcweir 
2988cdf0e10cSrcweir                 /*  #i15246# only close popups if pointer is outside all our frames
2989cdf0e10cSrcweir                  *  cannot use our own geometry data here because stacking
2990cdf0e10cSrcweir                  *  is unknown (the above case implicitly assumes
2991cdf0e10cSrcweir                  *  that floats are on top which should be true)
2992cdf0e10cSrcweir                  */
2993cdf0e10cSrcweir                 XLIB_Window aRoot, aChild;
2994cdf0e10cSrcweir                 int root_x, root_y, win_x, win_y;
2995cdf0e10cSrcweir                 unsigned int mask_return;
2996cdf0e10cSrcweir                 if( XQueryPointer( GetXDisplay(),
2997cdf0e10cSrcweir                                    GetDisplay()->GetRootWindow( m_nScreen ),
2998cdf0e10cSrcweir                                    &aRoot, &aChild,
2999cdf0e10cSrcweir                                    &root_x, &root_y,
3000cdf0e10cSrcweir                                    &win_x, &win_y,
3001cdf0e10cSrcweir                                    &mask_return )
3002cdf0e10cSrcweir                     && aChild // pointer may not be in any child
3003cdf0e10cSrcweir                     )
3004cdf0e10cSrcweir                 {
3005cdf0e10cSrcweir                     for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
3006cdf0e10cSrcweir                     {
3007cdf0e10cSrcweir                         const X11SalFrame* pFrame = static_cast< const X11SalFrame* >(*it);
3008cdf0e10cSrcweir                         if( ! pFrame->IsFloatGrabWindow()
3009cdf0e10cSrcweir                             && ( pFrame->GetWindow() == aChild ||
3010cdf0e10cSrcweir                                  pFrame->GetShellWindow() == aChild ||
3011cdf0e10cSrcweir                                  pFrame->GetStackingWindow() == aChild )
3012cdf0e10cSrcweir                             )
3013cdf0e10cSrcweir                         {
3014cdf0e10cSrcweir                             // #i63638# check that pointer is inside window, not
3015cdf0e10cSrcweir                             // only inside stacking window
3016cdf0e10cSrcweir                             if( root_x >= pFrame->maGeometry.nX && root_x < sal::static_int_cast< int >(pFrame->maGeometry.nX+pFrame->maGeometry.nWidth) &&
3017cdf0e10cSrcweir                                 root_y >= pFrame->maGeometry.nY && root_y < sal::static_int_cast< int >(pFrame->maGeometry.nX+pFrame->maGeometry.nHeight) )
3018cdf0e10cSrcweir                             {
3019cdf0e10cSrcweir                                 bClosePopups = false;
3020cdf0e10cSrcweir                             }
3021cdf0e10cSrcweir                             break;
3022cdf0e10cSrcweir                         }
3023cdf0e10cSrcweir                     }
3024cdf0e10cSrcweir                 }
3025cdf0e10cSrcweir             }
3026cdf0e10cSrcweir         }
3027cdf0e10cSrcweir 
3028cdf0e10cSrcweir         if( m_bXEmbed && pEvent->xbutton.button == Button1 )
3029cdf0e10cSrcweir             askForXEmbedFocus( pEvent->xbutton.time );
3030cdf0e10cSrcweir 
3031cdf0e10cSrcweir 		if( pEvent->xbutton.button == Button1 ||
3032cdf0e10cSrcweir 			pEvent->xbutton.button == Button2 ||
3033cdf0e10cSrcweir 			pEvent->xbutton.button == Button3 )
3034cdf0e10cSrcweir 		{
3035cdf0e10cSrcweir 			aMouseEvt.mnX		= pEvent->xbutton.x;
3036cdf0e10cSrcweir 			aMouseEvt.mnY		= pEvent->xbutton.y;
3037cdf0e10cSrcweir 			aMouseEvt.mnTime	= pEvent->xbutton.time;
3038cdf0e10cSrcweir 			aMouseEvt.mnCode	= sal_GetCode( pEvent->xbutton.state );
3039cdf0e10cSrcweir 
3040cdf0e10cSrcweir 			if( Button1 == pEvent->xbutton.button )
3041cdf0e10cSrcweir 				aMouseEvt.mnButton	= MOUSE_LEFT;
3042cdf0e10cSrcweir 			else if( Button2 == pEvent->xbutton.button )
3043cdf0e10cSrcweir 				aMouseEvt.mnButton	= MOUSE_MIDDLE;
3044cdf0e10cSrcweir 			else if( Button3 == pEvent->xbutton.button )
3045cdf0e10cSrcweir 				aMouseEvt.mnButton	= MOUSE_RIGHT;
3046cdf0e10cSrcweir 
3047cdf0e10cSrcweir 			nEvent				= ButtonPress == pEvent->type
3048cdf0e10cSrcweir 				? SALEVENT_MOUSEBUTTONDOWN
3049cdf0e10cSrcweir 				: SALEVENT_MOUSEBUTTONUP;
3050cdf0e10cSrcweir 		}
3051cdf0e10cSrcweir 		else if( pEvent->xbutton.button == Button4 ||
3052cdf0e10cSrcweir                  pEvent->xbutton.button == Button5 ||
3053cdf0e10cSrcweir                  pEvent->xbutton.button == Button6 ||
3054cdf0e10cSrcweir                  pEvent->xbutton.button == Button7 )
3055cdf0e10cSrcweir 		{
3056cdf0e10cSrcweir             const bool bIncrement(
3057cdf0e10cSrcweir                 pEvent->xbutton.button == Button4 ||
3058cdf0e10cSrcweir                 pEvent->xbutton.button == Button6 );
3059cdf0e10cSrcweir             const bool bHoriz(
3060cdf0e10cSrcweir                 pEvent->xbutton.button == Button6 ||
3061cdf0e10cSrcweir                 pEvent->xbutton.button == Button7 );
3062cdf0e10cSrcweir 
3063cdf0e10cSrcweir             if( pEvent->type == ButtonRelease )
3064cdf0e10cSrcweir                 return 0;
3065cdf0e10cSrcweir 
3066cdf0e10cSrcweir             static sal_uLong		nLines = 0;
3067cdf0e10cSrcweir 			if( ! nLines )
3068cdf0e10cSrcweir 			{
3069cdf0e10cSrcweir 				char* pEnv = getenv( "SAL_WHEELLINES" );
3070cdf0e10cSrcweir 				nLines = pEnv ? atoi( pEnv ) : 3;
3071cdf0e10cSrcweir 				if( nLines > 10 )
3072cdf0e10cSrcweir 					nLines = SAL_WHEELMOUSE_EVENT_PAGESCROLL;
3073cdf0e10cSrcweir 			}
3074cdf0e10cSrcweir 
3075cdf0e10cSrcweir 			SalWheelMouseEvent	aWheelEvt;
3076cdf0e10cSrcweir 			aWheelEvt.mnTime		= pEvent->xbutton.time;
3077cdf0e10cSrcweir 			aWheelEvt.mnX			= pEvent->xbutton.x;
3078cdf0e10cSrcweir 			aWheelEvt.mnY			= pEvent->xbutton.y;
3079cdf0e10cSrcweir 			aWheelEvt.mnDelta		= bIncrement ? 120 : -120;
3080cdf0e10cSrcweir 			aWheelEvt.mnNotchDelta	= bIncrement ? 1 : -1;
3081cdf0e10cSrcweir 			aWheelEvt.mnScrollLines = nLines;
3082cdf0e10cSrcweir 			aWheelEvt.mnCode		= sal_GetCode( pEvent->xbutton.state );
3083cdf0e10cSrcweir 			aWheelEvt.mbHorz		= bHoriz;
3084cdf0e10cSrcweir 
3085cdf0e10cSrcweir 			nEvent = SALEVENT_WHEELMOUSE;
3086cdf0e10cSrcweir 
3087cdf0e10cSrcweir             // --- RTL --- (mirror mouse pos)
3088cdf0e10cSrcweir             if( Application::GetSettings().GetLayoutRTL() )
3089cdf0e10cSrcweir                 aWheelEvt.mnX = nWidth_-1-aWheelEvt.mnX;
3090cdf0e10cSrcweir 			return CallCallback( nEvent, &aWheelEvt );
3091cdf0e10cSrcweir 		}
3092cdf0e10cSrcweir 	}
3093cdf0e10cSrcweir 
3094cdf0e10cSrcweir     int nRet = 0;
3095cdf0e10cSrcweir 	if( nEvent == SALEVENT_MOUSELEAVE
3096cdf0e10cSrcweir 		|| ( aMouseEvt.mnX <  nWidth_  && aMouseEvt.mnX >  -1 &&
3097cdf0e10cSrcweir 			 aMouseEvt.mnY <  nHeight_ && aMouseEvt.mnY >  -1 )
3098cdf0e10cSrcweir 		|| pDisplay_->MouseCaptured( this )
3099cdf0e10cSrcweir         )
3100cdf0e10cSrcweir     {
3101cdf0e10cSrcweir         // --- RTL --- (mirror mouse pos)
3102cdf0e10cSrcweir         if( Application::GetSettings().GetLayoutRTL() )
3103cdf0e10cSrcweir             aMouseEvt.mnX = nWidth_-1-aMouseEvt.mnX;
3104cdf0e10cSrcweir 		nRet = CallCallback( nEvent, &aMouseEvt );
3105cdf0e10cSrcweir     }
3106cdf0e10cSrcweir 
3107cdf0e10cSrcweir     if( bClosePopups )
3108cdf0e10cSrcweir     {
3109cdf0e10cSrcweir         /*  #108213# close popups after dispatching the event outside the popup;
3110cdf0e10cSrcweir          *  applications do weird things.
3111cdf0e10cSrcweir          */
3112cdf0e10cSrcweir         ImplSVData* pSVData = ImplGetSVData();
3113cdf0e10cSrcweir         if ( pSVData->maWinData.mpFirstFloat )
3114cdf0e10cSrcweir         {
3115cdf0e10cSrcweir             static const char* pEnv = getenv( "SAL_FLOATWIN_NOAPPFOCUSCLOSE" );
3116cdf0e10cSrcweir             if ( !(pSVData->maWinData.mpFirstFloat->GetPopupModeFlags() & FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE) && !(pEnv && *pEnv) )
3117cdf0e10cSrcweir                 pSVData->maWinData.mpFirstFloat->EndPopupMode( FLOATWIN_POPUPMODEEND_CANCEL | FLOATWIN_POPUPMODEEND_CLOSEALL );
3118cdf0e10cSrcweir         }
3119cdf0e10cSrcweir     }
3120cdf0e10cSrcweir 
3121cdf0e10cSrcweir 	return nRet;
3122cdf0e10cSrcweir }
3123cdf0e10cSrcweir 
3124cdf0e10cSrcweir // F10 means either KEY_F10 or KEY_MENU, which has to be decided
3125cdf0e10cSrcweir // in the independent part.
3126cdf0e10cSrcweir struct KeyAlternate
3127cdf0e10cSrcweir {
3128cdf0e10cSrcweir 	sal_uInt16			nKeyCode;
3129cdf0e10cSrcweir 	sal_Unicode		nCharCode;
KeyAlternateKeyAlternate3130cdf0e10cSrcweir 	KeyAlternate() : nKeyCode( 0 ), nCharCode( 0 ) {}
KeyAlternateKeyAlternate3131cdf0e10cSrcweir 	KeyAlternate( sal_uInt16 nKey, sal_Unicode nChar = 0 ) : nKeyCode( nKey ), nCharCode( nChar ) {}
3132cdf0e10cSrcweir };
3133cdf0e10cSrcweir 
3134cdf0e10cSrcweir inline KeyAlternate
GetAlternateKeyCode(const sal_uInt16 nKeyCode)3135cdf0e10cSrcweir GetAlternateKeyCode( const sal_uInt16 nKeyCode )
3136cdf0e10cSrcweir {
3137cdf0e10cSrcweir 	KeyAlternate aAlternate;
3138cdf0e10cSrcweir 
3139cdf0e10cSrcweir 	switch( nKeyCode )
3140cdf0e10cSrcweir 	{
3141cdf0e10cSrcweir 		case KEY_F10: aAlternate = KeyAlternate( KEY_MENU );break;
3142cdf0e10cSrcweir 		case KEY_F24: aAlternate = KeyAlternate( KEY_SUBTRACT, '-' );break;
3143cdf0e10cSrcweir 	}
3144cdf0e10cSrcweir 
3145cdf0e10cSrcweir 	return aAlternate;
3146cdf0e10cSrcweir }
3147cdf0e10cSrcweir 
beginUnicodeSequence()3148cdf0e10cSrcweir void X11SalFrame::beginUnicodeSequence()
3149cdf0e10cSrcweir {
3150cdf0e10cSrcweir     rtl::OUString& rSeq( GetX11SalData()->GetUnicodeAccumulator() );
3151cdf0e10cSrcweir     DeletionListener aDeleteWatch( this );
3152cdf0e10cSrcweir 
3153cdf0e10cSrcweir     if( rSeq.getLength() )
3154cdf0e10cSrcweir         endUnicodeSequence();
3155cdf0e10cSrcweir 
3156cdf0e10cSrcweir     rSeq = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "u" ) );
3157cdf0e10cSrcweir 
3158cdf0e10cSrcweir     if( ! aDeleteWatch.isDeleted() )
3159cdf0e10cSrcweir     {
3160cdf0e10cSrcweir         sal_uInt16 nTextAttr = SAL_EXTTEXTINPUT_ATTR_UNDERLINE;
3161cdf0e10cSrcweir         SalExtTextInputEvent aEv;
3162cdf0e10cSrcweir         aEv.mnTime          = 0;
3163cdf0e10cSrcweir         aEv.maText          = rSeq;
3164cdf0e10cSrcweir         aEv.mpTextAttr      = &nTextAttr;
3165cdf0e10cSrcweir         aEv.mnCursorPos     = 0;
3166cdf0e10cSrcweir         aEv.mnDeltaStart    = 0;
3167cdf0e10cSrcweir         aEv.mnCursorFlags   = 0;
3168cdf0e10cSrcweir         aEv.mbOnlyCursor    = sal_False;
3169cdf0e10cSrcweir 
3170cdf0e10cSrcweir         CallCallback(SALEVENT_EXTTEXTINPUT, (void*)&aEv);
3171cdf0e10cSrcweir     }
3172cdf0e10cSrcweir }
3173cdf0e10cSrcweir 
appendUnicodeSequence(sal_Unicode c)3174cdf0e10cSrcweir bool X11SalFrame::appendUnicodeSequence( sal_Unicode c )
3175cdf0e10cSrcweir {
3176cdf0e10cSrcweir     bool bRet = false;
3177cdf0e10cSrcweir     rtl::OUString& rSeq( GetX11SalData()->GetUnicodeAccumulator() );
3178cdf0e10cSrcweir     if( rSeq.getLength() > 0 )
3179cdf0e10cSrcweir     {
3180cdf0e10cSrcweir         // range check
3181cdf0e10cSrcweir         if( (c >= sal_Unicode('0') && c <= sal_Unicode('9')) ||
3182cdf0e10cSrcweir             (c >= sal_Unicode('a') && c <= sal_Unicode('f')) ||
3183cdf0e10cSrcweir             (c >= sal_Unicode('A') && c <= sal_Unicode('F')) )
3184cdf0e10cSrcweir         {
3185cdf0e10cSrcweir             rtl::OUStringBuffer aBuf( rSeq.getLength() + 1 );
3186cdf0e10cSrcweir             aBuf.append( rSeq );
3187cdf0e10cSrcweir             aBuf.append( c );
3188cdf0e10cSrcweir             rSeq = aBuf.makeStringAndClear();
3189cdf0e10cSrcweir             std::vector<sal_uInt16> attribs( rSeq.getLength(), SAL_EXTTEXTINPUT_ATTR_UNDERLINE );
3190cdf0e10cSrcweir 
3191cdf0e10cSrcweir             SalExtTextInputEvent aEv;
3192cdf0e10cSrcweir             aEv.mnTime          = 0;
3193cdf0e10cSrcweir             aEv.maText          = rSeq;
3194cdf0e10cSrcweir             aEv.mpTextAttr      = &attribs[0];
3195cdf0e10cSrcweir             aEv.mnCursorPos     = 0;
3196cdf0e10cSrcweir             aEv.mnDeltaStart    = 0;
3197cdf0e10cSrcweir             aEv.mnCursorFlags   = 0;
3198cdf0e10cSrcweir             aEv.mbOnlyCursor    = sal_False;
3199cdf0e10cSrcweir 
3200cdf0e10cSrcweir             CallCallback(SALEVENT_EXTTEXTINPUT, (void*)&aEv);
3201cdf0e10cSrcweir             bRet = true;
3202cdf0e10cSrcweir         }
3203cdf0e10cSrcweir         else
3204cdf0e10cSrcweir             bRet = endUnicodeSequence();
3205cdf0e10cSrcweir     }
3206cdf0e10cSrcweir     else
3207cdf0e10cSrcweir         endUnicodeSequence();
3208cdf0e10cSrcweir     return bRet;
3209cdf0e10cSrcweir }
3210cdf0e10cSrcweir 
endUnicodeSequence()3211cdf0e10cSrcweir bool X11SalFrame::endUnicodeSequence()
3212cdf0e10cSrcweir {
3213cdf0e10cSrcweir     rtl::OUString& rSeq( GetX11SalData()->GetUnicodeAccumulator() );
3214cdf0e10cSrcweir 
3215cdf0e10cSrcweir     DeletionListener aDeleteWatch( this );
3216cdf0e10cSrcweir     if( rSeq.getLength() > 1 && rSeq.getLength() < 6 )
3217cdf0e10cSrcweir     {
3218cdf0e10cSrcweir         // cut the "u"
3219cdf0e10cSrcweir         rtl::OUString aNumbers( rSeq.copy( 1 ) );
3220cdf0e10cSrcweir         sal_Int32 nValue = aNumbers.toInt32( 16 );
3221cdf0e10cSrcweir         if( nValue >= 32 )
3222cdf0e10cSrcweir         {
3223cdf0e10cSrcweir             sal_uInt16 nTextAttr = SAL_EXTTEXTINPUT_ATTR_UNDERLINE;
3224cdf0e10cSrcweir             SalExtTextInputEvent aEv;
3225cdf0e10cSrcweir             aEv.mnTime          = 0;
3226cdf0e10cSrcweir             aEv.maText          = rtl::OUString( sal_Unicode(nValue) );
3227cdf0e10cSrcweir             aEv.mpTextAttr      = &nTextAttr;
3228cdf0e10cSrcweir             aEv.mnCursorPos     = 0;
3229cdf0e10cSrcweir             aEv.mnDeltaStart    = 0;
3230cdf0e10cSrcweir             aEv.mnCursorFlags   = 0;
3231cdf0e10cSrcweir             aEv.mbOnlyCursor    = sal_False;
3232cdf0e10cSrcweir             CallCallback(SALEVENT_EXTTEXTINPUT, (void*)&aEv);
3233cdf0e10cSrcweir         }
3234cdf0e10cSrcweir     }
3235cdf0e10cSrcweir     bool bWasInput = rSeq.getLength() > 0;
3236cdf0e10cSrcweir     rSeq = rtl::OUString();
3237cdf0e10cSrcweir     if( bWasInput && ! aDeleteWatch.isDeleted() )
3238cdf0e10cSrcweir         CallCallback(SALEVENT_ENDEXTTEXTINPUT, NULL);
3239cdf0e10cSrcweir     return bWasInput;
3240cdf0e10cSrcweir }
3241cdf0e10cSrcweir 
3242cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleKeyEvent(XKeyEvent * pEvent)3243cdf0e10cSrcweir long X11SalFrame::HandleKeyEvent( XKeyEvent *pEvent )
3244cdf0e10cSrcweir {
3245cdf0e10cSrcweir 	KeySym			nKeySym;
3246cdf0e10cSrcweir     KeySym          nUnmodifiedKeySym;
3247cdf0e10cSrcweir 	int 			nLen = 2048;
3248cdf0e10cSrcweir 	unsigned char	*pPrintable = (unsigned char*)alloca( nLen );
3249cdf0e10cSrcweir 
3250cdf0e10cSrcweir 	// singlebyte code composed by input method, the new default
3251cdf0e10cSrcweir 	if (mpInputContext != NULL && mpInputContext->UseContext())
3252cdf0e10cSrcweir 	{
3253cdf0e10cSrcweir 		// returns a keysym as well as the pPrintable (in system encoding)
3254cdf0e10cSrcweir 		// printable may be empty.
3255cdf0e10cSrcweir 		Status nStatus;
3256cdf0e10cSrcweir     	nKeySym = pDisplay_->GetKeySym( pEvent, pPrintable, &nLen,
3257cdf0e10cSrcweir                                         &nUnmodifiedKeySym,
3258cdf0e10cSrcweir                                         &nStatus, mpInputContext->GetContext() );
3259cdf0e10cSrcweir 		if ( nStatus == XBufferOverflow )
3260cdf0e10cSrcweir 		{
3261cdf0e10cSrcweir 			nLen *= 2;
3262cdf0e10cSrcweir 			pPrintable = (unsigned char*)alloca( nLen );
3263cdf0e10cSrcweir 			nKeySym = pDisplay_->GetKeySym( pEvent, pPrintable, &nLen,
3264cdf0e10cSrcweir                                             &nUnmodifiedKeySym,
3265cdf0e10cSrcweir                                             &nStatus, mpInputContext->GetContext() );
3266cdf0e10cSrcweir 		}
3267cdf0e10cSrcweir 	}
3268cdf0e10cSrcweir 	else
3269cdf0e10cSrcweir 	{
3270cdf0e10cSrcweir 		// fallback, this should never ever be called
3271cdf0e10cSrcweir 		Status nStatus = 0;
3272cdf0e10cSrcweir        	nKeySym = pDisplay_->GetKeySym( pEvent, pPrintable, &nLen, &nUnmodifiedKeySym, &nStatus );
3273cdf0e10cSrcweir  	}
3274cdf0e10cSrcweir 
3275cdf0e10cSrcweir 	SalKeyEvent aKeyEvt;
3276cdf0e10cSrcweir 	sal_uInt16      nKeyCode;
3277cdf0e10cSrcweir 	sal_uInt16 nModCode = 0;
3278cdf0e10cSrcweir 	char		aDummy;
3279cdf0e10cSrcweir 
3280cdf0e10cSrcweir 	if( pEvent->state & ShiftMask )
3281cdf0e10cSrcweir 		nModCode |= KEY_SHIFT;
3282cdf0e10cSrcweir 	if( pEvent->state & ControlMask )
3283cdf0e10cSrcweir 		nModCode |= KEY_MOD1;
3284cdf0e10cSrcweir 	if( pEvent->state & Mod1Mask )
3285cdf0e10cSrcweir 		nModCode |= KEY_MOD2;
3286cdf0e10cSrcweir 
3287cdf0e10cSrcweir     if( nModCode != (KEY_SHIFT|KEY_MOD1) )
3288cdf0e10cSrcweir         endUnicodeSequence();
3289cdf0e10cSrcweir 
3290cdf0e10cSrcweir 	if( 	nKeySym == XK_Shift_L 	|| nKeySym == XK_Shift_R
3291cdf0e10cSrcweir 		|| 	nKeySym == XK_Control_L || nKeySym == XK_Control_R
3292cdf0e10cSrcweir 		|| 	nKeySym == XK_Alt_L		|| nKeySym == XK_Alt_R
3293cdf0e10cSrcweir 		|| 	nKeySym == XK_Meta_L 	|| nKeySym == XK_Meta_R
3294cdf0e10cSrcweir                 ||      nKeySym == XK_Super_L   || nKeySym == XK_Super_R )
3295cdf0e10cSrcweir 	{
3296cdf0e10cSrcweir 		SalKeyModEvent aModEvt;
3297cdf0e10cSrcweir         aModEvt.mnModKeyCode = 0;
3298cdf0e10cSrcweir         if( pEvent->type == XLIB_KeyPress && mnExtKeyMod == 0 )
3299cdf0e10cSrcweir             mbSendExtKeyModChange = true;
3300cdf0e10cSrcweir         else if( pEvent->type == KeyRelease && mbSendExtKeyModChange )
3301cdf0e10cSrcweir         {
3302cdf0e10cSrcweir             aModEvt.mnModKeyCode = mnExtKeyMod;
3303cdf0e10cSrcweir             mnExtKeyMod = 0;
3304cdf0e10cSrcweir         }
3305cdf0e10cSrcweir 
3306cdf0e10cSrcweir 		// pressing just the ctrl key leads to a keysym of XK_Control but
3307cdf0e10cSrcweir 		// the event state does not contain ControlMask. In the release
3308cdf0e10cSrcweir 		// event its the other way round: it does contain the Control mask.
3309cdf0e10cSrcweir 		// The modifier mode therefore has to be adapted manually.
3310cdf0e10cSrcweir         sal_uInt16 nExtModMask = 0;
3311cdf0e10cSrcweir         sal_uInt16 nModMask = 0;
3312cdf0e10cSrcweir         switch( nKeySym )
3313cdf0e10cSrcweir         {
3314cdf0e10cSrcweir             case XK_Control_L:
3315cdf0e10cSrcweir                 nExtModMask = MODKEY_LMOD1;
3316cdf0e10cSrcweir                 nModMask = KEY_MOD1;
3317cdf0e10cSrcweir                 break;
3318cdf0e10cSrcweir             case XK_Control_R:
3319cdf0e10cSrcweir                 nExtModMask = MODKEY_RMOD1;
3320cdf0e10cSrcweir                 nModMask = KEY_MOD1;
3321cdf0e10cSrcweir                 break;
3322cdf0e10cSrcweir             case XK_Alt_L:
3323cdf0e10cSrcweir                 nExtModMask = MODKEY_LMOD2;
3324cdf0e10cSrcweir                 nModMask = KEY_MOD2;
3325cdf0e10cSrcweir                 break;
3326cdf0e10cSrcweir             case XK_Alt_R:
3327cdf0e10cSrcweir                 nExtModMask = MODKEY_RMOD2;
3328cdf0e10cSrcweir                 nModMask = KEY_MOD2;
3329cdf0e10cSrcweir                 break;
3330cdf0e10cSrcweir             case XK_Shift_L:
3331cdf0e10cSrcweir                 nExtModMask = MODKEY_LSHIFT;
3332cdf0e10cSrcweir                 nModMask = KEY_SHIFT;
3333cdf0e10cSrcweir                 break;
3334cdf0e10cSrcweir             case XK_Shift_R:
3335cdf0e10cSrcweir                 nExtModMask = MODKEY_RSHIFT;
3336cdf0e10cSrcweir                 nModMask = KEY_SHIFT;
3337cdf0e10cSrcweir                 break;
3338cdf0e10cSrcweir             // Map Meta/Super keys to MOD3 modifier on all Unix systems
3339cdf0e10cSrcweir             // except Mac OS X
3340cdf0e10cSrcweir             case XK_Meta_L:
3341cdf0e10cSrcweir             case XK_Super_L:
3342cdf0e10cSrcweir                 nExtModMask = MODKEY_LMOD3;
3343cdf0e10cSrcweir                 nModMask = KEY_MOD3;
3344cdf0e10cSrcweir                 break;
3345cdf0e10cSrcweir             case XK_Meta_R:
3346cdf0e10cSrcweir             case XK_Super_R:
3347cdf0e10cSrcweir                 nExtModMask = MODKEY_RMOD3;
3348cdf0e10cSrcweir                 nModMask = KEY_MOD3;
3349cdf0e10cSrcweir                 break;
3350cdf0e10cSrcweir         }
3351cdf0e10cSrcweir         if( pEvent->type == KeyRelease )
3352cdf0e10cSrcweir         {
3353cdf0e10cSrcweir             nModCode &= ~nModMask;
3354cdf0e10cSrcweir             mnExtKeyMod &= ~nExtModMask;
3355cdf0e10cSrcweir         }
3356cdf0e10cSrcweir         else
3357cdf0e10cSrcweir         {
3358cdf0e10cSrcweir             nModCode |= nModMask;
3359cdf0e10cSrcweir             mnExtKeyMod |= nExtModMask;
3360cdf0e10cSrcweir         }
3361cdf0e10cSrcweir 
3362cdf0e10cSrcweir 		aModEvt.mnCode = nModCode;
3363cdf0e10cSrcweir 		aModEvt.mnTime = pEvent->time;
3364cdf0e10cSrcweir 
3365cdf0e10cSrcweir 		int nRet = CallCallback( SALEVENT_KEYMODCHANGE, &aModEvt );
3366cdf0e10cSrcweir 
3367cdf0e10cSrcweir         // emulate KEY_MENU
3368cdf0e10cSrcweir         if ( ( (nKeySym == XK_Alt_L) || (nKeySym == XK_Alt_R) ) &&
3369cdf0e10cSrcweir              ( (nModCode & ~(KEY_MOD3|KEY_MOD2)) == 0 ) )
3370cdf0e10cSrcweir         {
3371cdf0e10cSrcweir             if( pEvent->type == XLIB_KeyPress )
3372cdf0e10cSrcweir                 mbKeyMenu = true;
3373cdf0e10cSrcweir             else if( mbKeyMenu )
3374cdf0e10cSrcweir             {
3375cdf0e10cSrcweir                 // simulate KEY_MENU
3376cdf0e10cSrcweir                 aKeyEvt.mnCode	   = KEY_MENU | nModCode;
3377cdf0e10cSrcweir                 aKeyEvt.mnRepeat   = 0;
3378cdf0e10cSrcweir                 aKeyEvt.mnTime	   = pEvent->time;
3379cdf0e10cSrcweir                 aKeyEvt.mnCharCode = 0;
3380cdf0e10cSrcweir                 nRet = CallCallback( SALEVENT_KEYINPUT, &aKeyEvt );
3381cdf0e10cSrcweir                 nRet = CallCallback( SALEVENT_KEYUP, &aKeyEvt );
3382cdf0e10cSrcweir             }
3383cdf0e10cSrcweir         }
3384cdf0e10cSrcweir         else
3385cdf0e10cSrcweir             mbKeyMenu = false;
3386cdf0e10cSrcweir         return nRet;
3387cdf0e10cSrcweir 	}
3388cdf0e10cSrcweir 
3389cdf0e10cSrcweir     mbSendExtKeyModChange = mbKeyMenu = false;
3390cdf0e10cSrcweir 
3391cdf0e10cSrcweir 	// try to figure out the vcl code for the keysym
3392cdf0e10cSrcweir     // #i52338# use the unmodified KeySym if there is none for the real KeySym
3393cdf0e10cSrcweir     // because the independent part has only keycodes for unshifted keys
3394cdf0e10cSrcweir 	nKeyCode = pDisplay_->GetKeyCode( nKeySym, &aDummy );
3395cdf0e10cSrcweir     if( nKeyCode == 0 )
3396cdf0e10cSrcweir         nKeyCode = pDisplay_->GetKeyCode( nUnmodifiedKeySym, &aDummy );
3397cdf0e10cSrcweir 
3398cdf0e10cSrcweir 	// try to figure out a printable if XmbLookupString returns only a keysym
3399cdf0e10cSrcweir 	// and NOT a printable. Do not store it in pPrintable[0] since it is expected to
3400cdf0e10cSrcweir 	// be in system encoding, not unicode.
3401cdf0e10cSrcweir     // #i8988##, if KeySym and printable look equally promising then prefer KeySym
3402cdf0e10cSrcweir     // the printable is bound to the encoding so the KeySym might contain more
3403cdf0e10cSrcweir     // information (in et_EE locale: "Compose + Z + <" delivers "," in printable and
3404cdf0e10cSrcweir     // (the desired) Zcaron in KeySym
3405cdf0e10cSrcweir 	sal_Unicode nKeyString = 0x0;
3406cdf0e10cSrcweir 	if (   (nLen == 0)
3407cdf0e10cSrcweir         || ((nLen == 1) && (nKeySym > 0)) )
3408cdf0e10cSrcweir 		nKeyString = KeysymToUnicode (nKeySym);
3409cdf0e10cSrcweir 	// if we have nothing we give up
3410cdf0e10cSrcweir 	if( !nKeyCode && !nLen && !nKeyString)
3411cdf0e10cSrcweir 		return 0;
3412cdf0e10cSrcweir 
3413cdf0e10cSrcweir     DeletionListener aDeleteWatch( this );
3414cdf0e10cSrcweir 
3415cdf0e10cSrcweir     if( nModCode == (KEY_SHIFT | KEY_MOD1) && pEvent->type == XLIB_KeyPress )
3416cdf0e10cSrcweir     {
3417cdf0e10cSrcweir         sal_uInt16 nSeqKeyCode = pDisplay_->GetKeyCode( nUnmodifiedKeySym, &aDummy );
3418cdf0e10cSrcweir         if( nSeqKeyCode == KEY_U )
3419cdf0e10cSrcweir         {
3420cdf0e10cSrcweir             beginUnicodeSequence();
3421cdf0e10cSrcweir             return 1;
3422cdf0e10cSrcweir         }
3423cdf0e10cSrcweir         else if( nSeqKeyCode >= KEY_0 && nSeqKeyCode <= KEY_9 )
3424cdf0e10cSrcweir         {
3425cdf0e10cSrcweir             if( appendUnicodeSequence( sal_Unicode( '0' ) + sal_Unicode(nSeqKeyCode - KEY_0) ) )
3426cdf0e10cSrcweir                 return 1;
3427cdf0e10cSrcweir         }
3428cdf0e10cSrcweir         else if( nSeqKeyCode >= KEY_A && nSeqKeyCode <= KEY_F )
3429cdf0e10cSrcweir         {
3430cdf0e10cSrcweir             if( appendUnicodeSequence( sal_Unicode( 'a' ) + sal_Unicode(nSeqKeyCode - KEY_A) ) )
3431cdf0e10cSrcweir                 return 1;
3432cdf0e10cSrcweir         }
3433cdf0e10cSrcweir         else
3434cdf0e10cSrcweir             endUnicodeSequence();
3435cdf0e10cSrcweir     }
3436cdf0e10cSrcweir 
3437cdf0e10cSrcweir     if( aDeleteWatch.isDeleted() )
3438cdf0e10cSrcweir         return 0;
3439cdf0e10cSrcweir 
3440cdf0e10cSrcweir 	rtl_TextEncoding nEncoding;
3441cdf0e10cSrcweir 
3442cdf0e10cSrcweir     if (mpInputContext != NULL && mpInputContext->IsMultiLingual() )
3443cdf0e10cSrcweir         nEncoding = RTL_TEXTENCODING_UTF8;
3444cdf0e10cSrcweir     else
3445cdf0e10cSrcweir         nEncoding = osl_getThreadTextEncoding();
3446cdf0e10cSrcweir 
3447cdf0e10cSrcweir 	sal_Unicode *pBuffer;
3448cdf0e10cSrcweir 	sal_Unicode *pString;
3449cdf0e10cSrcweir 	sal_Size     nBufferSize = nLen * 2;
3450cdf0e10cSrcweir 	sal_Size     nSize;
3451cdf0e10cSrcweir 	pBuffer = (sal_Unicode*) malloc( nBufferSize + 2 );
3452cdf0e10cSrcweir 	pBuffer[ 0 ] = 0;
3453cdf0e10cSrcweir 
3454cdf0e10cSrcweir 	if (nKeyString != 0)
3455cdf0e10cSrcweir 	{
3456cdf0e10cSrcweir 		pString = &nKeyString;
3457cdf0e10cSrcweir 		nSize = 1;
3458cdf0e10cSrcweir 	}
3459cdf0e10cSrcweir 	else
3460cdf0e10cSrcweir 	if (nLen > 0 && nEncoding != RTL_TEXTENCODING_UNICODE)
3461cdf0e10cSrcweir 	{
3462cdf0e10cSrcweir 		// create text converter
3463cdf0e10cSrcweir 		rtl_TextToUnicodeConverter aConverter =
3464cdf0e10cSrcweir 				rtl_createTextToUnicodeConverter( nEncoding );
3465cdf0e10cSrcweir 		rtl_TextToUnicodeContext aContext =
3466cdf0e10cSrcweir 			 	rtl_createTextToUnicodeContext( aConverter );
3467cdf0e10cSrcweir 
3468cdf0e10cSrcweir 		sal_uInt32  nConversionInfo;
3469cdf0e10cSrcweir 		sal_Size    nConvertedChars;
3470cdf0e10cSrcweir 
3471cdf0e10cSrcweir 		// convert to single byte text stream
3472cdf0e10cSrcweir 		nSize = rtl_convertTextToUnicode(
3473cdf0e10cSrcweir 				                aConverter, aContext,
3474cdf0e10cSrcweir                                 (char*)pPrintable, nLen,
3475cdf0e10cSrcweir                                 pBuffer, nBufferSize,
3476cdf0e10cSrcweir                                 RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE |
3477cdf0e10cSrcweir                                 RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE,
3478cdf0e10cSrcweir                                 &nConversionInfo, &nConvertedChars );
3479cdf0e10cSrcweir 
3480cdf0e10cSrcweir 		// destroy converter
3481cdf0e10cSrcweir 		rtl_destroyTextToUnicodeContext( aConverter, aContext );
3482cdf0e10cSrcweir 		rtl_destroyTextToUnicodeConverter( aConverter );
3483cdf0e10cSrcweir 
3484cdf0e10cSrcweir 		pString = pBuffer;
3485cdf0e10cSrcweir 	}
3486cdf0e10cSrcweir 	else
3487cdf0e10cSrcweir 	if (nLen > 0 /* nEncoding == RTL_TEXTENCODING_UNICODE */)
3488cdf0e10cSrcweir 	{
3489cdf0e10cSrcweir 		pString = (sal_Unicode*)pPrintable;
3490cdf0e10cSrcweir 	  	nSize = nLen;
3491cdf0e10cSrcweir 	}
3492cdf0e10cSrcweir     else
3493cdf0e10cSrcweir     {
3494cdf0e10cSrcweir         pString = pBuffer;
3495cdf0e10cSrcweir         nSize   = 0;
3496cdf0e10cSrcweir     }
3497cdf0e10cSrcweir 
3498cdf0e10cSrcweir 	if (   mpInputContext != NULL
3499cdf0e10cSrcweir 		&& mpInputContext->UseContext()
3500cdf0e10cSrcweir 		&& KeyRelease != pEvent->type
3501cdf0e10cSrcweir 		&& (   (nSize >  1)
3502cdf0e10cSrcweir             || (nSize >  0 && mpInputContext->IsPreeditMode())) )
3503cdf0e10cSrcweir 	{
3504cdf0e10cSrcweir         mpInputContext->CommitKeyEvent(pString, nSize);
3505cdf0e10cSrcweir 	}
3506cdf0e10cSrcweir 	else
3507cdf0e10cSrcweir     // normal single character keyinput
3508cdf0e10cSrcweir 	{
3509cdf0e10cSrcweir 		aKeyEvt.mnCode	   = nKeyCode | nModCode;
3510cdf0e10cSrcweir 		aKeyEvt.mnRepeat   = 0;
3511cdf0e10cSrcweir 		aKeyEvt.mnTime	   = pEvent->time;
3512cdf0e10cSrcweir 		aKeyEvt.mnCharCode = pString[ 0 ];
3513cdf0e10cSrcweir 
3514cdf0e10cSrcweir 		if( KeyRelease == pEvent->type )
3515cdf0e10cSrcweir 		{
3516cdf0e10cSrcweir 			CallCallback( SALEVENT_KEYUP, &aKeyEvt );
3517cdf0e10cSrcweir 		}
3518cdf0e10cSrcweir 		else
3519cdf0e10cSrcweir 		{
3520cdf0e10cSrcweir 			if ( ! CallCallback(SALEVENT_KEYINPUT, &aKeyEvt) )
3521cdf0e10cSrcweir 			{
3522cdf0e10cSrcweir 				// independent layer doesnt want to handle key-event, so check
3523cdf0e10cSrcweir 				// whether the keycode may have an alternate meaning
3524cdf0e10cSrcweir 				KeyAlternate aAlternate = GetAlternateKeyCode( nKeyCode );
3525cdf0e10cSrcweir 				if ( aAlternate.nKeyCode != 0 )
3526cdf0e10cSrcweir 				{
3527cdf0e10cSrcweir 					aKeyEvt.mnCode = aAlternate.nKeyCode | nModCode;
3528cdf0e10cSrcweir 					if( aAlternate.nCharCode )
3529cdf0e10cSrcweir 						aKeyEvt.mnCharCode = aAlternate.nCharCode;
3530cdf0e10cSrcweir 					CallCallback(SALEVENT_KEYINPUT, &aKeyEvt);
3531cdf0e10cSrcweir 				}
3532cdf0e10cSrcweir 			}
3533cdf0e10cSrcweir 		}
3534cdf0e10cSrcweir 	}
3535cdf0e10cSrcweir 
3536cdf0e10cSrcweir   	//
3537cdf0e10cSrcweir   	// update the spot location for PreeditPosition IME style
3538cdf0e10cSrcweir   	//
3539cdf0e10cSrcweir     if (! aDeleteWatch.isDeleted())
3540cdf0e10cSrcweir     {
3541cdf0e10cSrcweir         if (mpInputContext != NULL && mpInputContext->UseContext())
3542cdf0e10cSrcweir             mpInputContext->UpdateSpotLocation();
3543cdf0e10cSrcweir     }
3544cdf0e10cSrcweir 
3545cdf0e10cSrcweir 	free (pBuffer);
3546cdf0e10cSrcweir 	return True;
3547cdf0e10cSrcweir }
3548cdf0e10cSrcweir 
3549cdf0e10cSrcweir 
3550cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleFocusEvent(XFocusChangeEvent * pEvent)3551cdf0e10cSrcweir long X11SalFrame::HandleFocusEvent( XFocusChangeEvent *pEvent )
3552cdf0e10cSrcweir {
3553cdf0e10cSrcweir     // #107739# ReflectionX in Windows mode changes focus while mouse is grabbed
3554cdf0e10cSrcweir 	if( nVisibleFloats > 0 && GetDisplay()->getWMAdaptor()->getWindowManagerName().EqualsAscii( "ReflectionX Windows" ) )
3555cdf0e10cSrcweir 		return 1;
3556cdf0e10cSrcweir 
3557cdf0e10cSrcweir 	/*	#55691# ignore focusout resulting from keyboard grabs
3558cdf0e10cSrcweir 	 *	we do not grab it and are not interested when
3559cdf0e10cSrcweir 	 *	someone else does CDE e.g. does a XGrabKey on arrow keys
3560cdf0e10cSrcweir 	 *	#73179# handle focus events with mode NotifyWhileGrabbed
3561cdf0e10cSrcweir 	 *	because with CDE alt-tab focus changing we do not get
3562cdf0e10cSrcweir 	 *	normal focus events
3563cdf0e10cSrcweir 	 *	#71791# cast focus event to the input context, otherwise the
3564cdf0e10cSrcweir 	 *	status window does not follow the application frame
3565cdf0e10cSrcweir 	 */
3566cdf0e10cSrcweir 
3567cdf0e10cSrcweir 	if ( mpInputContext != NULL  )
3568cdf0e10cSrcweir 	{
3569cdf0e10cSrcweir 		if( FocusIn == pEvent->type )
3570cdf0e10cSrcweir             mpInputContext->SetICFocus( this );
3571cdf0e10cSrcweir         else
3572cdf0e10cSrcweir         {
3573cdf0e10cSrcweir             /*
3574cdf0e10cSrcweir              *  do not unset the IC focuse here because would kill
3575cdf0e10cSrcweir              *  a lookup choice windows that might have the focus now
3576cdf0e10cSrcweir              *  	mpInputContext->UnsetICFocus( this );
3577cdf0e10cSrcweir              */
3578cdf0e10cSrcweir             I18NStatus::get().show( false, I18NStatus::focus );
3579cdf0e10cSrcweir         }
3580cdf0e10cSrcweir 	}
3581cdf0e10cSrcweir 
3582cdf0e10cSrcweir 
3583cdf0e10cSrcweir 	if ( pEvent->mode == NotifyNormal || pEvent->mode == NotifyWhileGrabbed ||
3584cdf0e10cSrcweir          ( ( nStyle_ & SAL_FRAME_STYLE_PLUG ) && pEvent->window == GetShellWindow() )
3585cdf0e10cSrcweir          )
3586cdf0e10cSrcweir 	{
3587cdf0e10cSrcweir         if( hPresentationWindow != None && hPresentationWindow != GetShellWindow() )
3588cdf0e10cSrcweir             return 0;
3589cdf0e10cSrcweir 
3590cdf0e10cSrcweir 		if( FocusIn == pEvent->type )
3591cdf0e10cSrcweir 		{
3592cdf0e10cSrcweir             vcl_sal::PrinterUpdate::update();
3593cdf0e10cSrcweir 			mbInputFocus = True;
3594cdf0e10cSrcweir             ImplSVData* pSVData = ImplGetSVData();
3595cdf0e10cSrcweir 
3596cdf0e10cSrcweir 
3597cdf0e10cSrcweir 
3598cdf0e10cSrcweir 			long nRet = CallCallback( SALEVENT_GETFOCUS,  0 );
3599cdf0e10cSrcweir             if ((mpParent != NULL && nStyle_ == 0)
3600cdf0e10cSrcweir                 && pSVData->maWinData.mpFirstFloat )
3601cdf0e10cSrcweir             {
3602cdf0e10cSrcweir                 sal_uLong nMode = pSVData->maWinData.mpFirstFloat->GetPopupModeFlags();
3603cdf0e10cSrcweir                 pSVData->maWinData.mpFirstFloat->SetPopupModeFlags(
3604cdf0e10cSrcweir                                         nMode & ~(FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE));
3605cdf0e10cSrcweir             }
3606cdf0e10cSrcweir             return nRet;
3607cdf0e10cSrcweir 		}
3608cdf0e10cSrcweir 		else
3609cdf0e10cSrcweir 		{
3610cdf0e10cSrcweir 			mbInputFocus = False;
3611cdf0e10cSrcweir             mbSendExtKeyModChange = mbKeyMenu = false;
3612cdf0e10cSrcweir             mnExtKeyMod = 0;
3613cdf0e10cSrcweir 			return CallCallback( SALEVENT_LOSEFOCUS, 0 );
3614cdf0e10cSrcweir 		}
3615cdf0e10cSrcweir 	}
3616cdf0e10cSrcweir 
3617cdf0e10cSrcweir 	return 0;
3618cdf0e10cSrcweir }
3619cdf0e10cSrcweir 
3620cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
3621cdf0e10cSrcweir 
HandleExposeEvent(XEvent * pEvent)3622cdf0e10cSrcweir long X11SalFrame::HandleExposeEvent( XEvent *pEvent )
3623cdf0e10cSrcweir {
3624cdf0e10cSrcweir 	XRectangle	aRect = { 0, 0, 0, 0 };
3625cdf0e10cSrcweir 	sal_uInt16		nCount = 0;
3626cdf0e10cSrcweir 
3627cdf0e10cSrcweir 	if( pEvent->type == Expose )
3628cdf0e10cSrcweir 	{
3629cdf0e10cSrcweir 		aRect.x 		= pEvent->xexpose.x;
3630cdf0e10cSrcweir 		aRect.y 		= pEvent->xexpose.y;
3631cdf0e10cSrcweir 		aRect.width 	= pEvent->xexpose.width;
3632cdf0e10cSrcweir 		aRect.height	= pEvent->xexpose.height;
3633cdf0e10cSrcweir 		nCount			= pEvent->xexpose.count;
3634cdf0e10cSrcweir 	}
3635cdf0e10cSrcweir 	else if( pEvent->type == GraphicsExpose )
3636cdf0e10cSrcweir 	{
3637cdf0e10cSrcweir 		aRect.x 		= pEvent->xgraphicsexpose.x;
3638cdf0e10cSrcweir 		aRect.y 		= pEvent->xgraphicsexpose.y;
3639cdf0e10cSrcweir 		aRect.width 	= pEvent->xgraphicsexpose.width;
3640cdf0e10cSrcweir 		aRect.height	= pEvent->xgraphicsexpose.height;
3641cdf0e10cSrcweir 		nCount			= pEvent->xgraphicsexpose.count;
3642cdf0e10cSrcweir 	}
3643cdf0e10cSrcweir 
3644cdf0e10cSrcweir     if( IsOverrideRedirect() && mbFullScreen &&
3645cdf0e10cSrcweir         aPresentationReparentList.begin() == aPresentationReparentList.end() )
3646cdf0e10cSrcweir 		// we are in fullscreen mode -> override redirect
3647cdf0e10cSrcweir  		// focus is possibly lost, so reget it
3648cdf0e10cSrcweir  		XSetInputFocus( GetXDisplay(), GetShellWindow(), RevertToNone, CurrentTime );
3649cdf0e10cSrcweir 
3650cdf0e10cSrcweir     // width and height are extents, so they are of by one for rectangle
3651cdf0e10cSrcweir     maPaintRegion.Union( Rectangle( Point(aRect.x, aRect.y), Size(aRect.width+1, aRect.height+1) ) );
3652cdf0e10cSrcweir 
3653cdf0e10cSrcweir 	if( nCount )
3654cdf0e10cSrcweir         // wait for last expose rectangle, do not wait for resize timer
3655cdf0e10cSrcweir         // if a completed graphics expose sequence is available
3656cdf0e10cSrcweir 		return 1;
3657cdf0e10cSrcweir 
3658cdf0e10cSrcweir 	SalPaintEvent aPEvt( maPaintRegion.Left(), maPaintRegion.Top(), maPaintRegion.GetWidth(), maPaintRegion.GetHeight() );
3659cdf0e10cSrcweir 
3660cdf0e10cSrcweir  	CallCallback( SALEVENT_PAINT, &aPEvt );
3661cdf0e10cSrcweir     maPaintRegion = Rectangle();
3662cdf0e10cSrcweir 
3663cdf0e10cSrcweir 	return 1;
3664cdf0e10cSrcweir }
3665cdf0e10cSrcweir 
RestackChildren(XLIB_Window * pTopLevelWindows,int nTopLevelWindows)3666cdf0e10cSrcweir void X11SalFrame::RestackChildren( XLIB_Window* pTopLevelWindows, int nTopLevelWindows )
3667cdf0e10cSrcweir {
3668cdf0e10cSrcweir     if( maChildren.begin() != maChildren.end() )
3669cdf0e10cSrcweir     {
3670cdf0e10cSrcweir         int nWindow = nTopLevelWindows;
3671cdf0e10cSrcweir         while( nWindow-- )
3672cdf0e10cSrcweir             if( pTopLevelWindows[nWindow] == GetStackingWindow() )
3673cdf0e10cSrcweir                 break;
3674cdf0e10cSrcweir         if( nWindow < 0 )
3675cdf0e10cSrcweir             return;
3676cdf0e10cSrcweir 
3677cdf0e10cSrcweir         std::list< X11SalFrame* >::const_iterator it;
3678cdf0e10cSrcweir         for( it = maChildren.begin(); it != maChildren.end(); ++it )
3679cdf0e10cSrcweir         {
3680cdf0e10cSrcweir             X11SalFrame* pData = *it;
3681cdf0e10cSrcweir             if( pData->bMapped_ )
3682cdf0e10cSrcweir             {
3683cdf0e10cSrcweir                 int nChild = nWindow;
3684cdf0e10cSrcweir                 while( nChild-- )
3685cdf0e10cSrcweir                 {
3686cdf0e10cSrcweir                     if( pTopLevelWindows[nChild] == pData->GetStackingWindow() )
3687cdf0e10cSrcweir                     {
3688cdf0e10cSrcweir                         // if a child is behind its parent, place it above the
3689cdf0e10cSrcweir                         // parent (for insane WMs like Dtwm and olwm)
3690cdf0e10cSrcweir                         XWindowChanges aCfg;
3691cdf0e10cSrcweir                         aCfg.sibling	= GetStackingWindow();
3692cdf0e10cSrcweir                         aCfg.stack_mode	= Above;
3693cdf0e10cSrcweir                         XConfigureWindow( GetXDisplay(), pData->GetStackingWindow(), CWSibling|CWStackMode, &aCfg );
3694cdf0e10cSrcweir                         break;
3695cdf0e10cSrcweir                     }
3696cdf0e10cSrcweir                 }
3697cdf0e10cSrcweir             }
3698cdf0e10cSrcweir         }
3699cdf0e10cSrcweir         for( it = maChildren.begin(); it != maChildren.end(); ++it )
3700cdf0e10cSrcweir         {
3701cdf0e10cSrcweir             X11SalFrame* pData = *it;
3702cdf0e10cSrcweir             pData->RestackChildren( pTopLevelWindows, nTopLevelWindows );
3703cdf0e10cSrcweir         }
3704cdf0e10cSrcweir     }
3705cdf0e10cSrcweir }
3706cdf0e10cSrcweir 
RestackChildren()3707cdf0e10cSrcweir void X11SalFrame::RestackChildren()
3708cdf0e10cSrcweir {
3709cdf0e10cSrcweir     if( ! GetDisplay()->getWMAdaptor()->isTransientBehaviourAsExpected()
3710cdf0e10cSrcweir         && maChildren.begin() != maChildren.end() )
3711cdf0e10cSrcweir     {
3712cdf0e10cSrcweir         XLIB_Window aRoot, aParent, *pChildren = NULL;
3713cdf0e10cSrcweir         unsigned int nChildren;
3714cdf0e10cSrcweir         if( XQueryTree( GetXDisplay(),
3715cdf0e10cSrcweir                         GetDisplay()->GetRootWindow( m_nScreen ),
3716cdf0e10cSrcweir                         &aRoot,
3717cdf0e10cSrcweir                         &aParent,
3718cdf0e10cSrcweir                         &pChildren,
3719cdf0e10cSrcweir                         &nChildren ) )
3720cdf0e10cSrcweir         {
3721cdf0e10cSrcweir             RestackChildren( pChildren, nChildren );
3722cdf0e10cSrcweir             XFree( pChildren );
3723cdf0e10cSrcweir         }
3724cdf0e10cSrcweir     }
3725cdf0e10cSrcweir }
3726cdf0e10cSrcweir 
3727cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleSizeEvent(XConfigureEvent * pEvent)3728cdf0e10cSrcweir long X11SalFrame::HandleSizeEvent( XConfigureEvent *pEvent )
3729cdf0e10cSrcweir {
3730cdf0e10cSrcweir 	if (   pEvent->window != GetShellWindow()
3731cdf0e10cSrcweir            && pEvent->window != GetWindow()
3732cdf0e10cSrcweir            && pEvent->window != GetForeignParent()
3733cdf0e10cSrcweir            && pEvent->window != GetStackingWindow()
3734cdf0e10cSrcweir            )
3735cdf0e10cSrcweir 	{
3736cdf0e10cSrcweir 		// could be as well a sys-child window (aka SalObject)
3737cdf0e10cSrcweir 		return 1;
3738cdf0e10cSrcweir 	}
3739cdf0e10cSrcweir 
3740cdf0e10cSrcweir 
3741cdf0e10cSrcweir 	if( ( nStyle_ & SAL_FRAME_STYLE_PLUG ) && pEvent->window == GetShellWindow() )
3742cdf0e10cSrcweir 	{
3743cdf0e10cSrcweir 		// just update the children's positions
3744cdf0e10cSrcweir 		RestackChildren();
3745cdf0e10cSrcweir 		return 1;
3746cdf0e10cSrcweir 	}
3747cdf0e10cSrcweir 
3748cdf0e10cSrcweir 	if( pEvent->window == GetForeignParent() )
3749cdf0e10cSrcweir         XResizeWindow( GetXDisplay(),
3750cdf0e10cSrcweir                        GetWindow(),
3751cdf0e10cSrcweir                        pEvent->width,
3752cdf0e10cSrcweir                        pEvent->height );
3753cdf0e10cSrcweir 
3754cdf0e10cSrcweir 	XLIB_Window hDummy;
3755cdf0e10cSrcweir 	XTranslateCoordinates( GetXDisplay(),
3756cdf0e10cSrcweir 						   GetWindow(),
3757cdf0e10cSrcweir 						   pDisplay_->GetRootWindow( pDisplay_->GetDefaultScreenNumber() ),
3758cdf0e10cSrcweir 						   0, 0,
3759cdf0e10cSrcweir 						   &pEvent->x, &pEvent->y,
3760cdf0e10cSrcweir 						   &hDummy );
3761cdf0e10cSrcweir 
3762cdf0e10cSrcweir     if( pEvent->window == GetStackingWindow() )
3763cdf0e10cSrcweir     {
3764cdf0e10cSrcweir         if( maGeometry.nX != pEvent->x || maGeometry.nY != pEvent->y )
3765cdf0e10cSrcweir         {
3766cdf0e10cSrcweir             maGeometry.nX = pEvent->x;
3767cdf0e10cSrcweir             maGeometry.nY = pEvent->y;
3768cdf0e10cSrcweir             CallCallback( SALEVENT_MOVE, NULL );
3769cdf0e10cSrcweir         }
3770cdf0e10cSrcweir         return 1;
3771cdf0e10cSrcweir     }
3772cdf0e10cSrcweir 
3773cdf0e10cSrcweir     // check size hints in first time SalFrame::Show
3774cdf0e10cSrcweir 	if( SHOWSTATE_UNKNOWN == nShowState_ && bMapped_ )
3775cdf0e10cSrcweir         nShowState_ = SHOWSTATE_NORMAL;
3776cdf0e10cSrcweir 
3777cdf0e10cSrcweir     nWidth_ 	= pEvent->width;
3778cdf0e10cSrcweir     nHeight_	= pEvent->height;
3779cdf0e10cSrcweir 
3780cdf0e10cSrcweir     bool bMoved = ( pEvent->x != maGeometry.nX || pEvent->y != maGeometry.nY );
3781cdf0e10cSrcweir     bool bSized = ( pEvent->width != (int)maGeometry.nWidth || pEvent->height != (int)maGeometry.nHeight );
3782cdf0e10cSrcweir 
3783cdf0e10cSrcweir     maGeometry.nX		= pEvent->x;
3784cdf0e10cSrcweir     maGeometry.nY		= pEvent->y;
3785cdf0e10cSrcweir     maGeometry.nWidth	= pEvent->width;
3786cdf0e10cSrcweir     maGeometry.nHeight	= pEvent->height;
3787cdf0e10cSrcweir     updateScreenNumber();
3788cdf0e10cSrcweir 
3789cdf0e10cSrcweir 	// update children's position
3790cdf0e10cSrcweir 	RestackChildren();
3791cdf0e10cSrcweir 
3792cdf0e10cSrcweir     if( bSized && ! bMoved )
3793cdf0e10cSrcweir         CallCallback( SALEVENT_RESIZE, NULL );
3794cdf0e10cSrcweir     else if( bMoved && ! bSized )
3795cdf0e10cSrcweir         CallCallback( SALEVENT_MOVE, NULL );
3796cdf0e10cSrcweir     else if( bMoved && bSized )
3797cdf0e10cSrcweir         CallCallback( SALEVENT_MOVERESIZE, NULL );
3798cdf0e10cSrcweir 
3799cdf0e10cSrcweir 	return 1;
3800cdf0e10cSrcweir }
3801cdf0e10cSrcweir 
IMPL_LINK(X11SalFrame,HandleAlwaysOnTopRaise,void *,EMPTYARG)3802cdf0e10cSrcweir IMPL_LINK( X11SalFrame, HandleAlwaysOnTopRaise, void*, EMPTYARG )
3803cdf0e10cSrcweir {
3804cdf0e10cSrcweir     if( bMapped_ )
3805cdf0e10cSrcweir         ToTop( 0 );
3806cdf0e10cSrcweir     return 0;
3807cdf0e10cSrcweir }
3808cdf0e10cSrcweir 
3809cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleReparentEvent(XReparentEvent * pEvent)3810cdf0e10cSrcweir long X11SalFrame::HandleReparentEvent( XReparentEvent *pEvent )
3811cdf0e10cSrcweir {
3812cdf0e10cSrcweir 	Display 	   *pDisplay   = pEvent->display;
3813cdf0e10cSrcweir 	XLIB_Window 	hWM_Parent;
3814cdf0e10cSrcweir 	XLIB_Window 	hRoot, *Children, hDummy;
3815cdf0e10cSrcweir 	unsigned int	nChildren;
3816cdf0e10cSrcweir 	sal_Bool			bNone = pDisplay_->GetProperties()
3817cdf0e10cSrcweir 							& PROPERTY_SUPPORT_WM_Parent_Pixmap_None;
3818cdf0e10cSrcweir     sal_Bool            bAccessParentWindow = ! (pDisplay_->GetProperties()
3819cdf0e10cSrcweir 							& PROPERTY_FEATURE_TrustedSolaris);
3820cdf0e10cSrcweir 
3821cdf0e10cSrcweir 	static const char* pDisableStackingCheck = getenv( "SAL_DISABLE_STACKING_CHECK" );
3822cdf0e10cSrcweir 
3823cdf0e10cSrcweir     GetDisplay()->GetXLib()->PushXErrorLevel( true );
3824cdf0e10cSrcweir 
3825cdf0e10cSrcweir     /*
3826cdf0e10cSrcweir      *  #89186# don't rely on the new parent from the event.
3827cdf0e10cSrcweir      *  the event may be "out of date", that is the window manager
3828cdf0e10cSrcweir      *  window may not exist anymore. This can happen if someone
3829cdf0e10cSrcweir      *  shows a frame and hides it again quickly (not that that would
3830cdf0e10cSrcweir      *  be very sensible)
3831cdf0e10cSrcweir      */
3832cdf0e10cSrcweir     hWM_Parent = GetShellWindow();
3833cdf0e10cSrcweir     do
3834cdf0e10cSrcweir     {
3835cdf0e10cSrcweir         Children = NULL;
3836cdf0e10cSrcweir         XQueryTree( pDisplay,
3837cdf0e10cSrcweir                     hWM_Parent,
3838cdf0e10cSrcweir                     &hRoot,
3839cdf0e10cSrcweir                     &hDummy,
3840cdf0e10cSrcweir                     &Children,
3841cdf0e10cSrcweir                     &nChildren );
3842cdf0e10cSrcweir         if( GetDisplay()->GetXLib()->HasXErrorOccured() )
3843cdf0e10cSrcweir         {
3844cdf0e10cSrcweir             hWM_Parent = GetShellWindow();
3845cdf0e10cSrcweir             break;
3846cdf0e10cSrcweir         }
3847cdf0e10cSrcweir          /* #107048# this sometimes happens if a Show(sal_True) is
3848cdf0e10cSrcweir          *  immediately followed by Show(sal_False) (which is braindead anyway)
3849cdf0e10cSrcweir          */
3850cdf0e10cSrcweir         if(  hDummy == hWM_Parent )
3851cdf0e10cSrcweir             hDummy = hRoot;
3852cdf0e10cSrcweir         if( hDummy != hRoot )
3853cdf0e10cSrcweir         {
3854cdf0e10cSrcweir             hWM_Parent = hDummy;
3855cdf0e10cSrcweir             if( bAccessParentWindow && bNone )
3856cdf0e10cSrcweir                 XSetWindowBackgroundPixmap( pDisplay, hWM_Parent, None );
3857cdf0e10cSrcweir         }
3858cdf0e10cSrcweir         if( Children )
3859cdf0e10cSrcweir             XFree( Children );
3860cdf0e10cSrcweir     } while( hDummy != hRoot );
3861cdf0e10cSrcweir 
3862cdf0e10cSrcweir 	if( GetStackingWindow() == None
3863cdf0e10cSrcweir         && hWM_Parent != hPresentationWindow
3864cdf0e10cSrcweir         && hWM_Parent != GetShellWindow()
3865cdf0e10cSrcweir         && ( ! pDisableStackingCheck || ! *pDisableStackingCheck )
3866cdf0e10cSrcweir         )
3867cdf0e10cSrcweir 	{
3868cdf0e10cSrcweir 		mhStackingWindow = hWM_Parent;
3869cdf0e10cSrcweir 		if (bAccessParentWindow)
3870cdf0e10cSrcweir             XSelectInput( pDisplay, GetStackingWindow(), StructureNotifyMask );
3871cdf0e10cSrcweir 	}
3872cdf0e10cSrcweir 
3873cdf0e10cSrcweir 	if( 	hWM_Parent == pDisplay_->GetRootWindow( pDisplay_->GetDefaultScreenNumber() )
3874cdf0e10cSrcweir             || 	hWM_Parent == GetForeignParent()
3875cdf0e10cSrcweir             || 	pEvent->parent == pDisplay_->GetRootWindow( pDisplay_->GetDefaultScreenNumber() )
3876cdf0e10cSrcweir             || ( nStyle_ & SAL_FRAME_STYLE_FLOAT ) )
3877cdf0e10cSrcweir 	{
3878cdf0e10cSrcweir 		// Reparenting before Destroy
3879cdf0e10cSrcweir         aPresentationReparentList.remove( GetStackingWindow() );
3880cdf0e10cSrcweir 		mhStackingWindow = None;
3881cdf0e10cSrcweir         GetDisplay()->GetXLib()->PopXErrorLevel();
3882cdf0e10cSrcweir 		return 0;
3883cdf0e10cSrcweir 	}
3884cdf0e10cSrcweir 
3885cdf0e10cSrcweir     /*
3886cdf0e10cSrcweir      *  evil hack to show decorated windows on top
3887cdf0e10cSrcweir      *  of override redirect presentation windows:
3888cdf0e10cSrcweir      *  reparent the window manager window to the presentation window
3889cdf0e10cSrcweir      *  does not work with non-reparenting WMs
3890cdf0e10cSrcweir      *  in future this should not be necessary anymore with
3891cdf0e10cSrcweir      *  _NET_WM_STATE_FULLSCREEN available
3892cdf0e10cSrcweir      */
3893cdf0e10cSrcweir     if( hPresentationWindow != None
3894cdf0e10cSrcweir         && hPresentationWindow != GetWindow()
3895cdf0e10cSrcweir         && GetStackingWindow() != None
3896cdf0e10cSrcweir         && GetStackingWindow() != GetDisplay()->GetRootWindow( m_nScreen )
3897cdf0e10cSrcweir         )
3898cdf0e10cSrcweir     {
3899cdf0e10cSrcweir         int x = 0, y = 0;
3900cdf0e10cSrcweir         XLIB_Window aChild;
3901cdf0e10cSrcweir         XTranslateCoordinates( GetXDisplay(),
3902cdf0e10cSrcweir                                GetStackingWindow(),
3903cdf0e10cSrcweir                                GetDisplay()->GetRootWindow( m_nScreen ),
3904cdf0e10cSrcweir                                0, 0,
3905cdf0e10cSrcweir                                &x, &y,
3906cdf0e10cSrcweir                                &aChild
3907cdf0e10cSrcweir                                );
3908cdf0e10cSrcweir         XReparentWindow( GetXDisplay(),
3909cdf0e10cSrcweir                          GetStackingWindow(),
3910cdf0e10cSrcweir                          hPresentationWindow,
3911cdf0e10cSrcweir                          x, y
3912cdf0e10cSrcweir                          );
3913cdf0e10cSrcweir         aPresentationReparentList.push_back( GetStackingWindow() );
3914cdf0e10cSrcweir     }
3915cdf0e10cSrcweir 
3916cdf0e10cSrcweir     int nLeft = 0, nTop = 0;
3917cdf0e10cSrcweir 	XTranslateCoordinates( GetXDisplay(),
3918cdf0e10cSrcweir                            GetShellWindow(),
3919cdf0e10cSrcweir                            hWM_Parent,
3920cdf0e10cSrcweir                            0, 0,
3921cdf0e10cSrcweir                            &nLeft,
3922cdf0e10cSrcweir                            &nTop,
3923cdf0e10cSrcweir                            &hDummy );
3924cdf0e10cSrcweir     maGeometry.nLeftDecoration	= nLeft > 0 ? nLeft-1 : 0;
3925cdf0e10cSrcweir     maGeometry.nTopDecoration	= nTop  > 0 ? nTop-1  : 0;
3926cdf0e10cSrcweir 
3927cdf0e10cSrcweir     /*
3928cdf0e10cSrcweir      *  decorations are not symmetric,
3929cdf0e10cSrcweir      *  so need real geometries here
3930cdf0e10cSrcweir      *  (this will fail with virtual roots ?)
3931cdf0e10cSrcweir      */
3932cdf0e10cSrcweir     GetDisplay()->GetXLib()->ResetXErrorOccured();
3933cdf0e10cSrcweir     int xp, yp, x, y;
3934cdf0e10cSrcweir     unsigned int wp, w, hp, h, bw, d;
3935cdf0e10cSrcweir     XGetGeometry( GetXDisplay(),
3936cdf0e10cSrcweir                   GetShellWindow(),
3937cdf0e10cSrcweir                   &hRoot,
3938cdf0e10cSrcweir                   &x, &y, &w, &h, &bw, &d );
3939cdf0e10cSrcweir     XGetGeometry( GetXDisplay(),
3940cdf0e10cSrcweir                   hWM_Parent,
3941cdf0e10cSrcweir                   &hRoot,
3942cdf0e10cSrcweir                   &xp, &yp, &wp, &hp, &bw, &d );
3943cdf0e10cSrcweir     bool bResized = false;
3944cdf0e10cSrcweir     if( ! GetDisplay()->GetXLib()->HasXErrorOccured() )
3945cdf0e10cSrcweir     {
3946cdf0e10cSrcweir         maGeometry.nRightDecoration 	= wp - w - maGeometry.nLeftDecoration;
3947cdf0e10cSrcweir         maGeometry.nBottomDecoration	= hp - h - maGeometry.nTopDecoration;
3948cdf0e10cSrcweir         /*
3949cdf0e10cSrcweir          *  note: this works because hWM_Parent is direct child of root,
3950cdf0e10cSrcweir          *  not necessarily parent of GetShellWindow()
3951cdf0e10cSrcweir          */
3952cdf0e10cSrcweir         maGeometry.nX		= xp + nLeft;
3953cdf0e10cSrcweir         maGeometry.nY		= yp + nTop;
3954cdf0e10cSrcweir         bResized = w != maGeometry.nWidth || h != maGeometry.nHeight;
3955cdf0e10cSrcweir         maGeometry.nWidth	= w;
3956cdf0e10cSrcweir         maGeometry.nHeight = h;
3957cdf0e10cSrcweir     }
3958cdf0e10cSrcweir 
3959cdf0e10cSrcweir 
3960cdf0e10cSrcweir     // limit width and height if we are too large: #47757
3961cdf0e10cSrcweir     // olwm and fvwm need this, it doesnt harm the rest
3962cdf0e10cSrcweir 
3963cdf0e10cSrcweir     // #i81311# do this only for sizable frames
3964cdf0e10cSrcweir     if( (nStyle_ & SAL_FRAME_STYLE_SIZEABLE) != 0 )
3965cdf0e10cSrcweir     {
3966cdf0e10cSrcweir         Size aScreenSize = GetDisplay()->GetScreenSize( m_nScreen );
3967cdf0e10cSrcweir         int nScreenWidth  = aScreenSize.Width();
3968cdf0e10cSrcweir         int nScreenHeight = aScreenSize.Height();
3969cdf0e10cSrcweir         int nFrameWidth   = maGeometry.nWidth + maGeometry.nLeftDecoration + maGeometry.nRightDecoration;
3970cdf0e10cSrcweir         int nFrameHeight  = maGeometry.nHeight + maGeometry.nTopDecoration  + maGeometry.nBottomDecoration;
3971cdf0e10cSrcweir 
3972cdf0e10cSrcweir         if ((nFrameWidth > nScreenWidth) || (nFrameHeight > nScreenHeight))
3973cdf0e10cSrcweir         {
3974cdf0e10cSrcweir             Size aSize(maGeometry.nWidth, maGeometry.nHeight);
3975cdf0e10cSrcweir 
3976cdf0e10cSrcweir             if (nFrameWidth  > nScreenWidth)
3977cdf0e10cSrcweir                 aSize.Width()  = nScreenWidth  - maGeometry.nRightDecoration - maGeometry.nLeftDecoration;
3978cdf0e10cSrcweir             if (nFrameHeight > nScreenHeight)
3979cdf0e10cSrcweir                 aSize.Height() = nScreenHeight - maGeometry.nBottomDecoration - maGeometry.nTopDecoration;
3980cdf0e10cSrcweir 
3981cdf0e10cSrcweir             SetSize( aSize );
3982cdf0e10cSrcweir             bResized = false;
3983cdf0e10cSrcweir         }
3984cdf0e10cSrcweir     }
3985cdf0e10cSrcweir     if( bResized )
3986cdf0e10cSrcweir         CallCallback( SALEVENT_RESIZE, NULL );
3987cdf0e10cSrcweir 
3988cdf0e10cSrcweir     GetDisplay()->GetXLib()->PopXErrorLevel();
3989cdf0e10cSrcweir 
3990cdf0e10cSrcweir 	return 1;
3991cdf0e10cSrcweir }
3992cdf0e10cSrcweir 
3993cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleColormapEvent(XColormapEvent *)3994cdf0e10cSrcweir long X11SalFrame::HandleColormapEvent( XColormapEvent* )
3995cdf0e10cSrcweir {
3996cdf0e10cSrcweir 	return 0;
3997cdf0e10cSrcweir }
3998cdf0e10cSrcweir 
3999cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleStateEvent(XPropertyEvent * pEvent)4000cdf0e10cSrcweir long X11SalFrame::HandleStateEvent( XPropertyEvent *pEvent )
4001cdf0e10cSrcweir {
4002cdf0e10cSrcweir 	Atom		  actual_type;
4003cdf0e10cSrcweir 	int 		  actual_format;
4004cdf0e10cSrcweir 	unsigned long nitems, bytes_after;
4005cdf0e10cSrcweir 	unsigned char *prop = NULL;
4006cdf0e10cSrcweir 
4007cdf0e10cSrcweir 	if( 0 != XGetWindowProperty( GetXDisplay(),
4008cdf0e10cSrcweir 								 GetShellWindow(),
4009cdf0e10cSrcweir 								 pEvent->atom,			// property
4010cdf0e10cSrcweir 								 0, 					// long_offset (32bit)
4011cdf0e10cSrcweir 								 2, 					// long_length (32bit)
4012cdf0e10cSrcweir 								 False, 				// delete
4013cdf0e10cSrcweir 								 pEvent->atom,			// req_type
4014cdf0e10cSrcweir 								 &actual_type,
4015cdf0e10cSrcweir 								 &actual_format,
4016cdf0e10cSrcweir 								 &nitems,
4017cdf0e10cSrcweir 								 &bytes_after,
4018cdf0e10cSrcweir 								 &prop )
4019cdf0e10cSrcweir 		|| ! prop
4020cdf0e10cSrcweir 		)
4021cdf0e10cSrcweir 		return 0;
4022cdf0e10cSrcweir 
4023cdf0e10cSrcweir 	DBG_ASSERT( actual_type = pEvent->atom
4024cdf0e10cSrcweir 				&& 32 == actual_format
4025cdf0e10cSrcweir 				&&	2 == nitems
4026cdf0e10cSrcweir 				&&	0 == bytes_after, "HandleStateEvent" );
4027cdf0e10cSrcweir 
4028cdf0e10cSrcweir 	if( *(unsigned long*)prop == NormalState )
4029cdf0e10cSrcweir 		nShowState_ = SHOWSTATE_NORMAL;
4030cdf0e10cSrcweir 	else if( *(unsigned long*)prop == IconicState )
4031cdf0e10cSrcweir 		nShowState_ = SHOWSTATE_MINIMIZED;
4032cdf0e10cSrcweir 
4033cdf0e10cSrcweir 	XFree( prop );
4034cdf0e10cSrcweir 	return 1;
4035cdf0e10cSrcweir }
4036cdf0e10cSrcweir 
4037cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
HandleClientMessage(XClientMessageEvent * pEvent)4038cdf0e10cSrcweir long X11SalFrame::HandleClientMessage( XClientMessageEvent *pEvent )
4039cdf0e10cSrcweir {
4040cdf0e10cSrcweir     const WMAdaptor& rWMAdaptor( *pDisplay_->getWMAdaptor() );
4041cdf0e10cSrcweir 
4042cdf0e10cSrcweir #if !defined(__synchronous_extinput__)
4043cdf0e10cSrcweir 	if( pEvent->message_type == rWMAdaptor.getAtom( WMAdaptor::SAL_EXTTEXTEVENT ) )
4044cdf0e10cSrcweir 	{
4045cdf0e10cSrcweir 		HandleExtTextEvent (pEvent);
4046cdf0e10cSrcweir 		return 1;
4047cdf0e10cSrcweir 	}
4048cdf0e10cSrcweir #endif
4049cdf0e10cSrcweir 	else if( pEvent->message_type == rWMAdaptor.getAtom( WMAdaptor::SAL_QUITEVENT ) )
4050cdf0e10cSrcweir 	{
4051cdf0e10cSrcweir 		stderr0( "X11SalFrame::Dispatch Quit\n" );
4052cdf0e10cSrcweir 		Close(); // ???
4053cdf0e10cSrcweir 		return 1;
4054cdf0e10cSrcweir 	}
4055cdf0e10cSrcweir 	else if( pEvent->message_type == rWMAdaptor.getAtom( WMAdaptor::WM_PROTOCOLS ) )
4056cdf0e10cSrcweir     {
4057cdf0e10cSrcweir         if( (Atom)pEvent->data.l[0] == rWMAdaptor.getAtom( WMAdaptor::NET_WM_PING ) )
4058cdf0e10cSrcweir             rWMAdaptor.answerPing( this, pEvent );
4059cdf0e10cSrcweir         else if( ! ( nStyle_ & SAL_FRAME_STYLE_PLUG )
4060cdf0e10cSrcweir               && ! (( nStyle_ & SAL_FRAME_STYLE_FLOAT ) && (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION))
4061cdf0e10cSrcweir              )
4062cdf0e10cSrcweir         {
4063cdf0e10cSrcweir             if( (Atom)pEvent->data.l[0] == rWMAdaptor.getAtom( WMAdaptor::WM_DELETE_WINDOW ) )
4064cdf0e10cSrcweir             {
4065cdf0e10cSrcweir                 Close();
4066cdf0e10cSrcweir                 return 1;
4067cdf0e10cSrcweir             }
4068cdf0e10cSrcweir             else if( (Atom)pEvent->data.l[0] == rWMAdaptor.getAtom( WMAdaptor::WM_TAKE_FOCUS ) )
4069cdf0e10cSrcweir             {
4070cdf0e10cSrcweir                 // do nothing, we set the input focus in ToTop() if necessary
4071cdf0e10cSrcweir     #if OSL_DEBUG_LEVEL > 1
4072cdf0e10cSrcweir                 fprintf( stderr, "got WM_TAKE_FOCUS on %s window\n",
4073cdf0e10cSrcweir                          (nStyle_&SAL_FRAME_STYLE_OWNERDRAWDECORATION) ?
4074cdf0e10cSrcweir                          "ownerdraw" : "NON OWNERDRAW" );
4075cdf0e10cSrcweir     #endif
4076cdf0e10cSrcweir             }
4077cdf0e10cSrcweir             else if( (Atom)pEvent->data.l[0] == rWMAdaptor.getAtom( WMAdaptor::WM_SAVE_YOURSELF ) )
4078cdf0e10cSrcweir             {
4079cdf0e10cSrcweir                 bool bSession = rWMAdaptor.getWindowManagerName().EqualsAscii( "Dtwm" );
4080cdf0e10cSrcweir 
4081cdf0e10cSrcweir                 if( ! bSession )
4082cdf0e10cSrcweir                 {
4083cdf0e10cSrcweir                     if( this == s_pSaveYourselfFrame )
4084cdf0e10cSrcweir                     {
4085cdf0e10cSrcweir                         ByteString aExec( SessionManagerClient::getExecName(), osl_getThreadTextEncoding() );
4086cdf0e10cSrcweir                         const char* argv[2];
4087cdf0e10cSrcweir                         argv[0] = "/bin/sh";
4088cdf0e10cSrcweir                         argv[1] = const_cast<char*>(aExec.GetBuffer());
4089cdf0e10cSrcweir     #if OSL_DEBUG_LEVEL > 1
4090cdf0e10cSrcweir                         fprintf( stderr, "SaveYourself request, setting command: %s %s\n", argv[0], argv[1] );
4091cdf0e10cSrcweir     #endif
4092cdf0e10cSrcweir                         XSetCommand( GetXDisplay(), GetShellWindow(), (char**)argv, 2 );
4093cdf0e10cSrcweir                     }
4094cdf0e10cSrcweir                     else
4095cdf0e10cSrcweir                         // can only happen in race between WM and window closing
4096cdf0e10cSrcweir                         XChangeProperty( GetXDisplay(), GetShellWindow(), rWMAdaptor.getAtom( WMAdaptor::WM_COMMAND ), XA_STRING, 8, PropModeReplace, (unsigned char*)"", 0 );
4097cdf0e10cSrcweir                 }
4098cdf0e10cSrcweir                 else
4099cdf0e10cSrcweir                 {
4100cdf0e10cSrcweir                     // save open documents; would be good for non Dtwm, too,
4101cdf0e10cSrcweir                     // but there is no real Shutdown message in the ancient
4102cdf0e10cSrcweir                     // SM protocol; on Dtwm SaveYourself really means Shutdown, too.
4103cdf0e10cSrcweir                     IceSalSession::handleOldX11SaveYourself( this );
4104cdf0e10cSrcweir                 }
4105cdf0e10cSrcweir             }
4106cdf0e10cSrcweir         }
4107cdf0e10cSrcweir     }
4108cdf0e10cSrcweir     else if( pEvent->message_type == rWMAdaptor.getAtom( WMAdaptor::XEMBED ) &&
4109cdf0e10cSrcweir              pEvent->window == GetWindow() )
4110cdf0e10cSrcweir     {
4111cdf0e10cSrcweir         if( pEvent->data.l[1] == 1 || // XEMBED_WINDOW_ACTIVATE
4112cdf0e10cSrcweir             pEvent->data.l[1] == 2 )  // XEMBED_WINDOW_DEACTIVATE
4113cdf0e10cSrcweir         {
4114cdf0e10cSrcweir             XFocusChangeEvent aEvent;
4115cdf0e10cSrcweir             aEvent.type         = (pEvent->data.l[1] == 1 ? FocusIn : FocusOut);
4116cdf0e10cSrcweir             aEvent.serial       = pEvent->serial;
4117cdf0e10cSrcweir             aEvent.send_event   = True;
4118cdf0e10cSrcweir             aEvent.display      = pEvent->display;
4119cdf0e10cSrcweir             aEvent.window       = pEvent->window;
4120cdf0e10cSrcweir             aEvent.mode         = NotifyNormal;
4121cdf0e10cSrcweir             aEvent.detail       = NotifyDetailNone;
4122cdf0e10cSrcweir             HandleFocusEvent( &aEvent );
4123cdf0e10cSrcweir         }
4124cdf0e10cSrcweir     }
4125cdf0e10cSrcweir 	return 0;
4126cdf0e10cSrcweir }
4127cdf0e10cSrcweir 
SaveYourselfDone(SalFrame * pSaveFrame)4128cdf0e10cSrcweir void X11SalFrame::SaveYourselfDone( SalFrame* pSaveFrame )
4129cdf0e10cSrcweir {
4130cdf0e10cSrcweir     // session save was done, inform dtwm
4131cdf0e10cSrcweir     if( s_pSaveYourselfFrame && pSaveFrame )
4132cdf0e10cSrcweir     {
4133cdf0e10cSrcweir         ByteString aExec( SessionManagerClient::getExecName(), osl_getThreadTextEncoding() );
4134cdf0e10cSrcweir         const char* argv[2];
4135cdf0e10cSrcweir         argv[0] = "/bin/sh";
4136cdf0e10cSrcweir         argv[1] = const_cast<char*>(aExec.GetBuffer());
4137cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
4138cdf0e10cSrcweir         fprintf( stderr, "SaveYourself request, setting command: %s %s\n", argv[0], argv[1] );
4139cdf0e10cSrcweir #endif
4140cdf0e10cSrcweir         XSetCommand( s_pSaveYourselfFrame->GetXDisplay(),
4141cdf0e10cSrcweir                      s_pSaveYourselfFrame->GetShellWindow(),
4142cdf0e10cSrcweir                      (char**)argv, 2 );
4143cdf0e10cSrcweir         if( pSaveFrame != s_pSaveYourselfFrame )
4144cdf0e10cSrcweir         {
4145cdf0e10cSrcweir             // check if it still exists
4146cdf0e10cSrcweir             const X11SalFrame* pFrame = NULL;
4147cdf0e10cSrcweir             const std::list< SalFrame* >& rFrames = static_cast<X11SalFrame*>(pSaveFrame)->GetDisplay()->getFrames();
4148cdf0e10cSrcweir             std::list< SalFrame* >::const_iterator it = rFrames.begin();
4149cdf0e10cSrcweir             while( it != rFrames.end() )
4150cdf0e10cSrcweir             {
4151cdf0e10cSrcweir                 pFrame = static_cast< const X11SalFrame* >(*it);
4152cdf0e10cSrcweir                 if( pFrame == pSaveFrame )
4153cdf0e10cSrcweir                     break;
4154cdf0e10cSrcweir                 ++it;
4155cdf0e10cSrcweir             }
4156cdf0e10cSrcweir             if( pFrame == pSaveFrame )
4157cdf0e10cSrcweir             {
4158cdf0e10cSrcweir                 const WMAdaptor& rWMAdaptor( *pFrame->pDisplay_->getWMAdaptor() );
4159cdf0e10cSrcweir                 XChangeProperty( pFrame->GetXDisplay(),
4160cdf0e10cSrcweir                                  pFrame->GetShellWindow(),
4161cdf0e10cSrcweir                                  rWMAdaptor.getAtom( WMAdaptor::WM_COMMAND ), XA_STRING, 8, PropModeReplace, (unsigned char*)"", 0 );
4162cdf0e10cSrcweir             }
4163cdf0e10cSrcweir         }
4164cdf0e10cSrcweir         s_pSaveYourselfFrame->ShutDown();
4165cdf0e10cSrcweir     }
4166cdf0e10cSrcweir }
4167cdf0e10cSrcweir 
4168cdf0e10cSrcweir // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
4169cdf0e10cSrcweir 
4170cdf0e10cSrcweir extern "C"
4171cdf0e10cSrcweir {
call_checkKeyReleaseForRepeat(Display * pDisplay,XEvent * pCheck,XPointer pX11SalFrame)4172cdf0e10cSrcweir Bool call_checkKeyReleaseForRepeat( Display* pDisplay, XEvent* pCheck, XPointer pX11SalFrame )
4173cdf0e10cSrcweir {
4174cdf0e10cSrcweir     return X11SalFrame::checkKeyReleaseForRepeat( pDisplay, pCheck, pX11SalFrame );
4175cdf0e10cSrcweir }
4176cdf0e10cSrcweir }
4177cdf0e10cSrcweir 
checkKeyReleaseForRepeat(Display *,XEvent * pCheck,XPointer pX11SalFrame)4178cdf0e10cSrcweir Bool X11SalFrame::checkKeyReleaseForRepeat( Display*, XEvent* pCheck, XPointer pX11SalFrame )
4179cdf0e10cSrcweir {
4180cdf0e10cSrcweir 	X11SalFrame* pThis = (X11SalFrame*)pX11SalFrame;
4181cdf0e10cSrcweir 	return
4182cdf0e10cSrcweir 		pCheck->type			== XLIB_KeyPress &&
4183cdf0e10cSrcweir 		pCheck->xkey.state		== pThis->nKeyState_ &&
4184cdf0e10cSrcweir 		pCheck->xkey.keycode	== pThis->nKeyCode_ &&
4185cdf0e10cSrcweir 		pCheck->xkey.time		== pThis->nReleaseTime_  ? True : False;
4186cdf0e10cSrcweir }
4187cdf0e10cSrcweir 
Dispatch(XEvent * pEvent)4188cdf0e10cSrcweir long X11SalFrame::Dispatch( XEvent *pEvent )
4189cdf0e10cSrcweir {
4190cdf0e10cSrcweir 	long nRet = 0;
4191cdf0e10cSrcweir 
4192cdf0e10cSrcweir 	if( -1 == nCaptured_ )
4193cdf0e10cSrcweir 	{
4194cdf0e10cSrcweir 		CaptureMouse( sal_True );
4195cdf0e10cSrcweir #ifdef DBG_UTIL
4196cdf0e10cSrcweir 		if( -1 != nCaptured_ )
4197cdf0e10cSrcweir 			pDisplay_->PrintEvent( "Captured", pEvent );
4198cdf0e10cSrcweir #endif
4199cdf0e10cSrcweir 	}
4200cdf0e10cSrcweir 
4201cdf0e10cSrcweir 	if( pEvent->xany.window == GetShellWindow() || pEvent->xany.window == GetWindow() )
4202cdf0e10cSrcweir 	{
4203cdf0e10cSrcweir 		switch( pEvent->type )
4204cdf0e10cSrcweir 		{
4205cdf0e10cSrcweir 			case XLIB_KeyPress:
4206cdf0e10cSrcweir 				nKeyCode_	= pEvent->xkey.keycode;
4207cdf0e10cSrcweir 				nKeyState_	= pEvent->xkey.state;
4208cdf0e10cSrcweir 				nRet		= HandleKeyEvent( &pEvent->xkey );
4209cdf0e10cSrcweir 				break;
4210cdf0e10cSrcweir 
4211cdf0e10cSrcweir 			case KeyRelease:
4212cdf0e10cSrcweir 				if( -1 == nCompose_ )
4213cdf0e10cSrcweir 				{
4214cdf0e10cSrcweir 					nReleaseTime_ = pEvent->xkey.time;
4215cdf0e10cSrcweir 					XEvent aEvent;
4216cdf0e10cSrcweir 					if( XCheckIfEvent( pEvent->xkey.display, &aEvent, call_checkKeyReleaseForRepeat, (XPointer)this ) )
4217cdf0e10cSrcweir 						XPutBackEvent( pEvent->xkey.display, &aEvent );
4218cdf0e10cSrcweir 					else
4219cdf0e10cSrcweir 						nRet		= HandleKeyEvent( &pEvent->xkey );
4220cdf0e10cSrcweir 				}
4221cdf0e10cSrcweir 			break;
4222cdf0e10cSrcweir 
4223cdf0e10cSrcweir 			case ButtonPress:
4224cdf0e10cSrcweir 				// #74406# if we loose the focus in presentation mode
4225cdf0e10cSrcweir 				// there are good chances that we never get it back
4226cdf0e10cSrcweir 				// since the WM ignores us
4227cdf0e10cSrcweir  				if( IsOverrideRedirect() )
4228cdf0e10cSrcweir  				{
4229cdf0e10cSrcweir  					XSetInputFocus( GetXDisplay(), GetShellWindow(),
4230cdf0e10cSrcweir  							RevertToNone, CurrentTime );
4231cdf0e10cSrcweir  				}
4232cdf0e10cSrcweir 
4233cdf0e10cSrcweir 			case ButtonRelease:
4234cdf0e10cSrcweir 			case MotionNotify:
4235cdf0e10cSrcweir 			case EnterNotify:
4236cdf0e10cSrcweir 			case LeaveNotify:
4237cdf0e10cSrcweir 				nRet = HandleMouseEvent( pEvent );
4238cdf0e10cSrcweir 				break;
4239cdf0e10cSrcweir 
4240cdf0e10cSrcweir 			case FocusIn:
4241cdf0e10cSrcweir 			case FocusOut:
4242cdf0e10cSrcweir 				nRet = HandleFocusEvent( &pEvent->xfocus );
4243cdf0e10cSrcweir 				break;
4244cdf0e10cSrcweir 
4245cdf0e10cSrcweir 			case Expose:
4246cdf0e10cSrcweir 			case GraphicsExpose:
4247cdf0e10cSrcweir 				nRet = HandleExposeEvent( pEvent );
4248cdf0e10cSrcweir 				break;
4249cdf0e10cSrcweir 
4250cdf0e10cSrcweir 			case MapNotify:
4251cdf0e10cSrcweir 				if( pEvent->xmap.window == GetShellWindow() )
4252cdf0e10cSrcweir 				{
4253cdf0e10cSrcweir                     if( nShowState_ == SHOWSTATE_HIDDEN )
4254cdf0e10cSrcweir                     {
4255cdf0e10cSrcweir                         /*
4256cdf0e10cSrcweir                          *  #95097# workaround for (at least) KWin 2.2.2
4257cdf0e10cSrcweir                          *  which will map windows that were once transient
4258cdf0e10cSrcweir                          *  even if they are withdrawn when the respective
4259cdf0e10cSrcweir                          *  document is mapped.
4260cdf0e10cSrcweir                          */
4261cdf0e10cSrcweir                         if( ! (nStyle_ & SAL_FRAME_STYLE_PLUG) )
4262cdf0e10cSrcweir                             XUnmapWindow( GetXDisplay(), GetShellWindow() );
4263cdf0e10cSrcweir                         break;
4264cdf0e10cSrcweir                     }
4265cdf0e10cSrcweir 					bMapped_   = sal_True;
4266cdf0e10cSrcweir 					bViewable_ = sal_True;
4267cdf0e10cSrcweir 					nRet = sal_True;
4268cdf0e10cSrcweir 					if ( mpInputContext != NULL )
4269cdf0e10cSrcweir 						mpInputContext->Map( this );
4270cdf0e10cSrcweir                     CallCallback( SALEVENT_RESIZE, NULL );
4271cdf0e10cSrcweir                     if( pDisplay_->GetServerVendor() == vendor_hummingbird )
4272cdf0e10cSrcweir                     {
4273cdf0e10cSrcweir                         /*
4274cdf0e10cSrcweir                          *  With Exceed sometimes there does not seem to be
4275cdf0e10cSrcweir                          *  an Expose after the MapNotify.
4276cdf0e10cSrcweir                          *  so start a delayed paint here
4277cdf0e10cSrcweir                          */
4278cdf0e10cSrcweir                         maPaintRegion.Union( Rectangle( Point( 0, 0 ), Size( maGeometry.nWidth, maGeometry.nHeight ) ) );
4279cdf0e10cSrcweir                         XEvent aEvent;
4280cdf0e10cSrcweir                         aEvent.xexpose.type		= Expose;
4281cdf0e10cSrcweir                         aEvent.xexpose.display	= pDisplay_->GetDisplay();
4282cdf0e10cSrcweir                         aEvent.xexpose.x		= 0;
4283cdf0e10cSrcweir                         aEvent.xexpose.y		= 0;
4284cdf0e10cSrcweir                         aEvent.xexpose.width	= maGeometry.nWidth;
4285cdf0e10cSrcweir                         aEvent.xexpose.height	= maGeometry.nHeight;
4286cdf0e10cSrcweir                         aEvent.xexpose.count	= 0;
4287cdf0e10cSrcweir                         XSendEvent( pDisplay_->GetDisplay(),
4288cdf0e10cSrcweir                                     GetWindow(),
4289cdf0e10cSrcweir                                     True,
4290cdf0e10cSrcweir                                     ExposureMask,
4291cdf0e10cSrcweir                                     &aEvent );
4292cdf0e10cSrcweir                     }
4293cdf0e10cSrcweir 
4294cdf0e10cSrcweir                     bool bSetFocus = m_bSetFocusOnMap;
4295cdf0e10cSrcweir                     /*  #99570# another workaround for sawfish: if a transient window for the same parent is shown
4296cdf0e10cSrcweir                      *  sawfish does not set the focus to it. Applies only for click to focus mode.
4297cdf0e10cSrcweir                      */
4298cdf0e10cSrcweir                     if( ! (nStyle_ & SAL_FRAME_STYLE_FLOAT ) && mbInShow && GetDisplay()->getWMAdaptor()->getWindowManagerName().EqualsAscii( "Sawfish" ) )
4299cdf0e10cSrcweir                     {
4300cdf0e10cSrcweir                         // #101775# don't set the focus into the IME status window
4301cdf0e10cSrcweir                         // since this will lead to a parent loose-focus, close status,
4302cdf0e10cSrcweir                         // reget focus, open status, .... flicker loop
4303cdf0e10cSrcweir                         if ( (I18NStatus::get().getStatusFrame() != this) )
4304cdf0e10cSrcweir                             bSetFocus = true;
4305cdf0e10cSrcweir                     }
4306cdf0e10cSrcweir 
4307cdf0e10cSrcweir                     /*
4308cdf0e10cSrcweir                      *  sometimes a message box/dialogue is brought up when a frame is not mapped
4309cdf0e10cSrcweir                      *  the corresponding TRANSIENT_FOR hint is then set to the root window
4310cdf0e10cSrcweir                      *  so that the dialogue shows in all cases. Correct it here if the
4311cdf0e10cSrcweir                      *  frame is shown afterwards.
4312cdf0e10cSrcweir                      */
4313cdf0e10cSrcweir                     if( ! IsChildWindow()
4314cdf0e10cSrcweir                         && ! IsOverrideRedirect()
4315cdf0e10cSrcweir                         && ! IsFloatGrabWindow()
4316cdf0e10cSrcweir                         )
4317cdf0e10cSrcweir                     {
4318cdf0e10cSrcweir                         for( std::list< X11SalFrame* >::const_iterator it = maChildren.begin();
4319cdf0e10cSrcweir                              it != maChildren.end(); ++it )
4320cdf0e10cSrcweir                         {
4321cdf0e10cSrcweir                             if( (*it)->mbTransientForRoot )
4322cdf0e10cSrcweir                                 pDisplay_->getWMAdaptor()->changeReferenceFrame( *it, this );
4323cdf0e10cSrcweir                         }
4324cdf0e10cSrcweir                     }
4325cdf0e10cSrcweir 
4326cdf0e10cSrcweir                     if( hPresentationWindow != None && GetShellWindow() == hPresentationWindow )
4327cdf0e10cSrcweir                         XSetInputFocus( GetXDisplay(), GetShellWindow(), RevertToParent, CurrentTime );
4328cdf0e10cSrcweir                     /*  For unknown reasons Dtwm does respect the input_hint
4329cdf0e10cSrcweir                      *  set to False, but not when mapping the window. So
4330cdf0e10cSrcweir                      *  emulate the correct behaviour and set the focus back
4331cdf0e10cSrcweir                      *  to where it most probably should have been.
4332cdf0e10cSrcweir                      */
4333cdf0e10cSrcweir                     if( (nStyle_ & SAL_FRAME_STYLE_OWNERDRAWDECORATION) &&
4334cdf0e10cSrcweir                         mpParent &&
4335cdf0e10cSrcweir                         GetDisplay()->getWMAdaptor()->getWindowManagerName().EqualsAscii( "Dtwm" )
4336cdf0e10cSrcweir                         )
4337cdf0e10cSrcweir                     {
4338cdf0e10cSrcweir                         XSetInputFocus( GetXDisplay(),
4339cdf0e10cSrcweir                                         mpParent->GetShellWindow(),
4340cdf0e10cSrcweir                                         RevertToParent,
4341cdf0e10cSrcweir                                         CurrentTime );
4342cdf0e10cSrcweir                         bSetFocus = false;
4343cdf0e10cSrcweir                     }
4344cdf0e10cSrcweir 
4345cdf0e10cSrcweir                     if( bSetFocus )
4346cdf0e10cSrcweir                     {
4347cdf0e10cSrcweir                         XSetInputFocus( GetXDisplay(),
4348cdf0e10cSrcweir                                         GetShellWindow(),
4349cdf0e10cSrcweir                                         RevertToParent,
4350cdf0e10cSrcweir                                         CurrentTime );
4351cdf0e10cSrcweir                     }
4352cdf0e10cSrcweir 
4353cdf0e10cSrcweir 
4354cdf0e10cSrcweir                     RestackChildren();
4355cdf0e10cSrcweir                     mbInShow = sal_False;
4356cdf0e10cSrcweir                     m_bSetFocusOnMap = false;
4357cdf0e10cSrcweir 				}
4358cdf0e10cSrcweir 				break;
4359cdf0e10cSrcweir 
4360cdf0e10cSrcweir 			case UnmapNotify:
4361cdf0e10cSrcweir 				if( pEvent->xunmap.window == GetShellWindow() )
4362cdf0e10cSrcweir 				{
4363cdf0e10cSrcweir 					bMapped_   = sal_False;
4364cdf0e10cSrcweir 					bViewable_ = sal_False;
4365cdf0e10cSrcweir 					nRet = sal_True;
4366cdf0e10cSrcweir 					if ( mpInputContext != NULL )
4367cdf0e10cSrcweir 						mpInputContext->Unmap( this );
4368cdf0e10cSrcweir 					CallCallback( SALEVENT_RESIZE, NULL );
4369cdf0e10cSrcweir 				}
4370cdf0e10cSrcweir 				break;
4371cdf0e10cSrcweir 
4372cdf0e10cSrcweir 			case ConfigureNotify:
4373cdf0e10cSrcweir 				if( pEvent->xconfigure.window == GetShellWindow()
4374cdf0e10cSrcweir                     || pEvent->xconfigure.window == GetWindow() )
4375cdf0e10cSrcweir 					nRet = HandleSizeEvent( &pEvent->xconfigure );
4376cdf0e10cSrcweir 				break;
4377cdf0e10cSrcweir 
4378cdf0e10cSrcweir 			case VisibilityNotify:
4379cdf0e10cSrcweir 				nVisibility_ = pEvent->xvisibility.state;
4380cdf0e10cSrcweir 				nRet = sal_True;
4381cdf0e10cSrcweir                 if( bAlwaysOnTop_
4382cdf0e10cSrcweir                     && bMapped_
4383cdf0e10cSrcweir                     && ! GetDisplay()->getWMAdaptor()->isAlwaysOnTopOK()
4384cdf0e10cSrcweir                     && nVisibility_ != VisibilityUnobscured )
4385cdf0e10cSrcweir                     maAlwaysOnTopRaiseTimer.Start();
4386cdf0e10cSrcweir             break;
4387cdf0e10cSrcweir 
4388cdf0e10cSrcweir 			case ReparentNotify:
4389cdf0e10cSrcweir 				nRet = HandleReparentEvent( &pEvent->xreparent );
4390cdf0e10cSrcweir 				break;
4391cdf0e10cSrcweir 
4392cdf0e10cSrcweir 			case MappingNotify:
4393cdf0e10cSrcweir 				if( MappingPointer != pEvent->xmapping.request )
4394cdf0e10cSrcweir 					nRet = CallCallback( SALEVENT_KEYBOARDCHANGED, 0 );
4395cdf0e10cSrcweir 				break;
4396cdf0e10cSrcweir 
4397cdf0e10cSrcweir 			case ColormapNotify:
4398cdf0e10cSrcweir 				nRet = HandleColormapEvent( &pEvent->xcolormap );
4399cdf0e10cSrcweir 				break;
4400cdf0e10cSrcweir 
4401cdf0e10cSrcweir 			case PropertyNotify:
4402cdf0e10cSrcweir 			{
4403cdf0e10cSrcweir 				if( pEvent->xproperty.atom == pDisplay_->getWMAdaptor()->getAtom( WMAdaptor::WM_STATE ) )
4404cdf0e10cSrcweir 					nRet = HandleStateEvent( &pEvent->xproperty );
4405cdf0e10cSrcweir 				else
4406cdf0e10cSrcweir 					nRet = pDisplay_->getWMAdaptor()->handlePropertyNotify( this, &pEvent->xproperty );
4407cdf0e10cSrcweir 				break;
4408cdf0e10cSrcweir 			}
4409cdf0e10cSrcweir 
4410cdf0e10cSrcweir 			case ClientMessage:
4411cdf0e10cSrcweir 				nRet = HandleClientMessage( &pEvent->xclient );
4412cdf0e10cSrcweir 				break;
4413cdf0e10cSrcweir 		}
4414cdf0e10cSrcweir 	}
4415cdf0e10cSrcweir 	else
4416cdf0e10cSrcweir 	{
4417cdf0e10cSrcweir 		switch( pEvent->type )
4418cdf0e10cSrcweir 		{
4419cdf0e10cSrcweir  			case FocusIn:
4420cdf0e10cSrcweir  			case FocusOut:
4421cdf0e10cSrcweir                 if( ( nStyle_ & SAL_FRAME_STYLE_PLUG )
4422cdf0e10cSrcweir                     && ( pEvent->xfocus.window == GetShellWindow()
4423cdf0e10cSrcweir                          || pEvent->xfocus.window == GetForeignParent() )
4424cdf0e10cSrcweir                     )
4425cdf0e10cSrcweir                 {
4426cdf0e10cSrcweir                     nRet = HandleFocusEvent( &pEvent->xfocus );
4427cdf0e10cSrcweir                 }
4428cdf0e10cSrcweir  				break;
4429cdf0e10cSrcweir 
4430cdf0e10cSrcweir 			case ConfigureNotify:
4431cdf0e10cSrcweir 				if( pEvent->xconfigure.window == GetForeignParent() ||
4432cdf0e10cSrcweir 					pEvent->xconfigure.window == GetShellWindow() )
4433cdf0e10cSrcweir 					nRet = HandleSizeEvent( &pEvent->xconfigure );
4434cdf0e10cSrcweir 
4435cdf0e10cSrcweir 				if( pEvent->xconfigure.window == GetStackingWindow() )
4436cdf0e10cSrcweir                     nRet = HandleSizeEvent( &pEvent->xconfigure );
4437cdf0e10cSrcweir 
4438cdf0e10cSrcweir 				RestackChildren();
4439cdf0e10cSrcweir 				break;
4440cdf0e10cSrcweir 		}
4441cdf0e10cSrcweir 	}
4442cdf0e10cSrcweir 
4443cdf0e10cSrcweir 	return nRet;
4444cdf0e10cSrcweir }
4445cdf0e10cSrcweir 
ResetClipRegion()4446cdf0e10cSrcweir void X11SalFrame::ResetClipRegion()
4447cdf0e10cSrcweir {
4448cdf0e10cSrcweir     delete [] m_pClipRectangles;
4449cdf0e10cSrcweir     m_pClipRectangles = NULL;
4450cdf0e10cSrcweir     m_nCurClipRect = m_nMaxClipRect = 0;
4451cdf0e10cSrcweir 
4452cdf0e10cSrcweir 	const int	dest_kind	= ShapeBounding;
4453cdf0e10cSrcweir 	const int	op			= ShapeSet;
4454cdf0e10cSrcweir 	const int	ordering	= YSorted;
4455cdf0e10cSrcweir 
4456cdf0e10cSrcweir 	XWindowAttributes win_attrib;
4457cdf0e10cSrcweir 	XRectangle		  win_size;
4458cdf0e10cSrcweir 
4459cdf0e10cSrcweir 	XLIB_Window aShapeWindow = mhShellWindow;
4460cdf0e10cSrcweir 
4461cdf0e10cSrcweir 	XGetWindowAttributes ( GetDisplay()->GetDisplay(),
4462cdf0e10cSrcweir 						   aShapeWindow,
4463cdf0e10cSrcweir 						   &win_attrib );
4464cdf0e10cSrcweir 
4465cdf0e10cSrcweir 	win_size.x		= 0;
4466cdf0e10cSrcweir 	win_size.y		= 0;
4467cdf0e10cSrcweir 	win_size.width	= win_attrib.width;
4468cdf0e10cSrcweir 	win_size.height = win_attrib.height;
4469cdf0e10cSrcweir 
4470cdf0e10cSrcweir 	XShapeCombineRectangles ( GetDisplay()->GetDisplay(),
4471cdf0e10cSrcweir 							  aShapeWindow,
4472cdf0e10cSrcweir 							  dest_kind,
4473cdf0e10cSrcweir 							  0, 0, 			// x_off, y_off
4474cdf0e10cSrcweir 							  &win_size,		// list of rectangles
4475cdf0e10cSrcweir 							  1,				// number of rectangles
4476cdf0e10cSrcweir 							  op, ordering );
4477cdf0e10cSrcweir }
4478cdf0e10cSrcweir 
BeginSetClipRegion(sal_uLong nRects)4479cdf0e10cSrcweir void X11SalFrame::BeginSetClipRegion( sal_uLong nRects )
4480cdf0e10cSrcweir {
4481cdf0e10cSrcweir     if( m_pClipRectangles )
4482cdf0e10cSrcweir         delete [] m_pClipRectangles;
4483cdf0e10cSrcweir     if( nRects )
4484cdf0e10cSrcweir         m_pClipRectangles = new XRectangle[nRects];
4485cdf0e10cSrcweir     else
4486cdf0e10cSrcweir         m_pClipRectangles = NULL;
4487cdf0e10cSrcweir     m_nMaxClipRect = static_cast<int>(nRects);
4488cdf0e10cSrcweir     m_nCurClipRect = 0;
4489cdf0e10cSrcweir }
4490cdf0e10cSrcweir 
UnionClipRegion(long nX,long nY,long nWidth,long nHeight)4491cdf0e10cSrcweir void X11SalFrame::UnionClipRegion( long nX, long nY, long nWidth, long nHeight )
4492cdf0e10cSrcweir {
4493cdf0e10cSrcweir     if( m_pClipRectangles && m_nCurClipRect < m_nMaxClipRect )
4494cdf0e10cSrcweir     {
4495cdf0e10cSrcweir         m_pClipRectangles[m_nCurClipRect].x      = nX;
4496cdf0e10cSrcweir         m_pClipRectangles[m_nCurClipRect].y      = nY;
4497cdf0e10cSrcweir         m_pClipRectangles[m_nCurClipRect].width  = nWidth;
4498cdf0e10cSrcweir         m_pClipRectangles[m_nCurClipRect].height = nHeight;
4499cdf0e10cSrcweir         m_nCurClipRect++;
4500cdf0e10cSrcweir     }
4501cdf0e10cSrcweir }
4502cdf0e10cSrcweir 
EndSetClipRegion()4503cdf0e10cSrcweir void X11SalFrame::EndSetClipRegion()
4504cdf0e10cSrcweir {
4505cdf0e10cSrcweir 	const int	dest_kind	= ShapeBounding;
4506cdf0e10cSrcweir 	const int	ordering	= YSorted;
4507cdf0e10cSrcweir 	const int	op = ShapeSet;
4508cdf0e10cSrcweir 
4509cdf0e10cSrcweir 	XLIB_Window aShapeWindow = mhShellWindow;
4510cdf0e10cSrcweir 	XShapeCombineRectangles ( GetDisplay()->GetDisplay(),
4511cdf0e10cSrcweir 							  aShapeWindow,
4512cdf0e10cSrcweir 							  dest_kind,
4513cdf0e10cSrcweir 							  0, 0, // x_off, y_off
4514cdf0e10cSrcweir 							  m_pClipRectangles,
4515cdf0e10cSrcweir 							  m_nCurClipRect,
4516cdf0e10cSrcweir 							  op, ordering );
4517cdf0e10cSrcweir 
4518cdf0e10cSrcweir }
4519cdf0e10cSrcweir 
4520