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