X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fwxwindows%2Finterface.cpp;h=7f1963c29ef407f452575ba11dd284ba2b0bec49;hb=51d84ecbc8c0959991a795a442176faa85880b92;hp=a2c23fd5379c2ab3fe770437efaecd01590789f8;hpb=d246063ae6567e74d48426ce5c7b1c54f32235bf;p=vlc diff --git a/modules/gui/wxwindows/interface.cpp b/modules/gui/wxwindows/interface.cpp index a2c23fd537..7f1963c29e 100644 --- a/modules/gui/wxwindows/interface.cpp +++ b/modules/gui/wxwindows/interface.cpp @@ -1,10 +1,10 @@ /***************************************************************************** * interface.cpp : wxWindows plugin for vlc ***************************************************************************** - * Copyright (C) 2000-2001 VideoLAN - * $Id: interface.cpp,v 1.59 2003/08/30 13:59:15 gbazin Exp $ + * Copyright (C) 2000-2004, 2003 VideoLAN + * $Id$ * - * Authors: Gildas Bazin + * Authors: Gildas Bazin * * 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 @@ -24,36 +24,27 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include /* ENOMEM */ -#include /* strerror() */ -#include - #include #include +#include #include -#include "stream_control.h" #include "wxwindows.h" /* include the toolbar graphics */ -#include "bitmaps/file.xpm" -#include "bitmaps/disc.xpm" -#include "bitmaps/net.xpm" -#if 0 -#include "bitmaps/sat.xpm" -#endif #include "bitmaps/play.xpm" #include "bitmaps/pause.xpm" #include "bitmaps/stop.xpm" -#include "bitmaps/previous.xpm" +#include "bitmaps/prev.xpm" #include "bitmaps/next.xpm" -#include "bitmaps/playlist.xpm" -#include "bitmaps/fast.xpm" +#include "bitmaps/eject.xpm" #include "bitmaps/slow.xpm" +#include "bitmaps/fast.xpm" +#include "bitmaps/playlist.xpm" +#include "bitmaps/speaker.xpm" -#define TOOLBAR_BMP_WIDTH 36 -#define TOOLBAR_BMP_HEIGHT 36 +#define TOOLBAR_BMP_WIDTH 16 +#define TOOLBAR_BMP_HEIGHT 16 /* include the icon graphic */ #include "../../../share/vlc32x32.xpm" @@ -85,10 +76,11 @@ class wxVolCtrl: public wxGauge { public: /* Constructor */ - wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id ); + wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id, + wxPoint = wxDefaultPosition, wxSize = wxSize( 20, -1 ) ); virtual ~wxVolCtrl() {}; - void Change( int i_volume ); + void UpdateVolume(); void OnChange( wxMouseEvent& event ); @@ -108,23 +100,35 @@ END_EVENT_TABLE() * Event Table. *****************************************************************************/ +DEFINE_LOCAL_EVENT_TYPE( wxEVT_INTF ); + /* IDs for the controls and the menu commands */ enum { /* menu items */ + MenuDummy_Event = wxID_HIGHEST + 1000, Exit_Event = wxID_HIGHEST, OpenFileSimple_Event, + OpenAdv_Event, OpenFile_Event, OpenDisc_Event, OpenNet_Event, + OpenCapture_Event, OpenSat_Event, + OpenOther_Event, EjectDisc_Event, + Wizard_Event, + Playlist_Event, Logs_Event, FileInfo_Event, Prefs_Event, + Extended_Event, +// Undock_Event, + Bookmarks_Event, + Skins_Event, SliderScroll_Event, StopStream_Event, @@ -152,6 +156,11 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) EVT_MENU_OPEN(Interface::OnMenuOpen) + EVT_MENU( Extended_Event, Interface::OnExtended ) +// EVT_MENU( Undock_Event, Interface::OnUndock ) + + EVT_MENU( Bookmarks_Event, Interface::OnShowDialog) + #if defined( __WXMSW__ ) || defined( __WXMAC__ ) EVT_CONTEXT_MENU(Interface::OnContextMenu2) #endif @@ -159,10 +168,13 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) /* Toolbar events */ EVT_MENU(OpenFileSimple_Event, Interface::OnShowDialog) + EVT_MENU(OpenAdv_Event, Interface::OnShowDialog) EVT_MENU(OpenFile_Event, Interface::OnShowDialog) EVT_MENU(OpenDisc_Event, Interface::OnShowDialog) EVT_MENU(OpenNet_Event, Interface::OnShowDialog) + EVT_MENU(OpenCapture_Event, Interface::OnShowDialog) EVT_MENU(OpenSat_Event, Interface::OnShowDialog) + EVT_MENU(Wizard_Event, Interface::OnShowDialog) EVT_MENU(StopStream_Event, Interface::OnStopStream) EVT_MENU(PlayStream_Event, Interface::OnPlayStream) EVT_MENU(PrevStream_Event, Interface::OnPrevStream) @@ -173,6 +185,10 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) /* Slider events */ EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate) + /* Custom events */ + EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent) + EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent) + END_EVENT_TABLE() /***************************************************************************** @@ -180,35 +196,39 @@ END_EVENT_TABLE() *****************************************************************************/ Interface::Interface( intf_thread_t *_p_intf ): wxFrame( NULL, -1, wxT("VLC media player"), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ) + wxDefaultPosition, wxSize(700,100), wxDEFAULT_FRAME_STYLE ) { /* Initializations */ p_intf = _p_intf; i_old_playing_status = PAUSE_S; + b_extra = VLC_FALSE; +// b_undock = VLC_FALSE; + + extra_window = NULL; /* Give our interface a nice little icon */ SetIcon( wxIcon( vlc_xpm ) ); /* Create a sizer for the main frame */ - frame_sizer = new wxBoxSizer( wxHORIZONTAL ); + frame_sizer = new wxBoxSizer( wxVERTICAL ); SetSizer( frame_sizer ); /* Create a dummy widget that can get the keyboard focus */ wxWindow *p_dummy = new wxWindow( this, 0, wxDefaultPosition, wxSize(0,0) ); p_dummy->SetFocus(); - frame_sizer->Add( p_dummy ); - + frame_sizer->Add( p_dummy, 0, wxEXPAND ); + /* Creation of the menu bar */ CreateOurMenuBar(); /* Creation of the tool bar */ CreateOurToolBar(); - /* Creation of the slider sub-window */ - CreateOurSlider(); - frame_sizer->Add( slider_frame, 1, wxGROW, 0 ); - frame_sizer->Hide( slider_frame ); + /* Create the extra panel */ + extra_frame = new ExtraPanel( p_intf, this ); + frame_sizer->Add( extra_frame, 0, wxEXPAND , 0 ); + frame_sizer->Hide( extra_frame ); /* Creation of the status bar * Helptext for menu items and toolbar tools will automatically get @@ -218,20 +238,34 @@ Interface::Interface( intf_thread_t *_p_intf ): statusbar->SetStatusWidths( 3, i_status_width ); statusbar->SetStatusText( wxString::Format(wxT("x%.2f"), 1.0), 1 ); + /* Video window */ + if( config_GetInt( p_intf, "wxwin-embed" ) ) + { + VideoWindow( p_intf, this ); + frame_sizer->Add( p_intf->p_sys->p_video_sizer, 1, wxEXPAND , 0 ); + } + + /* Creation of the slider sub-window */ + CreateOurSlider(); + frame_sizer->Add( slider_frame, 0, wxEXPAND , 0 ); + frame_sizer->Hide( slider_frame ); + /* Make sure we've got the right background colour */ SetBackgroundColour( slider_frame->GetBackgroundColour() ); /* Layout everything */ - SetAutoLayout( TRUE ); frame_sizer->Layout(); frame_sizer->Fit(this); -#if !defined(__WXX11__) +#if wxUSE_DRAG_AND_DROP /* Associate drop targets with the main interface */ SetDropTarget( new DragAndDrop( p_intf ) ); #endif - UpdateAcceleratorTable(); + SetupHotkeys(); + + /* Start timer */ + timer = new Timer( p_intf, this ); } Interface::~Interface() @@ -240,7 +274,33 @@ Interface::~Interface() { delete p_intf->p_sys->p_wxwindow; } + /* Clean up */ + delete timer; +} + +void Interface::Update() +{ + /* Misc updates */ + ((wxVolCtrl *)volctrl)->UpdateVolume(); +} + +void Interface::OnControlEvent( wxCommandEvent& event ) +{ + switch( event.GetId() ) + { + case 0: + frame_sizer->Layout(); + frame_sizer->Fit(this); + break; + + case 1: + long i_style = GetWindowStyle(); + if( event.GetInt() ) i_style |= wxSTAY_ON_TOP; + else i_style &= ~wxSTAY_ON_TOP; + SetWindowStyle( i_style ); + break; + } } /***************************************************************************** @@ -248,77 +308,46 @@ Interface::~Interface() *****************************************************************************/ void Interface::CreateOurMenuBar() { -#define HELP_FILE N_("Open a file") -#define HELP_DISC N_("Open a DVD or (S)VCD") -#define HELP_NET N_("Open a network stream") -#define HELP_SAT N_("Open a satellite stream") -#define HELP_EJECT N_("Eject the DVD/CD") -#define HELP_EXIT N_("Exit this program") - -#define HELP_PLAYLIST N_("Open the playlist") -#define HELP_LOGS N_("Show the program logs") -#define HELP_FILEINFO N_("Show information about the file being played") - -#define HELP_PREFS N_("Go to the preferences menu") - -#define HELP_ABOUT N_("About this program") - /* Create the "File" menu */ wxMenu *file_menu = new wxMenu; - file_menu->Append( OpenFileSimple_Event, wxU(_("Simple &Open ...")), - wxU(_(HELP_FILE)) ); - file_menu->Append( OpenFile_Event, wxU(_("Open &File...")), - wxU(_(HELP_FILE)) ); - file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...")), - wxU(_(HELP_DISC)) ); - file_menu->Append( OpenNet_Event, wxU(_("Open &Network Stream...")), - wxU(_(HELP_NET)) ); -#if 0 - file_menu->Append( OpenSat_Event, wxU(_("Open &Satellite Stream...")), - wxU(_(HELP_NET)) ); -#endif -#if 0 + file_menu->Append( OpenFileSimple_Event, + wxU(_("Quick &Open File...\tCtrl-O")) ); + file_menu->AppendSeparator(); - file_menu->Append( EjectDisc_Event, wxU(_("&Eject Disc")), - wxU(_(HELP_EJECT)) ); -#endif + file_menu->Append( OpenFile_Event, wxU(_("Open &File...\tCtrl-F")) ); + file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...\tCtrl-D")) ); + file_menu->Append( OpenNet_Event, + wxU(_("Open &Network Stream...\tCtrl-N")) ); + file_menu->Append( OpenCapture_Event, + wxU(_("Open &Capture Device...\tCtrl-C")) ); + + file_menu->AppendSeparator(); + file_menu->Append( Wizard_Event, wxU(_("&Wizard...\tCtrl-W")) ); file_menu->AppendSeparator(); - file_menu->Append( Exit_Event, wxU(_("E&xit")), wxU(_(HELP_EXIT)) ); + file_menu->Append( Exit_Event, wxU(_("E&xit\tCtrl-X")) ); /* Create the "View" menu */ wxMenu *view_menu = new wxMenu; - view_menu->Append( Playlist_Event, wxU(_("&Playlist...")), - wxU(_(HELP_PLAYLIST)) ); - view_menu->Append( Logs_Event, wxU(_("&Messages...")), wxU(_(HELP_LOGS)) ); - view_menu->Append( FileInfo_Event, wxU(_("&File info...")), - wxU(_(HELP_FILEINFO)) ); + view_menu->Append( Playlist_Event, wxU(_("&Playlist...\tCtrl-P")) ); + view_menu->Append( Logs_Event, wxU(_("&Messages...\tCtrl-M")) ); + view_menu->Append( FileInfo_Event, + wxU(_("Stream and Media &info...\tCtrl-I")) ); - /* Create the "Settings" menu */ - wxMenu *settings_menu = new wxMenu; - settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")), - wxU(_(HELP_PREFS)) ); - - /* Create the "Audio" menu */ - p_audio_menu = new wxMenu; - b_audio_menu = 1; - - /* Create the "Video" menu */ - p_video_menu = new wxMenu; - b_video_menu = 1; - - /* Create the "Navigation" menu */ - p_navig_menu = new wxMenu; - b_navig_menu = 1; + /* Create the "Auto-generated" menus */ + p_settings_menu = SettingsMenu( p_intf, this ); + p_audio_menu = AudioMenu( p_intf, this ); + p_video_menu = VideoMenu( p_intf, this ); + p_navig_menu = NavigMenu( p_intf, this ); /* Create the "Help" menu */ wxMenu *help_menu = new wxMenu; - help_menu->Append( About_Event, wxU(_("&About...")), wxU(_(HELP_ABOUT)) ); + help_menu->Append( About_Event, wxU(_("About VLC media player")) ); /* Append the freshly created menus to the menu bar... */ wxMenuBar *menubar = new wxMenuBar( wxMB_DOCKABLE ); menubar->Append( file_menu, wxU(_("&File")) ); menubar->Append( view_menu, wxU(_("&View")) ); - menubar->Append( settings_menu, wxU(_("&Settings")) ); + menubar->Append( p_settings_menu, wxU(_("&Settings")) ); menubar->Append( p_audio_menu, wxU(_("&Audio")) ); menubar->Append( p_video_menu, wxU(_("&Video")) ); menubar->Append( p_navig_menu, wxU(_("&Navigation")) ); @@ -327,21 +356,76 @@ void Interface::CreateOurMenuBar() /* Attach the menu bar to the frame */ SetMenuBar( menubar ); + /* Find out size of menu bar */ + int i_size = 0; + for( unsigned int i = 0; i < menubar->GetMenuCount(); i++ ) + { + int i_width, i_height; + menubar->GetTextExtent( menubar->GetLabelTop(i), &i_width, &i_height ); + i_size += i_width + +#if defined(__WXGTK__) + 22 /* approximate margin */; +#else + 4 /* approximate margin */; +#endif + } + frame_sizer->SetMinSize( i_size, -1 ); + /* Intercept all menu events in our custom event handler */ PushEventHandler( new MenuEvtHandler( p_intf, this ) ); -#if !defined(__WXX11__) +#if wxUSE_DRAG_AND_DROP /* Associate drop targets with the menubar */ menubar->SetDropTarget( new DragAndDrop( p_intf ) ); #endif } +class VLCVolCtrl : public wxControl +{ +public: + VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent, wxGauge ** ); + virtual ~VLCVolCtrl() {}; + + virtual void OnPaint( wxPaintEvent &event ); + + private: + DECLARE_EVENT_TABLE() + int i_y_offset; +}; + +BEGIN_EVENT_TABLE(VLCVolCtrl, wxControl) + EVT_PAINT(VLCVolCtrl::OnPaint) +END_EVENT_TABLE() + +#if defined(__WXGTK__) +#define VLCVOL_HEIGHT p_parent->GetSize().GetHeight() +#else +#define VLCVOL_HEIGHT TOOLBAR_BMP_HEIGHT +#endif +VLCVolCtrl::VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent, + wxGauge **pp_volctrl ) + :wxControl( p_parent, -1, wxDefaultPosition, wxSize(64, VLCVOL_HEIGHT ), + wxBORDER_NONE ), + i_y_offset((VLCVOL_HEIGHT - TOOLBAR_BMP_HEIGHT) / 2) +{ + *pp_volctrl = new wxVolCtrl( p_intf, this, -1, wxPoint( 18, i_y_offset ), + wxSize( 44, TOOLBAR_BMP_HEIGHT ) ); +} + +void VLCVolCtrl::OnPaint( wxPaintEvent &evt ) +{ + wxPaintDC dc( this ); + wxBitmap mPlayBitmap( speaker_xpm ); + dc.DrawBitmap( mPlayBitmap, 0, i_y_offset, TRUE ); +} + void Interface::CreateOurToolBar() { -#define HELP_STOP N_("Stop current playlist item") -#define HELP_PLAY N_("Play current playlist item") -#define HELP_PAUSE N_("Pause current playlist item") -#define HELP_PLO N_("Open playlist") +#define HELP_OPEN N_("Open") +#define HELP_STOP N_("Stop") +#define HELP_PLAY N_("Play") +#define HELP_PAUSE N_("Pause") +#define HELP_PLO N_("Playlist") #define HELP_PLP N_("Previous playlist item") #define HELP_PLN N_("Next playlist item") #define HELP_SLOW N_("Play slower") @@ -350,54 +434,47 @@ void Interface::CreateOurToolBar() wxLogNull LogDummy; /* Hack to suppress annoying log message on the win32 * version because we don't include wx.rc */ - wxToolBar *toolbar = CreateToolBar( - wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE ); + wxToolBar *toolbar = + CreateToolBar( wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE ); toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) ); - toolbar->AddTool( OpenFile_Event, wxU(_("File")), wxBitmap( file_xpm ), - wxU(_(HELP_FILE)) ); - toolbar->AddTool( OpenDisc_Event, wxU(_("Disc")), wxBitmap( disc_xpm ), - wxU(_(HELP_DISC)) ); - toolbar->AddTool( OpenNet_Event, wxU(_("Net")), wxBitmap( net_xpm ), - wxU(_(HELP_NET)) ); + toolbar->AddTool( OpenFile_Event, wxT(""), + wxBitmap( eject_xpm ), wxU(_(HELP_OPEN)) ); + toolbar->AddSeparator(); + toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( play_xpm ), + wxU(_(HELP_PLAY)) ); #if 0 - toolbar->AddTool( OpenSat_Event, wxU(_("Sat")), wxBitmap( sat_xpm ), - wxU(_(HELP_SAT)) ); + toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( pause_xpm ), + wxU(_(HELP_PAUSE)) ); #endif - toolbar->AddSeparator(); - toolbar->AddTool( StopStream_Event, wxU(_("Stop")), wxBitmap( stop_xpm ), + toolbar->AddTool( StopStream_Event, wxT(""), wxBitmap( stop_xpm ), wxU(_(HELP_STOP)) ); - toolbar->AddTool( PlayStream_Event, wxU(_("Play")), wxBitmap( play_xpm ), - wxU(_(HELP_PLAY)) ); toolbar->AddSeparator(); - toolbar->AddTool( Playlist_Event, wxU(_("Playlist")), - wxBitmap( playlist_xpm ), wxU(_(HELP_PLO)) ); - toolbar->AddTool( PrevStream_Event, wxU(_("Prev")), - wxBitmap( previous_xpm ), wxU(_(HELP_PLP)) ); - toolbar->AddTool( NextStream_Event, wxU(_("Next")), wxBitmap( next_xpm ), + toolbar->AddTool( PrevStream_Event, wxT(""), + wxBitmap( prev_xpm ), wxU(_(HELP_PLP)) ); + toolbar->AddTool( SlowStream_Event, wxT(""), + wxBitmap( slow_xpm ), wxU(_(HELP_SLOW)) ); + toolbar->AddTool( FastStream_Event, wxT(""), + wxBitmap( fast_xpm ), wxU(_(HELP_FAST)) ); + toolbar->AddTool( NextStream_Event, wxT(""), wxBitmap( next_xpm ), wxU(_(HELP_PLN)) ); - toolbar->AddTool( SlowStream_Event, wxU(_("Slower")), wxBitmap( slow_xpm ), - wxU(_(HELP_SLOW)) ); - toolbar->AddTool( FastStream_Event, wxU(_("Faster")), wxBitmap( fast_xpm ), - wxU(_(HELP_FAST)) ); + toolbar->AddSeparator(); + toolbar->AddTool( Playlist_Event, wxT(""), wxBitmap( playlist_xpm ), + wxU(_(HELP_PLO)) ); - toolbar->Realize(); + wxControl *p_dummy_ctrl = + new wxControl( toolbar, -1, wxDefaultPosition, + wxSize(35, 16 ), wxBORDER_NONE ); - /* Place the toolbar in a sizer, so we can calculate the width of the - * toolbar and set this as the minimum for the main frame size. */ - wxBoxSizer *toolbar_sizer = new wxBoxSizer( wxHORIZONTAL ); - toolbar_sizer->Add( toolbar, 0, 0, 0 ); - toolbar_sizer->Layout(); + toolbar->AddControl( p_dummy_ctrl ); -#ifndef WIN32 - frame_sizer->SetMinSize( toolbar_sizer->GetMinSize().GetWidth(), -1 ); -#else - frame_sizer->SetMinSize( toolbar->GetToolSize().GetWidth() * - toolbar->GetToolsCount(), -1 ); -#endif + VLCVolCtrl *sound_control = new VLCVolCtrl( p_intf, toolbar, &volctrl ); + toolbar->AddControl( sound_control ); -#if !defined(__WXX11__) + toolbar->Realize(); + +#if wxUSE_DRAG_AND_DROP /* Associate drop targets with the toolbar */ toolbar->SetDropTarget( new DragAndDrop( p_intf ) ); #endif @@ -408,28 +485,15 @@ void Interface::CreateOurSlider() /* Create a new frame and sizer containing the slider */ slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize ); slider_frame->SetAutoLayout( TRUE ); - wxBoxSizer *frame_sizer = - new wxBoxSizer( wxHORIZONTAL ); - - /* Create static box to surround the slider */ - slider_box = new wxStaticBox( slider_frame, -1, wxT("") ); - - /* Create sizer for slider frame */ - wxStaticBoxSizer *slider_sizer = - new wxStaticBoxSizer( slider_box, wxHORIZONTAL ); - slider_sizer->SetMinSize( -1, 50 ); + wxBoxSizer *frame_sizer = new wxBoxSizer( wxHORIZONTAL ); + //frame_sizer->SetMinSize( -1, 50 ); /* Create slider */ slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0, SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize ); - slider_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 ); - - - volctrl = new wxVolCtrl( p_intf, slider_frame, -1 ); /* Add everything to the frame */ - frame_sizer->Add( slider_sizer, 1, wxEXPAND | wxBOTTOM, 5 ); - frame_sizer->Add( volctrl, 0, wxEXPAND | wxALL, 5 ); + frame_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 ); slider_frame->SetSizer( frame_sizer ); frame_sizer->Layout(); frame_sizer->SetSizeHints(slider_frame); @@ -438,139 +502,134 @@ void Interface::CreateOurSlider() slider_frame->Hide(); } -void Interface::UpdateAcceleratorTable() -{ - /* Set some hotkeys */ - wxAcceleratorEntry entries[7]; - int i_key = config_GetInt( p_intf, "quit-key" ); - int i = 0; - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - Exit_Event ); - i_key = config_GetInt( p_intf, "stop-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - StopStream_Event ); - i_key = config_GetInt( p_intf, "play-pause-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - PlayStream_Event ); - i_key = config_GetInt( p_intf, "next-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - NextStream_Event ); - i_key = config_GetInt( p_intf, "prev-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - PrevStream_Event ); - i_key = config_GetInt( p_intf, "faster-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - FastStream_Event ); - i_key = config_GetInt( p_intf, "slower-key" ); - entries[i++].Set( ConvertHotkeyModifiers( i_key ), ConvertHotkey( i_key ), - SlowStream_Event ); - - wxAcceleratorTable accel( 7, entries ); - if( !accel.Ok() ) - msg_Err( p_intf, "invalid accelerator table" ); - - SetAcceleratorTable( accel ); - msg_Dbg( p_intf, "accelerator table loaded" ); - +static int ConvertHotkeyModifiers( int i_hotkey ) +{ + int i_accel_flags = 0; + if( i_hotkey & KEY_MODIFIER_ALT ) i_accel_flags |= wxACCEL_ALT; + if( i_hotkey & KEY_MODIFIER_CTRL ) i_accel_flags |= wxACCEL_CTRL; + if( i_hotkey & KEY_MODIFIER_SHIFT ) i_accel_flags |= wxACCEL_SHIFT; + if( !i_accel_flags ) i_accel_flags = wxACCEL_NORMAL; + return i_accel_flags; } -/***************************************************************************** - * Event Handlers. - *****************************************************************************/ -/* Work-around helper for buggy wxGTK */ -void RecursiveDestroy( wxMenu *menu ) +static int ConvertHotkey( int i_hotkey ) { - wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst(); - for( ; node; ) + int i_key = i_hotkey & ~KEY_MODIFIER; + if( i_key & KEY_ASCII ) return i_key & KEY_ASCII; + else if( i_key & KEY_SPECIAL ) { - wxMenuItem *item = node->GetData(); - node = node->GetNext(); - - /* Delete the submenus */ - wxMenu *submenu = item->GetSubMenu(); - if( submenu ) + switch ( i_key ) { - RecursiveDestroy( submenu ); + case KEY_LEFT: return WXK_LEFT; + case KEY_RIGHT: return WXK_RIGHT; + case KEY_UP: return WXK_UP; + case KEY_DOWN: return WXK_DOWN; + case KEY_SPACE: return WXK_SPACE; + case KEY_ENTER: return WXK_RETURN; + case KEY_F1: return WXK_F1; + case KEY_F2: return WXK_F2; + case KEY_F3: return WXK_F3; + case KEY_F4: return WXK_F4; + case KEY_F5: return WXK_F5; + case KEY_F6: return WXK_F6; + case KEY_F7: return WXK_F7; + case KEY_F8: return WXK_F8; + case KEY_F9: return WXK_F9; + case KEY_F10: return WXK_F10; + case KEY_F11: return WXK_F11; + case KEY_F12: return WXK_F12; + case KEY_HOME: return WXK_HOME; + case KEY_END: return WXK_HOME; + case KEY_MENU: return WXK_MENU; + case KEY_ESC: return WXK_ESCAPE; + case KEY_PAGEUP: return WXK_PRIOR; + case KEY_PAGEDOWN: return WXK_NEXT; + case KEY_TAB: return WXK_TAB; + case KEY_BACKSPACE: return WXK_BACK; } - menu->Delete( item ); } + return WXK_F24; } -void Interface::OnMenuOpen(wxMenuEvent& event) +void Interface::SetupHotkeys() { -#if !defined( __WXMSW__ ) - if( event.GetEventObject() == p_audio_menu ) - { - if( b_audio_menu ) - { - p_audio_menu = AudioMenu( p_intf, this ); + struct vlc_t::hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys; + int i_hotkeys; - /* Work-around for buggy wxGTK */ - wxMenu *menu = GetMenuBar()->GetMenu( 3 ); - RecursiveDestroy( menu ); - /* End work-around */ + /* Count number of hoteys */ + for( i_hotkeys = 0; p_hotkeys[i_hotkeys].psz_action != NULL; i_hotkeys++ ); - menu = - GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) ); - if( menu ) delete menu; + p_intf->p_sys->i_first_hotkey_event = wxID_HIGHEST + 7000; + p_intf->p_sys->i_hotkeys = i_hotkeys; - b_audio_menu = 0; - } - else b_audio_menu = 1; - } - else if( event.GetEventObject() == p_video_menu ) - { - if( b_video_menu ) - { - p_video_menu = VideoMenu( p_intf, this ); + wxAcceleratorEntry p_entries[i_hotkeys]; - /* Work-around for buggy wxGTK */ - wxMenu *menu = GetMenuBar()->GetMenu( 4 ); - RecursiveDestroy( menu ); - /* End work-around */ + /* Setup the hotkeys as accelerators */ + for( int i = 0; i < i_hotkeys; i++ ) + { + p_entries[i].Set( ConvertHotkeyModifiers( p_hotkeys[i].i_key ), + ConvertHotkey( p_hotkeys[i].i_key ), + p_intf->p_sys->i_first_hotkey_event + i ); + } - menu = - GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) ); - if( menu ) delete menu; + wxAcceleratorTable accel( i_hotkeys, p_entries ); - b_video_menu = 0; - } - else b_video_menu = 1; + if( !accel.Ok() ) + { + msg_Err( p_intf, "invalid accelerator table" ); } - else if( event.GetEventObject() == p_navig_menu ) + else { - if( b_navig_menu ) - { - p_navig_menu = NavigMenu( p_intf, this ); + SetAcceleratorTable( accel ); + msg_Dbg( p_intf, "accelerator table loaded" ); + } +} + +/***************************************************************************** + * Event Handlers. + *****************************************************************************/ - /* Work-around for buggy wxGTK */ - wxMenu *menu = GetMenuBar()->GetMenu( 5 ); - RecursiveDestroy( menu ); - /* End work-around */ +void Interface::OnMenuOpen(wxMenuEvent& event) +{ +#if defined( __WXMSW__ ) +# define GetEventObject GetMenu +#endif - menu = - GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation"))); - if( menu ) delete menu; + if( event.GetEventObject() == p_settings_menu ) + { + p_settings_menu = SettingsMenu( p_intf, this, p_settings_menu ); - b_navig_menu = 0; - } - else b_navig_menu = 1; + /* Add static items */ + p_settings_menu->AppendCheckItem( Extended_Event, + wxU(_("&Extended GUI") ) ); + if( b_extra ) p_settings_menu->Check( Extended_Event, TRUE ); +#if 0 + p_settings_menu->AppendCheckItem( Undock_Event, + wxU(_("&Undock Ext. GUI") ) ); + if( b_undock ) p_settings_menu->Check( Undock_Event, TRUE ); +#endif + p_settings_menu->Append( Bookmarks_Event, wxU(_("&Bookmarks...") ) ); + p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")) ); } -#else - p_audio_menu = AudioMenu( p_intf, this ); - wxMenu *menu = GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) ); - if( menu ) delete menu; + else if( event.GetEventObject() == p_audio_menu ) + { + p_audio_menu = AudioMenu( p_intf, this, p_audio_menu ); + } - p_video_menu = VideoMenu( p_intf, this ); - menu = GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) ); - if( menu ) delete menu; + else if( event.GetEventObject() == p_video_menu ) + { + p_video_menu = VideoMenu( p_intf, this, p_video_menu ); + } - p_navig_menu = NavigMenu( p_intf, this ); - menu = GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")) ); - if( menu ) delete menu; + else if( event.GetEventObject() == p_navig_menu ) + { + p_navig_menu = NavigMenu( p_intf, this, p_navig_menu ); + } +#if defined( __WXMSW__ ) +# undef GetEventObject #endif } @@ -603,10 +662,10 @@ void Interface::OnExit( wxCommandEvent& WXUNUSED(event) ) void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) ) { wxString msg; - msg.Printf( wxString(wxT("VLC media player " VERSION)) + + msg.Printf( wxString(wxT("VLC media player " PACKAGE_VERSION)) + wxU(_(" (wxWindows interface)\n\n")) + - wxU(_("(C) 1996-2003 - the VideoLAN Team\n\n")) + - wxU( INTF_ABOUT_MSG ) + wxT("\n\n") + + wxU(_("(c) 1996-2004 - the VideoLAN Team\n\n")) + + wxU( vlc_wraptext(INTF_ABOUT_MSG,WRAPCOUNT,ISUTF8) ) + wxT("\n\n") + wxU(_("The VideoLAN team \n" "http://www.videolan.org/\n\n")) ); @@ -625,6 +684,8 @@ void Interface::OnShowDialog( wxCommandEvent& event ) case OpenFileSimple_Event: i_id = INTF_DIALOG_FILE_SIMPLE; break; + case OpenAdv_Event: + i_id = INTF_DIALOG_FILE; case OpenFile_Event: i_id = INTF_DIALOG_FILE; break; @@ -634,6 +695,9 @@ void Interface::OnShowDialog( wxCommandEvent& event ) case OpenNet_Event: i_id = INTF_DIALOG_NET; break; + case OpenCapture_Event: + i_id = INTF_DIALOG_CAPTURE; + break; case OpenSat_Event: i_id = INTF_DIALOG_SAT; break; @@ -649,16 +713,117 @@ void Interface::OnShowDialog( wxCommandEvent& event ) case Prefs_Event: i_id = INTF_DIALOG_PREFS; break; + case Wizard_Event: + i_id = INTF_DIALOG_WIZARD; + break; + case Bookmarks_Event: + i_id = INTF_DIALOG_BOOKMARKS; + break; default: i_id = INTF_DIALOG_FILE; break; - } p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 ); } } +void Interface::OnExtended(wxCommandEvent& event) +{ + b_extra = (b_extra == VLC_TRUE ? VLC_FALSE : VLC_TRUE ); + + if( b_extra == VLC_FALSE ) + { + extra_frame->Hide(); + frame_sizer->Hide( extra_frame ); + } + else + { + extra_frame->Show(); + frame_sizer->Show( extra_frame ); + } + frame_sizer->Layout(); + frame_sizer->Fit(this); +} + +#if 0 + if( b_undock == VLC_TRUE ) + { + fprintf(stderr,"Deleting window\n"); + if( extra_window ) + { + delete extra_window; + extra_window = NULL; + } + } + else + { + extra_frame->Hide(); + frame_sizer->Hide( extra_frame ); + frame_sizer->Layout(); + frame_sizer->Fit(this); + } + } + else + { + if( b_undock == VLC_TRUE ) + { + fprintf(stderr,"Creating window\n"); + extra_frame->Hide(); + frame_sizer->Hide( extra_frame ); + frame_sizer->Detach( extra_frame ); + frame_sizer->Layout(); + frame_sizer->Fit(this); + extra_window = new ExtraWindow( p_intf, this, extra_frame ); + } + else + { + fprintf(stderr,"Deleting window\n"); + if( extra_window ) + { + delete extra_window; + } + extra_frame->Show(); + frame_sizer->Show( extra_frame ); + frame_sizer->Layout(); + frame_sizer->Fit(this); + } + } +} + +void Interface::OnUndock(wxCommandEvent& event) +{ + b_undock = (b_undock == VLC_TRUE ? VLC_FALSE : VLC_TRUE ); + + if( b_extra == VLC_TRUE ) + { + if( b_undock == VLC_FALSE ) + { + fprintf(stderr,"Deleting window\n"); + if( extra_window ) + { + delete extra_window; + extra_window = NULL; + } + extra_frame->Show(); + frame_sizer->Show( extra_frame ); + frame_sizer->Layout(); + frame_sizer->Fit(this); + } + else + { + fprintf(stderr,"Creating window\n"); + extra_frame->Hide(); + frame_sizer->Hide( extra_frame ); + frame_sizer->Detach( extra_frame ); + frame_sizer->Layout(); + frame_sizer->Fit(this); + extra_window = new ExtraWindow( p_intf, this, extra_frame ); + } + } +} +#endif + void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) ) { wxCommandEvent dummy; @@ -667,8 +832,10 @@ void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) ) FIND_ANYWHERE ); if( p_playlist == NULL ) return; - if( p_playlist->i_size ) + if( p_playlist->i_size && p_playlist->i_enabled ) { + vlc_value_t state; + input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); @@ -681,19 +848,21 @@ void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) ) return; } - if( p_input->stream.control.i_status != PAUSE_S ) + var_Get( p_input, "state", &state ); + + if( state.i_int != PAUSE_S ) { /* A stream is being played, pause it */ - input_SetStatus( p_input, INPUT_STATUS_PAUSE ); - TogglePlayButton( PAUSE_S ); - vlc_object_release( p_playlist ); - vlc_object_release( p_input ); - return; + state.i_int = PAUSE_S; } + else + { + /* Stream is paused, resume it */ + state.i_int = PLAYING_S; + } + var_Set( p_input, "state", state ); - /* Stream is paused, resume it */ - input_SetStatus( p_input, INPUT_STATUS_PLAY ); - TogglePlayButton( PLAYING_S ); + TogglePlayButton( state.i_int ); vlc_object_release( p_input ); vlc_object_release( p_playlist ); } @@ -732,10 +901,10 @@ void Interface::OnSliderUpdate( wxScrollEvent& event ) if( p_intf->p_sys->i_slider_pos != event.GetPosition() && p_intf->p_sys->p_input ) { - p_intf->p_sys->i_slider_pos = event.GetPosition(); - input_Seek( p_intf->p_sys->p_input, p_intf->p_sys->i_slider_pos * - 100 / SLIDER_MAX_POS, - INPUT_SEEK_PERCENT | INPUT_SEEK_SET ); + vlc_value_t pos; + pos.f_float = (float)event.GetPosition() / (float)SLIDER_MAX_POS; + + var_Set( p_intf->p_sys->p_input, "position", pos ); } #ifdef WIN32 @@ -748,19 +917,22 @@ void Interface::OnSliderUpdate( wxScrollEvent& event ) if( p_intf->p_sys->p_input ) { /* Update stream date */ -#define p_area p_intf->p_sys->p_input->stream.p_selected_area - char psz_time[ OFFSETTOTIME_MAX_SIZE ]; - - slider_box->SetLabel( - wxU(input_OffsetToTime( p_intf->p_sys->p_input, - psz_time, - p_area->i_size * event.GetPosition() - / SLIDER_MAX_POS )) ); -#undef p_area + char psz_time[ MSTRTIME_MAX_SIZE ], psz_total[ MSTRTIME_MAX_SIZE ]; + mtime_t i_seconds; + vlc_value_t val; + + i_seconds = var_GetTime( p_intf->p_sys->p_input, "length" ) / I64C(1000000 ); + secstotimestr( psz_total, i_seconds ); + + i_seconds = var_GetTime( p_intf->p_sys->p_input, "time" ) / I64C(1000000 ); + secstotimestr( psz_time, i_seconds ); + + statusbar->SetStatusText( wxU(psz_time)+ wxString(wxT(" / ")) + wxU(psz_total), 0 ); } } #endif +#undef WIN32 vlc_mutex_unlock( &p_intf->change_lock ); } @@ -774,7 +946,8 @@ void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) ) return; } - vlc_mutex_lock( &p_playlist->object_lock ); + /* FIXME --fenrir */ +#if 0 if( p_playlist->p_input != NULL ) { vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock ); @@ -783,13 +956,11 @@ void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) ) vlc_value_t val; val.b_bool = VLC_TRUE; vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); var_Set( p_playlist->p_input, "prev-title", val ); - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - return; - } - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); + } else + vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); } vlc_mutex_unlock( &p_playlist->object_lock ); +#endif playlist_Prev( p_playlist ); vlc_object_release( p_playlist ); @@ -805,6 +976,9 @@ void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) ) return; } + /* FIXME --fenrir */ +#if 0 + var_Change( p_input, "title", VLC_VAR_CHOICESCOUNT, &val, NULL ); vlc_mutex_lock( &p_playlist->object_lock ); if( p_playlist->p_input != NULL ) { @@ -816,14 +990,11 @@ void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) ) vlc_value_t val; val.b_bool = VLC_TRUE; vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); var_Set( p_playlist->p_input, "next-title", val ); - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - return; - } - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); + } else + vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); } vlc_mutex_unlock( &p_playlist->object_lock ); - +#endif playlist_Next( p_playlist ); vlc_object_release( p_playlist ); } @@ -835,7 +1006,9 @@ void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) ) FIND_ANYWHERE ); if( p_input ) { - input_SetStatus( p_input, INPUT_STATUS_SLOWER ); + vlc_value_t val; val.b_bool = VLC_TRUE; + + var_Set( p_input, "rate-slower", val ); vlc_object_release( p_input ); } } @@ -847,7 +1020,9 @@ void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) ) FIND_ANYWHERE ); if( p_input ) { - input_SetStatus( p_input, INPUT_STATUS_FASTER ); + vlc_value_t val; val.b_bool = VLC_TRUE; + + var_Set( p_input, "rate-faster", val ); vlc_object_release( p_input ); } } @@ -861,13 +1036,13 @@ void Interface::TogglePlayButton( int i_playing_status ) if( i_playing_status == PLAYING_S ) { - GetToolBar()->InsertTool( 5, PlayStream_Event, wxU(_("Pause")), + GetToolBar()->InsertTool( 2, PlayStream_Event, wxU(_("Pause")), wxBitmap( pause_xpm ), wxNullBitmap, wxITEM_NORMAL, wxU(_(HELP_PAUSE)) ); } else { - GetToolBar()->InsertTool( 5, PlayStream_Event, wxU(_("Play")), + GetToolBar()->InsertTool( 2, PlayStream_Event, wxU(_("Play")), wxBitmap( play_xpm ), wxNullBitmap, wxITEM_NORMAL, wxU(_(HELP_PLAY)) ); } @@ -877,13 +1052,14 @@ void Interface::TogglePlayButton( int i_playing_status ) i_old_playing_status = i_playing_status; } -#if !defined(__WXX11__) +#if wxUSE_DRAG_AND_DROP /***************************************************************************** * Definition of DragAndDrop class. *****************************************************************************/ -DragAndDrop::DragAndDrop( intf_thread_t *_p_intf ) +DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, vlc_bool_t _b_enqueue ) { p_intf = _p_intf; + b_enqueue = _b_enqueue; } bool DragAndDrop::OnDropFiles( wxCoord, wxCoord, @@ -900,8 +1076,10 @@ bool DragAndDrop::OnDropFiles( wxCoord, wxCoord, } for( size_t i = 0; i < filenames.GetCount(); i++ ) - playlist_Add( p_playlist, (const char *)filenames[i].mb_str(), 0, 0, - PLAYLIST_APPEND | (i ? 0 : PLAYLIST_GO), PLAYLIST_END ); + playlist_Add( p_playlist, (const char *)filenames[i].mb_str(), + (const char *)filenames[i].mb_str(), + PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO), + PLAYLIST_END ); vlc_object_release( p_playlist ); @@ -910,28 +1088,34 @@ bool DragAndDrop::OnDropFiles( wxCoord, wxCoord, #endif /***************************************************************************** - * Definition of wxVolCtrl class. + * Definition of VolCtrl class. *****************************************************************************/ -wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id ) - : wxGauge( parent, id, 200, wxDefaultPosition, wxDefaultSize, - wxGA_VERTICAL | wxGA_SMOOTH ) +wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id, + wxPoint point, wxSize size ) + : wxGauge( parent, id, 200, point, size, wxGA_HORIZONTAL | wxGA_SMOOTH ) { p_intf = _p_intf; + UpdateVolume(); } void wxVolCtrl::OnChange( wxMouseEvent& event ) { if( !event.LeftDown() && !event.LeftIsDown() ) return; - int i_volume = (GetClientSize().GetHeight() - event.GetY()) * 200 / - GetClientSize().GetHeight(); - Change( i_volume ); + int i_volume = event.GetX() * 200 / GetClientSize().GetWidth(); + aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 ); + UpdateVolume(); } -void wxVolCtrl::Change( int i_volume ) +void wxVolCtrl::UpdateVolume() { - aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 ); - SetValue( i_volume ); + audio_volume_t i_volume; + aout_VolumeGet( p_intf, &i_volume ); + + int i_gauge_volume = i_volume * 200 * 2 / AOUT_VOLUME_MAX; + if( i_gauge_volume == GetValue() ) return; + + SetValue( i_gauge_volume ); SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"), - i_volume ) ); + i_gauge_volume / 2 ) ); }