From 49f38b850c63d5886c18a351979e6ebdac81868a Mon Sep 17 00:00:00 2001 From: Philipp Lohmann Date: Tue, 24 Nov 2009 12:04:19 +0000 Subject: #i107080# autorelease pool only on first yield --- vcl/aqua/source/app/salinst.cxx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/vcl/aqua/source/app/salinst.cxx b/vcl/aqua/source/app/salinst.cxx index e4037df0c4aa..cd291fdfbbf2 100644 --- a/vcl/aqua/source/app/salinst.cxx +++ b/vcl/aqua/source/app/salinst.cxx @@ -675,8 +675,21 @@ class ReleasePoolHolder { NSAutoreleasePool* mpPool; public: - ReleasePoolHolder() : mpPool( [[NSAutoreleasePool alloc] init] ) {} - ~ReleasePoolHolder() { [mpPool release]; } + ReleasePoolHolder() : mpPool( nil ) + { + // NSAutoreleasePool documentation suggests we should have + // an own pool for each yield level + // #i107080# however shows us that doing that can easily crash + // while VoiceOver is active. So for now let's create an + // autorelease pool only for the top of the yield stack + if( ImplGetSVData()->maAppData.mnDispatchLevel == 1 ) + mpPool = [[NSAutoreleasePool alloc] init]; + } + ~ReleasePoolHolder() + { + if( mpPool ) + [mpPool release]; + } }; void AquaSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents ) @@ -685,8 +698,6 @@ void AquaSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents ) // will therefore not be destroyed by cocoa implicitly SalData::ensureThreadAutoreleasePool(); - // NSAutoreleasePool documentation suggests we should have - // an own pool for each yield level ReleasePoolHolder aReleasePool; // Release all locks so that we don't deadlock when we pull pending -- cgit From 3ef399fb3302214147ed2dd97e5f8717666a5acd Mon Sep 17 00:00:00 2001 From: Philipp Lohmann Date: Wed, 25 Nov 2009 12:34:59 +0000 Subject: revert earlier ineffective change --- vcl/aqua/source/app/salinst.cxx | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/vcl/aqua/source/app/salinst.cxx b/vcl/aqua/source/app/salinst.cxx index cd291fdfbbf2..e4037df0c4aa 100644 --- a/vcl/aqua/source/app/salinst.cxx +++ b/vcl/aqua/source/app/salinst.cxx @@ -675,21 +675,8 @@ class ReleasePoolHolder { NSAutoreleasePool* mpPool; public: - ReleasePoolHolder() : mpPool( nil ) - { - // NSAutoreleasePool documentation suggests we should have - // an own pool for each yield level - // #i107080# however shows us that doing that can easily crash - // while VoiceOver is active. So for now let's create an - // autorelease pool only for the top of the yield stack - if( ImplGetSVData()->maAppData.mnDispatchLevel == 1 ) - mpPool = [[NSAutoreleasePool alloc] init]; - } - ~ReleasePoolHolder() - { - if( mpPool ) - [mpPool release]; - } + ReleasePoolHolder() : mpPool( [[NSAutoreleasePool alloc] init] ) {} + ~ReleasePoolHolder() { [mpPool release]; } }; void AquaSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents ) @@ -698,6 +685,8 @@ void AquaSalInstance::Yield( bool bWait, bool bHandleAllCurrentEvents ) // will therefore not be destroyed by cocoa implicitly SalData::ensureThreadAutoreleasePool(); + // NSAutoreleasePool documentation suggests we should have + // an own pool for each yield level ReleasePoolHolder aReleasePool; // Release all locks so that we don't deadlock when we pull pending -- cgit From d14ff396c43feebd0cbceb7cdc327ad56024195a Mon Sep 17 00:00:00 2001 From: Philipp Lohmann Date: Thu, 26 Nov 2009 10:50:48 +0000 Subject: #i107204# fix some native shortcuts on Snow Leopard --- vcl/aqua/inc/salframeview.h | 6 ++++++ vcl/aqua/source/window/salframeview.mm | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/vcl/aqua/inc/salframeview.h b/vcl/aqua/inc/salframeview.h index 7fd4d96c4a45..e823837e7af6 100755 --- a/vcl/aqua/inc/salframeview.h +++ b/vcl/aqua/inc/salframeview.h @@ -132,7 +132,11 @@ -(void)moveWordForwardAndModifySelection: (id)aSender; -(void)moveWordRightAndModifySelection: (id)aSender; -(void)moveToEndOfLine: (id)aSender; +-(void)moveToRightEndOfLine: (id)aSender; +-(void)moveToLeftEndOfLine: (id)aSender; -(void)moveToEndOfLineAndModifySelection: (id)aSender; +-(void)moveToRightEndOfLineAndModifySelection: (id)aSender; +-(void)moveToLeftEndOfLineAndModifySelection: (id)aSender; -(void)moveToBeginningOfLine: (id)aSender; -(void)moveToBeginningOfLineAndModifySelection: (id)aSender; -(void)moveToEndOfParagraph: (id)aSender; @@ -144,8 +148,10 @@ -(void)moveParagraphBackward: (id)aSender; -(void)moveParagraphBackwardAndModifySelection: (id)aSender; -(void)moveToEndOfDocument: (id)aSender; +-(void)scrollToEndOfDocument: (id)aSender; -(void)moveToEndOfDocumentAndModifySelection: (id)aSender; -(void)moveToBeginningOfDocument: (id)aSender; +-(void)scrollToBeginningOfDocument: (id)aSender; -(void)moveToBeginningOfDocumentAndModifySelection: (id)aSender; -(void)insertNewline: (id)aSender; -(void)deleteBackward: (id)aSender; diff --git a/vcl/aqua/source/window/salframeview.mm b/vcl/aqua/source/window/salframeview.mm index aabc287dc885..51f1b1a3b63c 100755 --- a/vcl/aqua/source/window/salframeview.mm +++ b/vcl/aqua/source/window/salframeview.mm @@ -1065,21 +1065,41 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToRightEndOfLine: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToEndOfLineAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToRightEndOfLineAndModifySelection: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfLine: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToLeftEndOfLine: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfLineAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToLeftEndOfLineAndModifySelection: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToEndOfParagraph: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH character: 0 modifiers: 0]; @@ -1125,6 +1145,12 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; } +-(void)scrollToEndOfDocument: (id)aSender +{ + // this is not exactly what we should do, but it makes "End" and "Shift-End" behave consistent + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; +} + -(void)moveToEndOfDocumentAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; @@ -1135,6 +1161,12 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; } +-(void)scrollToBeginningOfDocument: (id)aSender +{ + // this is not exactly what we should do, but it makes "Home" and "Shift-Home" behave consistent + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfDocumentAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; @@ -1462,6 +1494,9 @@ private: { if( AquaSalFrame::isAlive( mpFrame ) ) { + #if OSL_DEBUG_LEVEL > 1 + // fprintf( stderr, "SalFrameView: doCommandBySelector %s\n", (char*)aSelector ); + #endif if( (mpFrame->mnICOptions & SAL_INPUTCONTEXT_TEXT) != 0 && aSelector != NULL && [self respondsToSelector: aSelector] ) { -- cgit From ab651c33a7a67bb50f49015d7bccb18fd7eae8e3 Mon Sep 17 00:00:00 2001 From: Thorsten Behrens Date: Fri, 27 Nov 2009 17:39:26 +0000 Subject: #i107248# Free render Picture before killing underlying drawable --- vcl/unx/gtk/window/gtkframe.cxx | 5 +++++ vcl/unx/inc/salframe.h | 2 +- vcl/unx/source/window/salframe.cxx | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index 99a331be2318..92ff2d3b8d8e 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -2377,6 +2377,11 @@ void GtkSalFrame::createNewWindow( XLIB_Window aNewParent, bool bXEmbed, int nSc } } + // free xrender resources + for( unsigned int i = 0; i < sizeof(m_aGraphics)/sizeof(m_aGraphics[0]); i++ ) + if( m_aGraphics[i].bInUse ) + m_aGraphics[i].pGraphics->SetDrawable( None, m_nScreen ); + // first deinit frame if( m_pIMHandler ) { diff --git a/vcl/unx/inc/salframe.h b/vcl/unx/inc/salframe.h index 848f2250d31c..c640b0398a97 100644 --- a/vcl/unx/inc/salframe.h +++ b/vcl/unx/inc/salframe.h @@ -212,7 +212,7 @@ public: virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics* pGraphics ); - virtual void updateGraphics(); + virtual void updateGraphics( Drawable drawable ); virtual BOOL PostEvent( void* pData ); diff --git a/vcl/unx/source/window/salframe.cxx b/vcl/unx/source/window/salframe.cxx index 6219b50d6ec3..37f995838d48 100644 --- a/vcl/unx/source/window/salframe.cxx +++ b/vcl/unx/source/window/salframe.cxx @@ -930,12 +930,12 @@ void X11SalFrame::ReleaseGraphics( SalGraphics *pGraphics ) pGraphics_ = NULL; } -void X11SalFrame::updateGraphics() +void X11SalFrame::updateGraphics( Drawable drawable ) { if( pGraphics_ ) - pGraphics_->SetDrawable( GetWindow(), m_nScreen ); + pGraphics_->SetDrawable( drawable, m_nScreen ); if( pFreeGraphics_ ) - pFreeGraphics_->SetDrawable( GetWindow(), m_nScreen ); + pFreeGraphics_->SetDrawable( drawable, m_nScreen ); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -2726,6 +2726,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) } // first deinit frame + updateGraphics(None); if( mpInputContext ) { mpInputContext->UnsetICFocus( this ); @@ -2748,7 +2749,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) Init( nStyle_ & ~SAL_FRAME_STYLE_PLUG, nScreen, NULL, true ); // update graphics if necessary - updateGraphics(); + updateGraphics(GetWindow()); if( m_aTitle.Len() ) SetTitle( m_aTitle ); -- cgit From 1ceebe9d381561079e7f7ca916d856224f81064a Mon Sep 17 00:00:00 2001 From: Philipp Lohmann Date: Mon, 30 Nov 2009 16:03:42 +0000 Subject: #i107080# invalidate is needed --- vcl/aqua/source/a11y/documentfocuslistener.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vcl/aqua/source/a11y/documentfocuslistener.cxx b/vcl/aqua/source/a11y/documentfocuslistener.cxx index 2bb1429bc9fe..f20a67a85f29 100644 --- a/vcl/aqua/source/a11y/documentfocuslistener.cxx +++ b/vcl/aqua/source/a11y/documentfocuslistener.cxx @@ -102,12 +102,12 @@ DocumentFocusListener::notifyEvent( const AccessibleEventObject& aEvent ) break; case AccessibleEventId::INVALIDATE_ALL_CHILDREN: -/* { + { Reference< XAccessible > xAccessible( getAccessible(aEvent) ); detachRecursive(xAccessible); attachRecursive(xAccessible); } -*/ + OSL_TRACE( "Invalidate all children called\n" ); break; default: -- cgit From 9612596d539624f9b2550264647732f1043bdbb6 Mon Sep 17 00:00:00 2001 From: Philipp Lohmann Date: Mon, 30 Nov 2009 17:15:30 +0000 Subject: #i107248# cleanup updateGraphics --- vcl/unx/inc/plugins/kde/kdedata.hxx | 2 +- vcl/unx/inc/salframe.h | 4 +++- vcl/unx/kde/salnativewidgets-kde.cxx | 5 +++-- vcl/unx/kde4/KDESalFrame.cxx | 5 +++-- vcl/unx/kde4/KDESalFrame.hxx | 2 +- vcl/unx/source/window/salframe.cxx | 11 ++++++----- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/vcl/unx/inc/plugins/kde/kdedata.hxx b/vcl/unx/inc/plugins/kde/kdedata.hxx index 831621e38cc1..04730b39fad2 100644 --- a/vcl/unx/inc/plugins/kde/kdedata.hxx +++ b/vcl/unx/inc/plugins/kde/kdedata.hxx @@ -75,7 +75,7 @@ public: virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics *pGraphics ); - virtual void updateGraphics(); + virtual void updateGraphics( bool bClear ); virtual void UpdateSettings( AllSettings& rSettings ); virtual void Show( BOOL bVisible, BOOL bNoActivate ); }; diff --git a/vcl/unx/inc/salframe.h b/vcl/unx/inc/salframe.h index c640b0398a97..8dad0350a937 100644 --- a/vcl/unx/inc/salframe.h +++ b/vcl/unx/inc/salframe.h @@ -212,7 +212,9 @@ public: virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics* pGraphics ); - virtual void updateGraphics( Drawable drawable ); + // call with true to clear graphics (setting None as drawable) + // call with false to setup graphics with window (GetWindow()) + virtual void updateGraphics( bool bClear ); virtual BOOL PostEvent( void* pData ); diff --git a/vcl/unx/kde/salnativewidgets-kde.cxx b/vcl/unx/kde/salnativewidgets-kde.cxx index 8046d22d75d3..8e294c0adecc 100644 --- a/vcl/unx/kde/salnativewidgets-kde.cxx +++ b/vcl/unx/kde/salnativewidgets-kde.cxx @@ -2073,12 +2073,13 @@ void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) } } -void KDESalFrame::updateGraphics() +void KDESalFrame::updateGraphics( bool bClear ) { + Drawable aDrawable = bClear ? None : GetWindow(); for( int i = 0; i < nMaxGraphics; i++ ) { if( m_aGraphics[i].bInUse ) - m_aGraphics[i].pGraphics->SetDrawable( GetWindow(), GetScreenNumber() ); + m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); } } diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx index 202d3dbcd517..6177c4b2896a 100644 --- a/vcl/unx/kde4/KDESalFrame.cxx +++ b/vcl/unx/kde4/KDESalFrame.cxx @@ -363,12 +363,13 @@ void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) } } -void KDESalFrame::updateGraphics() +void KDESalFrame::updateGraphics( bool bClear ) { + Drawable aDrawable = bClear ? None : GetWindow(); for( int i = 0; i < nMaxGraphics; i++ ) { if( m_aGraphics[i].bInUse ) - m_aGraphics[i].pGraphics->SetDrawable( GetWindow(), GetScreenNumber() ); + m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); } } diff --git a/vcl/unx/kde4/KDESalFrame.hxx b/vcl/unx/kde4/KDESalFrame.hxx index 11a22bd93ba5..de3a5af189ee 100644 --- a/vcl/unx/kde4/KDESalFrame.hxx +++ b/vcl/unx/kde4/KDESalFrame.hxx @@ -52,7 +52,7 @@ class KDESalFrame : public X11SalFrame virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics *pGraphics ); - virtual void updateGraphics(); + virtual void updateGraphics( bool bClear ); virtual void UpdateSettings( AllSettings& rSettings ); virtual void Show( BOOL bVisible, BOOL bNoActivate ); }; \ No newline at end of file diff --git a/vcl/unx/source/window/salframe.cxx b/vcl/unx/source/window/salframe.cxx index 37f995838d48..68c99e05da77 100644 --- a/vcl/unx/source/window/salframe.cxx +++ b/vcl/unx/source/window/salframe.cxx @@ -930,12 +930,13 @@ void X11SalFrame::ReleaseGraphics( SalGraphics *pGraphics ) pGraphics_ = NULL; } -void X11SalFrame::updateGraphics( Drawable drawable ) +void X11SalFrame::updateGraphics( bool bClear ) { + Drawable aDrawable = bClear ? None : GetWindow(); if( pGraphics_ ) - pGraphics_->SetDrawable( drawable, m_nScreen ); + pGraphics_->SetDrawable( aDrawable, m_nScreen ); if( pFreeGraphics_ ) - pFreeGraphics_->SetDrawable( drawable, m_nScreen ); + pFreeGraphics_->SetDrawable( aDrawable, m_nScreen ); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -2726,7 +2727,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) } // first deinit frame - updateGraphics(None); + updateGraphics(true); if( mpInputContext ) { mpInputContext->UnsetICFocus( this ); @@ -2749,7 +2750,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) Init( nStyle_ & ~SAL_FRAME_STYLE_PLUG, nScreen, NULL, true ); // update graphics if necessary - updateGraphics(GetWindow()); + updateGraphics(false); if( m_aTitle.Len() ) SetTitle( m_aTitle ); -- cgit