Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <string.h>
21 : #include "vcl/syswin.hxx"
22 : #include "headless/svpframe.hxx"
23 : #include "headless/svpinst.hxx"
24 : #include "headless/svpgdi.hxx"
25 :
26 : #include <basebmp/bitmapdevice.hxx>
27 : #include <basebmp/scanlineformats.hxx>
28 : #include <basegfx/vector/b2ivector.hxx>
29 :
30 : using namespace basebmp;
31 : using namespace basegfx;
32 :
33 : SvpSalFrame* SvpSalFrame::s_pFocusFrame = NULL;
34 :
35 : #ifndef IOS
36 :
37 : namespace {
38 : /// Decouple SalFrame lifetime from damagetracker lifetime
39 : struct DamageTracker : public basebmp::IBitmapDeviceDamageTracker
40 : {
41 0 : DamageTracker( SvpSalFrame& rFrame ) : m_rFrame( rFrame ) {}
42 0 : virtual ~DamageTracker() {}
43 0 : virtual void damaged( const basegfx::B2IBox& rDamageRect ) const SAL_OVERRIDE
44 : {
45 0 : m_rFrame.damaged( rDamageRect );
46 0 : }
47 : SvpSalFrame& m_rFrame;
48 : };
49 : }
50 :
51 0 : void SvpSalFrame::enableDamageTracker( bool bOn )
52 : {
53 0 : if( m_bDamageTracking == bOn )
54 0 : return;
55 0 : if( m_aFrame.get() )
56 : {
57 0 : if( m_bDamageTracking )
58 0 : m_aFrame->setDamageTracker( basebmp::IBitmapDeviceDamageTrackerSharedPtr() );
59 : else
60 : m_aFrame->setDamageTracker(
61 0 : basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
62 : }
63 0 : m_bDamageTracking = bOn;
64 : }
65 :
66 : #endif
67 :
68 12438 : SvpSalFrame::SvpSalFrame( SvpSalInstance* pInstance,
69 : SalFrame* pParent,
70 : sal_uLong nSalFrameStyle,
71 : bool bTopDown,
72 : basebmp::Format nScanlineFormat,
73 : SystemParentData* ) :
74 : m_pInstance( pInstance ),
75 : m_pParent( static_cast<SvpSalFrame*>(pParent) ),
76 : m_nStyle( nSalFrameStyle ),
77 : m_bVisible( false ),
78 : m_bTopDown( bTopDown ),
79 : #ifndef IOS
80 : m_bDamageTracking( false ),
81 : #endif
82 : m_nScanlineFormat( nScanlineFormat ),
83 : m_nMinWidth( 0 ),
84 : m_nMinHeight( 0 ),
85 : m_nMaxWidth( 0 ),
86 12438 : m_nMaxHeight( 0 )
87 : {
88 : // SAL_DEBUG("SvpSalFrame::SvpSalFrame: " << this);
89 : // fast and easy cross-platform wiping of the data
90 12438 : memset( (void *)&m_aSystemChildData, 0, sizeof( SystemEnvData ) );
91 12438 : m_aSystemChildData.nSize = sizeof( SystemEnvData );
92 : #ifdef IOS
93 : // Nothing
94 : #elif defined ANDROID
95 : // Nothing
96 : #else
97 12438 : m_aSystemChildData.pSalFrame = this;
98 12438 : m_aSystemChildData.nDepth = 24;
99 : #endif
100 :
101 12438 : if( m_pParent )
102 6314 : m_pParent->m_aChildren.push_back( this );
103 :
104 12438 : if( m_pInstance )
105 12438 : m_pInstance->registerFrame( this );
106 :
107 12438 : SetPosSize( 0, 0, 800, 600, SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
108 12438 : }
109 :
110 37260 : SvpSalFrame::~SvpSalFrame()
111 : {
112 12420 : if( m_pInstance )
113 12420 : m_pInstance->deregisterFrame( this );
114 :
115 12420 : std::list<SvpSalFrame*> Children = m_aChildren;
116 37260 : for( std::list<SvpSalFrame*>::iterator it = Children.begin();
117 24840 : it != Children.end(); ++it )
118 0 : (*it)->SetParent( m_pParent );
119 12420 : if( m_pParent )
120 6314 : m_pParent->m_aChildren.remove( this );
121 :
122 12420 : if( s_pFocusFrame == this )
123 : {
124 : // SAL_DEBUG("SvpSalFrame::~SvpSalFrame: losing focus: " << this);
125 16 : s_pFocusFrame = NULL;
126 : // call directly here, else an event for a destroyed frame would be dispatched
127 16 : CallCallback( SALEVENT_LOSEFOCUS, NULL );
128 : // if the handler has not set a new focus frame
129 : // pass focus to another frame, preferably a document style window
130 16 : if( s_pFocusFrame == NULL )
131 : {
132 16 : const std::list< SalFrame* >& rFrames( m_pInstance->getFrames() );
133 34 : for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
134 : {
135 26 : SvpSalFrame* pFrame = const_cast<SvpSalFrame*>(static_cast<const SvpSalFrame*>(*it));
136 34 : if( pFrame->m_bVisible &&
137 16 : pFrame->m_pParent == NULL &&
138 8 : (pFrame->m_nStyle & (SAL_FRAME_STYLE_MOVEABLE |
139 : SAL_FRAME_STYLE_SIZEABLE |
140 : SAL_FRAME_STYLE_CLOSEABLE) ) != 0
141 : )
142 : {
143 8 : pFrame->GetFocus();
144 8 : break;
145 : }
146 : }
147 : }
148 12420 : }
149 24840 : }
150 :
151 16572 : void SvpSalFrame::GetFocus()
152 : {
153 16572 : if( s_pFocusFrame == this )
154 27610 : return;
155 :
156 5534 : if( (m_nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_FLOAT)) == 0 )
157 : {
158 5534 : if( s_pFocusFrame )
159 54 : s_pFocusFrame->LoseFocus();
160 : // SAL_DEBUG("SvpSalFrame::GetFocus(): " << this);
161 5534 : s_pFocusFrame = this;
162 5534 : m_pInstance->PostEvent( this, NULL, SALEVENT_GETFOCUS );
163 : }
164 : }
165 :
166 5652 : void SvpSalFrame::LoseFocus()
167 : {
168 5652 : if( s_pFocusFrame == this )
169 : {
170 : // SAL_DEBUG("SvpSalFrame::LoseFocus: " << this);
171 5514 : m_pInstance->PostEvent( this, NULL, SALEVENT_LOSEFOCUS );
172 5514 : s_pFocusFrame = NULL;
173 : }
174 5652 : }
175 :
176 422753 : SalGraphics* SvpSalFrame::AcquireGraphics()
177 : {
178 422753 : SvpSalGraphics* pGraphics = new SvpSalGraphics();
179 : #ifndef IOS
180 422753 : pGraphics->setDevice( m_aFrame );
181 : #endif
182 422753 : m_aGraphics.push_back( pGraphics );
183 422753 : return pGraphics;
184 : }
185 :
186 422455 : void SvpSalFrame::ReleaseGraphics( SalGraphics* pGraphics )
187 : {
188 422455 : SvpSalGraphics* pSvpGraphics = dynamic_cast<SvpSalGraphics*>(pGraphics);
189 422455 : m_aGraphics.remove( pSvpGraphics );
190 422455 : delete pSvpGraphics;
191 422455 : }
192 :
193 83552 : bool SvpSalFrame::PostEvent( void* pData )
194 : {
195 83552 : m_pInstance->PostEvent( this, pData, SALEVENT_USEREVENT );
196 83552 : return true;
197 : }
198 :
199 5207 : void SvpSalFrame::PostPaint(bool bImmediate) const
200 : {
201 5207 : if( m_bVisible )
202 : {
203 5172 : SalPaintEvent aPEvt(0, 0, maGeometry.nWidth, maGeometry.nHeight);
204 5172 : aPEvt.mbImmediateUpdate = bImmediate;
205 5172 : CallCallback( SALEVENT_PAINT, &aPEvt );
206 : }
207 5207 : }
208 :
209 11516 : void SvpSalFrame::SetTitle( const OUString& )
210 : {
211 11516 : }
212 :
213 5590 : void SvpSalFrame::SetIcon( sal_uInt16 )
214 : {
215 5590 : }
216 :
217 0 : void SvpSalFrame::SetMenu( SalMenu* )
218 : {
219 0 : }
220 :
221 0 : void SvpSalFrame::DrawMenuBar()
222 : {
223 0 : }
224 :
225 8444 : void SvpSalFrame::SetExtendedFrameStyle( SalExtStyle )
226 : {
227 8444 : }
228 :
229 11200 : void SvpSalFrame::Show( bool bVisible, bool bNoActivate )
230 : {
231 11200 : if( bVisible && ! m_bVisible )
232 : {
233 : // SAL_DEBUG("SvpSalFrame::Show: showing: " << this);
234 5602 : m_bVisible = true;
235 5602 : m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
236 11204 : if( ! bNoActivate )
237 5510 : GetFocus();
238 : }
239 5598 : else if( ! bVisible && m_bVisible )
240 : {
241 : // SAL_DEBUG("SvpSalFrame::Show: hiding: " << this);
242 5598 : m_bVisible = false;
243 5598 : m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
244 5598 : LoseFocus();
245 : }
246 : else
247 : {
248 : // SAL_DEBUG("SvpSalFrame::Show: nothihg: " << this);
249 : }
250 11200 : }
251 :
252 70 : void SvpSalFrame::SetMinClientSize( long nWidth, long nHeight )
253 : {
254 70 : m_nMinWidth = nWidth;
255 70 : m_nMinHeight = nHeight;
256 70 : }
257 :
258 0 : void SvpSalFrame::SetMaxClientSize( long nWidth, long nHeight )
259 : {
260 0 : m_nMaxWidth = nWidth;
261 0 : m_nMaxHeight = nHeight;
262 0 : }
263 :
264 29095 : void SvpSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags )
265 : {
266 29095 : if( (nFlags & SAL_FRAME_POSSIZE_X) != 0 )
267 5488 : maGeometry.nX = nX;
268 29095 : if( (nFlags & SAL_FRAME_POSSIZE_Y) != 0 )
269 5488 : maGeometry.nY = nY;
270 29095 : if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 )
271 : {
272 29055 : maGeometry.nWidth = nWidth;
273 29055 : if( m_nMaxWidth > 0 && maGeometry.nWidth > (unsigned int)m_nMaxWidth )
274 0 : maGeometry.nWidth = m_nMaxWidth;
275 29055 : if( m_nMinWidth > 0 && maGeometry.nWidth < (unsigned int)m_nMinWidth )
276 0 : maGeometry.nWidth = m_nMinWidth;
277 : }
278 29095 : if( (nFlags & SAL_FRAME_POSSIZE_HEIGHT) != 0 )
279 : {
280 29055 : maGeometry.nHeight = nHeight;
281 29055 : if( m_nMaxHeight > 0 && maGeometry.nHeight > (unsigned int)m_nMaxHeight )
282 0 : maGeometry.nHeight = m_nMaxHeight;
283 29055 : if( m_nMinHeight > 0 && maGeometry.nHeight < (unsigned int)m_nMinHeight )
284 0 : maGeometry.nHeight = m_nMinHeight;
285 : }
286 : #ifndef IOS
287 29095 : B2IVector aFrameSize( maGeometry.nWidth, maGeometry.nHeight );
288 29095 : if( ! m_aFrame.get() || m_aFrame->getSize() != aFrameSize )
289 : {
290 19087 : if( aFrameSize.getX() == 0 )
291 4 : aFrameSize.setX( 1 );
292 19087 : if( aFrameSize.getY() == 0 )
293 4 : aFrameSize.setY( 1 );
294 19087 : m_aFrame = createBitmapDevice( aFrameSize, m_bTopDown, m_nScanlineFormat );
295 19087 : if (m_bDamageTracking)
296 : m_aFrame->setDamageTracker(
297 0 : basebmp::IBitmapDeviceDamageTrackerSharedPtr( new DamageTracker( *this ) ) );
298 : // update device in existing graphics
299 197082 : for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin();
300 131388 : it != m_aGraphics.end(); ++it )
301 : {
302 46607 : (*it)->setDevice( m_aFrame );
303 : }
304 : }
305 29095 : if( m_bVisible )
306 32 : m_pInstance->PostEvent( this, NULL, SALEVENT_RESIZE );
307 : #endif
308 29095 : }
309 :
310 11153 : void SvpSalFrame::GetClientSize( long& rWidth, long& rHeight )
311 : {
312 11153 : if( m_bVisible )
313 : {
314 5286 : rWidth = maGeometry.nWidth;
315 5286 : rHeight = maGeometry.nHeight;
316 : }
317 : else
318 5867 : rWidth = rHeight = 0;
319 11153 : }
320 :
321 32500 : void SvpSalFrame::GetWorkArea( Rectangle& rRect )
322 : {
323 : rRect = Rectangle( Point( 0, 0 ),
324 32500 : Size( VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT ) );
325 32500 : }
326 :
327 44988 : SalFrame* SvpSalFrame::GetParent() const
328 : {
329 44988 : return m_pParent;
330 : }
331 :
332 : #define _FRAMESTATE_MASK_GEOMETRY \
333 : (WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | \
334 : WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT)
335 :
336 5602 : void SvpSalFrame::SetWindowState( const SalFrameState *pState )
337 : {
338 5602 : if (pState == NULL)
339 5602 : return;
340 :
341 : // Request for position or size change
342 5602 : if (pState->mnMask & _FRAMESTATE_MASK_GEOMETRY)
343 : {
344 5426 : long nX = maGeometry.nX;
345 5426 : long nY = maGeometry.nY;
346 5426 : long nWidth = maGeometry.nWidth;
347 5426 : long nHeight = maGeometry.nHeight;
348 :
349 : // change requested properties
350 5426 : if (pState->mnMask & WINDOWSTATE_MASK_X)
351 5426 : nX = pState->mnX;
352 5426 : if (pState->mnMask & WINDOWSTATE_MASK_Y)
353 5426 : nY = pState->mnY;
354 5426 : if (pState->mnMask & WINDOWSTATE_MASK_WIDTH)
355 5366 : nWidth = pState->mnWidth;
356 5426 : if (pState->mnMask & WINDOWSTATE_MASK_HEIGHT)
357 5366 : nHeight = pState->mnHeight;
358 :
359 : SetPosSize( nX, nY, nWidth, nHeight,
360 : SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y |
361 5426 : SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
362 : }
363 : }
364 :
365 21988 : bool SvpSalFrame::GetWindowState( SalFrameState* pState )
366 : {
367 21988 : pState->mnState = WINDOWSTATE_STATE_NORMAL;
368 21988 : pState->mnX = maGeometry.nX;
369 21988 : pState->mnY = maGeometry.nY;
370 21988 : pState->mnWidth = maGeometry.nWidth;
371 21988 : pState->mnHeight = maGeometry.nHeight;
372 21988 : pState->mnMask = _FRAMESTATE_MASK_GEOMETRY | WINDOWSTATE_MASK_STATE;
373 :
374 21988 : return true;
375 : }
376 :
377 0 : void SvpSalFrame::ShowFullScreen( bool, sal_Int32 )
378 : {
379 : SetPosSize( 0, 0, VIRTUAL_DESKTOP_WIDTH, VIRTUAL_DESKTOP_HEIGHT,
380 0 : SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
381 0 : }
382 :
383 0 : void SvpSalFrame::StartPresentation( bool )
384 : {
385 0 : }
386 :
387 0 : void SvpSalFrame::SetAlwaysOnTop( bool )
388 : {
389 0 : }
390 :
391 11054 : void SvpSalFrame::ToTop( sal_uInt16 )
392 : {
393 11054 : GetFocus();
394 11054 : }
395 :
396 0 : void SvpSalFrame::SetPointer( PointerStyle )
397 : {
398 0 : }
399 :
400 0 : void SvpSalFrame::CaptureMouse( bool )
401 : {
402 0 : }
403 :
404 0 : void SvpSalFrame::SetPointerPos( long, long )
405 : {
406 0 : }
407 :
408 121588 : void SvpSalFrame::Flush()
409 : {
410 121588 : }
411 :
412 0 : void SvpSalFrame::Sync()
413 : {
414 0 : }
415 :
416 9423 : void SvpSalFrame::SetInputContext( SalInputContext* )
417 : {
418 9423 : }
419 :
420 0 : void SvpSalFrame::EndExtTextInput( sal_uInt16 )
421 : {
422 0 : }
423 :
424 89730 : OUString SvpSalFrame::GetKeyName( sal_uInt16 )
425 : {
426 89730 : return OUString();
427 : }
428 :
429 0 : bool SvpSalFrame::MapUnicodeToKeyCode( sal_Unicode, LanguageType, vcl::KeyCode& )
430 : {
431 0 : return false;
432 : }
433 :
434 4741 : LanguageType SvpSalFrame::GetInputLanguage()
435 : {
436 4741 : return LANGUAGE_DONTKNOW;
437 : }
438 :
439 1140 : void SvpSalFrame::UpdateSettings( AllSettings& )
440 : {
441 1140 : }
442 :
443 0 : void SvpSalFrame::Beep()
444 : {
445 0 : }
446 :
447 15538 : const SystemEnvData* SvpSalFrame::GetSystemData() const
448 : {
449 15538 : return &m_aSystemChildData;
450 : }
451 :
452 427 : SalFrame::SalPointerState SvpSalFrame::GetPointerState()
453 : {
454 427 : SalPointerState aState;
455 427 : aState.mnState = 0;
456 427 : return aState;
457 : }
458 :
459 0 : SalFrame::SalIndicatorState SvpSalFrame::GetIndicatorState()
460 : {
461 : SalIndicatorState aState;
462 0 : aState.mnState = 0;
463 0 : return aState;
464 : }
465 :
466 0 : void SvpSalFrame::SimulateKeyPress( sal_uInt16 /*nKeyCode*/ )
467 : {
468 0 : }
469 :
470 4528 : void SvpSalFrame::SetParent( SalFrame* pNewParent )
471 : {
472 4528 : if( m_pParent )
473 4528 : m_pParent->m_aChildren.remove( this );
474 4528 : m_pParent = static_cast<SvpSalFrame*>(pNewParent);
475 4528 : }
476 :
477 0 : bool SvpSalFrame::SetPluginParent( SystemParentData* )
478 : {
479 0 : return true;
480 : }
481 :
482 0 : void SvpSalFrame::ResetClipRegion()
483 : {
484 0 : }
485 :
486 0 : void SvpSalFrame::BeginSetClipRegion( sal_uLong )
487 : {
488 0 : }
489 :
490 0 : void SvpSalFrame::UnionClipRegion( long, long, long, long )
491 : {
492 0 : }
493 :
494 0 : void SvpSalFrame::EndSetClipRegion()
495 : {
496 1125 : }
497 :
498 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|