/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include #include #include "gstwindow.hxx" #include "gstplayer.hxx" #include #include using namespace ::com::sun::star; namespace avmedia { namespace gst { // --------------------- // - PlayerChildWindow - // --------------------- class PlayerChildWindow : public SystemChildWindow { public: PlayerChildWindow( Window* pParent ); ~PlayerChildWindow(); protected: virtual void MouseMove( const MouseEvent& rMEvt ); virtual void MouseButtonDown( const MouseEvent& rMEvt ); virtual void MouseButtonUp( const MouseEvent& rMEvt ); virtual void KeyInput( const KeyEvent& rKEvt ); virtual void KeyUp( const KeyEvent& rKEvt ); virtual void Command( const CommandEvent& rCEvt ); }; // --------------------------------------------------------------------- PlayerChildWindow::PlayerChildWindow( Window* pParent ) : SystemChildWindow( pParent, WB_CLIPCHILDREN ) { } // --------------------------------------------------------------------- PlayerChildWindow::~PlayerChildWindow() { } // --------------------------------------------------------------------- void PlayerChildWindow::MouseMove( const MouseEvent& rMEvt ) { const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() ); SystemChildWindow::MouseMove( rMEvt ); GetParent()->MouseMove( aTransformedEvent ); } // --------------------------------------------------------------------- void PlayerChildWindow::MouseButtonDown( const MouseEvent& rMEvt ) { const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() ); SystemChildWindow::MouseButtonDown( rMEvt ); GetParent()->MouseButtonDown( aTransformedEvent ); } // --------------------------------------------------------------------- void PlayerChildWindow::MouseButtonUp( const MouseEvent& rMEvt ) { const MouseEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) ), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), rMEvt.GetModifier() ); SystemChildWindow::MouseButtonUp( rMEvt ); GetParent()->MouseButtonUp( aTransformedEvent ); } // --------------------------------------------------------------------- void PlayerChildWindow::KeyInput( const KeyEvent& rKEvt ) { SystemChildWindow::KeyInput( rKEvt ); GetParent()->KeyInput( rKEvt ); } // --------------------------------------------------------------------- void PlayerChildWindow::KeyUp( const KeyEvent& rKEvt ) { SystemChildWindow::KeyUp( rKEvt ); GetParent()->KeyUp( rKEvt ); } // --------------------------------------------------------------------- void PlayerChildWindow::Command( const CommandEvent& rCEvt ) { const CommandEvent aTransformedEvent( GetParent()->ScreenToOutputPixel( OutputToScreenPixel( rCEvt.GetMousePosPixel() ) ), rCEvt.GetCommand(), rCEvt.IsMouseEvent(), rCEvt.GetData() ); SystemChildWindow::Command( rCEvt ); GetParent()->Command( aTransformedEvent ); } // --------------- // - Window - // --------------- Window::Window( ::avmedia::gst::Player& rPlayer ) : maListeners( maMutex ), maWindowRect( 0, 0, 0, 0 ), mrPlayer( rPlayer ), mpPlayerWindow( NULL ), meZoomLevel( media::ZoomLevel_NOT_AVAILABLE ), mnPointerType( awt::SystemPointer::ARROW ) {} // ------------------------------------------------------------------------------ Window::~Window() { dispose(); } // ------------------------------------------------------------------------------ void Window::implLayoutVideoWindow() { if( mpPlayerWindow && ( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel ) ) { awt::Size aPrefSize( mrPlayer.getPreferredPlayerWindowSize() ); awt::Rectangle aRect = getPosSize(); int nW = aRect.Width, nH = aRect.Height; int nVideoW = nW, nVideoH = nH; int nX = 0, nY = 0, nWidth = 0, nHeight = 0; bool bDone = false, bZoom = false; if( media::ZoomLevel_ORIGINAL == meZoomLevel ) { bZoom = true; } else if( media::ZoomLevel_ZOOM_1_TO_4 == meZoomLevel ) { aPrefSize.Width >>= 2; aPrefSize.Height >>= 2; bZoom = true; } else if( media::ZoomLevel_ZOOM_1_TO_2 == meZoomLevel ) { aPrefSize.Width >>= 1; aPrefSize.Height >>= 1; bZoom = true; } else if( media::ZoomLevel_ZOOM_2_TO_1 == meZoomLevel ) { aPrefSize.Width <<= 1; aPrefSize.Height <<= 1; bZoom = true; } else if( media::ZoomLevel_ZOOM_4_TO_1 == meZoomLevel ) { aPrefSize.Width <<= 2; aPrefSize.Height <<= 2; bZoom = true; } else if( media::ZoomLevel_FIT_TO_WINDOW == meZoomLevel ) { nWidth = nVideoW; nHeight = nVideoH; bDone = true; } if( bZoom ) { if( ( aPrefSize.Width <= nVideoW ) && ( aPrefSize.Height <= nVideoH ) ) { nX = ( nVideoW - aPrefSize.Width ) >> 1; nY = ( nVideoH - aPrefSize.Height ) >> 1; nWidth = aPrefSize.Width; nHeight = aPrefSize.Height; bDone = true; } } if( !bDone ) { if( ( aPrefSize.Width > 0 ) && ( aPrefSize.Height > 0 ) && ( nVideoW > 0 ) && ( nVideoH > 0 ) ) { double fPrefWH = (double) aPrefSize.Width / aPrefSize.Height; if( fPrefWH < ( (double) nVideoW / nVideoH ) ) { nVideoW = (int) ( nVideoH * fPrefWH ); } else { nVideoH = (int) ( nVideoW / fPrefWH ); } nX = ( nW - nVideoW ) >> 1; nY = ( nH - nVideoH ) >> 1; nWidth = nVideoW; nHeight = nVideoH; } else { nX = nY = nWidth = nHeight = 0; } } mpPlayerWindow->SetPosSizePixel( Point( nX, nY ), Size( nWidth, nHeight ) ); } } // ------------------------------------------------------------------------------ bool Window::create( const uno::Sequence< uno::Any >& rArguments ) { OSL_ASSERT( !mpPlayerWindow ); OSL_ENSURE( rArguments.getLength() > 2, "::avmedia::gst::Windiow::create: GStreamer backend needs \ valid parent SystemChildWindow pointer (sal_IntPtr) as third Any \ value in sequence of arguments" ); bool bRet = false; if( !mpPlayerWindow && ( rArguments.getLength() > 2 ) ) { SystemChildWindow* pParentWindow = NULL; sal_IntPtr pIntPtr = 0; // we are not interested in the first argument, which is a pure X11 window handle; // this backend relies on a SystemChildWindow as parent for the PlayerWindow, given // as third Sal_IntPtr value within the argument Sequence rArguments[ 1 ] >>= maWindowRect; rArguments[ 2 ] >>= pIntPtr; pParentWindow = reinterpret_cast< SystemChildWindow* >( pIntPtr ); if( pParentWindow ) { meZoomLevel = media::ZoomLevel_FIT_TO_WINDOW; mpPlayerWindow = new PlayerChildWindow( pParentWindow ); mpPlayerWindow->SetBackground( Color( COL_BLACK ) ); mpPlayerWindow->SetPosSizePixel( Point( maWindowRect.X, maWindowRect.Y ), Size( maWindowRect.Width, maWindowRect.Height ) ); mpPlayerWindow->Show(); bRet = true; } } return( bRet ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::update() throw( uno::RuntimeException ) { if( mpPlayerWindow ) { mpPlayerWindow->Invalidate( INVALIDATE_UPDATE ); mpPlayerWindow->Sync(); } } // ------------------------------------------------------------------------------ sal_Bool SAL_CALL Window::setZoomLevel( media::ZoomLevel eZoomLevel ) throw(uno::RuntimeException) { bool bRet = false; if( ( media::ZoomLevel_NOT_AVAILABLE != meZoomLevel ) && ( media::ZoomLevel_NOT_AVAILABLE != eZoomLevel ) ) { if( eZoomLevel != meZoomLevel ) { meZoomLevel = eZoomLevel; implLayoutVideoWindow(); } bRet = true; } return( bRet ); } // ------------------------------------------------------------------------------ media::ZoomLevel SAL_CALL Window::getZoomLevel() throw( uno::RuntimeException ) { return( meZoomLevel ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::setPointerType( sal_Int32 nPointerType ) throw( uno::RuntimeException ) { if( mpPlayerWindow ) { Pointer ePointer = POINTER_ARROW; switch( nPointerType ) { case (awt::SystemPointer::CROSS) : { ePointer = POINTER_CROSS; } break; case (awt::SystemPointer::HAND) : { ePointer = POINTER_HAND; } break; case (awt::SystemPointer::MOVE) : { ePointer = POINTER_MOVE; } break; case (awt::SystemPointer::WAIT) : { ePointer = POINTER_WAIT; } break; default: break; } mpPlayerWindow->SetPointer( ePointer ); } } // ------------------------------------------------------------------------------ void SAL_CALL Window::setPosSize( sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 /* Flags */ ) throw( uno::RuntimeException ) { maWindowRect.X = nX; maWindowRect.Y = nY; maWindowRect.Width = nWidth; maWindowRect.Height = nHeight; implLayoutVideoWindow(); } // ------------------------------------------------------------------------------ awt::Rectangle SAL_CALL Window::getPosSize() throw( uno::RuntimeException ) { return( maWindowRect ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::setVisible( sal_Bool bVisible ) throw( uno::RuntimeException ) { if( mpPlayerWindow ) { bVisible ? mpPlayerWindow->Show() : mpPlayerWindow->Hide(); } } // ------------------------------------------------------------------------------ void SAL_CALL Window::setEnable( sal_Bool bEnable ) throw( uno::RuntimeException ) { if( mpPlayerWindow ) { mpPlayerWindow->Enable( bEnable ); } } // ------------------------------------------------------------------------------ void SAL_CALL Window::setFocus() throw( uno::RuntimeException ) { if( mpPlayerWindow ) { mpPlayerWindow->GrabFocus(); } } // ------------------------------------------------------------------------------ void SAL_CALL Window::addWindowListener( const uno::Reference< awt::XWindowListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeWindowListener( const uno::Reference< awt::XWindowListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::addFocusListener( const uno::Reference< awt::XFocusListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeFocusListener( const uno::Reference< awt::XFocusListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::addKeyListener( const uno::Reference< awt::XKeyListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeKeyListener( const uno::Reference< awt::XKeyListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::addMouseListener( const uno::Reference< awt::XMouseListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeMouseListener( const uno::Reference< awt::XMouseListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::addMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::addPaintListener( const uno::Reference< awt::XPaintListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removePaintListener( const uno::Reference< awt::XPaintListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::dispose() throw( uno::RuntimeException ) { delete mpPlayerWindow; mpPlayerWindow = NULL; } // ------------------------------------------------------------------------------ void SAL_CALL Window::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException ) { maListeners.addInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void SAL_CALL Window::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) throw( uno::RuntimeException ) { maListeners.removeInterface( getCppuType( &xListener ), xListener ); } // ------------------------------------------------------------------------------ void Window::fireMousePressedEvent( const ::com::sun::star::awt::MouseEvent& rEvt ) { ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseListener >* ) 0 ) ); if( pContainer ) { ::cppu::OInterfaceIteratorHelper aIter( *pContainer ); while( aIter.hasMoreElements() ) { uno::Reference< awt::XMouseListener >( aIter.next(), uno::UNO_QUERY )->mousePressed( rEvt ); } } } // ----------------------------------------------------------------------------- void Window::fireMouseReleasedEvent( const ::com::sun::star::awt::MouseEvent& rEvt ) { ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseListener >* ) 0 ) ); if( pContainer ) { ::cppu::OInterfaceIteratorHelper aIter( *pContainer ); while( aIter.hasMoreElements() ) { uno::Reference< awt::XMouseListener >( aIter.next(), uno::UNO_QUERY )->mouseReleased( rEvt ); } } } // ----------------------------------------------------------------------------- void Window::fireMouseMovedEvent( const ::com::sun::star::awt::MouseEvent& rEvt ) { ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( ( uno::Reference< awt::XMouseMotionListener >* ) 0 ) ); if( pContainer ) { ::cppu::OInterfaceIteratorHelper aIter( *pContainer ); while( aIter.hasMoreElements() ) { uno::Reference< awt::XMouseMotionListener >( aIter.next(), uno::UNO_QUERY )->mouseMoved( rEvt ); } } } // ----------------------------------------------------------------------------- void Window::fireSetFocusEvent( const ::com::sun::star::awt::FocusEvent& rEvt ) { ::cppu::OInterfaceContainerHelper* pContainer = maListeners.getContainer( getCppuType( ( uno::Reference< awt::XFocusListener >* ) 0 ) ); if( pContainer ) { ::cppu::OInterfaceIteratorHelper aIter( *pContainer ); while( aIter.hasMoreElements() ) { uno::Reference< awt::XFocusListener >( aIter.next(), uno::UNO_QUERY )->focusGained( rEvt ); } } } // ------------------------------------------------------------------------------ long Window::getXWindowHandle() const { return( mpPlayerWindow ? mpPlayerWindow->GetSystemData()->aWindow : 0 ); } // ------------------------------------------------------------------------------ ::rtl::OUString SAL_CALL Window::getImplementationName() throw( uno::RuntimeException ) { return( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_GSTREAMER_WINDOW_IMPLEMENTATIONNAME ) ) ); } // ------------------------------------------------------------------------------ sal_Bool SAL_CALL Window::supportsService( const ::rtl::OUString& ServiceName ) throw( uno::RuntimeException ) { return( ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( AVMEDIA_GSTREAMER_WINDOW_SERVICENAME ) ) ); } // ------------------------------------------------------------------------------ uno::Sequence< ::rtl::OUString > SAL_CALL Window::getSupportedServiceNames() throw( uno::RuntimeException ) { uno::Sequence< ::rtl::OUString > aRet( 1 ); aRet[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_GSTREAMER_WINDOW_SERVICENAME ) ); return( aRet ); } } // namespace gst } // namespace avmedia