Commit 1e34cf51 authored by Cyril Deguet's avatar Cyril Deguet

* all: split GenericWindow into GenericWindow (general interface for

  windows) and TopWindow (implementation for top-level windows)
parent a5ca00dc
......@@ -112,6 +112,8 @@ SOURCES_skins2 = \
src/theme_loader.hpp \
src/tooltip.cpp \
src/tooltip.hpp \
src/top_window.cpp \
src/top_window.hpp \
src/var_manager.cpp \
src/var_manager.hpp \
src/vlcproc.cpp \
......
......@@ -2,7 +2,7 @@
* cmd_layout.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: cmd_layout.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
......@@ -23,7 +23,7 @@
*****************************************************************************/
#include "cmd_layout.hpp"
#include "../src/generic_window.hpp"
#include "../src/top_window.hpp"
#include "../src/generic_layout.hpp"
#include "../src/theme.hpp"
......@@ -42,7 +42,7 @@ void CmdLayout::execute()
{
return;
}
GenericWindow *pWindow =
TopWindow *pWindow =
getIntf()->p_sys->p_theme->getWindowById( m_windowId );
GenericLayout *pLayout =
getIntf()->p_sys->p_theme->getLayoutById( m_layoutId );
......
......@@ -26,7 +26,7 @@
#define CMD_SHOW_WINDOW_HPP
#include "cmd_generic.hpp"
#include "../src/generic_window.hpp"
#include "../src/top_window.hpp"
#include "../src/window_manager.hpp"
......@@ -35,7 +35,7 @@ class CmdShowWindow: public CmdGeneric
{
public:
CmdShowWindow( intf_thread_t *pIntf, WindowManager &rWinManager,
GenericWindow &rWin ):
TopWindow &rWin ):
CmdGeneric( pIntf ), m_rWinManager( rWinManager ), m_rWin( rWin ) {}
virtual ~CmdShowWindow() {}
......@@ -49,7 +49,7 @@ class CmdShowWindow: public CmdGeneric
/// Reference to the window manager
WindowManager &m_rWinManager;
/// Reference to the window
GenericWindow &m_rWin;
TopWindow &m_rWin;
};
......@@ -58,7 +58,7 @@ class CmdHideWindow: public CmdGeneric
{
public:
CmdHideWindow( intf_thread_t *pIntf, WindowManager &rWinManager,
GenericWindow &rWin ):
TopWindow &rWin ):
CmdGeneric( pIntf ), m_rWinManager( rWinManager ), m_rWin( rWin ) {}
virtual ~CmdHideWindow() {}
......@@ -72,7 +72,7 @@ class CmdHideWindow: public CmdGeneric
/// Reference to the window manager
WindowManager &m_rWinManager;
/// Reference to the window
GenericWindow &m_rWin;
TopWindow &m_rWin;
};
......
......@@ -2,7 +2,7 @@
* ctrl_generic.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: ctrl_generic.cpp,v 1.2 2004/02/29 16:49:55 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
......@@ -24,7 +24,7 @@
#include "ctrl_generic.hpp"
#include "../src/generic_layout.hpp"
#include "../src/generic_window.hpp"
#include "../src/top_window.hpp"
#include "../src/os_graphics.hpp"
#include "../utils/position.hpp"
#include "../utils/var_bool.hpp"
......@@ -101,7 +101,7 @@ void CtrlGeneric::releaseMouse() const
void CtrlGeneric::notifyTooltipChange() const
{
GenericWindow *pWin = getWindow();
TopWindow *pWin = getWindow();
if( pWin )
{
// Notify the window
......@@ -110,7 +110,7 @@ void CtrlGeneric::notifyTooltipChange() const
}
GenericWindow *CtrlGeneric::getWindow() const
TopWindow *CtrlGeneric::getWindow() const
{
if( m_pLayout )
{
......
......@@ -2,7 +2,7 @@
* ctrl_generic.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: ctrl_generic.hpp,v 1.2 2004/02/29 16:49:55 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
......@@ -35,7 +35,7 @@ class EvtGeneric;
class OSGraphics;
class GenericLayout;
class Position;
class GenericWindow;
class TopWindow;
class VarBool;
......@@ -96,7 +96,7 @@ class CtrlGeneric: public SkinObject, public Observer<VarBool>
virtual void notifyTooltipChange() const;
/// Get the associated window, if any
virtual GenericWindow *getWindow() const;
virtual TopWindow *getWindow() const;
/// Overload this method if you want to do something special when
/// the Position object is set
......
......@@ -26,13 +26,13 @@
#include "../events/evt_generic.hpp"
#include "../events/evt_mouse.hpp"
#include "../events/evt_motion.hpp"
#include "../src/generic_window.hpp"
#include "../src/top_window.hpp"
#include "../src/window_manager.hpp"
#include "../utils/position.hpp"
CtrlMove::CtrlMove( intf_thread_t *pIntf, WindowManager &rWindowManager,
CtrlFlat &rCtrl, GenericWindow &rWindow,
CtrlFlat &rCtrl, TopWindow &rWindow,
const UString &rHelp, VarBool *pVisible ):
CtrlFlat( pIntf, rHelp, pVisible ), m_fsm( pIntf ),
m_rWindowManager( rWindowManager ),
......
......@@ -2,7 +2,7 @@
* ctrl_move.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: ctrl_move.hpp,v 1.2 2004/02/29 16:49:55 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
......@@ -29,7 +29,7 @@
#include "../utils/fsm.hpp"
#include "ctrl_flat.hpp"
class GenericWindow;
class TopWindow;
class WindowManager;
......@@ -38,7 +38,7 @@ class CtrlMove: public CtrlFlat
{
public:
CtrlMove( intf_thread_t *pIntf, WindowManager &rWindowManager,
CtrlFlat &rCtrl, GenericWindow &rWindow,
CtrlFlat &rCtrl, TopWindow &rWindow,
const UString &rHelp, VarBool *pVisible );
virtual ~CtrlMove() {}
......@@ -69,7 +69,7 @@ class CtrlMove: public CtrlFlat
/// Decorated CtrlFlat
CtrlFlat &m_rCtrl;
/// The window moved by this control
GenericWindow &m_rWindow;
TopWindow &m_rWindow;
/// The last received event
EvtGeneric *m_pEvt;
/// Position of the click that started the move
......
......@@ -2,7 +2,7 @@
* ctrl_slider.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: ctrl_slider.cpp,v 1.5 2004/03/02 21:45:15 ipkiss Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
......@@ -27,7 +27,7 @@
#include "../events/evt_mouse.hpp"
#include "../events/evt_scroll.hpp"
#include "../src/generic_bitmap.hpp"
#include "../src/generic_window.hpp"
#include "../src/top_window.hpp"
#include "../src/os_factory.hpp"
#include "../src/os_graphics.hpp"
#include "../utils/position.hpp"
......@@ -342,7 +342,7 @@ void CtrlSliderBg::handleEvent( EvtGeneric &rEvent )
// Forward the clic to the cursor
EvtMouse evt( getIntf(), x, y, EvtMouse::kLeft, EvtMouse::kDown );
GenericWindow *pWin = getWindow();
TopWindow *pWin = getWindow();
if( pWin )
{
EvtEnter evtEnter( getIntf() );
......
......@@ -27,10 +27,9 @@
#include "../src/os_graphics.hpp"
CtrlVideo::CtrlVideo( intf_thread_t *pIntf, WindowManager &rWindowManager,
const UString &rHelp, VarBool *pVisible ):
CtrlGeneric( pIntf, rHelp, pVisible ), m_rWindowManager( rWindowManager ),
m_pVout( NULL )
CtrlVideo::CtrlVideo( intf_thread_t *pIntf, const UString &rHelp,
VarBool *pVisible ):
CtrlGeneric( pIntf, rHelp, pVisible ), m_pVout( NULL )
{
}
......@@ -80,8 +79,7 @@ void CtrlVideo::draw( OSGraphics &rImage, int xDest, int yDest )
if (!m_pVout)
{
m_pVout = new VoutWindow( getIntf(), pPos->getLeft(),
pPos->getTop(), m_rWindowManager, false,
false, *pParent );
pPos->getTop(), false, false, *pParent );
m_pVout->resize( pPos->getWidth(), pPos->getHeight() );
m_pVout->show();
}
......
......@@ -27,14 +27,13 @@
#include "ctrl_generic.hpp"
class VoutWindow;
class WindowManager;
/// Control video
class CtrlVideo: public CtrlGeneric
{
public:
CtrlVideo( intf_thread_t *pIntf, WindowManager &rWindowManager,
const UString &rHelp, VarBool *pVisible );
CtrlVideo( intf_thread_t *pIntf, const UString &rHelp,
VarBool *pVisible );
virtual ~CtrlVideo();
/// Handle an event on the control
......@@ -50,8 +49,6 @@ class CtrlVideo: public CtrlGeneric
virtual void draw( OSGraphics &rImage, int xDest, int yDest );
private:
/// Window manager
WindowManager &m_rWindowManager;
/// Vout window
VoutWindow *m_pVout;
};
......
......@@ -29,8 +29,7 @@
#include "../src/png_bitmap.hpp"
#include "../src/os_factory.hpp"
#include "../src/generic_bitmap.hpp"
#include "../src/generic_window.hpp"
#include "../src/vout_window.hpp"
#include "../src/top_window.hpp"
#include "../src/anchor.hpp"
#include "../src/ft2_font.hpp"
#include "../src/theme.hpp"
......@@ -149,18 +148,18 @@ void Builder::addFont( const BuilderData::Font &rData )
void Builder::addWindow( const BuilderData::Window &rData )
{
GenericWindow *pWin =
new GenericWindow( getIntf(), rData.m_xPos, rData.m_yPos,
TopWindow *pWin =
new TopWindow( getIntf(), rData.m_xPos, rData.m_yPos,
m_pTheme->getWindowManager(),
rData.m_dragDrop, rData.m_playOnDrop );
m_pTheme->m_windows[rData.m_id] = GenericWindowPtr( pWin );
m_pTheme->m_windows[rData.m_id] = TopWindowPtr( pWin );
}
void Builder::addLayout( const BuilderData::Layout &rData )
{
GenericWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
TopWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
if( pWin == NULL )
{
msg_Err( getIntf(), "unknown window id: %s", rData.m_windowId.c_str() );
......@@ -186,7 +185,7 @@ void Builder::addLayout( const BuilderData::Layout &rData )
void Builder::addAnchor( const BuilderData::Anchor &rData )
{
GenericWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
TopWindow *pWin = m_pTheme->m_windows[rData.m_windowId].get();
if( pWin == NULL )
{
msg_Err( getIntf(), "unknown window id: %s", rData.m_windowId.c_str() );
......@@ -335,7 +334,7 @@ void Builder::addImage( const BuilderData::Image &rData )
return;
}
GenericWindow *pWindow = m_pTheme->m_windows[rData.m_windowId].get();
TopWindow *pWindow = m_pTheme->m_windows[rData.m_windowId].get();
if( pWindow == NULL )
{
msg_Err( getIntf(), "unknown window id: %s", rData.m_windowId.c_str() );
......@@ -570,9 +569,8 @@ void Builder::addVideo( const BuilderData::Video &rData )
return;
}
CtrlVideo *pVideo =
new CtrlVideo( getIntf(), m_pTheme->getWindowManager(),
UString( getIntf(), rData.m_help.c_str() ), NULL);
CtrlVideo *pVideo = new CtrlVideo( getIntf(),
UString( getIntf(), rData.m_help.c_str() ), NULL);
// Compute the position of the control
const Position pos = makePosition( rData.m_leftTop, rData.m_rightBottom,
......
......@@ -118,7 +118,7 @@ CmdGeneric *Interpreter::parseAction( const string &rAction, Theme *pTheme )
{
int leftPos = rAction.find( ".show()" );
string windowId = rAction.substr( 0, leftPos );
GenericWindow *pWin = pTheme->getWindowById( windowId );
TopWindow *pWin = pTheme->getWindowById( windowId );
if( pWin )
{
pCommand = new CmdShowWindow( getIntf(), pTheme->getWindowManager(),
......@@ -133,7 +133,7 @@ CmdGeneric *Interpreter::parseAction( const string &rAction, Theme *pTheme )
{
int leftPos = rAction.find( ".hide()" );
string windowId = rAction.substr( 0, leftPos );
GenericWindow *pWin = pTheme->getWindowById( windowId );
TopWindow *pWin = pTheme->getWindowById( windowId );
if( pWin )
{
pCommand = new CmdHideWindow( getIntf(), pTheme->getWindowManager(),
......@@ -210,7 +210,7 @@ VarBool *Interpreter::getVarBool( const string &rName, Theme *pTheme )
{
int leftPos = rName.find( ".isVisible" );
string windowId = rName.substr( 0, leftPos );
GenericWindow *pWin = pTheme->getWindowById( windowId );
TopWindow *pWin = pTheme->getWindowById( windowId );
if( pWin )
{
return &pWin->getVisibleVar();
......
......@@ -2,7 +2,7 @@
* generic_layout.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: generic_layout.cpp,v 1.2 2004/02/29 16:49:55 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
......@@ -23,7 +23,7 @@
*****************************************************************************/
#include "generic_layout.hpp"
#include "generic_window.hpp"
#include "top_window.hpp"
#include "os_factory.hpp"
#include "os_graphics.hpp"
#include "../controls/ctrl_generic.hpp"
......@@ -52,7 +52,7 @@ GenericLayout::~GenericLayout()
}
void GenericLayout::setWindow( GenericWindow *pWindow )
void GenericLayout::setWindow( TopWindow *pWindow )
{
m_pWindow = pWindow;
}
......@@ -61,7 +61,7 @@ void GenericLayout::setWindow( GenericWindow *pWindow )
void GenericLayout::onControlCapture( const CtrlGeneric &rCtrl )
{
// Just forward the request to the window
GenericWindow *pWindow = getWindow();
TopWindow *pWindow = getWindow();
if( pWindow )
{
pWindow->onControlCapture( rCtrl );
......@@ -72,7 +72,7 @@ void GenericLayout::onControlCapture( const CtrlGeneric &rCtrl )
void GenericLayout::onControlRelease( const CtrlGeneric &rCtrl )
{
// Just forward the request to the window
GenericWindow *pWindow = getWindow();
TopWindow *pWindow = getWindow();
if( pWindow )
{
pWindow->onControlRelease( rCtrl );
......@@ -161,7 +161,7 @@ void GenericLayout::resize( int width, int height )
}
// Resize and refresh the associated window
GenericWindow *pWindow = getWindow();
TopWindow *pWindow = getWindow();
if( pWindow )
{
// Resize the window
......@@ -191,7 +191,7 @@ void GenericLayout::refreshAll()
}
// Refresh the associated window
GenericWindow *pWindow = getWindow();
TopWindow *pWindow = getWindow();
if( pWindow )
{
pWindow->refresh( 0, 0, m_width, m_height );
......
......@@ -2,7 +2,7 @@
* generic_layout.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id: generic_layout.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
......@@ -31,7 +31,7 @@
#include <list>
class GenericWindow;
class TopWindow;
class OSGraphics;
class CtrlGeneric;
......@@ -60,10 +60,10 @@ class GenericLayout: public SkinObject, public Box
virtual ~GenericLayout();
/// Attach the layout to a window
virtual void setWindow( GenericWindow *pWindow );
virtual void setWindow( TopWindow *pWindow );
/// Get the associated window, if any
virtual GenericWindow *getWindow() const { return m_pWindow; }
virtual TopWindow *getWindow() const { return m_pWindow; }
/// Called by a control which wants to capture the mouse
virtual void onControlCapture( const CtrlGeneric &rCtrl );
......@@ -104,7 +104,7 @@ class GenericLayout: public SkinObject, public Box
private:
/// Parent window of the layout
GenericWindow *m_pWindow;
TopWindow *m_pWindow;
/// Layout size
int m_width, m_height;
int m_minWidth, m_maxWidth;
......
......@@ -23,39 +23,15 @@
*****************************************************************************/
#include "generic_window.hpp"
#include "generic_layout.hpp"
#include "os_graphics.hpp"
#include "os_window.hpp"
#include "os_factory.hpp"
#include "theme.hpp"
#include "dialogs.hpp"
#include "var_manager.hpp"
#include "../commands/cmd_on_top.hpp"
#include "../controls/ctrl_generic.hpp"
#include "../events/evt_enter.hpp"
#include "../events/evt_focus.hpp"
#include "../events/evt_leave.hpp"
#include "../events/evt_motion.hpp"
#include "../events/evt_mouse.hpp"
#include "../events/evt_key.hpp"
#include "../events/evt_refresh.hpp"
#include "../events/evt_special.hpp"
#include "../events/evt_scroll.hpp"
#include "../utils/position.hpp"
#include "../utils/ustring.hpp"
#include <vlc_keys.h>
GenericWindow::GenericWindow( intf_thread_t *pIntf, int left, int top,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop,
GenericWindow *pParent ):
SkinObject( pIntf ), m_rWindowManager( rWindowManager ),
m_left( left ), m_top( top ), m_width( 0 ), m_height( 0 ),
m_isChild( true ), m_pActiveLayout( NULL ), m_pLastHitControl( NULL ),
m_pCapturingControl( NULL ), m_pFocusControl( NULL ), m_varVisible( pIntf ),
m_currModifier( 0 )
SkinObject( pIntf ), m_left( left ), m_top( top ), m_width( 0 ),
m_height( 0 ), m_varVisible( pIntf )
{
// Get the OSFactory
OSFactory *pOsFactory = OSFactory::instance( getIntf() );
......@@ -71,14 +47,6 @@ GenericWindow::GenericWindow( intf_thread_t *pIntf, int left, int top,
m_pOsWindow = pOsFactory->createOSWindow( *this, dragDrop, playOnDrop,
pOSParent );
// Child windows don't need that
if( !pParent )
{
m_isChild = false;
// Register as a moving window
m_rWindowManager.registerWindow( *this );
}
// Observe the visibility variable
m_varVisible.addObserver( this );
}
......@@ -86,11 +54,6 @@ GenericWindow::GenericWindow( intf_thread_t *pIntf, int left, int top,
GenericWindow::~GenericWindow()
{
if( !m_isChild )
{
// Unregister from the window manager
m_rWindowManager.unregisterWindow( *this );
}
m_varVisible.delObserver( this );
if( m_pOsWindow )
......@@ -100,227 +63,6 @@ GenericWindow::~GenericWindow()
}
void GenericWindow::processEvent( EvtFocus &rEvtFocus )
{
// fprintf(stderr, rEvtFocus.getAsString().c_str()) ;
}
void GenericWindow::processEvent( EvtMotion &rEvtMotion )
{
// New control hit by the mouse
CtrlGeneric *pNewHitControl =
findHitControl( rEvtMotion.getXPos() - m_left,
rEvtMotion.getYPos() - m_top );
setLastHit( pNewHitControl );
/// Update the help text
VarManager *pVarManager = VarManager::instance( getIntf() );
if( pNewHitControl )
{
pVarManager->getHelpText().set( pNewHitControl->getHelpText() );
}
// Send a motion event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
// Compute the coordinates relative to the window
int xPos = rEvtMotion.getXPos() - m_left;
int yPos = rEvtMotion.getYPos() - m_top;
// Send a motion event
EvtMotion evt( getIntf(), xPos, yPos );
pActiveControl->handleEvent( evt );
}
}
void GenericWindow::processEvent( EvtLeave &rEvtLeave )
{
// No more hit control
setLastHit( NULL );
if( !m_pCapturingControl )
{
m_rWindowManager.hideTooltip();
}
}
void GenericWindow::processEvent( EvtMouse &rEvtMouse )
{
// Get the control hit by the mouse
CtrlGeneric *pNewHitControl = findHitControl( rEvtMouse.getXPos(),
rEvtMouse.getYPos() );
setLastHit( pNewHitControl );
// Change the focused control
if( rEvtMouse.getAction() == EvtMouse::kDown )
{
// Raise all the windows
m_rWindowManager.raiseAll( *this );
if( pNewHitControl && pNewHitControl->isFocusable() )
{
// If a new control gains the focus, the previous one loses it
if( m_pFocusControl && m_pFocusControl != pNewHitControl )
{
EvtFocus evt( getIntf(), false );
m_pFocusControl->handleEvent( evt );
}
if( pNewHitControl != m_pFocusControl )
{
m_pFocusControl = pNewHitControl;
EvtFocus evt( getIntf(), false );
pNewHitControl->handleEvent( evt );
}
}
else if( m_pFocusControl )
{
// The previous control loses the focus
EvtFocus evt( getIntf(), false );
m_pFocusControl->handleEvent( evt );
m_pFocusControl = NULL;
}
}
// Send a mouse event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
pActiveControl->handleEvent( rEvtMouse );
}
}
void GenericWindow::processEvent( EvtKey &rEvtKey )
{
// Forward the event to the focused control, if any
if( m_pFocusControl )
{
m_pFocusControl->handleEvent( rEvtKey );
return;
}
// Only do the action when the key is down
if( rEvtKey.getAsString().find( "key:down") != string::npos )
{
//XXX not to be hardcoded !
// Ctrl-S = Change skin
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 's' )
{
Dialogs *pDialogs = Dialogs::instance( getIntf() );
if( pDialogs != NULL )
{
pDialogs->showChangeSkin();
}
return;
}
//XXX not to be hardcoded !
// Ctrl-T = Toggle on top
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 't' )
{
CmdOnTop cmd( getIntf() );
cmd.execute();
return;
}
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_vlc, "key-pressed", val );
}
// Always store the modifier, which can be needed for scroll events
m_currModifier = rEvtKey.getMod();
}
void GenericWindow::processEvent( EvtRefresh &rEvtRefresh )
{
// Refresh the given area
refresh( rEvtRefresh.getXStart(), rEvtRefresh.getYStart(),
rEvtRefresh.getWidth(), rEvtRefresh.getHeight() );
}
void GenericWindow::processEvent( EvtScroll &rEvtScroll )
{
// Raise the windows
raise();
// Get the control hit by the mouse
CtrlGeneric *pNewHitControl = findHitControl( rEvtScroll.getXPos(),
rEvtScroll.getYPos());
setLastHit( pNewHitControl );
// Send a mouse event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
pActiveControl->handleEvent( rEvtScroll );
}
else
{
// Treat the scroll event as a hotkey
vlc_value_t val;
if( rEvtScroll.getDirection() == EvtScroll::kUp )
{
val.i_int = KEY_MOUSEWHEELUP;
}
else
{
val.i_int = KEY_MOUSEWHEELDOWN;
}
// Add the modifiers
val.i_int |= m_currModifier;
var_Set( getIntf()->p_vlc, "key-pressed", val );
}
}
void GenericWindow::forwardEvent( EvtGeneric &rEvt, CtrlGeneric &rCtrl )
{
// XXX: We should do some checks here
rCtrl.handleEvent( rEvt );
}
void GenericWindow::show()
{
m_varVisible.set( true );
......@@ -333,16 +75,6 @@ void GenericWindow::hide()
}
void GenericWindow::refresh( int left, int top, int width, int height )
{
if( m_pActiveLayout )
{
m_pActiveLayout->getImage()->copyToWindow( *m_pOsWindow, left, top,
width, height, left, top );
}
}
void GenericWindow::move( int left, int top )
{
// Update the window coordinates
......@@ -381,97 +113,6 @@ void GenericWindow::toggleOnTop( bool onTop ) const
}
void GenericWindow::setActiveLayout( GenericLayout *pLayout )
{
pLayout->setWindow( this );
m_pActiveLayout = pLayout;
// Get the size of the layout and resize the window
m_width = pLayout->getWidth();
m_height = pLayout->getHeight();
m_pOsWindow->moveResize( m_left, m_top, m_width, m_height );
updateShape();
pLayout->refreshAll();
}
void GenericWindow::updateShape()
{
// Set the shape of the window
if( m_pActiveLayout )
{
OSGraphics *pImage = m_pActiveLayout->getImage();
if( pImage )
{
pImage->applyMaskToWindow( *m_pOsWindow );
}
}
}
const list<Anchor*> GenericWindow::getAnchorList() const
{
return m_anchorList;
}
void GenericWindow::addAnchor( Anchor *pAnchor )
{
m_anchorList.push_back( pAnchor );
}
void GenericWindow::onControlCapture( const CtrlGeneric &rCtrl )
{
// Set the capturing control
m_pCapturingControl = (CtrlGeneric*) &rCtrl;
}
void GenericWindow::onControlRelease( const CtrlGeneric &rCtrl )
{
// Release the capturing control
if( m_pCapturingControl == &rCtrl )
{
m_pCapturingControl = NULL;
}
else
{
msg_Dbg( getIntf(), "Control had not captured the mouse" );
}
// Send an enter event to the control under the mouse, if it doesn't
// have received it yet
if( m_pLastHitControl && m_pLastHitControl != &rCtrl )
{
EvtEnter evt( getIntf() );
m_pLastHitControl->handleEvent( evt );
// Show the tooltip
m_rWindowManager.hideTooltip();
UString tipText = m_pLastHitControl->getTooltipText();
if( tipText.length() > 0 )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( tipText );
m_rWindowManager.showTooltip();
}
}
}
void GenericWindow::onTooltipChange( const CtrlGeneric &rCtrl )
{
// Check that the control is the active one
if( m_pLastHitControl && m_pLastHitControl == &rCtrl )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( rCtrl.getTooltipText() );
}
}
void GenericWindow::onUpdate( Subject<VarBool> &rVariable )
{
if( m_varVisible.get() )
......@@ -487,13 +128,6 @@ void GenericWindow::onUpdate( Subject<VarBool> &rVariable )
void GenericWindow::innerShow()
{
// First, refresh the layout and update the shape of the window
if( m_pActiveLayout )
{
updateShape();
m_pActiveLayout->refreshAll();
}
if( m_pOsWindow )
{
m_pOsWindow->show( m_left, m_top );
......@@ -509,89 +143,3 @@ void GenericWindow::innerHide()
}
}
CtrlGeneric *GenericWindow::findHitControl( int xPos, int yPos )
{
if( m_pActiveLayout == NULL )
{
return NULL;
}
// Get the controls in the active layout
const list<LayeredControl> &ctrlList = m_pActiveLayout->getControlList();
list<LayeredControl>::const_reverse_iterator iter;
// New control hit by the mouse
CtrlGeneric *pNewHitControl = NULL;
// Loop on the control list to find the uppest hit control
for( iter = ctrlList.rbegin(); iter != ctrlList.rend(); iter++ )
{
// Get the position of the control in the layout
const Position *pos = (*iter).m_pControl->getPosition();
if( pos != NULL )
{
// Compute the coordinates of the mouse relative to the control
int xRel = xPos - pos->getLeft();
int yRel = yPos - pos->getTop();
CtrlGeneric *pCtrl = (*iter).m_pControl;
// Control hit ?
if( pCtrl->isVisible() && pCtrl->mouseOver( xRel, yRel ) )
{
pNewHitControl = (*iter).m_pControl;
break;
}
}
else
{
msg_Dbg( getIntf(), "Control at NULL position" );
}
}
// If the hit control has just been entered, send it an enter event
if( pNewHitControl && (pNewHitControl != m_pLastHitControl) )
{
// Don't send the event if another control captured the mouse
if( !m_pCapturingControl || (m_pCapturingControl == pNewHitControl ) )
{
EvtEnter evt( getIntf() );
pNewHitControl->handleEvent( evt );
if( !m_pCapturingControl )
{
// Show the tooltip
m_rWindowManager.hideTooltip();
UString tipText = pNewHitControl->getTooltipText();
if( tipText.length() > 0 )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( tipText );
m_rWindowManager.showTooltip();
}
}
}
}
return pNewHitControl;
}
void GenericWindow::setLastHit( CtrlGeneric *pNewHitControl )
{
// Send a leave event to the left control
if( m_pLastHitControl && (pNewHitControl != m_pLastHitControl) )
{
// Don't send the event if another control captured the mouse
if( !m_pCapturingControl || (m_pCapturingControl == m_pLastHitControl))
{
EvtLeave evt( getIntf() );
m_pLastHitControl->handleEvent( evt );
}
}
m_pLastHitControl = pNewHitControl;
}
......@@ -26,15 +26,9 @@
#define GENERIC_WINDOW_HPP
#include "skin_common.hpp"
#include "../utils/pointer.hpp"
#include "../utils/var_bool.hpp"
#include <list>
class Anchor;
class OSWindow;
class OSGraphics;
class GenericLayout;
class CtrlGeneric;
class EvtGeneric;
class EvtFocus;
class EvtLeave;
......@@ -43,7 +37,6 @@ class EvtMouse;
class EvtKey;
class EvtRefresh;
class EvtScroll;
class WindowManager;
/// Generic window class
......@@ -51,22 +44,18 @@ class GenericWindow: public SkinObject, public Observer<VarBool>
{
public:
GenericWindow( intf_thread_t *pIntf, int xPos, int yPos,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop,
GenericWindow *pParent = NULL );
virtual ~GenericWindow();
/// Methods to process OS events.
virtual void processEvent( EvtFocus &rEvtFocus );
virtual void processEvent( EvtMotion &rEvtMotion );
virtual void processEvent( EvtMouse &rEvtMouse );
virtual void processEvent( EvtLeave &rEvtLeave );
virtual void processEvent( EvtKey &rEvtKey );
virtual void processEvent( EvtRefresh &rEvtRefresh );
virtual void processEvent( EvtScroll &rEvtScroll );
/// Forward an event to a control
virtual void forwardEvent( EvtGeneric &rEvt, CtrlGeneric &rCtrl );
virtual void processEvent( EvtFocus &rEvtFocus ) {}
virtual void processEvent( EvtMotion &rEvtMotion ) {}
virtual void processEvent( EvtMouse &rEvtMouse ) {}
virtual void processEvent( EvtLeave &rEvtLeave ) {}
virtual void processEvent( EvtKey &rEvtKey ) {}
virtual void processEvent( EvtRefresh &rEvtRefresh ) {}
virtual void processEvent( EvtScroll &rEvtScroll ) {}
// Show the window
virtual void show();
......@@ -75,7 +64,7 @@ class GenericWindow: public SkinObject, public Observer<VarBool>
virtual void hide();
// Refresh an area of the window
virtual void refresh( int left, int top, int width, int height );
virtual void refresh( int left, int top, int width, int height ) {}
/// Move the window
virtual void move( int left, int top );
......@@ -92,21 +81,6 @@ class GenericWindow: public SkinObject, public Observer<VarBool>
/// Toggle the window on top
virtual void toggleOnTop( bool onTop ) const;
/// Change the active layout
virtual void setActiveLayout( GenericLayout *pLayout );
/// Update the shape of the window from the active layout
virtual void updateShape();
/// Called by a control that wants to capture the mouse
virtual void onControlCapture( const CtrlGeneric &rCtrl );
/// Called by a control that wants to release the mouse
virtual void onControlRelease( const CtrlGeneric &rCtrl );
/// Called by a control when its tooltip changed
virtual void onTooltipChange( const CtrlGeneric &rCtrl );
/// Get the coordinates of the window
virtual int getLeft() const { return m_left; }
virtual int getTop() const { return m_top; }
......@@ -116,55 +90,27 @@ class GenericWindow: public SkinObject, public Observer<VarBool>
/// Give access to the visibility variable
VarBool &getVisibleVar() { return m_varVisible; }
/// Get the list of the anchors of this window
virtual const list<Anchor*> getAnchorList() const;
protected:
/// Actually show the window
virtual void innerShow();
/// Actually hide the window
virtual void innerHide();
/// Add an anchor to this window
virtual void addAnchor( Anchor *pAnchor );
/// Get the OS window
OSWindow *getOSWindow() const { return m_pOsWindow; }
private:
/// Window manager
WindowManager &m_rWindowManager;
/// Window position and size
int m_left, m_top, m_width, m_height;
/// Flag set if the window has a parent
bool m_isChild;
/// OS specific implementation
OSWindow *m_pOsWindow;
/// Current active layout of the window
GenericLayout *m_pActiveLayout;
/// Last control on which the mouse was over
CtrlGeneric *m_pLastHitControl;
/// Control that has captured the mouse
CtrlGeneric *m_pCapturingControl;
/// Control that has the focus
CtrlGeneric *m_pFocusControl;
/// List of the anchors of this window
list<Anchor*> m_anchorList;
/// Variable for the visibility of the window
VarBoolImpl m_varVisible;
/// Current key modifier (also used for mouse)
int m_currModifier;
/// Method called when the observed variable is modified
virtual void onUpdate( Subject<VarBool> &rVariable );
// Actually show the window
virtual void innerShow();
// Actually hide the window
virtual void innerHide();
/// Find the uppest control in the layout hit by the mouse, and send
/// it an enter event if needed
CtrlGeneric *findHitControl( int xPos, int yPos );
/// Update the lastHitControl pointer and send a leave event to the
/// right control
void setLastHit( CtrlGeneric *pNewHitControl );
};
typedef CountedPtr<GenericWindow> GenericWindowPtr;
#endif
......@@ -51,14 +51,14 @@ void Theme::loadConfig()
return;
// Initialization
map<string, GenericWindowPtr>::const_iterator it;
map<string, TopWindowPtr>::const_iterator it;
int i = 0;
int x, y, v, scan;
// Get config for each window
for( it = m_windows.begin(); it != m_windows.end(); it++ )
{
GenericWindow *pWin = (*it).second.get();
TopWindow *pWin = (*it).second.get();
// Get config
scan = sscanf( &save[i * 13], "(%4d,%4d,%1d)", &x, &y, &v );
......@@ -81,14 +81,14 @@ void Theme::saveConfig()
// Initialize char where config is stored
char *save = new char[400];
map<string, GenericWindowPtr>::const_iterator it;
map<string, TopWindowPtr>::const_iterator it;
int i = 0;
int x, y;
// Save config of every window
for( it = m_windows.begin(); it != m_windows.end(); it++ )
{
GenericWindow *pWin = (*it).second.get();
TopWindow *pWin = (*it).second.get();
// Print config
x = pWin->getLeft();
y = pWin->getTop();
......@@ -126,9 +126,9 @@ GenericFont *Theme::getFontById( const string &id )
FIND_OBJECT( GenericFontPtr, m_fonts );
}
GenericWindow *Theme::getWindowById( const string &id )
TopWindow *Theme::getWindowById( const string &id )
{
FIND_OBJECT( GenericWindowPtr, m_windows );
FIND_OBJECT( TopWindowPtr, m_windows );
}
GenericLayout *Theme::getLayoutById( const string &id )
......
......@@ -51,7 +51,7 @@ class Theme: public SkinObject
GenericBitmap *getBitmapById( const string &id );
GenericFont *getFontById( const string &id );
GenericWindow *getWindowById( const string &id );
TopWindow *getWindowById( const string &id );
GenericLayout *getLayoutById( const string &id );
CtrlGeneric *getControlById( const string &id );
......@@ -65,7 +65,7 @@ class Theme: public SkinObject
/// Store the fonts by ID
map<string, GenericFontPtr> m_fonts;
/// Store the windows by ID
map<string, GenericWindowPtr> m_windows;
map<string, TopWindowPtr> m_windows;
/// Store the layouts by ID
map<string, GenericLayoutPtr> m_layouts;
/// Store the controls by ID
......
/*****************************************************************************
* top_window.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulire <ipkiss@via.ecp.fr>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include "top_window.hpp"
#include "generic_layout.hpp"
#include "os_graphics.hpp"
#include "os_window.hpp"
#include "os_factory.hpp"
#include "theme.hpp"
#include "dialogs.hpp"
#include "var_manager.hpp"
#include "../commands/cmd_on_top.hpp"
#include "../controls/ctrl_generic.hpp"
#include "../events/evt_enter.hpp"
#include "../events/evt_focus.hpp"
#include "../events/evt_leave.hpp"
#include "../events/evt_motion.hpp"
#include "../events/evt_mouse.hpp"
#include "../events/evt_key.hpp"
#include "../events/evt_refresh.hpp"
#include "../events/evt_special.hpp"
#include "../events/evt_scroll.hpp"
#include "../utils/position.hpp"
#include "../utils/ustring.hpp"
#include <vlc_keys.h>
TopWindow::TopWindow( intf_thread_t *pIntf, int left, int top,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop ):
GenericWindow( pIntf, left, top, dragDrop, playOnDrop,
NULL),
m_rWindowManager( rWindowManager ), m_pActiveLayout( NULL ),
m_pLastHitControl( NULL ), m_pCapturingControl( NULL ),
m_pFocusControl( NULL ), m_currModifier( 0 )
{
// Register as a moving window
m_rWindowManager.registerWindow( *this );
}
TopWindow::~TopWindow()
{
// Unregister from the window manager
m_rWindowManager.unregisterWindow( *this );
}
void TopWindow::processEvent( EvtFocus &rEvtFocus )
{
// fprintf(stderr, rEvtFocus.getAsString().c_str()) ;
}
void TopWindow::processEvent( EvtMotion &rEvtMotion )
{
// New control hit by the mouse
CtrlGeneric *pNewHitControl =
findHitControl( rEvtMotion.getXPos() - getLeft(),
rEvtMotion.getYPos() - getTop() );
setLastHit( pNewHitControl );
/// Update the help text
VarManager *pVarManager = VarManager::instance( getIntf() );
if( pNewHitControl )
{
pVarManager->getHelpText().set( pNewHitControl->getHelpText() );
}
// Send a motion event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
// Compute the coordinates relative to the window
int xPos = rEvtMotion.getXPos() - getLeft();
int yPos = rEvtMotion.getYPos() - getTop();
// Send a motion event
EvtMotion evt( getIntf(), xPos, yPos );
pActiveControl->handleEvent( evt );
}
}
void TopWindow::processEvent( EvtLeave &rEvtLeave )
{
// No more hit control
setLastHit( NULL );
if( !m_pCapturingControl )
{
m_rWindowManager.hideTooltip();
}
}
void TopWindow::processEvent( EvtMouse &rEvtMouse )
{
// Get the control hit by the mouse
CtrlGeneric *pNewHitControl = findHitControl( rEvtMouse.getXPos(),
rEvtMouse.getYPos() );
setLastHit( pNewHitControl );
// Change the focused control
if( rEvtMouse.getAction() == EvtMouse::kDown )
{
// Raise all the windows
m_rWindowManager.raiseAll( *this );
if( pNewHitControl && pNewHitControl->isFocusable() )
{
// If a new control gains the focus, the previous one loses it
if( m_pFocusControl && m_pFocusControl != pNewHitControl )
{
EvtFocus evt( getIntf(), false );
m_pFocusControl->handleEvent( evt );
}
if( pNewHitControl != m_pFocusControl )
{
m_pFocusControl = pNewHitControl;
EvtFocus evt( getIntf(), false );
pNewHitControl->handleEvent( evt );
}
}
else if( m_pFocusControl )
{
// The previous control loses the focus
EvtFocus evt( getIntf(), false );
m_pFocusControl->handleEvent( evt );
m_pFocusControl = NULL;
}
}
// Send a mouse event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
pActiveControl->handleEvent( rEvtMouse );
}
}
void TopWindow::processEvent( EvtKey &rEvtKey )
{
// Forward the event to the focused control, if any
if( m_pFocusControl )
{
m_pFocusControl->handleEvent( rEvtKey );
return;
}
// Only do the action when the key is down
if( rEvtKey.getAsString().find( "key:down") != string::npos )
{
//XXX not to be hardcoded !
// Ctrl-S = Change skin
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 's' )
{
Dialogs *pDialogs = Dialogs::instance( getIntf() );
if( pDialogs != NULL )
{
pDialogs->showChangeSkin();
}
return;
}
//XXX not to be hardcoded !
// Ctrl-T = Toggle on top
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 't' )
{
CmdOnTop cmd( getIntf() );
cmd.execute();
return;
}
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_vlc, "key-pressed", val );
}
// Always store the modifier, which can be needed for scroll events
m_currModifier = rEvtKey.getMod();
}
void TopWindow::processEvent( EvtRefresh &rEvtRefresh )
{
// Refresh the given area
refresh( rEvtRefresh.getXStart(), rEvtRefresh.getYStart(),
rEvtRefresh.getWidth(), rEvtRefresh.getHeight() );
}
void TopWindow::processEvent( EvtScroll &rEvtScroll )
{
// Raise the windows
raise();
// Get the control hit by the mouse
CtrlGeneric *pNewHitControl = findHitControl( rEvtScroll.getXPos(),
rEvtScroll.getYPos());
setLastHit( pNewHitControl );
// Send a mouse event to the hit control, or to the control
// that captured the mouse, if any
CtrlGeneric *pActiveControl = pNewHitControl;
if( m_pCapturingControl )
{
pActiveControl = m_pCapturingControl;
}
if( pActiveControl )
{
pActiveControl->handleEvent( rEvtScroll );
}
else
{
// Treat the scroll event as a hotkey
vlc_value_t val;
if( rEvtScroll.getDirection() == EvtScroll::kUp )
{
val.i_int = KEY_MOUSEWHEELUP;
}
else
{
val.i_int = KEY_MOUSEWHEELDOWN;
}
// Add the modifiers
val.i_int |= m_currModifier;
var_Set( getIntf()->p_vlc, "key-pressed", val );
}
}
void TopWindow::forwardEvent( EvtGeneric &rEvt, CtrlGeneric &rCtrl )
{
// XXX: We should do some checks here
rCtrl.handleEvent( rEvt );
}
void TopWindow::refresh( int left, int top, int width, int height )
{
if( m_pActiveLayout )
{
m_pActiveLayout->getImage()->copyToWindow( *getOSWindow(), left, top,
width, height, left, top );
}
}
void TopWindow::setActiveLayout( GenericLayout *pLayout )
{
pLayout->setWindow( this );
m_pActiveLayout = pLayout;
// Get the size of the layout and resize the window
resize( pLayout->getWidth(), pLayout->getHeight() );
updateShape();
pLayout->refreshAll();
}
void TopWindow::innerShow()
{
// First, refresh the layout and update the shape of the window
if( m_pActiveLayout )
{
updateShape();
m_pActiveLayout->refreshAll();
}
// Show the window
GenericWindow::innerShow();
}
void TopWindow::updateShape()
{
// Set the shape of the window
if( m_pActiveLayout )
{
OSGraphics *pImage = m_pActiveLayout->getImage();
if( pImage )
{
pImage->applyMaskToWindow( *getOSWindow() );
}
}
}
const list<Anchor*> TopWindow::getAnchorList() const
{
return m_anchorList;
}
void TopWindow::addAnchor( Anchor *pAnchor )
{
m_anchorList.push_back( pAnchor );
}
void TopWindow::onControlCapture( const CtrlGeneric &rCtrl )
{
// Set the capturing control
m_pCapturingControl = (CtrlGeneric*) &rCtrl;
}
void TopWindow::onControlRelease( const CtrlGeneric &rCtrl )
{
// Release the capturing control
if( m_pCapturingControl == &rCtrl )
{
m_pCapturingControl = NULL;
}
else
{
msg_Dbg( getIntf(), "Control had not captured the mouse" );
}
// Send an enter event to the control under the mouse, if it doesn't
// have received it yet
if( m_pLastHitControl && m_pLastHitControl != &rCtrl )
{
EvtEnter evt( getIntf() );
m_pLastHitControl->handleEvent( evt );
// Show the tooltip
m_rWindowManager.hideTooltip();
UString tipText = m_pLastHitControl->getTooltipText();
if( tipText.length() > 0 )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( tipText );
m_rWindowManager.showTooltip();
}
}
}
void TopWindow::onTooltipChange( const CtrlGeneric &rCtrl )
{
// Check that the control is the active one
if( m_pLastHitControl && m_pLastHitControl == &rCtrl )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( rCtrl.getTooltipText() );
}
}
CtrlGeneric *TopWindow::findHitControl( int xPos, int yPos )
{
if( m_pActiveLayout == NULL )
{
return NULL;
}
// Get the controls in the active layout
const list<LayeredControl> &ctrlList = m_pActiveLayout->getControlList();
list<LayeredControl>::const_reverse_iterator iter;
// New control hit by the mouse
CtrlGeneric *pNewHitControl = NULL;
// Loop on the control list to find the uppest hit control
for( iter = ctrlList.rbegin(); iter != ctrlList.rend(); iter++ )
{
// Get the position of the control in the layout
const Position *pos = (*iter).m_pControl->getPosition();
if( pos != NULL )
{
// Compute the coordinates of the mouse relative to the control
int xRel = xPos - pos->getLeft();
int yRel = yPos - pos->getTop();
CtrlGeneric *pCtrl = (*iter).m_pControl;
// Control hit ?
if( pCtrl->isVisible() && pCtrl->mouseOver( xRel, yRel ) )
{
pNewHitControl = (*iter).m_pControl;
break;
}
}
else
{
msg_Dbg( getIntf(), "Control at NULL position" );
}
}
// If the hit control has just been entered, send it an enter event
if( pNewHitControl && (pNewHitControl != m_pLastHitControl) )
{
// Don't send the event if another control captured the mouse
if( !m_pCapturingControl || (m_pCapturingControl == pNewHitControl ) )
{
EvtEnter evt( getIntf() );
pNewHitControl->handleEvent( evt );
if( !m_pCapturingControl )
{
// Show the tooltip
m_rWindowManager.hideTooltip();
UString tipText = pNewHitControl->getTooltipText();
if( tipText.length() > 0 )
{
// Set the tooltip text variable
VarManager *pVarManager = VarManager::instance( getIntf() );
pVarManager->getTooltipText().set( tipText );
m_rWindowManager.showTooltip();
}
}
}
}
return pNewHitControl;
}
void TopWindow::setLastHit( CtrlGeneric *pNewHitControl )
{
// Send a leave event to the left control
if( m_pLastHitControl && (pNewHitControl != m_pLastHitControl) )
{
// Don't send the event if another control captured the mouse
if( !m_pCapturingControl || (m_pCapturingControl == m_pLastHitControl))
{
EvtLeave evt( getIntf() );
m_pLastHitControl->handleEvent( evt );
}
}
m_pLastHitControl = pNewHitControl;
}
/*****************************************************************************
* top_window.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
* $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifndef TOP_WINDOW_HPP
#define TOP_WINDOW_HPP
#include "generic_window.hpp"
#include "../utils/pointer.hpp"
#include <list>
class Anchor;
class OSWindow;
class OSGraphics;
class GenericLayout;
class CtrlGeneric;
class WindowManager;
/// Class to handle top-level windows
class TopWindow: public GenericWindow
{
public:
TopWindow( intf_thread_t *pIntf, int xPos, int yPos,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop );
virtual ~TopWindow();
/// Methods to process OS events.
virtual void processEvent( EvtFocus &rEvtFocus );
virtual void processEvent( EvtMotion &rEvtMotion );
virtual void processEvent( EvtMouse &rEvtMouse );
virtual void processEvent( EvtLeave &rEvtLeave );
virtual void processEvent( EvtKey &rEvtKey );
virtual void processEvent( EvtRefresh &rEvtRefresh );
virtual void processEvent( EvtScroll &rEvtScroll );
/// Forward an event to a control
virtual void forwardEvent( EvtGeneric &rEvt, CtrlGeneric &rCtrl );
// Refresh an area of the window
virtual void refresh( int left, int top, int width, int height );
/// Change the active layout
virtual void setActiveLayout( GenericLayout *pLayout );
/// Update the shape of the window from the active layout
virtual void updateShape();
/// Called by a control that wants to capture the mouse
virtual void onControlCapture( const CtrlGeneric &rCtrl );
/// Called by a control that wants to release the mouse
virtual void onControlRelease( const CtrlGeneric &rCtrl );
/// Called by a control when its tooltip changed
virtual void onTooltipChange( const CtrlGeneric &rCtrl );
/// Get the list of the anchors of this window
virtual const list<Anchor*> getAnchorList() const;
/// Add an anchor to this window
virtual void addAnchor( Anchor *pAnchor );
protected:
/// Actually show the window
virtual void innerShow();
private:
/// Window manager
WindowManager &m_rWindowManager;
/// Current active layout of the window
GenericLayout *m_pActiveLayout;
/// Last control on which the mouse was over
CtrlGeneric *m_pLastHitControl;
/// Control that has captured the mouse
CtrlGeneric *m_pCapturingControl;
/// Control that has the focus
CtrlGeneric *m_pFocusControl;
/// List of the anchors of this window
list<Anchor*> m_anchorList;
/// Current key modifier (also used for mouse)
int m_currModifier;
/// Find the uppest control in the layout hit by the mouse, and send
/// it an enter event if needed
CtrlGeneric *findHitControl( int xPos, int yPos );
/// Update the lastHitControl pointer and send a leave event to the
/// right control
void setLastHit( CtrlGeneric *pNewHitControl );
};
typedef CountedPtr<TopWindow> TopWindowPtr;
#endif
......@@ -27,9 +27,8 @@
VoutWindow::VoutWindow( intf_thread_t *pIntf, int left, int top,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop, GenericWindow &rParent ):
GenericWindow( pIntf, left, top, rWindowManager, dragDrop, playOnDrop,
GenericWindow( pIntf, left, top, dragDrop, playOnDrop,
&rParent )
{
}
......
......@@ -32,7 +32,6 @@ class VoutWindow: public GenericWindow
{
public:
VoutWindow( intf_thread_t *pIntf, int xPos, int yPos,
WindowManager &rWindowManager,
bool dragDrop, bool playOnDrop, GenericWindow &rParent );
virtual ~VoutWindow();
};
......
......@@ -42,14 +42,14 @@ WindowManager::~WindowManager()
}
void WindowManager::registerWindow( GenericWindow &rWindow )
void WindowManager::registerWindow( TopWindow &rWindow )
{
// Add the window to the set
m_allWindows.insert( &rWindow );
}
void WindowManager::unregisterWindow( GenericWindow &rWindow )
void WindowManager::unregisterWindow( TopWindow &rWindow )
{
// Erase every possible reference to the window
m_allWindows.erase( &rWindow );
......@@ -58,7 +58,7 @@ void WindowManager::unregisterWindow( GenericWindow &rWindow )
}
void WindowManager::startMove( GenericWindow &rWindow )
void WindowManager::startMove( TopWindow &rWindow )
{
// Rebuild the set of moving windows
m_movingWindows.clear();
......@@ -126,7 +126,7 @@ void WindowManager::stopMove()
}
void WindowManager::move( GenericWindow &rWindow, int left, int top ) const
void WindowManager::move( TopWindow &rWindow, int left, int top ) const
{
// Compute the real move offset
int xOffset = left - rWindow.getLeft();
......@@ -144,7 +144,7 @@ void WindowManager::move( GenericWindow &rWindow, int left, int top ) const
}
void WindowManager::raiseAll( GenericWindow &rWindow ) const
void WindowManager::raiseAll( TopWindow &rWindow ) const
{
// Raise all the windows
WinSet_t::const_iterator it;
......@@ -194,7 +194,7 @@ void WindowManager::toggleOnTop()
void WindowManager::buildDependSet( WinSet_t &rWinSet,
GenericWindow *pWindow )
TopWindow *pWindow )
{
// pWindow is in the set
rWinSet.insert( pWindow );
......@@ -213,7 +213,7 @@ void WindowManager::buildDependSet( WinSet_t &rWinSet,
}
void WindowManager::checkAnchors( GenericWindow *pWindow,
void WindowManager::checkAnchors( TopWindow *pWindow,
int &xOffset, int &yOffset ) const
{
WinSet_t::const_iterator itMov, itSta;
......
......@@ -26,7 +26,7 @@
#define WINDOW_MANAGER_HPP
#include "skin_common.hpp"
#include "generic_window.hpp"
#include "top_window.hpp"
#include <list>
#include <map>
#include <set>
......@@ -50,13 +50,13 @@ class WindowManager: public SkinObject
/// Add a window to the list of known windows. Necessary if you want
/// your window to be movable...
void registerWindow( GenericWindow &rWindow );
void registerWindow( TopWindow &rWindow );
/// Remove a previously registered window
void unregisterWindow( GenericWindow &rWindow );
void unregisterWindow( TopWindow &rWindow );
/// Tell the window manager that a move is initiated for pWindow.
void startMove( GenericWindow &rWindow );
void startMove( TopWindow &rWindow );
/// Tell the window manager that the current move ended.
void stopMove();
......@@ -64,10 +64,10 @@ class WindowManager: public SkinObject
/// Move the pWindow window to (left, top), and move all its
/// anchored windows.
/// If a new anchoring is detected, the windows will move accordingly.
void move( GenericWindow &rWindow, int left, int top ) const;
void move( TopWindow &rWindow, int left, int top ) const;
/// Raise all the windows, rWindow being above the others
void raiseAll( GenericWindow &rWindow ) const;
void raiseAll( TopWindow &rWindow ) const;
/// Show all the registered windows
void showAll() const;
......@@ -76,10 +76,10 @@ class WindowManager: public SkinObject
void hideAll() const;
/// Show the given window
void show( GenericWindow &rWindow ) { rWindow.show(); }
void show( TopWindow &rWindow ) { rWindow.show(); }
/// Hide the given window
void hide( GenericWindow &rWindow ) { rWindow.hide(); }
void hide( TopWindow &rWindow ) { rWindow.hide(); }
/// Toggle all the windows on top
void toggleOnTop();
......@@ -104,7 +104,7 @@ class WindowManager: public SkinObject
private:
/// Some useful typedefs for lazy people like me
typedef set<GenericWindow*> WinSet_t;
typedef set<TopWindow*> WinSet_t;
typedef list<Anchor*> AncList_t;
/// This map represents the graph of anchored windows: it associates
......@@ -112,7 +112,7 @@ class WindowManager: public SkinObject
/// This is not transitive, i.e. if a is in m_dep[b] and if b is in
/// m_dep[c], it doesn't mean that a is in m_dep[c] (in fact, it
/// would be extremely rare...)
map<GenericWindow*, WinSet_t> m_dependencies;
map<TopWindow*, WinSet_t> m_dependencies;
/// Store all the windows
WinSet_t m_allWindows;
/// Store the moving windows; this set is updated at every start of
......@@ -130,11 +130,11 @@ class WindowManager: public SkinObject
Tooltip *m_pTooltip;
/// Recursively build a set of windows anchored to the one given.
void buildDependSet( WinSet_t &rWinSet, GenericWindow *pWindow );
void buildDependSet( WinSet_t &rWinSet, TopWindow *pWindow );
/// Check anchoring: this function updates xOffset and yOffset,
/// to take care of a new anchoring (if any)
void checkAnchors( GenericWindow *pWindow,
void checkAnchors( TopWindow *pWindow,
int &xOffset, int &yOffset ) const;
};
......
......@@ -61,7 +61,6 @@
<Bitmap id="stop_disabled" file="stop_disabled.png" alphacolor="#FF0000"/>
<Bitmap id="stop_onclick" file="stop_onclick.png" alphacolor="#FF0000"/>
<Bitmap id="volume_radial" file="volume.png" alphacolor="#FF0000"/>
<Bitmap id="vout" file="vout.png" alphacolor="#FF0000"/>
<Font id="default_font" font="FreeSansBold.ttf" size="15"/>
<Font id="playlist_font" font="FreeSansBold.ttf" size="12"/>
......
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