sd/source/ui/remotecontrol/Receiver.cxx | 88 ++++++++++++++++++++++++++++-- slideshow/Library_slideshow.mk | 1 slideshow/source/engine/pointersymbol.cxx | 37 +++++++++--- slideshow/source/engine/pointersymbol.hxx | 11 ++- slideshow/source/engine/slideshowimpl.cxx | 36 ++++++++++++ slideshow/source/engine/waitsymbol.cxx | 2 6 files changed, 158 insertions(+), 17 deletions(-)
New commits: commit 731f3d986eb13468681ae9a7ef491897a078f675 Author: Siqi LIU <m...@siqi.fr> Date: Sun Aug 4 14:17:55 2013 +0200 request immdiateupdate for pointerSymbol, but bad performance Change-Id: I943019f6f6c6aaddeb40bf7f56bd0ffefff8a6b3 diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx index f7a3f8c..593ff99 100644 --- a/sd/source/ui/remotecontrol/Receiver.cxx +++ b/sd/source/ui/remotecontrol/Receiver.cxx @@ -132,11 +132,32 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) } else if (aCommand[0].equals( "pointer_started" )) { - std::cerr << "pointer_started" << std::endl; + // std::cerr << "pointer_started" << std::endl; + float x = aCommand[1].toFloat(); + float y = aCommand[2].toFloat(); SolarMutexGuard aSolarGuard; + + const ::com::sun::star::geometry::RealPoint2D pos(x,y); + // std::cerr << "Pointer at ("<<pos.X<<","<<pos.Y<<")" << std::endl; + + if (xSlideShow.is()) try + { + // std::cerr << "pointer_coordination in the is" << std::endl; + xSlideShow->setProperty( + beans::PropertyValue( "PointerPosition" , + -1, + makeAny( pos ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + SAL_WARN( "sd.slideshow", "sd::SlideShowImpl::setPointerPosition(), " + "exception caught: " << comphelper::anyToString( cppu::getCaughtException() )); + } + if (xSlideShow.is()) try { - std::cerr << "pointer_started in the is" << std::endl; + // std::cerr << "pointer_started in the is" << std::endl; xSlideShow->setProperty( beans::PropertyValue( "PointerVisible" , -1, @@ -148,15 +169,16 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) SAL_WARN( "sd.slideshow", "sd::SlideShowImpl::setPointerMode(), " "exception caught: " << comphelper::anyToString( cppu::getCaughtException() )); } + SAL_INFO( "sdremote", "Pointer started, we display the pointer on screen" ); } else if (aCommand[0].equals( "pointer_dismissed" )) { - std::cerr << "pointer_dismissed" << std::endl; + // std::cerr << "pointer_dismissed" << std::endl; SolarMutexGuard aSolarGuard; if (xSlideShow.is()) try { - std::cerr << "pointer_dismissed in the is" << std::endl; + // std::cerr << "pointer_dismissed in the is" << std::endl; xSlideShow->setProperty( beans::PropertyValue( "PointerVisible" , -1, @@ -178,12 +200,12 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) SAL_INFO( "sdremote", "Pointer at ("<<x<<","<<y<<")" ); const ::com::sun::star::geometry::RealPoint2D pos(x,y); - std::cerr << "Pointer at ("<<pos.X<<","<<pos.Y<<")" << std::endl; + // std::cerr << "Pointer at ("<<pos.X<<","<<pos.Y<<")" << std::endl; SolarMutexGuard aSolarGuard; if (xSlideShow.is()) try { - std::cerr << "pointer_coordination in the is" << std::endl; + // std::cerr << "pointer_coordination in the is" << std::endl; xSlideShow->setProperty( beans::PropertyValue( "PointerPosition" , -1, diff --git a/slideshow/source/engine/pointersymbol.cxx b/slideshow/source/engine/pointersymbol.cxx index 8629ea7..d0e7fce 100644 --- a/slideshow/source/engine/pointersymbol.cxx +++ b/slideshow/source/engine/pointersymbol.cxx @@ -119,11 +119,15 @@ basegfx::B2DPoint PointerSymbol::calcSpritePos( const uno::Reference<rendering::XBitmap> xBitmap( rView->getCanvas()->getUNOCanvas(), uno::UNO_QUERY_THROW ); const geometry::IntegerSize2D realSize( xBitmap->getSize() ); - return basegfx::B2DPoint( + + basegfx::B2DPoint newPos( // pos.X pos.Y are given in 0..1, beginning from the upper left corner of the currentSlide. - std::min<sal_Int32>( realSize.Width * pos.X, LEFT_BORDER_SPACE ), - std::max<sal_Int32>( 0, realSize.Height * (1-pos.Y) - mxBitmap->getSize().Height - - LOWER_BORDER_SPACE ) ); + realSize.Width * pos.X, + realSize.Height * pos.Y); + + // std::cerr << "calcSpritePos : (" << newPos.getX() << ","<<newPos.getY() << ")" << std::endl; + + return newPos; } void PointerSymbol::viewAdded( const UnoViewSharedPtr& rView ) @@ -215,9 +219,11 @@ void PointerSymbol::viewsChanged(const ::com::sun::star::geometry::RealPoint2D p ViewsVecT::const_iterator const aEnd ( maViews.end() ); while( aIter != aEnd ) { - if( aIter->second ) + if( aIter->second ) { aIter->second->movePixel( calcSpritePos( aIter->first, pos )); + mrScreenUpdater.requestImmediateUpdate(); + } ++aIter; } } diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx index db207a8..ded62b4 100644 --- a/slideshow/source/engine/slideshowimpl.cxx +++ b/slideshow/source/engine/slideshowimpl.cxx @@ -1809,7 +1809,7 @@ sal_Bool SlideShowImpl::setProperty( beans::PropertyValue const& rProperty ) if (! (rProperty.Value >>= pos)) return false; - std::cerr<<"Received pos at :(" << pos.X << ","<<pos.Y << ")" << std::endl; + // std::cerr<<"Received pos at :(" << pos.X << ","<<pos.Y << ")" << std::endl; mpPointerSymbol->viewsChanged(pos); } commit dffc87dd13daf9a2f2f629cd50558995aadc4d19 Author: Siqi LIU <m...@siqi.fr> Date: Sun Aug 4 13:10:55 2013 +0200 pointer display on the screen Change-Id: I43c91bdf6c364da282d354e5a07f871a9247f2d6 diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx index 5ea11e40..f7a3f8c 100644 --- a/sd/source/ui/remotecontrol/Receiver.cxx +++ b/sd/source/ui/remotecontrol/Receiver.cxx @@ -16,14 +16,23 @@ #include <com/sun/star/uno/RuntimeException.hpp> #include <comphelper/processfactory.hxx> +#include <comphelper/anytostring.hxx> +#include "cppuhelper/exc_hlp.hxx" #include <osl/file.hxx> #include <rtl/ustrbuf.hxx> #include <rtl/strbuf.hxx> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/presentation/SlideShow.hpp> using namespace sd; using namespace ::com::sun::star; using namespace ::osl; using namespace std; +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::presentation; +using namespace ::com::sun::star::beans; Receiver::Receiver( Transmitter *aTransmitter ) { @@ -61,6 +70,7 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) { uno::Reference<presentation::XSlideShowController> xSlideShowController; uno::Reference<presentation::XPresentation2> xPresentation; + uno::Reference<presentation::XSlideShow> xSlideShow; try { uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create( ::comphelper::getProcessComponentContext() ); uno::Reference< frame::XFrame > xFrame ( xFramesSupplier->getActiveFrame(), uno::UNO_QUERY_THROW ); @@ -70,6 +80,8 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) // Throws an exception if now slideshow running xSlideShowController = uno::Reference<presentation::XSlideShowController>( xPresentation->getController(), uno::UNO_QUERY_THROW ); + xSlideShow = uno::Reference<presentation::XSlideShow>( + xSlideShowController->getSlideShow(), uno::UNO_QUERY_THROW ); } catch (uno::RuntimeException &) { @@ -120,12 +132,43 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) } else if (aCommand[0].equals( "pointer_started" )) { - // xSlideShowController->setPointerMode(true); + std::cerr << "pointer_started" << std::endl; + SolarMutexGuard aSolarGuard; + if (xSlideShow.is()) try + { + std::cerr << "pointer_started in the is" << std::endl; + xSlideShow->setProperty( + beans::PropertyValue( "PointerVisible" , + -1, + makeAny( true ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + SAL_WARN( "sd.slideshow", "sd::SlideShowImpl::setPointerMode(), " + "exception caught: " << comphelper::anyToString( cppu::getCaughtException() )); + } SAL_INFO( "sdremote", "Pointer started, we display the pointer on screen" ); } else if (aCommand[0].equals( "pointer_dismissed" )) { - // xSlideShowController->setPointerMode(false); + std::cerr << "pointer_dismissed" << std::endl; + SolarMutexGuard aSolarGuard; + if (xSlideShow.is()) try + { + std::cerr << "pointer_dismissed in the is" << std::endl; + xSlideShow->setProperty( + beans::PropertyValue( "PointerVisible" , + -1, + makeAny( false ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + SAL_WARN( "sd.slideshow", "sd::SlideShowImpl::setPointerMode(), " + "exception caught: " << comphelper::anyToString( cppu::getCaughtException() )); + } + SAL_INFO( "sdremote", "Pointer dismissed, we hide the pointer on screen" ); } else if (aCommand[0].equals( "pointer_coordination" )) @@ -135,8 +178,23 @@ void Receiver::executeCommand( const std::vector<OString> &aCommand ) SAL_INFO( "sdremote", "Pointer at ("<<x<<","<<y<<")" ); const ::com::sun::star::geometry::RealPoint2D pos(x,y); - // Same problem here... - // xSlideShowController->setPointerPosition(pos); + std::cerr << "Pointer at ("<<pos.X<<","<<pos.Y<<")" << std::endl; + + SolarMutexGuard aSolarGuard; + if (xSlideShow.is()) try + { + std::cerr << "pointer_coordination in the is" << std::endl; + xSlideShow->setProperty( + beans::PropertyValue( "PointerPosition" , + -1, + makeAny( pos ), + beans::PropertyState_DIRECT_VALUE ) ); + } + catch ( Exception& ) + { + SAL_WARN( "sd.slideshow", "sd::SlideShowImpl::setPointerPosition(), " + "exception caught: " << comphelper::anyToString( cppu::getCaughtException() )); + } } else if ( aCommand[0].equals( "presentation_resume" ) ) { diff --git a/slideshow/Library_slideshow.mk b/slideshow/Library_slideshow.mk index 3e79255..e8485ef 100644 --- a/slideshow/Library_slideshow.mk +++ b/slideshow/Library_slideshow.mk @@ -142,6 +142,7 @@ $(eval $(call gb_Library_add_exception_objects,slideshow,\ slideshow/source/engine/unoviewcontainer \ slideshow/source/engine/usereventqueue \ slideshow/source/engine/waitsymbol \ + slideshow/source/engine/pointersymbol \ slideshow/source/engine/wakeupevent \ )) diff --git a/slideshow/source/engine/pointersymbol.cxx b/slideshow/source/engine/pointersymbol.cxx index 48ad0e5..8629ea7 100644 --- a/slideshow/source/engine/pointersymbol.cxx +++ b/slideshow/source/engine/pointersymbol.cxx @@ -28,6 +28,7 @@ #include <basegfx/vector/b2dvector.hxx> #include <com/sun/star/rendering/XCanvas.hpp> +#include "com/sun/star/uno/Reference.hxx" #include "pointersymbol.hxx" #include "eventmultiplexer.hxx" @@ -51,8 +52,8 @@ PointerSymbolSharedPtr PointerSymbol::create( const uno::Reference<rendering::XB { PointerSymbolSharedPtr pRet( new PointerSymbol( xBitmap, - rScreenUpdater, - rViewContainer )); + rScreenUpdater, + rViewContainer )); rEventMultiplexer.addViewHandler( pRet ); @@ -100,8 +101,20 @@ void PointerSymbol::setVisible( const bool bVisible ) } } +basegfx::B2DPoint PointerSymbol::calcSpritePos( UnoViewSharedPtr const & rView ) const +{ + const uno::Reference<rendering::XBitmap> xBitmap( rView->getCanvas()->getUNOCanvas(), + uno::UNO_QUERY_THROW ); + const geometry::IntegerSize2D realSize( xBitmap->getSize() ); + return basegfx::B2DPoint( + // pos.X pos.Y are given in 0..1, beginning from the upper left corner of the currentSlide. + std::min<sal_Int32>( 0, LEFT_BORDER_SPACE ), + std::max<sal_Int32>( 0, realSize.Height * 1 - mxBitmap->getSize().Height + - LOWER_BORDER_SPACE ) ); +} + basegfx::B2DPoint PointerSymbol::calcSpritePos( - UnoViewSharedPtr const & rView, const ::com::sun::star::geometry::RealPoint2D& pos) const + UnoViewSharedPtr const & rView, const ::com::sun::star::geometry::RealPoint2D pos) const { const uno::Reference<rendering::XBitmap> xBitmap( rView->getCanvas()->getUNOCanvas(), uno::UNO_QUERY_THROW ); @@ -195,7 +208,7 @@ void PointerSymbol::viewsChanged() } } -void PointerSymbol::viewsChanged(const ::com::sun::star::geometry::RealPoint2D& pos) +void PointerSymbol::viewsChanged(const ::com::sun::star::geometry::RealPoint2D pos) { // reposition sprites on all views ViewsVecT::const_iterator aIter( maViews.begin() ); @@ -210,6 +223,6 @@ void PointerSymbol::viewsChanged(const ::com::sun::star::geometry::RealPoint2D& } } // namespace internal -} // namespace presentation +} // namespace slideshow /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/slideshow/source/engine/pointersymbol.hxx b/slideshow/source/engine/pointersymbol.hxx index 9dc2818..77309e7 100644 --- a/slideshow/source/engine/pointersymbol.hxx +++ b/slideshow/source/engine/pointersymbol.hxx @@ -14,6 +14,8 @@ #include <com/sun/star/rendering/XBitmap.hpp> #include <cppcanvas/customsprite.hxx> +#include "com/sun/star/uno/Reference.hxx" + #include "vieweventhandler.hxx" #include "screenupdater.hxx" #include "eventmultiplexer.hxx" @@ -24,6 +26,8 @@ #include <boost/utility.hpp> // for noncopyable #include <vector> +using namespace com::sun::star; + namespace slideshow { namespace internal { @@ -49,7 +53,8 @@ public: void hide() { setVisible(false); } /** Use this method to update the pointer's position */ - virtual void viewsChanged(const ::com::sun::star::geometry::RealPoint2D& pos); + void setVisible( const bool bVisible ); + virtual void viewsChanged(const ::com::sun::star::geometry::RealPoint2D pos); private: PointerSymbol( const ::com::sun::star::uno::Reference< @@ -63,9 +68,9 @@ private: virtual void viewChanged( const UnoViewSharedPtr& rView ); virtual void viewsChanged(); - void setVisible( const bool bVisible ); - basegfx::B2DPoint calcSpritePos( UnoViewSharedPtr const & rView, const ::com::sun::star::geometry::RealPoint2D& pos = ::com::sun::star::geometry::RealPoint2D(0, 0) ) const; + ::basegfx::B2DPoint calcSpritePos( UnoViewSharedPtr const & rView, const ::com::sun::star::geometry::RealPoint2D pos ) const; + ::basegfx::B2DPoint calcSpritePos( UnoViewSharedPtr const & rView ) const; template <typename func_type> void for_each_sprite( func_type const & func ) const diff --git a/slideshow/source/engine/slideshowimpl.cxx b/slideshow/source/engine/slideshowimpl.cxx index f9e8ed8..db207a8 100644 --- a/slideshow/source/engine/slideshowimpl.cxx +++ b/slideshow/source/engine/slideshowimpl.cxx @@ -95,6 +95,7 @@ #include "waitsymbol.hxx" #include "effectrewinder.hxx" #include "framerate.hxx" +#include "pointersymbol.hxx" #include <boost/noncopyable.hpp> #include <boost/bind.hpp> @@ -459,6 +460,8 @@ private: boost::shared_ptr<RehearseTimingsActivity> mpRehearseTimingsActivity; boost::shared_ptr<WaitSymbol> mpWaitSymbol; + boost::shared_ptr<PointerSymbol> mpPointerSymbol; + /// the current slide transition sound object: SoundPlayerSharedPtr mpCurrentSlideTransitionSound; @@ -579,6 +582,7 @@ SlideShowImpl::SlideShowImpl( mpListener(), mpRehearseTimingsActivity(), mpWaitSymbol(), + mpPointerSymbol(), mpCurrentSlideTransitionSound(), mxComponentContext( xContext ), mxOptionalTransitionFactory(), @@ -653,6 +657,7 @@ void SlideShowImpl::disposing() } mpWaitSymbol.reset(); + mpPointerSymbol.reset(); if( mpRehearseTimingsActivity ) { @@ -1777,6 +1782,37 @@ sal_Bool SlideShowImpl::setProperty( beans::PropertyValue const& rProperty ) return true; } + if ( rProperty.Name == "PointerSymbolBitmap" ) + { + uno::Reference<rendering::XBitmap> xBitmap; + if (! (rProperty.Value >>= xBitmap)) + return false; + + mpPointerSymbol = PointerSymbol::create( xBitmap, + maScreenUpdater, + maEventMultiplexer, + maViewContainer ); + + return true; + } + + if ( rProperty.Name == "PointerVisible" ) + { + bool visible; + rProperty.Value >>= visible; + mpPointerSymbol->setVisible(visible); + } + + if ( rProperty.Name == "PointerPosition") + { + ::com::sun::star::geometry::RealPoint2D pos; + if (! (rProperty.Value >>= pos)) + return false; + + std::cerr<<"Received pos at :(" << pos.X << ","<<pos.Y << ")" << std::endl; + mpPointerSymbol->viewsChanged(pos); + } + if (rProperty.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("NoSlideTransitions") )) { diff --git a/slideshow/source/engine/waitsymbol.cxx b/slideshow/source/engine/waitsymbol.cxx index 01ce9db..6c56ac7 100644 --- a/slideshow/source/engine/waitsymbol.cxx +++ b/slideshow/source/engine/waitsymbol.cxx @@ -195,6 +195,6 @@ void WaitSymbol::viewsChanged() } } // namespace internal -} // namespace presentation +} // namespace slideshow /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits