skins2: first proposal for a skinnable fullscreen controller (fsc)
[vlc.git] / modules / gui / skins2 / src / vout_manager.hpp
1 /*****************************************************************************
2  * vout_manager.hpp
3  *****************************************************************************
4  * Copyright (C) 2009 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Erwan Tulou < brezhoneg1 at yahoo.fr r>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifndef VOUTMANAGER_HPP
25 #define VOUTMANAGER_HPP
26
27 #include <vector>
28
29 #include <vlc_vout.h>
30 #include <vlc_vout_window.h>
31 #include "../utils/position.hpp"
32 #include "../commands/cmd_generic.hpp"
33 #include "../controls/ctrl_video.hpp"
34
35 class VarBool;
36 class GenericWindow;
37
38 #include <stdio.h>
39
40 class SavedWnd
41 {
42 public:
43     SavedWnd( vout_window_t* pWnd, VoutWindow* pVoutWindow = NULL,
44                CtrlVideo* pCtrlVideo = NULL, int height = 0, int width = 0 )
45             : pWnd( pWnd ), pVoutWindow( pVoutWindow ),
46               pCtrlVideo( pCtrlVideo ), height( height ), width( width ) { }
47     ~SavedWnd() { }
48
49     vout_window_t* pWnd;
50     VoutWindow *pVoutWindow;
51     CtrlVideo *pCtrlVideo;
52     int height;
53     int width;
54 };
55
56 class VoutMainWindow: public GenericWindow
57 {
58 public:
59
60     VoutMainWindow( intf_thread_t *pIntf, int left = 0, int top = 0 ) :
61             GenericWindow( pIntf, left, top, false, false, NULL,
62                            GenericWindow::FullscreenWindow )
63     {
64         resize( 10, 10 );
65         move( -50, -50 );
66     }
67     virtual ~VoutMainWindow() { }
68 };
69
70
71 /// Singleton object handling VLC internal state and playlist
72 class VoutManager: public SkinObject
73 {
74 public:
75     /// Get the instance of VoutManager
76     /// Returns NULL if the initialization of the object failed
77     static VoutManager *instance( intf_thread_t *pIntf );
78
79     /// Delete the instance of VoutManager
80     static void destroy( intf_thread_t *pIntf );
81
82     /// Accept Wnd
83     void* acceptWnd( vout_window_t* pWnd );
84
85     /// Release Wnd
86     void releaseWnd( vout_window_t* pWnd );
87
88     /// set size Wnd
89     void setSizeWnd( vout_window_t* pWnd, int width, int height );
90
91     /// set fullscreen Wnd
92     void setFullscreenWnd( vout_window_t* pWnd, bool b_fullscreen );
93
94     /// Callback to request a vout window
95     static void *getWindow( intf_thread_t *pIntf, vout_window_t *pWnd );
96
97     // Window provider (release)
98     static void releaseWindow( intf_thread_t *pIntf, vout_window_t *pWnd  );
99
100     /// Callback to change a vout window
101     static int controlWindow( struct vout_window_t *pWnd,
102                               int query, va_list args );
103
104     // Register Video Controls (when building theme)
105     void registerCtrlVideo( CtrlVideo* p_CtrlVideo );
106
107     // Register Video Controls (when building theme)
108     void registerFSC( TopWindow* p_Win );
109
110     // save and restore vouts (when changing theme)
111     void saveVoutConfig( );
112     void restoreVoutConfig( bool b_success );
113
114     // save and restore vouts (when swapping Layout)
115     void discardVout( CtrlVideo* pCtrlVideo );
116     void requestVout( CtrlVideo* pCtrlVideo );
117
118     // get a useable video Control
119     CtrlVideo* getBestCtrlVideo( );
120
121     // get the VoutMainWindow
122     VoutMainWindow* getVoutMainWindow() { return m_pVoutMainWindow; }
123
124     // test if vout are running
125     bool hasVout() { return ( m_SavedWndVec.size() != 0 ) ; }
126
127 protected:
128     // Protected because it is a singleton
129     VoutManager( intf_thread_t *pIntf );
130     virtual ~VoutManager();
131
132 private:
133
134     vector<CtrlVideo *> m_pCtrlVideoVec;
135     vector<CtrlVideo *> m_pCtrlVideoVecBackup;
136     vector<SavedWnd> m_SavedWndVec;
137
138     VoutMainWindow* m_pVoutMainWindow;
139
140     TopWindow* m_pFscWindow;
141 };
142
143
144 #endif