Commit 11bfb464 authored by Clément Stenac's avatar Clément Stenac

Add separate audio and video popup menus

parent 9f750249
/*
* Created on 28-feb-2006
*
* $Id: VideoIntf.java 8 2006-02-28 12:03:47Z little $
* $Id$
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General Public License
......
......@@ -162,6 +162,9 @@ VLC_EXPORT( void, intf_Destroy, ( intf_thread_t * ) );
#define INTF_DIALOG_BOOKMARKS 14
#define INTF_DIALOG_POPUPMENU 20
#define INTF_DIALOG_AUDIOPOPUPMENU 21
#define INTF_DIALOG_VIDEOPOPUPMENU 22
#define INTF_DIALOG_MISCPOPUPMENU 23
#define INTF_DIALOG_FILE_GENERIC 30
#define INTF_DIALOG_INTERACTION 50
......
......@@ -84,6 +84,9 @@ private:
void OnOpenSat( wxCommandEvent& event );
void OnPopupMenu( wxCommandEvent& event );
void OnAudioPopupMenu( wxCommandEvent& event );
void OnVideoPopupMenu( wxCommandEvent& event );
void OnMiscPopupMenu( wxCommandEvent& event );
void OnIdle( wxIdleEvent& event );
......@@ -140,8 +143,16 @@ BEGIN_EVENT_TABLE(DialogsProvider, wxFrame)
DialogsProvider::OnFileInfo)
EVT_COMMAND(INTF_DIALOG_BOOKMARKS, wxEVT_DIALOG,
DialogsProvider::OnBookmarks)
EVT_COMMAND(INTF_DIALOG_POPUPMENU, wxEVT_DIALOG,
DialogsProvider::OnPopupMenu)
EVT_COMMAND(INTF_DIALOG_AUDIOPOPUPMENU, wxEVT_DIALOG,
DialogsProvider::OnAudioPopupMenu)
EVT_COMMAND(INTF_DIALOG_VIDEOPOPUPMENU, wxEVT_DIALOG,
DialogsProvider::OnVideoPopupMenu)
EVT_COMMAND(INTF_DIALOG_MISCPOPUPMENU, wxEVT_DIALOG,
DialogsProvider::OnMiscPopupMenu)
EVT_COMMAND(INTF_DIALOG_EXIT, wxEVT_DIALOG,
DialogsProvider::OnExitThread)
EVT_COMMAND(INTF_DIALOG_UPDATEVLC, wxEVT_DIALOG,
......@@ -508,6 +519,22 @@ void DialogsProvider::OnPopupMenu( wxCommandEvent& event )
::PopupMenu( p_intf, this, mousepos );
}
void DialogsProvider::OnAudioPopupMenu( wxCommandEvent& event )
{
wxPoint mousepos = ScreenToClient( wxGetMousePosition() );
::AudioPopupMenu( p_intf, this, mousepos );
}
void DialogsProvider::OnVideoPopupMenu( wxCommandEvent& event )
{
wxPoint mousepos = ScreenToClient( wxGetMousePosition() );
::VideoPopupMenu( p_intf, this, mousepos );
}
void DialogsProvider::OnMiscPopupMenu( wxCommandEvent& event )
{
wxPoint mousepos = ScreenToClient( wxGetMousePosition() );
::MiscPopupMenu( p_intf, this, mousepos );
}
void DialogsProvider::OnExitThread( wxCommandEvent& WXUNUSED(event) )
{
wxTheApp->ExitMainLoop();
......
......@@ -239,6 +239,9 @@ namespace wxvlc
};
void PopupMenu( intf_thread_t *, wxWindow *, const wxPoint& );
void AudioPopupMenu( intf_thread_t *, wxWindow *, const wxPoint& );
void VideoPopupMenu( intf_thread_t *, wxWindow *, const wxPoint& );
void MiscPopupMenu( intf_thread_t *, wxWindow *, const wxPoint& );
wxMenu *SettingsMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
wxMenu *AudioMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
wxMenu *VideoMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
......
......@@ -21,20 +21,16 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h> /* malloc(), free() */
#include <errno.h> /* ENOMEM */
#include <string.h> /* strerror() */
#include <stdio.h>
#include <vlc/vlc.h>
#include <vlc/intf.h>
#include "wxwidgets.hpp"
#include "interface.hpp"
#include <vector>
#include <string>
using namespace std;
class wxMenuItemExt: public wxMenuItem
{
public:
......@@ -43,16 +39,12 @@ public:
const wxString& helpString, wxItemKind kind,
char *_psz_var, int _i_object_id, vlc_value_t _val,
int _i_val_type );
virtual ~wxMenuItemExt();
char *psz_var;
int i_val_type;
int i_object_id;
vlc_value_t val;
private:
};
class Menu: public wxMenu
......@@ -62,7 +54,7 @@ public:
Menu( intf_thread_t *p_intf, int i_start_id );
virtual ~Menu();
void Populate( int i_count, char **ppsz_names, int *pi_objects );
void Populate( vector<string> &, vector<int> &);
void Clear();
private:
......@@ -81,8 +73,6 @@ private:
/*****************************************************************************
* Event Table.
*****************************************************************************/
/* IDs for the controls and the menu commands */
enum
{
/* menu items */
......@@ -126,6 +116,9 @@ BEGIN_EVENT_TABLE(MenuEvtHandler, wxEvtHandler)
EVT_MENU(-1, MenuEvtHandler::OnMenuEvent)
END_EVENT_TABLE()
/*****************************************************************************
* Static menu helpers
*****************************************************************************/
wxMenu *OpenStreamMenu( intf_thread_t *p_intf )
{
wxMenu *menu = new wxMenu;
......@@ -147,215 +140,283 @@ wxMenu *MiscMenu( intf_thread_t *p_intf )
return menu;
}
void PopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
const wxPoint& pos )
{
#define MAX_POPUP_ITEMS 45
/*****************************************************************************
* Builders for the dynamic menus
*****************************************************************************/
#define PUSH_VAR( var ) rs_varnames.push_back( var ); \
ri_objects.push_back( p_object->i_object_id );
int minimal = config_GetInt( p_intf, "wx-minimal" );
int InputAutoMenuBuilder( vlc_object_t *p_object,
vector<int> &ri_objects, vector<string> &rs_varnames )
{
PUSH_VAR( "bookmark");
PUSH_VAR( "title" );
PUSH_VAR ("chapter" );
PUSH_VAR( "program" );
PUSH_VAR( "navigation" );
PUSH_VAR( "dvd_menus" );
return VLC_SUCCESS;
}
vlc_object_t *p_object, *p_input;
char *ppsz_varnames[MAX_POPUP_ITEMS];
int pi_objects[MAX_POPUP_ITEMS];
int i = 0, i_last_separator = 0;
int VideoAutoMenuBuilder( vlc_object_t *p_object,
vector<int> &ri_objects, vector<string> &rs_varnames )
{
PUSH_VAR( "fullscreen" );
PUSH_VAR( "zoom" );
PUSH_VAR( "deinterlace" );
PUSH_VAR( "aspect-ratio" );
PUSH_VAR( "crop" );
PUSH_VAR( "video-on-top" );
PUSH_VAR( "directx-wallpaper" );
PUSH_VAR( "video-snapshot" );
vlc_object_t *p_dec_obj = (vlc_object_t *)vlc_object_find( p_object,
VLC_OBJECT_DECODER,
FIND_PARENT );
if( p_dec_obj != NULL )
{
PUSH_VAR( "ffmpeg-pp-q" );
vlc_object_release( p_dec_obj );
}
return VLC_SUCCESS;
}
/* Initializations */
memset( pi_objects, 0, MAX_POPUP_ITEMS * sizeof(int) );
int AudioAutoMenuBuilder( vlc_object_t *p_object,
vector<int> &ri_objects, vector<string> &rs_varnames )
{
PUSH_VAR( "audio-device" );
PUSH_VAR( "audio-channels" );
PUSH_VAR( "visual" );
PUSH_VAR( "equalizer" );
return VLC_SUCCESS;
}
/* Input menu */
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
FIND_ANYWHERE );
int IntfAutoMenuBuilder( intf_thread_t *p_intf,
vector<int> &ri_objects, vector<string> &rs_varnames )
{
/* vlc_object_find is needed because of the dialogs provider case */
vlc_object_t *p_object;
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INTF,
FIND_PARENT );
if( p_object != NULL )
{
ppsz_varnames[i] = "bookmark";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "title";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "chapter";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "program";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "navigation";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "dvd_menus";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "video-es";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "audio-es";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "spu-es";
pi_objects[i++] = p_object->i_object_id;
PUSH_VAR( "intf-add" );
PUSH_VAR( "intf-skins" );
vlc_object_release( p_object );
}
p_input = p_object;
if( !p_input ) goto interfacemenu;
/* Video menu */
if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
i_last_separator = i;
return VLC_SUCCESS;
}
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
FIND_ANYWHERE );
if( p_object != NULL )
#undef PUSH_VAR
/*****************************************************************************
* Popup menus
*****************************************************************************/
#define PUSH_VAR( var ) as_varnames.push_back( var ); \
ai_objects.push_back( p_object->i_object_id );
#define PUSH_SEPARATOR if( ai_objects.size() != i_last_separator ) { \
ai_objects.push_back( 0 ); \
as_varnames.push_back( "" ); \
i_last_separator = ai_objects.size(); }
#define POPUP_BOILERPLATE \
unsigned int i_last_separator = 0; \
vector<int> ai_objects; \
vector<string> as_varnames; \
playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, \
VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );\
if( !p_playlist ) \
return; \
input_thread_t *p_input = p_playlist->p_input;
#define CREATE_POPUP \
Menu popupmenu( p_intf, PopupMenu_Events ); \
popupmenu.Populate( as_varnames, ai_objects ); \
p_intf->p_sys->p_popup_menu = &popupmenu; \
p_parent->PopupMenu( &popupmenu, pos.x, pos.y ); \
p_intf->p_sys->p_popup_menu = NULL; \
#define POPUP_STATIC_ENTRIES \
if( p_input != NULL ) \
{ \
vlc_value_t val; \
popupmenu.InsertSeparator( 0 ); \
if (!minimal) \
{ \
popupmenu.Insert( 0, Stop_Event, wxU(_("Stop")) ); \
popupmenu.Insert( 0, Previous_Event, wxU(_("Previous")) ); \
popupmenu.Insert( 0, Next_Event, wxU(_("Next")) ); \
} \
\
var_Get( p_input, "state", &val ); \
if( val.i_int == PAUSE_S ) \
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) ); \
else \
popupmenu.Insert( 0, Pause_Event, wxU(_("Pause")) ); \
\
vlc_object_release( p_input ); \
} \
else \
{ \
if( p_playlist && p_playlist->i_size ) \
{ \
popupmenu.InsertSeparator( 0 ); \
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) ); \
} \
if( p_playlist ) vlc_object_release( p_playlist ); \
} \
\
popupmenu.Append( MenuDummy_Event, wxU(_("Miscellaneous")), \
MiscMenu( p_intf ), wxT("") ); \
void VideoPopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
const wxPoint& pos )
{
POPUP_BOILERPLATE;
if( p_input )
{
vlc_object_t *p_dec_obj;
ppsz_varnames[i] = "fullscreen";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "zoom";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "deinterlace";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "aspect-ratio";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "crop";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "video-on-top";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "directx-wallpaper";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "video-snapshot";
pi_objects[i++] = p_object->i_object_id;
p_dec_obj = (vlc_object_t *)vlc_object_find( p_object,
VLC_OBJECT_DECODER,
FIND_PARENT );
if( p_dec_obj != NULL )
vlc_object_yield( p_input );
as_varnames.push_back( "video-es" );
ai_objects.push_back( p_input->i_object_id );
as_varnames.push_back( "spu-es" );
ai_objects.push_back( p_input->i_object_id );
vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input,
VLC_OBJECT_VOUT, FIND_CHILD );
if( p_vout )
{
ppsz_varnames[i] = "ffmpeg-pp-q";
pi_objects[i++] = p_dec_obj->i_object_id;
vlc_object_release( p_dec_obj );
VideoAutoMenuBuilder( p_vout, ai_objects, as_varnames );
vlc_object_release( p_vout );
}
vlc_object_release( p_object );
vlc_object_release( p_input );
}
CREATE_POPUP;
}
/* Audio menu */
if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
i_last_separator = i;
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_AOUT,
FIND_ANYWHERE );
if( p_object != NULL )
void AudioPopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
const wxPoint& pos )
{
POPUP_BOILERPLATE;
if( p_input )
{
ppsz_varnames[i] = "audio-device";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "audio-channels";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "visual";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "equalizer";
pi_objects[i++] = p_object->i_object_id;
vlc_object_release( p_object );
vlc_object_yield( p_input );
as_varnames.push_back( "audio-es" );
ai_objects.push_back( p_input->i_object_id );
vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input,
VLC_OBJECT_AOUT, FIND_ANYWHERE );
if( p_aout )
{
AudioAutoMenuBuilder( p_aout, ai_objects, as_varnames );
vlc_object_release( p_aout );
}
vlc_object_release( p_input );
}
CREATE_POPUP;
}
interfacemenu:
/* Interface menu */
if( i != i_last_separator ) ppsz_varnames[i++] = NULL; /* Separator */
i_last_separator = i;
/* vlc_object_find is needed because of the dialogs provider case */
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INTF,
FIND_PARENT );
if( p_object != NULL )
/* Navigation stuff, and general */
void MiscPopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
const wxPoint& pos )
{
int minimal = 0;
POPUP_BOILERPLATE;
if( p_input )
{
#if 0
#if (wxCHECK_VERSION(2,5,0))
ppsz_varnames[i] = "intf-switch";
pi_objects[i++] = p_object->i_object_id;
#endif
#endif
ppsz_varnames[i] = "intf-add";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "intf-skins";
pi_objects[i++] = p_object->i_object_id;
vlc_object_release( p_object );
vlc_object_yield( p_input );
as_varnames.push_back( "audio-es" );
InputAutoMenuBuilder( VLC_OBJECT(p_input), ai_objects, as_varnames );
PUSH_SEPARATOR;
}
IntfAutoMenuBuilder( p_intf, ai_objects, as_varnames );
/* Build menu */
Menu popupmenu( p_intf, PopupMenu_Events );
popupmenu.Populate( i, ppsz_varnames, pi_objects );
popupmenu.Populate( as_varnames, ai_objects );
/* Add static entries */
if( p_input != NULL )
{
vlc_value_t val;
popupmenu.InsertSeparator( 0 );
if (!minimal)
{
popupmenu.Insert( 0, Stop_Event, wxU(_("Stop")) );
popupmenu.Insert( 0, Previous_Event, wxU(_("Previous")) );
popupmenu.Insert( 0, Next_Event, wxU(_("Next")) );
}
POPUP_STATIC_ENTRIES;
popupmenu.Append( MenuDummy_Event, wxU(_("Open")),
OpenStreamMenu( p_intf ), wxT("") );
var_Get( p_input, "state", &val );
if( val.i_int == PAUSE_S )
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) );
else
popupmenu.Insert( 0, Pause_Event, wxU(_("Pause")) );
p_intf->p_sys->p_popup_menu = &popupmenu;
p_parent->PopupMenu( &popupmenu, pos.x, pos.y );
p_intf->p_sys->p_popup_menu = NULL;
}
vlc_object_release( p_input );
}
else
void PopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
const wxPoint& pos )
{
int minimal = config_GetInt( p_intf, "wx-minimal" );
POPUP_BOILERPLATE;
if( p_input )
{
playlist_t * p_playlist =
(playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
FIND_ANYWHERE );
if( p_playlist && p_playlist->i_size )
vlc_object_yield( p_input );
InputAutoMenuBuilder( VLC_OBJECT(p_input), ai_objects, as_varnames );
/* Video menu */
PUSH_SEPARATOR;
as_varnames.push_back( "video-es" );
ai_objects.push_back( p_input->i_object_id );
as_varnames.push_back( "spu-es" );
ai_objects.push_back( p_input->i_object_id );
vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input,
VLC_OBJECT_VOUT, FIND_CHILD );
if( p_vout )
{
popupmenu.InsertSeparator( 0 );
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) );
VideoAutoMenuBuilder( p_vout, ai_objects, as_varnames );
vlc_object_release( p_vout );
}
/* Audio menu */
PUSH_SEPARATOR
as_varnames.push_back( "audio-es" );
ai_objects.push_back( p_input->i_object_id );
vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input,
VLC_OBJECT_AOUT, FIND_ANYWHERE );
if( p_aout )
{
AudioAutoMenuBuilder( p_aout, ai_objects, as_varnames );
vlc_object_release( p_aout );
}
if( p_playlist ) vlc_object_release( p_playlist );
}
popupmenu.Append( MenuDummy_Event, wxU(_("Miscellaneous")),
MiscMenu( p_intf ), wxT("") );
/* Interface menu */
PUSH_SEPARATOR
IntfAutoMenuBuilder( p_intf, ai_objects, as_varnames );
/* Build menu */
Menu popupmenu( p_intf, PopupMenu_Events );
popupmenu.Populate( as_varnames, ai_objects );
POPUP_STATIC_ENTRIES;
if (!minimal)
{
popupmenu.Append( MenuDummy_Event, wxU(_("Open")),
OpenStreamMenu( p_intf ), wxT("") );
popupmenu.Append( MenuDummy_Event, wxU(_("Open")),
OpenStreamMenu( p_intf ), wxT("") );
}
p_intf->p_sys->p_popup_menu = &popupmenu;
p_parent->PopupMenu( &popupmenu, pos.x, pos.y );
p_intf->p_sys->p_popup_menu = NULL;
}
/*****************************************************************************
* Auto menus
*****************************************************************************/
wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
{
#define MAX_AUDIO_ITEMS 10
vlc_object_t *p_object;
char *ppsz_varnames[MAX_AUDIO_ITEMS];
int pi_objects[MAX_AUDIO_ITEMS];
int i = 0;
/* Initializations */
memset( pi_objects, 0, MAX_AUDIO_ITEMS * sizeof(int) );
vector<int> ai_objects;
vector<string> as_varnames;
p_object = (vlc_object_t *)vlc_object_find( _p_intf, VLC_OBJECT_INPUT,
FIND_ANYWHERE );
if( p_object != NULL )
{
ppsz_varnames[i] = "audio-es";
pi_objects[i++] = p_object->i_object_id;
PUSH_VAR( "audio-es" );
vlc_object_release( p_object );
}
p_object = (vlc_object_t *)vlc_object_find( _p_intf, VLC_OBJECT_AOUT,
FIND_ANYWHERE );
if( p_object != NULL )
if( p_object )
{
ppsz_varnames[i] = "audio-device";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "audio-channels";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "visual";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "equalizer";
pi_objects[i++] = p_object->i_object_id;
AudioAutoMenuBuilder( p_object, ai_objects, as_varnames );
vlc_object_release( p_object );
}
......@@ -366,31 +427,23 @@ wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
else
p_vlc_menu->Clear();
p_vlc_menu->Populate( i, ppsz_varnames, pi_objects );
p_vlc_menu->Populate( as_varnames, ai_objects );
return p_vlc_menu;
}
wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
{
#define MAX_VIDEO_ITEMS 15
vlc_object_t *p_object;
char *ppsz_varnames[MAX_VIDEO_ITEMS];
int pi_objects[MAX_VIDEO_ITEMS];
int i = 0;
/* Initializations */
memset( pi_objects, 0, MAX_VIDEO_ITEMS * sizeof(int) );
vector<int> ai_objects;
vector<string> as_varnames;
p_object = (vlc_object_t *)vlc_object_find( _p_intf, VLC_OBJECT_INPUT,
FIND_ANYWHERE );
if( p_object != NULL )
{
ppsz_varnames[i] = "video-es";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "spu-es";
pi_objects[i++] = p_object->i_object_id;
PUSH_VAR( "video-es" );
PUSH_VAR( "spu-es" );
vlc_object_release( p_object );
}
......@@ -398,35 +451,7 @@ wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
FIND_ANYWHERE );
if( p_object != NULL )
{
vlc_object_t *p_dec_obj;
ppsz_varnames[i] = "fullscreen";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "zoom";
pi_objects[i++] = p_object->i_object_id;
ppsz_varnames[i] = "deinterlace";