Commit 84ade0ea authored by Erwan Tulou's avatar Erwan Tulou

skins2: rework of vout manager

This patch does the following :
- as a vout window provider, make sure skins functions run by vout thread(s)
  don't issue any calls to the GUI. (skins on Linux runs fine at last !)
- prepare support for SET_VOUT_SET_FULLSCREEN new control
- implement hotkeys (no longer available at the vout level)
- modify a show() method not consistent across platform
- cleanup (dead code)
parent 9ad7729f
...@@ -32,6 +32,8 @@ SOURCES_skins2 = \ ...@@ -32,6 +32,8 @@ SOURCES_skins2 = \
commands/cmd_quit.hpp \ commands/cmd_quit.hpp \
commands/cmd_resize.cpp \ commands/cmd_resize.cpp \
commands/cmd_resize.hpp \ commands/cmd_resize.hpp \
commands/cmd_voutwindow.cpp \
commands/cmd_voutwindow.hpp \
commands/cmd_snapshot.cpp \ commands/cmd_snapshot.cpp \
commands/cmd_snapshot.hpp \ commands/cmd_snapshot.hpp \
commands/cmd_show_window.hpp \ commands/cmd_show_window.hpp \
......
...@@ -44,7 +44,6 @@ void CmdChangeSkin::execute() ...@@ -44,7 +44,6 @@ void CmdChangeSkin::execute()
pOldTheme->getWindowManager().hideAll(); pOldTheme->getWindowManager().hideAll();
} }
VoutManager::instance( getIntf() )->lockVout();
VoutManager::instance( getIntf() )->saveVoutConfig(); VoutManager::instance( getIntf() )->saveVoutConfig();
ThemeLoader loader( getIntf() ); ThemeLoader loader( getIntf() );
...@@ -57,7 +56,6 @@ void CmdChangeSkin::execute() ...@@ -57,7 +56,6 @@ void CmdChangeSkin::execute()
// restore vout config // restore vout config
VoutManager::instance( getIntf() )->restoreVoutConfig( true ); VoutManager::instance( getIntf() )->restoreVoutConfig( true );
VoutManager::instance( getIntf() )->unlockVout();
} }
else if( pOldTheme ) else if( pOldTheme )
{ {
...@@ -65,12 +63,10 @@ void CmdChangeSkin::execute() ...@@ -65,12 +63,10 @@ void CmdChangeSkin::execute()
" restoring the previous one" ); " restoring the previous one" );
getIntf()->p_sys->p_theme = pOldTheme; getIntf()->p_sys->p_theme = pOldTheme;
VoutManager::instance( getIntf() )->restoreVoutConfig( false ); VoutManager::instance( getIntf() )->restoreVoutConfig( false );
VoutManager::instance( getIntf() )->unlockVout();
pOldTheme->getWindowManager().restoreVisibility(); pOldTheme->getWindowManager().restoreVisibility();
} }
else else
{ {
VoutManager::instance( getIntf() )->unlockVout();
msg_Err( getIntf(), "cannot load the theme, aborting" ); msg_Err( getIntf(), "cannot load the theme, aborting" );
// Quit // Quit
CmdQuit cmd( getIntf() ); CmdQuit cmd( getIntf() );
......
...@@ -24,11 +24,10 @@ ...@@ -24,11 +24,10 @@
#include "cmd_resize.hpp" #include "cmd_resize.hpp"
#include "../src/generic_layout.hpp" #include "../src/generic_layout.hpp"
#include "../src/window_manager.hpp"
#include "../src/vlcproc.hpp" #include "../src/vlcproc.hpp"
#include "../src/vout_window.hpp" #include "../src/window_manager.hpp"
#include "../src/vout_manager.hpp"
#include "../controls/ctrl_video.hpp" #include "../controls/ctrl_video.hpp"
#include <vlc_vout.h>
CmdResize::CmdResize( intf_thread_t *pIntf, const WindowManager &rWindowManager, CmdResize::CmdResize( intf_thread_t *pIntf, const WindowManager &rWindowManager,
...@@ -46,39 +45,46 @@ void CmdResize::execute() ...@@ -46,39 +45,46 @@ void CmdResize::execute()
} }
CmdResizeVout::CmdResizeVout( intf_thread_t *pIntf, VoutWindow *pVoutWindow,
int width, int height ): CmdResizeInnerVout::CmdResizeInnerVout( intf_thread_t *pIntf,
CmdGeneric( pIntf ), m_pVoutWindow( pVoutWindow ), m_width( width ), CtrlVideo* pCtrlVideo )
m_height( height ) : CmdGeneric( pIntf ), m_pCtrlVideo( pCtrlVideo )
{ {
} }
void CmdResizeVout::execute() void CmdResizeInnerVout::execute()
{ {
if( m_pVoutWindow ) m_pCtrlVideo->resizeInnerVout();
{
m_pVoutWindow->setOriginalWidth( m_width );
m_pVoutWindow->setOriginalHeight( m_height );
CtrlVideo* pCtrlVideo = m_pVoutWindow->getCtrlVideo();
if( pCtrlVideo )
{
pCtrlVideo->resizeControl( m_width, m_height );
}
}
} }
CmdResizeInnerVout::CmdResizeInnerVout( intf_thread_t *pIntf, CmdResizeVout::CmdResizeVout( intf_thread_t *pIntf, vout_window_t* pWnd,
CtrlVideo* pCtrlVideo ) int width, int height )
: CmdGeneric( pIntf ), m_pCtrlVideo( pCtrlVideo ) : CmdGeneric( pIntf ), m_pWnd( pWnd ), m_width( width ), m_height( height )
{ {
} }
void CmdResizeInnerVout::execute() void CmdResizeVout::execute()
{
VoutManager* p_VoutManager = getIntf()->p_sys->p_voutManager;
p_VoutManager->setSizeWnd( m_pWnd, m_width, m_height );
}
CmdSetFullscreen::CmdSetFullscreen( intf_thread_t *pIntf,
vout_window_t * pWnd, bool fullscreen )
: CmdGeneric( pIntf ), m_pWnd( pWnd ), m_bFullscreen( fullscreen )
{ {
m_pCtrlVideo->resizeInnerVout();
} }
void CmdSetFullscreen::execute()
{
VoutManager* p_VoutManager = getIntf()->p_sys->p_voutManager;
p_VoutManager->setFullscreenWnd( m_pWnd, m_bFullscreen );
}
...@@ -26,12 +26,11 @@ ...@@ -26,12 +26,11 @@
#define CMD_RESIZE_HPP #define CMD_RESIZE_HPP
#include "cmd_generic.hpp" #include "cmd_generic.hpp"
#include <vlc_vout.h> #include <vlc_vout_window.h>
class WindowManager; class WindowManager;
class GenericLayout; class GenericLayout;
class CtrlVideo; class CtrlVideo;
class VoutWindow;
/// Command to resize a layout /// Command to resize a layout
...@@ -56,12 +55,31 @@ class CmdResize: public CmdGeneric ...@@ -56,12 +55,31 @@ class CmdResize: public CmdGeneric
}; };
/// Command to resize the inner vout window
class CmdResizeInnerVout: public CmdGeneric
{
public:
/// Resize the given layout
CmdResizeInnerVout( intf_thread_t *pIntf, CtrlVideo* pCtrlVideo );
virtual ~CmdResizeInnerVout() {}
/// This method does the real job of the command
virtual void execute();
/// Return the type of the command
virtual string getType() const { return "resize inner vout"; }
private:
CtrlVideo* m_pCtrlVideo;
};
/// Command to resize the vout window /// Command to resize the vout window
class CmdResizeVout: public CmdGeneric class CmdResizeVout: public CmdGeneric
{ {
public: public:
/// Resize the given layout /// Resize the given layout
CmdResizeVout( intf_thread_t *pIntf, VoutWindow *pVoutWindow, CmdResizeVout( intf_thread_t *pIntf, vout_window_t* pWnd,
int width, int height ); int width, int height );
virtual ~CmdResizeVout() {} virtual ~CmdResizeVout() {}
...@@ -72,27 +90,29 @@ class CmdResizeVout: public CmdGeneric ...@@ -72,27 +90,29 @@ class CmdResizeVout: public CmdGeneric
virtual string getType() const { return "resize vout"; } virtual string getType() const { return "resize vout"; }
private: private:
VoutWindow *m_pVoutWindow; vout_window_t* m_pWnd;
int m_width, m_height; int m_width, m_height;
}; };
/// Command to resize the inner vout window /// Command to toggle Fullscreen
class CmdResizeInnerVout: public CmdGeneric class CmdSetFullscreen: public CmdGeneric
{ {
public: public:
/// Resize the given layout /// Resize the given layout
CmdResizeInnerVout( intf_thread_t *pIntf, CtrlVideo* pCtrlVideo ); CmdSetFullscreen( intf_thread_t *pIntf, vout_window_t* pWnd,
virtual ~CmdResizeInnerVout() {} bool fullscreen );
virtual ~CmdSetFullscreen() {}
/// This method does the real job of the command /// This method does the real job of the command
virtual void execute(); virtual void execute();
/// Return the type of the command /// Return the type of the command
virtual string getType() const { return "resize inner vout"; } virtual string getType() const { return "toogle fullscreen"; }
private: private:
CtrlVideo* m_pCtrlVideo; vout_window_t* m_pWnd;
bool m_bFullscreen;
}; };
#endif #endif
/*****************************************************************************
* cmd_voutwindow.cpp
*****************************************************************************
* Copyright (C) 2009 the VideoLAN team
* $Id$
*
* Author: Erwan Tulou <erwan10 aT videolan doT org >
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "cmd_voutwindow.hpp"
#include "../src/vout_manager.hpp"
#include "../src/vout_window.hpp"
CmdNewVoutWindow::CmdNewVoutWindow( intf_thread_t *pIntf, vout_window_t* pWnd )
: CmdGeneric( pIntf ), m_pWnd( pWnd )
{
}
void CmdNewVoutWindow::execute()
{
vlc_mutex_lock( &getIntf()->p_sys->vout_lock );
VoutManager* p_VoutManager = getIntf()->p_sys->p_voutManager;
void* handle = p_VoutManager->acceptWnd( m_pWnd );
getIntf()->p_sys->handle = handle;
getIntf()->p_sys->b_vout_ready = true;
vlc_cond_signal( &getIntf()->p_sys->vout_wait );
vlc_mutex_unlock( &getIntf()->p_sys->vout_lock );
}
CmdReleaseVoutWindow::CmdReleaseVoutWindow( intf_thread_t *pIntf,
vout_window_t* pWnd )
: CmdGeneric( pIntf ), m_pWnd( pWnd )
{
}
void CmdReleaseVoutWindow::execute()
{
vlc_mutex_lock( &getIntf()->p_sys->vout_lock );
VoutManager* p_VoutManager = getIntf()->p_sys->p_voutManager;
p_VoutManager->releaseWnd( m_pWnd );
getIntf()->p_sys->b_vout_ready = true;
vlc_cond_signal( &getIntf()->p_sys->vout_wait );
vlc_mutex_unlock( &getIntf()->p_sys->vout_lock );
}
/*****************************************************************************
* cmd_voutwindow.hpp
*****************************************************************************
* Copyright (C) 2009 the VideoLAN team
* $Id$
*
* Author: Erwan Tulou <erwan10 aT videolan doT org >
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef CMD_VOUTWINDOW_HPP
#define CMD_VOUTWINDOW_HPP
#include "cmd_generic.hpp"
#include <vlc_vout_window.h>
/// Command to create a vout window
class CmdNewVoutWindow: public CmdGeneric
{
public:
/// Create a vout window
CmdNewVoutWindow( intf_thread_t *pIntf, vout_window_t *pWnd );
virtual ~CmdNewVoutWindow() {}
/// This method does the real job of the command
virtual void execute();
/// Return the type of the command
virtual string getType() const { return "new vout window"; }
private:
vout_window_t* m_pWnd;
};
/// Command to release a vout window
class CmdReleaseVoutWindow: public CmdGeneric
{
public:
/// Release a vout window
CmdReleaseVoutWindow( intf_thread_t *pIntf, vout_window_t *pWnd );
virtual ~CmdReleaseVoutWindow() {}
/// This method does the real job of the command
virtual void execute();
/// Return the type of the command
virtual string getType() const { return "new vout window"; }
private:
vout_window_t* m_pWnd;
};
#endif
...@@ -89,9 +89,8 @@ void CtrlVideo::onPositionChange() ...@@ -89,9 +89,8 @@ void CtrlVideo::onPositionChange()
void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest ) void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest )
{ {
GenericWindow *pParent = getWindow();
const Position *pPos = getPosition(); const Position *pPos = getPosition();
if( pParent && pPos ) if( pPos && !m_pVoutWindow )
{ {
// Draw a black rectangle under the video to avoid transparency // Draw a black rectangle under the video to avoid transparency
rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(), rImage.fillRect( pPos->getLeft(), pPos->getTop(), pPos->getWidth(),
...@@ -118,28 +117,28 @@ void CtrlVideo::setLayout( GenericLayout *pLayout, ...@@ -118,28 +117,28 @@ void CtrlVideo::setLayout( GenericLayout *pLayout,
void CtrlVideo::resizeControl( int width, int height ) void CtrlVideo::resizeControl( int width, int height )
{ {
int newWidth = width + m_xShift;
int newHeight = height + m_yShift;
// Create a resize command
// FIXME: this way of getting the window manager kind of sucks
WindowManager &rWindowManager = WindowManager &rWindowManager =
getIntf()->p_sys->p_theme->getWindowManager(); getIntf()->p_sys->p_theme->getWindowManager();
rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
CmdGeneric *pCmd = new CmdResize( getIntf(), rWindowManager,
m_rLayout, newWidth, newHeight );
// Push the command in the asynchronous command queue
AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );
pQueue->push( CmdGenericPtr( pCmd ), false );
// FIXME: this should be a command too const Position *pPos = getPosition();
rWindowManager.stopResize();
pCmd = new CmdResizeInnerVout( getIntf(), this ); if( width != pPos->getWidth() || height != pPos->getHeight() )
pQueue->push( CmdGenericPtr( pCmd ), false ); {
// new layout dimensions
int newWidth = width + m_xShift;
int newHeight = height + m_yShift;
TopWindow* pWin = getWindow(); // Resize the layout
rWindowManager.show( *pWin ); rWindowManager.startResize( m_rLayout, WindowManager::kResizeSE );
rWindowManager.resize( m_rLayout, newWidth, newHeight );
rWindowManager.stopResize();
if( m_pVoutWindow )
{
m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
}
}
} }
...@@ -225,9 +224,6 @@ void CtrlVideo::resizeInnerVout( ) ...@@ -225,9 +224,6 @@ void CtrlVideo::resizeInnerVout( )
m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() ); m_pVoutWindow->resize( pPos->getWidth(), pPos->getHeight() );
m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() ); m_pVoutWindow->move( pPos->getLeft(), pPos->getTop() );
rWindowManager.show( *pWin );
m_pVoutWindow->show();
} }
} }
...@@ -148,7 +148,7 @@ void GenericWindow::innerShow() ...@@ -148,7 +148,7 @@ void GenericWindow::innerShow()
{ {
if( m_pOsWindow ) if( m_pOsWindow )
{ {
m_pOsWindow->show( m_left, m_top ); m_pOsWindow->show();
} }
} }
......
...@@ -38,7 +38,7 @@ class OSWindow: public SkinObject ...@@ -38,7 +38,7 @@ class OSWindow: public SkinObject
virtual ~OSWindow() {} virtual ~OSWindow() {}
// Show the window // Show the window
virtual void show( int left, int top ) const = 0; virtual void show() const = 0;
// Hide the window // Hide the window
virtual void hide() const = 0; virtual void hide() const = 0;
......
...@@ -146,6 +146,12 @@ struct intf_sys_t ...@@ -146,6 +146,12 @@ struct intf_sys_t
vlc_mutex_t init_lock; vlc_mutex_t init_lock;
vlc_cond_t init_wait; vlc_cond_t init_wait;
bool b_ready; bool b_ready;
/// handle (vout windows)
void* handle;
vlc_mutex_t vout_lock;
vlc_cond_t vout_wait;
bool b_vout_ready;
}; };
......
...@@ -150,6 +150,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -150,6 +150,9 @@ static int Open( vlc_object_t *p_this )
skin_load.intf = p_intf; skin_load.intf = p_intf;
vlc_mutex_unlock( &skin_load.mutex ); vlc_mutex_unlock( &skin_load.mutex );
vlc_mutex_init( &p_intf->p_sys->vout_lock );
vlc_cond_init( &p_intf->p_sys->vout_wait );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -179,6 +182,9 @@ static void Close( vlc_object_t *p_this ) ...@@ -179,6 +182,9 @@ static void Close( vlc_object_t *p_this )
msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub );
#endif #endif
vlc_cond_destroy( &p_intf->p_sys->vout_wait );
vlc_mutex_destroy( &p_intf->p_sys->vout_lock );
// Destroy structure // Destroy structure
free( p_intf->p_sys ); free( p_intf->p_sys );
} }
...@@ -309,9 +315,6 @@ static void *Run( void * p_obj ) ...@@ -309,9 +315,6 @@ static void *Run( void * p_obj )
// Destroy OSLoop // Destroy OSLoop
OSFactory::instance( p_intf )->destroyOSLoop(); OSFactory::instance( p_intf )->destroyOSLoop();
// save config file
config_SaveConfigFile( p_intf, NULL );
// save and delete the theme // save and delete the theme
if( p_intf->p_sys->p_theme ) if( p_intf->p_sys->p_theme )
{ {
...@@ -323,6 +326,9 @@ static void *Run( void * p_obj ) ...@@ -323,6 +326,9 @@ static void *Run( void * p_obj )
msg_Dbg( p_intf, "current theme deleted" ); msg_Dbg( p_intf, "current theme deleted" );
} }
// save config file
config_SaveConfigFile( p_intf, NULL );
end: end:
// Destroy "singleton" objects // Destroy "singleton" objects
Dialogs::destroy( p_intf ); Dialogs::destroy( p_intf );
...@@ -347,6 +353,7 @@ end: ...@@ -347,6 +353,7 @@ end:
return NULL; return NULL;
} }
static vlc_mutex_t serializer = VLC_STATIC_MUTEX;
// Callbacks for vout requests // Callbacks for vout requests
static int WindowOpen( vlc_object_t *p_this ) static int WindowOpen( vlc_object_t *p_this )
...@@ -360,16 +367,20 @@ static int WindowOpen( vlc_object_t *p_this ) ...@@ -360,16 +367,20 @@ static int WindowOpen( vlc_object_t *p_this )
vlc_object_release( pIntf ); vlc_object_release( pIntf );
vlc_mutex_lock( &serializer );
pWnd->handle.hwnd = VoutManager::getWindow( pIntf, pWnd ); pWnd->handle.hwnd = VoutManager::getWindow( pIntf, pWnd );
if( pWnd->handle.hwnd ) if( pWnd->handle.hwnd )
{ {
pWnd->sys = (vout_window_sys_t*)pIntf; pWnd->sys = (vout_window_sys_t*)pIntf;
pWnd->control = &VoutManager::controlWindow; pWnd->control = &VoutManager::controlWindow;
vlc_mutex_unlock( &serializer );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
else else
{ {
vlc_mutex_unlock( &serializer );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
} }
......
...@@ -367,8 +367,12 @@ void TopWindow::innerShow() ...@@ -367,8 +367,12 @@ void TopWindow::innerShow()
updateShape(); updateShape();
m_pActiveLayout->onShow(); m_pActiveLayout->onShow();
} }
// Show the window // Show the window
GenericWindow::innerShow(); GenericWindow::innerShow();
// place the top window on the screen (after show!)
move( getLeft(), getTop() );
} }
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "../commands/async_queue.hpp" #include "../commands/async_queue.hpp"
#include "../commands/cmd_show_window.hpp" #include "../commands/cmd_show_window.hpp"
#include "../commands/cmd_resize.hpp" #include "../commands/cmd_resize.hpp"
#include "../commands/cmd_voutwindow.hpp"
...@@ -58,16 +59,12 @@ VoutManager::VoutManager( intf_thread_t *pIntf ): SkinObject( pIntf ), ...@@ -58,16 +59,12 @@ VoutManager::VoutManager( intf_thread_t *pIntf ): SkinObject( pIntf ),
m_pVoutMainWindow( NULL ), m_pCtrlVideoVec(), m_pVoutMainWindow( NULL ), m_pCtrlVideoVec(),
m_pCtrlVideoVecBackup(), m_SavedWndVec() m_pCtrlVideoVecBackup(), m_SavedWndVec()
{ {
vlc_mutex_init( &vout_lock );
m_pVoutMainWindow = new VoutMainWindow( getIntf() ); m_pVoutMainWindow = new VoutMainWindow( getIntf() );
} }
VoutManager::~VoutManager( ) VoutManager::~VoutManager( )
{ {
vlc_mutex_destroy( &vout_lock );
delete m_pVoutMainWindow; delete m_pVoutMainWindow;
} }
...@@ -176,8 +173,11 @@ CtrlVideo* VoutManager::getBestCtrlVideo( ) ...@@ -176,8 +173,11 @@ CtrlVideo* VoutManager::getBestCtrlVideo( )
} }
void* VoutManager::acceptWnd( vout_window_t* pWnd, int width, int height ) void* VoutManager::acceptWnd( vout_window_t* pWnd )
{ {
int width = (int)pWnd->cfg->width;
int height = (int)pWnd->cfg->height;
// Creation of a dedicated Window per vout thread // Creation of a dedicated Window per vout thread
VoutWindow* pVoutWindow = new VoutWindow( getIntf(), pWnd, width, height, VoutWindow* pVoutWindow = new VoutWindow( getIntf(), pWnd, width, height,
(GenericWindow*) m_pVoutMainWindow ); (GenericWindow*) m_pVoutMainWindow );
...@@ -196,13 +196,82 @@ void* VoutManager::acceptWnd( vout_window_t* pWnd, int width, int height ) ...@@ -196,13 +196,82 @@ void* VoutManager::acceptWnd( vout_window_t* pWnd, int width, int height )
// save vout characteristics // save vout characteristics
m_SavedWndVec.push_back( SavedWnd( pWnd, pVoutWindow, pCtrlVideo ) ); m_SavedWndVec.push_back( SavedWnd( pWnd, pVoutWindow, pCtrlVideo ) );
msg_Dbg( getIntf(), "New incoming vout=0x%p, handle=0x%p, VideoCtrl=0x%p", msg_Dbg( pWnd, "New vout : handle = %p, Ctrl = %p, w x h = %dx%d",
pWnd, handle, pCtrlVideo ); handle, pCtrlVideo, width, height );
return handle; return handle;
} }
void VoutManager::releaseWnd( vout_window_t *pWnd )
{
// remove vout thread from savedVec
vector<SavedWnd>::iterator it;
for( it = m_SavedWndVec.begin(); it != m_SavedWndVec.end(); it++ )
{
if( (*it).pWnd == pWnd )
{
msg_Dbg( getIntf(), "vout released vout=0x%p, VideoCtrl=0x%p",
pWnd, (*it).pCtrlVideo );
// if a video control was being used, detach from it
if( (*it).pCtrlVideo )
{
(*it).pCtrlVideo->detachVoutWindow( );
}
// remove resources
delete (*it).pVoutWindow;
m_SavedWndVec.erase( it );
break;
}
}
}
void VoutManager::setSizeWnd( vout_window_t *pWnd, int width, int height )
{
msg_Dbg( pWnd, "setSize (%dx%d) received from vout threadr",
width, height );
vector<SavedWnd>::iterator it;
for( it = m_SavedWndVec.begin(); it != m_SavedWndVec.end(); it++ )
{
if( (*it).pWnd == pWnd )
{
VoutWindow* pVoutWindow = (*it).pVoutWindow;
pVoutWindow->setOriginalWidth( width );
pVoutWindow->setOriginalHeight( height );
CtrlVideo* pCtrlVideo = pVoutWindow->getCtrlVideo();
if( pCtrlVideo )
{
pCtrlVideo->resizeControl( width, height );
}
break;
}
}
}
void VoutManager::setFullscreenWnd( vout_window_t *pWnd, bool b_fullscreen )
{
msg_Dbg( pWnd, "setFullscreen (%d) received from vout thread",
b_fullscreen ? 1 : 0 );
vector<SavedWnd>::iterator it;
for( it = m_SavedWndVec.begin(); it != m_SavedWndVec.end(); it++ )
{
if( (*it).pWnd == pWnd )
{
VoutWindow* pVoutWindow = (*it).pVoutWindow;
pVoutWindow->setFullscreen( b_fullscreen );
break;
}
}
}
// Functions called by window provider // Functions called by window provider
// /////////////////////////////////// // ///////////////////////////////////
...@@ -212,16 +281,21 @@ void *VoutManager::getWindow( intf_thread_t *pIntf, vout_window_t *pWnd ) ...@@ -212,16 +281,21 @@ void *VoutManager::getWindow( intf_thread_t *pIntf, vout_window_t *pWnd )
if( !pIntf->p_sys->p_theme ) if( !pIntf->p_sys->p_theme )
return NULL; return NULL;
VoutManager *pThis = pIntf->p_sys->p_voutManager; vlc_mutex_lock( &pIntf->p_sys->vout_lock );
pIntf->p_sys->b_vout_ready = false;
pIntf->p_sys->handle = NULL;
int width = (int)pWnd->cfg->width; CmdNewVoutWindow *pCmd =
int height = (int)pWnd->cfg->height; new CmdNewVoutWindow( pIntf, pWnd );
pThis->lockVout(); AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
pQueue->push( CmdGenericPtr( pCmd ), false );
void* handle = pThis->acceptWnd( pWnd, width, height ); while( !pIntf->p_sys->b_vout_ready )
vlc_cond_wait( &pIntf->p_sys->vout_wait, &pIntf->p_sys->vout_lock );
pThis->unlockVout(); void* handle = pIntf->p_sys->handle;
vlc_mutex_unlock( &pIntf->p_sys->vout_lock );
return handle; return handle;
} }
...@@ -229,37 +303,19 @@ void *VoutManager::getWindow( intf_thread_t *pIntf, vout_window_t *pWnd ) ...@@ -229,37 +303,19 @@ void *VoutManager::getWindow( intf_thread_t *pIntf, vout_window_t *pWnd )
void VoutManager::releaseWindow( intf_thread_t *pIntf, vout_window_t *pWnd ) void VoutManager::releaseWindow( intf_thread_t *pIntf, vout_window_t *pWnd )
{ {
VoutManager *pThis = pIntf->p_sys->p_voutManager; vlc_mutex_lock( &pIntf->p_sys->vout_lock );
pIntf->p_sys->b_vout_ready = false;
// Theme may have been destroyed CmdReleaseVoutWindow *pCmd =
if( !pIntf->p_sys->p_theme ) new CmdReleaseVoutWindow( pIntf, pWnd );
return;
pThis->lockVout();
// remove vout thread from savedVec
vector<SavedWnd>::iterator it;
for( it = pThis->m_SavedWndVec.begin(); it != pThis->m_SavedWndVec.end(); it++ )
{
if( (*it).pWnd == pWnd )
{
msg_Dbg( pIntf, "vout released vout=0x%p, VideoCtrl=0x%p",
pWnd, (*it).pCtrlVideo );
// if a video control was being used, detach from it AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
if( (*it).pCtrlVideo ) pQueue->push( CmdGenericPtr( pCmd ), false );
{
(*it).pCtrlVideo->detachVoutWindow( );
}
// remove resources while( !pIntf->p_sys->b_vout_ready )
delete (*it).pVoutWindow; vlc_cond_wait( &pIntf->p_sys->vout_wait, &pIntf->p_sys->vout_lock );
pThis->m_SavedWndVec.erase( it );
break;
}
}
pThis->unlockVout(); vlc_mutex_unlock( &pIntf->p_sys->vout_lock );
} }
...@@ -278,31 +334,31 @@ int VoutManager::controlWindow( struct vout_window_t *pWnd, ...@@ -278,31 +334,31 @@ int VoutManager::controlWindow( struct vout_window_t *pWnd,
if( i_width && i_height ) if( i_width && i_height )
{ {
pThis->lockVout(); // Post a vout resize command
CmdResizeVout *pCmd =
vector<SavedWnd>::iterator it; new CmdResizeVout( pThis->getIntf(),
for( it = pThis->m_SavedWndVec.begin(); pWnd, (int)i_width, (int)i_height );
it != pThis->m_SavedWndVec.end(); it++ ) AsyncQueue *pQueue =
{ AsyncQueue::instance( pThis->getIntf() );
if( (*it).pWnd == pWnd ) pQueue->push( CmdGenericPtr( pCmd ) );
{
// Post a vout resize command
CmdResizeVout *pCmd =
new CmdResizeVout( pThis->getIntf(),
(*it).pVoutWindow,
i_width, i_height );
AsyncQueue *pQueue =
AsyncQueue::instance( pThis->getIntf() );
pQueue->push( CmdGenericPtr( pCmd ) );
break;
}
}
pThis->unlockVout();
} }
return VLC_SUCCESS; return VLC_SUCCESS;
} }
case VOUT_WINDOW_SET_FULLSCREEN:
{
bool b_fullscreen = va_arg( args, int );
// Post a vout resize command
CmdSetFullscreen* pCmd =
new CmdSetFullscreen( pThis->getIntf(), pWnd, b_fullscreen );
AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
pQueue->push( CmdGenericPtr( pCmd ) );
return VLC_SUCCESS;
}
default: default:
msg_Dbg( pWnd, "control query not supported" ); msg_Dbg( pWnd, "control query not supported" );
return VLC_EGENERIC; return VLC_EGENERIC;
......
...@@ -80,12 +80,21 @@ class VoutManager: public SkinObject ...@@ -80,12 +80,21 @@ class VoutManager: public SkinObject
/// Delete the instance of VoutManager /// Delete the instance of VoutManager
static void destroy( intf_thread_t *pIntf ); static void destroy( intf_thread_t *pIntf );
/// Accept Wnd
void* acceptWnd( vout_window_t* pWnd );
/// Release Wnd
void releaseWnd( vout_window_t* pWnd );
/// set size Wnd
void setSizeWnd( vout_window_t* pWnd, int width, int height );
/// set fullscreen Wnd
void setFullscreenWnd( vout_window_t* pWnd, bool b_fullscreen );
/// Callback to request a vout window /// Callback to request a vout window
static void *getWindow( intf_thread_t *pIntf, vout_window_t *pWnd ); static void *getWindow( intf_thread_t *pIntf, vout_window_t *pWnd );
/// Accept Wnd
void* acceptWnd( vout_window_t* pWnd, int width, int height );
// Window provider (release) // Window provider (release)
static void releaseWindow( intf_thread_t *pIntf, vout_window_t *pWnd ); static void releaseWindow( intf_thread_t *pIntf, vout_window_t *pWnd );
...@@ -113,10 +122,6 @@ class VoutManager: public SkinObject ...@@ -113,10 +122,6 @@ class VoutManager: public SkinObject
// test if vout are running // test if vout are running
bool hasVout() { return ( m_SavedWndVec.size() != 0 ) ; } bool hasVout() { return ( m_SavedWndVec.size() != 0 ) ; }
// (un)lock functions to protect vout sets
void lockVout( ) { vlc_mutex_lock( &vout_lock ); }
void unlockVout( ) { vlc_mutex_unlock( &vout_lock ); }
protected: protected:
// Protected because it is a singleton // Protected because it is a singleton
VoutManager( intf_thread_t *pIntf ); VoutManager( intf_thread_t *pIntf );
...@@ -129,8 +134,6 @@ class VoutManager: public SkinObject ...@@ -129,8 +134,6 @@ class VoutManager: public SkinObject
vector<SavedWnd> m_SavedWndVec; vector<SavedWnd> m_SavedWndVec;
VoutMainWindow* m_pVoutMainWindow; VoutMainWindow* m_pVoutMainWindow;
vlc_mutex_t vout_lock;
}; };
......
...@@ -28,6 +28,11 @@ ...@@ -28,6 +28,11 @@
#include "os_factory.hpp" #include "os_factory.hpp"
#include "os_graphics.hpp" #include "os_graphics.hpp"
#include "os_window.hpp" #include "os_window.hpp"
#include "../events/evt_key.hpp"
#include <vlc_keys.h>
int VoutWindow::count = 0; int VoutWindow::count = 0;
...@@ -35,22 +40,18 @@ VoutWindow::VoutWindow( intf_thread_t *pIntf, vout_window_t* pWnd, ...@@ -35,22 +40,18 @@ VoutWindow::VoutWindow( intf_thread_t *pIntf, vout_window_t* pWnd,
int width, int height, GenericWindow* pParent ) : int width, int height, GenericWindow* pParent ) :
GenericWindow( pIntf, 0, 0, false, false, pParent ), GenericWindow( pIntf, 0, 0, false, false, pParent ),
m_pWnd( pWnd ), original_width( width ), original_height( height ), m_pWnd( pWnd ), original_width( width ), original_height( height ),
m_pParentWindow( pParent ), m_pImage( NULL ) m_pParentWindow( pParent ), m_pCtrlVideo( NULL ), m_bFullscreen( false )
{ {
// counter for debug // counter for debug
count++; count++;
if( m_pWnd ) if( m_pWnd )
vlc_object_hold( m_pWnd ); vlc_object_hold( m_pWnd );
// needed on MS-Windows to prevent vlc hanging
show();
} }
VoutWindow::~VoutWindow() VoutWindow::~VoutWindow()
{ {
delete m_pImage;
if( m_pWnd ) if( m_pWnd )
vlc_object_release( m_pWnd ); vlc_object_release( m_pWnd );
...@@ -59,38 +60,6 @@ VoutWindow::~VoutWindow() ...@@ -59,38 +60,6 @@ VoutWindow::~VoutWindow()
} }
void VoutWindow::resize( int width, int height )
{
// don't try to resize with zero value
if( !width || !height )
return;
// Get the OSFactory
OSFactory *pOsFactory = OSFactory::instance( getIntf() );
// Recreate the image
delete m_pImage;
m_pImage = pOsFactory->createOSGraphics( width, height );
// Draw a black rectangle
m_pImage->fillRect( 0, 0, width, height, 0 );
// Resize the window
GenericWindow::resize( width, height );
}
void VoutWindow::refresh( int left, int top, int width, int height )
{
if( m_pImage )
{
if( !m_pCtrlVideo )
{
m_pImage->copyToWindow( *getOSWindow(), left, top,
width, height, left, top );
}
}
}
void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo ) void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo )
{ {
if( pCtrlVideo ) if( pCtrlVideo )
...@@ -103,9 +72,12 @@ void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo ) ...@@ -103,9 +72,12 @@ void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo )
setParent( pCtrlVideo->getWindow(), x, y, w, h ); setParent( pCtrlVideo->getWindow(), x, y, w, h );
m_pParentWindow = pCtrlVideo->getWindow(); m_pParentWindow = pCtrlVideo->getWindow();
show();
} }
else else
{ {
hide();
setParent( VoutManager::instance( getIntf() )->getVoutMainWindow(), setParent( VoutManager::instance( getIntf() )->getVoutMainWindow(),
0, 0, 0, 0 ); 0, 0, 0, 0 );
m_pParentWindow = m_pParentWindow =
...@@ -115,3 +87,36 @@ void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo ) ...@@ -115,3 +87,36 @@ void VoutWindow::setCtrlVideo( CtrlVideo* pCtrlVideo )
m_pCtrlVideo = pCtrlVideo; m_pCtrlVideo = pCtrlVideo;
} }
void VoutWindow::setFullscreen( bool b_fullscreen )
{
/*TODO: fullscreen implementation */
}
void VoutWindow::processEvent( EvtKey &rEvtKey )
{
// Only do the action when the key is down
if( rEvtKey.getAsString().find( "key:down") != string::npos )
{
vlc_value_t val;
// Set the key
val.i_int = rEvtKey.getKey();
// Set the modifiers
if( rEvtKey.getMod() & EvtInput::kModAlt )
{
val.i_int |= KEY_MODIFIER_ALT;
}
if( rEvtKey.getMod() & EvtInput::kModCtrl )
{
val.i_int |= KEY_MODIFIER_CTRL;
}
if( rEvtKey.getMod() & EvtInput::kModShift )
{
val.i_int |= KEY_MODIFIER_SHIFT;
}
var_Set( getIntf()->p_libvlc, "key-pressed", val );
}
}
...@@ -48,22 +48,24 @@ class VoutWindow: private GenericWindow ...@@ -48,22 +48,24 @@ class VoutWindow: private GenericWindow
using GenericWindow::show; using GenericWindow::show;
using GenericWindow::hide; using GenericWindow::hide;
using GenericWindow::move; using GenericWindow::move;
using GenericWindow::resize;
using GenericWindow::getOSHandle; using GenericWindow::getOSHandle;
//@} //@}
/// Resize the window
virtual void resize( int width, int height );
/// get the parent window /// get the parent window
virtual GenericWindow* getWindow( ) { return m_pParentWindow; } virtual GenericWindow* getWindow( ) { return m_pParentWindow; }
/// Refresh an area of the window /// hotkeys processing
virtual void refresh( int left, int top, int width, int height ); virtual void processEvent( EvtKey &rEvtKey );
/// set and get Video Control for VoutWindow /// set and get Video Control for VoutWindow
virtual void setCtrlVideo( CtrlVideo* pCtrlVideo ); virtual void setCtrlVideo( CtrlVideo* pCtrlVideo );
virtual CtrlVideo* getCtrlVideo( ) { return m_pCtrlVideo; } virtual CtrlVideo* getCtrlVideo( ) { return m_pCtrlVideo; }
/// toggle fullscreen mode
virtual void setFullscreen( bool b_fullscreen );
virtual bool isFullscreen() { return m_bFullscreen; }
/// get original size of vout /// get original size of vout
virtual int getOriginalWidth( ) { return original_width; } virtual int getOriginalWidth( ) { return original_width; }
virtual int getOriginalHeight( ) { return original_height; } virtual int getOriginalHeight( ) { return original_height; }
...@@ -76,9 +78,6 @@ class VoutWindow: private GenericWindow ...@@ -76,9 +78,6 @@ class VoutWindow: private GenericWindow
private: private:
/// Image when there is no video
OSGraphics *m_pImage;
/// vout thread /// vout thread
vout_window_t* m_pWnd; vout_window_t* m_pWnd;
...@@ -86,6 +85,9 @@ class VoutWindow: private GenericWindow ...@@ -86,6 +85,9 @@ class VoutWindow: private GenericWindow
int original_width; int original_width;
int original_height; int original_height;
/// fulscreen mode indicator
bool m_bFullscreen;
/// VideoControl attached to it /// VideoControl attached to it
CtrlVideo* m_pCtrlVideo; CtrlVideo* m_pCtrlVideo;
......
...@@ -118,7 +118,7 @@ void Win32Window::reparent( void* OSHandle, int x, int y, int w, int h ) ...@@ -118,7 +118,7 @@ void Win32Window::reparent( void* OSHandle, int x, int y, int w, int h )
} }
void Win32Window::show( int left, int top ) const void Win32Window::show() const
{ {
ShowWindow( m_hWnd, SW_SHOW ); ShowWindow( m_hWnd, SW_SHOW );
} }
......
...@@ -41,7 +41,7 @@ class Win32Window: public OSWindow ...@@ -41,7 +41,7 @@ class Win32Window: public OSWindow
virtual ~Win32Window(); virtual ~Win32Window();
// Show the window // Show the window
virtual void show( int left, int top ) const; virtual void show() const;
// Hide the window // Hide the window
virtual void hide() const; virtual void hide() const;
......
...@@ -160,7 +160,9 @@ void X11Loop::handleX11Event() ...@@ -160,7 +160,9 @@ void X11Loop::handleX11Event()
Theme *pTheme = getIntf()->p_sys->p_theme; Theme *pTheme = getIntf()->p_sys->p_theme;
if( pTheme ) if( pTheme )
{ {
pTheme->getWindowManager().synchVisibility(); // Commented out as it really doesn't seem useful
// but rather brings visible problems
// pTheme->getWindowManager().synchVisibility();
} }
} }
return; return;
......
...@@ -41,36 +41,34 @@ X11Window::X11Window( intf_thread_t *pIntf, GenericWindow &rWindow, ...@@ -41,36 +41,34 @@ X11Window::X11Window( intf_thread_t *pIntf, GenericWindow &rWindow,
OSWindow( pIntf ), m_rDisplay( rDisplay ), m_pParent( pParentWindow ), OSWindow( pIntf ), m_rDisplay( rDisplay ), m_pParent( pParentWindow ),
m_dragDrop( dragDrop ) m_dragDrop( dragDrop )
{ {
XSetWindowAttributes attr;
unsigned long valuemask;
if (pParentWindow) if (pParentWindow)
{ {
m_wnd_parent = pParentWindow->m_wnd; m_wnd_parent = pParentWindow->m_wnd;
int i_screen = DefaultScreen( XDISPLAY );
attr.event_mask = ExposureMask | StructureNotifyMask;
attr.backing_store = Always;
attr.background_pixel = BlackPixel( XDISPLAY, i_screen );
valuemask = CWBackingStore | CWBackPixel | CWEventMask;
} }
else else
{ {
m_wnd_parent = DefaultRootWindow( XDISPLAY ); m_wnd_parent = DefaultRootWindow( XDISPLAY );
attr.event_mask = ExposureMask | StructureNotifyMask;
valuemask = CWEventMask;
} }
XSetWindowAttributes attr;
attr.event_mask = ExposureMask | StructureNotifyMask;
// Create the window // Create the window
m_wnd = XCreateWindow( XDISPLAY, m_wnd_parent, -10, 0, 1, 1, 0, 0, m_wnd = XCreateWindow( XDISPLAY, m_wnd_parent, -10, 0, 1, 1, 0, 0,
InputOutput, CopyFromParent, CWEventMask, &attr ); InputOutput, CopyFromParent, valuemask, &attr );
// Make sure window is created before returning // wait for X server to process the previous commands
XMapWindow( XDISPLAY, m_wnd ); XSync( XDISPLAY, false );
bool b_map_notify = false;
do
{
XEvent xevent;
XWindowEvent( XDISPLAY, m_wnd, SubstructureNotifyMask |
StructureNotifyMask, &xevent);
if( (xevent.type == MapNotify)
&& (xevent.xmap.window == m_wnd ) )
{
b_map_notify = true;
}
} while( ! b_map_notify );
XUnmapWindow( XDISPLAY, m_wnd );
// Set the colormap for 8bpp mode // Set the colormap for 8bpp mode
if( XPIXELSIZE == 1 ) if( XPIXELSIZE == 1 )
...@@ -156,11 +154,10 @@ void X11Window::reparent( void* OSHandle, int x, int y, int w, int h ) ...@@ -156,11 +154,10 @@ void X11Window::reparent( void* OSHandle, int x, int y, int w, int h )
} }
void X11Window::show( int left, int top ) const void X11Window::show() const
{ {
// Map the window // Map the window
XMapRaised( XDISPLAY, m_wnd ); XMapRaised( XDISPLAY, m_wnd );
XMoveWindow( XDISPLAY, m_wnd, left, top );
} }
......
...@@ -44,7 +44,7 @@ class X11Window: public OSWindow ...@@ -44,7 +44,7 @@ class X11Window: public OSWindow
virtual ~X11Window(); virtual ~X11Window();
// Show the window // Show the window
virtual void show( int left, int top ) const; virtual void show() const;
// Hide the window // Hide the window
virtual void hide() const; virtual void hide() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment