1 /*****************************************************************************
2 * interface.cpp : wxWindows plugin for vlc
3 *****************************************************************************
4 * Copyright (C) 2000-2004, 2003 VideoLAN
7 * Authors: Gildas Bazin <gbazin@videolan.org>
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.
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.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
31 #include "stream_control.h"
33 #include "wxwindows.h"
35 /* include the toolbar graphics */
36 #include "bitmaps/play.xpm"
37 #include "bitmaps/pause.xpm"
38 #include "bitmaps/stop.xpm"
39 #include "bitmaps/prev.xpm"
40 #include "bitmaps/next.xpm"
41 #include "bitmaps/eject.xpm"
42 #include "bitmaps/slow.xpm"
43 #include "bitmaps/fast.xpm"
44 #include "bitmaps/speaker.xpm"
46 #define TOOLBAR_BMP_WIDTH 16
47 #define TOOLBAR_BMP_HEIGHT 16
49 /* include the icon graphic */
50 #include "../../../share/vlc32x32.xpm"
52 /*****************************************************************************
53 * Local class declarations.
54 *****************************************************************************/
55 class wxMenuExt: public wxMenu
59 wxMenuExt( wxMenu* parentMenu, int id, const wxString& text,
60 const wxString& helpString, wxItemKind kind,
61 char *_psz_var, int _i_object_id, vlc_value_t _val,
64 virtual ~wxMenuExt() {};
75 class wxVolCtrl: public wxGauge
79 wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id,
80 wxPoint = wxDefaultPosition, wxSize = wxSize( 20, -1 ) );
81 virtual ~wxVolCtrl() {};
83 void Change( int i_volume );
85 void OnChange( wxMouseEvent& event );
88 intf_thread_t *p_intf;
90 DECLARE_EVENT_TABLE();
93 BEGIN_EVENT_TABLE(wxVolCtrl, wxWindow)
95 EVT_LEFT_DOWN(wxVolCtrl::OnChange)
96 EVT_MOTION(wxVolCtrl::OnChange)
99 /*****************************************************************************
101 *****************************************************************************/
103 DEFINE_LOCAL_EVENT_TYPE( wxEVT_INTF );
105 /* IDs for the controls and the menu commands */
109 MenuDummy_Event = wxID_HIGHEST + 1000,
110 Exit_Event = wxID_HIGHEST,
111 OpenFileSimple_Event,
150 /* it is important for the id corresponding to the "About" command to have
151 * this standard value as otherwise it won't be handled properly under Mac
152 * (where it is special and put into the "Apple" menu) */
153 About_Event = wxID_ABOUT
156 BEGIN_EVENT_TABLE(Interface, wxFrame)
158 EVT_MENU(Exit_Event, Interface::OnExit)
159 EVT_MENU(About_Event, Interface::OnAbout)
161 EVT_MENU(Playlist_Event, Interface::OnShowDialog)
162 EVT_MENU(Logs_Event, Interface::OnShowDialog)
163 EVT_MENU(FileInfo_Event, Interface::OnShowDialog)
164 EVT_MENU(Prefs_Event, Interface::OnShowDialog)
166 EVT_MENU_OPEN(Interface::OnMenuOpen)
168 EVT_MENU( Extended_Event, Interface::OnExtended)
169 EVT_MENU( Bookmarks_Event, Interface::OnShowDialog)
171 EVT_CHECKBOX( Adjust_Event, Interface::OnEnableAdjust)
172 EVT_TEXT( Ratio_Event, Interface::OnRatio)
173 EVT_CHECKBOX( Visual_Event, Interface::OnEnableVisual)
175 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
176 EVT_CONTEXT_MENU(Interface::OnContextMenu2)
178 EVT_RIGHT_UP(Interface::OnContextMenu)
181 EVT_MENU(OpenFileSimple_Event, Interface::OnShowDialog)
182 EVT_MENU(OpenAdv_Event, Interface::OnShowDialog)
183 EVT_MENU(OpenFile_Event, Interface::OnShowDialog)
184 EVT_MENU(OpenDisc_Event, Interface::OnShowDialog)
185 EVT_MENU(OpenNet_Event, Interface::OnShowDialog)
186 EVT_MENU(OpenSat_Event, Interface::OnShowDialog)
187 EVT_MENU(StreamWizard_Event, Interface::OnShowDialog)
188 EVT_MENU(Wizard_Event, Interface::OnShowDialog)
189 EVT_MENU(StopStream_Event, Interface::OnStopStream)
190 EVT_MENU(PlayStream_Event, Interface::OnPlayStream)
191 EVT_MENU(PrevStream_Event, Interface::OnPrevStream)
192 EVT_MENU(NextStream_Event, Interface::OnNextStream)
193 EVT_MENU(SlowStream_Event, Interface::OnSlowStream)
194 EVT_MENU(FastStream_Event, Interface::OnFastStream)
197 EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate)
199 EVT_COMMAND_SCROLL(Hue_Event, Interface::OnHueUpdate)
200 EVT_COMMAND_SCROLL(Contrast_Event, Interface::OnContrastUpdate)
201 EVT_COMMAND_SCROLL(Brightness_Event, Interface::OnBrightnessUpdate)
202 EVT_COMMAND_SCROLL(Saturation_Event, Interface::OnSaturationUpdate)
203 EVT_COMMAND_SCROLL(Gamma_Event, Interface::OnGammaUpdate)
206 EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent)
207 EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent)
211 /*****************************************************************************
213 *****************************************************************************/
214 Interface::Interface( intf_thread_t *_p_intf ):
215 wxFrame( NULL, -1, wxT("VLC media player"),
216 wxDefaultPosition, wxSize(700,100), wxDEFAULT_FRAME_STYLE )
218 /* Initializations */
220 i_old_playing_status = PAUSE_S;
223 /* Give our interface a nice little icon */
224 SetIcon( wxIcon( vlc_xpm ) );
226 /* Create a sizer for the main frame */
227 frame_sizer = new wxBoxSizer( wxVERTICAL );
228 SetSizer( frame_sizer );
230 /* Create a dummy widget that can get the keyboard focus */
231 wxWindow *p_dummy = new wxWindow( this, 0, wxDefaultPosition,
234 frame_sizer->Add( p_dummy, 0, wxEXPAND );
236 /* Creation of the menu bar */
239 /* Creation of the tool bar */
242 /* Create the extra panel */
243 CreateOurExtendedPanel();
244 frame_sizer->Add( extra_frame, 0, wxEXPAND , 0 );
245 frame_sizer->Hide( extra_frame );
247 /* Creation of the status bar
248 * Helptext for menu items and toolbar tools will automatically get
250 int i_status_width[3] = {-6, -2, -9};
251 statusbar = CreateStatusBar( 3 ); /* 2 fields */
252 statusbar->SetStatusWidths( 3, i_status_width );
253 statusbar->SetStatusText( wxString::Format(wxT("x%.2f"), 1.0), 1 );
256 if( config_GetInt( p_intf, "wxwin-embed" ) )
258 VideoWindow( p_intf, this );
259 frame_sizer->Add( p_intf->p_sys->p_video_sizer, 1, wxEXPAND , 0 );
262 /* Creation of the slider sub-window */
264 frame_sizer->Add( slider_frame, 0, wxEXPAND , 0 );
265 frame_sizer->Hide( slider_frame );
267 /* Make sure we've got the right background colour */
268 SetBackgroundColour( slider_frame->GetBackgroundColour() );
270 /* Layout everything */
271 frame_sizer->Layout();
272 frame_sizer->Fit(this);
274 #if !defined(__WXX11__)
275 /* Associate drop targets with the main interface */
276 SetDropTarget( new DragAndDrop( p_intf ) );
279 UpdateAcceleratorTable();
282 timer = new Timer( p_intf, this );
285 Interface::~Interface()
287 if( p_intf->p_sys->p_wxwindow )
289 delete p_intf->p_sys->p_wxwindow;
296 void Interface::OnControlEvent( wxCommandEvent& event )
298 switch( event.GetId() )
301 frame_sizer->Layout();
302 frame_sizer->Fit(this);
306 long i_style = GetWindowStyle();
307 if( event.GetInt() ) i_style |= wxSTAY_ON_TOP;
308 else i_style &= ~wxSTAY_ON_TOP;
309 SetWindowStyle( i_style );
314 /*****************************************************************************
316 *****************************************************************************/
317 void Interface::CreateOurMenuBar()
319 #define HELP_SIMPLE N_("Quick file open")
320 #define HELP_ADV N_("Advanced open")
321 #define HELP_FILE N_("Open a file")
322 #define HELP_DISC N_("Open Disc Media")
323 #define HELP_NET N_("Open a network stream")
324 #define HELP_SAT N_("Open a satellite stream")
325 #define HELP_EJECT N_("Eject the DVD/CD")
326 #define HELP_EXIT N_("Exit this program")
328 #define HELP_STREAMWIZARD N_("Open the streaming wizard")
330 #define HELP_PLAYLIST N_("Open the playlist")
331 #define HELP_LOGS N_("Show the program logs")
332 #define HELP_FILEINFO N_("Show information about the file being played")
334 #define HELP_PREFS N_("Go to the preferences menu")
335 #define HELP_EXTENDED N_("Shows the extended GUI")
336 #define HELP_BOOKMARKS N_("Shows the bookmarks window")
338 #define HELP_ABOUT N_("About this program")
340 /* Create the "File" menu */
341 wxMenu *file_menu = new wxMenu;
342 file_menu->Append( OpenFileSimple_Event,
343 wxU(_("Quick &Open File...\tCtrl-O")),
344 wxU(_(HELP_SIMPLE)) );
346 file_menu->AppendSeparator();
347 file_menu->Append( OpenFile_Event, wxU(_("Open &File...\tCtrl-F")),
349 file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...\tCtrl-D")),
351 file_menu->Append( OpenNet_Event,
352 wxU(_("Open &Network Stream...\tCtrl-N")),
355 file_menu->AppendSeparator();
356 file_menu->Append( StreamWizard_Event,
357 wxU(_("Streaming &Wizard...\tCtrl-W")),
358 wxU(_(HELP_STREAMWIZARD)) );
359 file_menu->Append( Wizard_Event, wxU(_("New Wizard...")),
360 wxU(_(HELP_STREAMWIZARD)) );
361 file_menu->AppendSeparator();
362 file_menu->Append( Exit_Event, wxU(_("E&xit\tCtrl-X")),
365 /* Create the "View" menu */
366 wxMenu *view_menu = new wxMenu;
367 view_menu->Append( Playlist_Event, wxU(_("&Playlist...\tCtrl-P")),
368 wxU(_(HELP_PLAYLIST)) );
369 view_menu->Append( Logs_Event, wxU(_("&Messages...\tCtrl-M")),
371 view_menu->Append( FileInfo_Event,
372 wxU(_("Stream and Media &info...\tCtrl-I")),
373 wxU(_(HELP_FILEINFO)) );
375 /* Create the "Auto-generated" menus */
376 p_settings_menu = SettingsMenu( p_intf, this );
377 p_audio_menu = AudioMenu( p_intf, this );
378 p_video_menu = VideoMenu( p_intf, this );
379 p_navig_menu = NavigMenu( p_intf, this );
381 /* Create the "Help" menu */
382 wxMenu *help_menu = new wxMenu;
383 help_menu->Append( About_Event, wxU(_("About VLC media player")),
384 wxU(_(HELP_ABOUT)) );
386 /* Append the freshly created menus to the menu bar... */
387 wxMenuBar *menubar = new wxMenuBar( wxMB_DOCKABLE );
388 menubar->Append( file_menu, wxU(_("&File")) );
389 menubar->Append( view_menu, wxU(_("&View")) );
390 menubar->Append( p_settings_menu, wxU(_("&Settings")) );
391 menubar->Append( p_audio_menu, wxU(_("&Audio")) );
392 menubar->Append( p_video_menu, wxU(_("&Video")) );
393 menubar->Append( p_navig_menu, wxU(_("&Navigation")) );
394 menubar->Append( help_menu, wxU(_("&Help")) );
396 /* Attach the menu bar to the frame */
397 SetMenuBar( menubar );
399 /* Intercept all menu events in our custom event handler */
400 PushEventHandler( new MenuEvtHandler( p_intf, this ) );
402 #if !defined(__WXX11__)
403 /* Associate drop targets with the menubar */
404 menubar->SetDropTarget( new DragAndDrop( p_intf ) );
408 class VLCVolCtrl : public wxControl
411 VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent, wxGauge ** );
412 virtual ~VLCVolCtrl() {};
414 virtual void OnPaint( wxPaintEvent &event );
417 DECLARE_EVENT_TABLE()
420 BEGIN_EVENT_TABLE(VLCVolCtrl, wxControl)
421 EVT_PAINT(VLCVolCtrl::OnPaint)
424 VLCVolCtrl::VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent,
425 wxGauge **pp_volctrl )
426 :wxControl( p_parent, -1, wxDefaultPosition, wxSize(64, 16 ), wxBORDER_NONE )
428 *pp_volctrl = new wxVolCtrl( p_intf, this, -1, wxPoint(18,0),
432 void VLCVolCtrl::OnPaint( wxPaintEvent &evt )
434 wxPaintDC dc( this );
435 wxBitmap mPlayBitmap( speaker_xpm );
436 dc.DrawBitmap( mPlayBitmap, 1, 0, TRUE );
439 void Interface::CreateOurToolBar()
441 #define HELP_STOP N_("Stop")
443 #define HELP_PLAY N_("Play")
444 #define HELP_PAUSE N_("Pause")
445 #define HELP_PLO N_("Playlist")
446 #define HELP_PLP N_("Previous playlist item")
447 #define HELP_PLN N_("Next playlist item")
448 #define HELP_SLOW N_("Play slower")
449 #define HELP_FAST N_("Play faster")
451 wxLogNull LogDummy; /* Hack to suppress annoying log message on the win32
452 * version because we don't include wx.rc */
455 CreateToolBar( wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE );
457 toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) );
459 toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( play_xpm ),
462 toolbar->AddTool( PlayStream_Event, wxT(""), wxBitmap( pause_xpm ),
463 wxU(_(HELP_PAUSE)) );
465 toolbar->AddTool( StopStream_Event, wxT(""), wxBitmap( stop_xpm ),
467 toolbar->AddSeparator();
468 toolbar->AddTool( PrevStream_Event, wxT(""),
469 wxBitmap( prev_xpm ), wxU(_(HELP_PLP)) );
470 toolbar->AddTool( SlowStream_Event, wxT(""),
471 wxBitmap( slow_xpm ), wxU(_(HELP_SLOW)) );
472 toolbar->AddTool( FastStream_Event, wxT(""),
473 wxBitmap( fast_xpm ), wxU(_(HELP_FAST)) );
474 toolbar->AddTool( NextStream_Event, wxT(""), wxBitmap( next_xpm ),
476 toolbar->AddSeparator();
477 toolbar->AddTool( Playlist_Event, wxT(""), wxBitmap( eject_xpm ),
480 wxControl *p_dummy_ctrl =
481 new wxControl( toolbar, -1, wxDefaultPosition,
482 wxSize(64, 16 ), wxBORDER_NONE );
484 toolbar->AddControl( p_dummy_ctrl );
486 VLCVolCtrl *sound_control = new VLCVolCtrl( p_intf, toolbar, &volctrl );
487 toolbar->AddControl( sound_control );
491 // '7' is the number of buttons on the toolbar, '3' is arbitrary :)
492 frame_sizer->SetMinSize( TOOLBAR_BMP_WIDTH * 7 * 3, -1 );
494 #if !defined(__WXX11__)
495 /* Associate drop targets with the toolbar */
496 toolbar->SetDropTarget( new DragAndDrop( p_intf ) );
500 void Interface::CreateOurSlider()
502 /* Create a new frame and sizer containing the slider */
503 slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
504 slider_frame->SetAutoLayout( TRUE );
505 wxBoxSizer *frame_sizer = new wxBoxSizer( wxHORIZONTAL );
506 //frame_sizer->SetMinSize( -1, 50 );
509 slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0,
510 SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize );
512 /* Add everything to the frame */
513 frame_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 );
514 slider_frame->SetSizer( frame_sizer );
515 frame_sizer->Layout();
516 frame_sizer->SetSizeHints(slider_frame);
518 /* Hide the slider by default */
519 slider_frame->Hide();
523 void Interface::CreateOurExtendedPanel()
527 extra_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
528 extra_frame->SetAutoLayout( TRUE );
529 wxBoxSizer *extra_sizer = new wxBoxSizer( wxHORIZONTAL );
531 /* Create static box to surround the adjust controls */
532 wxStaticBox *adjust_box =
533 new wxStaticBox( extra_frame, -1, wxU(_("Adjust Image")) );
535 /* Create the size for the frame */
536 wxStaticBoxSizer *adjust_sizer =
537 new wxStaticBoxSizer( adjust_box, wxVERTICAL );
538 adjust_sizer->SetMinSize( -1, 50 );
540 /* Create every controls */
542 /* Create the adjust button */
543 wxCheckBox * adjust_check = new wxCheckBox( extra_frame, Adjust_Event,
547 wxBoxSizer *hue_sizer = new wxBoxSizer( wxHORIZONTAL );
548 wxStaticText *hue_text = new wxStaticText( extra_frame, -1,
550 hue_slider = new wxSlider ( extra_frame, Hue_Event, 0, 0,
551 360, wxDefaultPosition, wxDefaultSize );
553 hue_sizer->Add(hue_text,1, 0 ,0);
554 hue_sizer->Add(hue_slider,1, 0 ,0);
557 wxBoxSizer *contrast_sizer = new wxBoxSizer( wxHORIZONTAL );
558 wxStaticText *contrast_text = new wxStaticText( extra_frame, -1,
559 wxU(_("Contrast")) );
560 contrast_slider = new wxSlider ( extra_frame, Contrast_Event, 0, 0,
561 200, wxDefaultPosition, wxDefaultSize);
562 contrast_sizer->Add(contrast_text,1, 0 ,0);
563 contrast_sizer->Add(contrast_slider,1, 0 ,0);
564 contrast_sizer->Layout();
566 wxBoxSizer *brightness_sizer = new wxBoxSizer( wxHORIZONTAL );
567 wxStaticText *brightness_text = new wxStaticText( extra_frame, -1,
568 wxU(_("Brightness")) );
569 brightness_slider = new wxSlider ( extra_frame, Brightness_Event, 0, 0,
570 200, wxDefaultPosition, wxDefaultSize) ;
571 brightness_sizer->Add(brightness_text,1,0,0);
572 brightness_sizer->Add(brightness_slider,1,0,0);
573 brightness_sizer->Layout();
575 wxBoxSizer *saturation_sizer = new wxBoxSizer( wxHORIZONTAL );
576 wxStaticText *saturation_text = new wxStaticText( extra_frame, -1,
577 wxU(_("Saturation")) );
578 saturation_slider = new wxSlider ( extra_frame, Saturation_Event, 0, 0,
579 300, wxDefaultPosition, wxDefaultSize );
580 saturation_sizer->Add(saturation_text,1,0,0);
581 saturation_sizer->Add(saturation_slider,1,0,0);
582 saturation_sizer->Layout();
584 wxBoxSizer *gamma_sizer = new wxBoxSizer( wxHORIZONTAL );
585 wxStaticText *gamma_text = new wxStaticText( extra_frame, -1,
587 gamma_slider = new wxSlider ( extra_frame, Gamma_Event, 0, 0,
588 100, wxDefaultPosition, wxDefaultSize );
589 gamma_sizer->Add(gamma_text,1,0,0);
590 gamma_sizer->Add(gamma_slider,1,0,0);
591 gamma_sizer->Layout();
593 adjust_sizer->Add(adjust_check, 1, wxEXPAND, 0);
594 adjust_sizer->Add(hue_sizer, 1, wxEXPAND, 0);
595 adjust_sizer->Add(contrast_sizer, 1, wxEXPAND, 0);
596 adjust_sizer->Add(brightness_sizer, 1, wxEXPAND, 0);
597 adjust_sizer->Add(saturation_sizer, 1, wxEXPAND, 0);
598 adjust_sizer->Add(gamma_sizer, 1, wxEXPAND, 0);
600 extra_sizer->Add(adjust_sizer,1,wxBOTTOM,5);
602 /* Create sizer to surround the other controls */
603 wxBoxSizer *other_sizer = new wxBoxSizer( wxVERTICAL );
606 wxStaticBox *video_box =
607 new wxStaticBox( extra_frame, -1, wxU(_("Video Options")) );
608 /* Create the sizer for the frame */
609 wxStaticBoxSizer *video_sizer =
610 new wxStaticBoxSizer( video_box, wxVERTICAL );
611 video_sizer->SetMinSize( -1, 50 );
613 static const wxString ratio_array[] =
619 wxBoxSizer *ratio_sizer = new wxBoxSizer( wxHORIZONTAL );
620 wxStaticText *ratio_text = new wxStaticText( extra_frame, -1,
621 wxU(_("Aspect Ratio")) );
623 ratio_combo = new wxComboBox( extra_frame, Ratio_Event, wxT(""),
624 wxDefaultPosition, wxSize(120,-1),
625 WXSIZEOF(ratio_array), ratio_array,
628 ratio_sizer->Add( ratio_text, 0, wxALL, 2 );
629 ratio_sizer->Add( ratio_combo, 0, wxALL, 2 );
630 ratio_sizer->Layout();
632 video_sizer->Add( ratio_sizer , 0 , wxALL , 0 );
633 video_sizer->Layout();
636 wxBoxSizer *visual_sizer = new wxBoxSizer( wxHORIZONTAL );
638 wxCheckBox *visual_checkbox = new wxCheckBox( extra_frame, Visual_Event,
639 wxU(_("Visualisations")) );
641 visual_sizer->Add( visual_checkbox, 0, wxEXPAND, 0);
642 visual_sizer->Layout();
644 wxStaticBox *audio_box =
645 new wxStaticBox( extra_frame, -1, wxU(_("Audio Options")) );
646 /* Create the sizer for the frame */
647 wxStaticBoxSizer *audio_sizer =
648 new wxStaticBoxSizer( audio_box, wxVERTICAL );
649 audio_sizer->SetMinSize( -1, 50 );
651 audio_sizer->Add( visual_sizer, 0, wxALL, 0);
652 audio_sizer->Layout();
654 other_sizer->Add( audio_sizer , 0 , wxALL | wxEXPAND , 0 );
656 other_sizer->Add( video_sizer, 0, wxALL | wxEXPAND , 0);
657 other_sizer->Layout();
659 extra_sizer->Add(other_sizer,0,wxBOTTOM,5);
661 extra_frame->SetSizer( extra_sizer );
663 /* Layout the whole panel */
664 extra_sizer->Layout();
666 extra_sizer->SetSizeHints(extra_frame);
668 /* Write down initial values */
670 psz_filters = config_GetPsz( p_intf, "audio-filter" );
671 if( psz_filters && strstr( psz_filters, "visual" ) )
673 visual_checkbox->SetValue(1);
675 if( psz_filters ) free( psz_filters );
677 psz_filters = config_GetPsz( p_intf, "filter" );
678 if( psz_filters && strstr( psz_filters, "adjust" ) )
680 adjust_check->SetValue( 1 );
681 saturation_slider->Enable();
682 contrast_slider->Enable();
683 brightness_slider->Enable();
684 hue_slider->Enable();
685 gamma_slider->Enable();
689 adjust_check->SetValue( 0 );
690 saturation_slider->Disable();
691 contrast_slider->Disable();
692 brightness_slider->Disable();
693 hue_slider->Disable();
694 gamma_slider->Disable();
696 if( psz_filters ) free( psz_filters );
698 int i_value = config_GetInt( p_intf, "hue" );
699 if( i_value > 0 && i_value < 360 )
700 hue_slider->SetValue( i_value );
703 f_value = config_GetFloat( p_intf, "saturation" );
704 if( f_value > 0 && f_value < 5 )
705 saturation_slider->SetValue( (int)(100 * f_value) );
706 f_value = config_GetFloat( p_intf, "contrast" );
707 if( f_value > 0 && f_value < 4 )
708 contrast_slider->SetValue( (int)(100 * f_value) );
709 f_value = config_GetFloat( p_intf, "brightness" );
710 if( f_value > 0 && f_value < 2 )
711 brightness_slider->SetValue( (int)(100 * f_value) );
712 f_value = config_GetFloat( p_intf, "gamma" );
713 if( f_value > 0 && f_value < 10 )
714 gamma_slider->SetValue( (int)(10 * f_value) );
719 void Interface::UpdateAcceleratorTable()
721 /* Set some hotkeys */
722 wxAcceleratorEntry entries[7];
726 var_Get( p_intf->p_vlc, "key-quit", &val );
727 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
728 ConvertHotkey( val.i_int ), Exit_Event );
729 var_Get( p_intf->p_vlc, "key-stop", &val );
730 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
731 ConvertHotkey( val.i_int ), StopStream_Event );
732 var_Get( p_intf->p_vlc, "key-play-pause", &val );
733 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
734 ConvertHotkey( val.i_int ), PlayStream_Event );
735 var_Get( p_intf->p_vlc, "key-next", &val );
736 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
737 ConvertHotkey( val.i_int ), NextStream_Event );
738 var_Get( p_intf->p_vlc, "key-prev", &val );
739 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
740 ConvertHotkey( val.i_int ), PrevStream_Event );
741 var_Get( p_intf->p_vlc, "key-faster", &val );
742 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
743 ConvertHotkey( val.i_int ), FastStream_Event );
744 var_Get( p_intf->p_vlc, "key-slower", &val );
745 entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
746 ConvertHotkey( val.i_int ), SlowStream_Event );
748 wxAcceleratorTable accel( 7, entries );
751 msg_Err( p_intf, "invalid accelerator table" );
753 SetAcceleratorTable( accel );
754 msg_Dbg( p_intf, "accelerator table loaded" );
758 /*****************************************************************************
760 *****************************************************************************/
762 void Interface::OnMenuOpen(wxMenuEvent& event)
764 #if defined( __WXMSW__ )
765 # define GetEventObject GetMenu
768 if( event.GetEventObject() == p_settings_menu )
770 p_settings_menu = SettingsMenu( p_intf, this, p_settings_menu );
772 /* Add static items */
773 p_settings_menu->AppendCheckItem( Extended_Event,
774 wxU(_("&Extended GUI") ), wxU(_(HELP_EXTENDED)) );
775 p_settings_menu->AppendCheckItem( Bookmarks_Event,
776 wxU(_("&Bookmarks...") ), wxU(_(HELP_BOOKMARKS)) );
777 p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
778 wxU(_(HELP_PREFS)) );
781 else if( event.GetEventObject() == p_audio_menu )
783 p_audio_menu = AudioMenu( p_intf, this, p_audio_menu );
786 else if( event.GetEventObject() == p_video_menu )
788 p_video_menu = VideoMenu( p_intf, this, p_video_menu );
791 else if( event.GetEventObject() == p_navig_menu )
793 p_navig_menu = NavigMenu( p_intf, this, p_navig_menu );
796 #if defined( __WXMSW__ )
797 # undef GetEventObject
801 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
802 void Interface::OnContextMenu2(wxContextMenuEvent& event)
804 /* Only show the context menu for the main interface */
805 if( GetId() != event.GetId() )
811 if( p_intf->p_sys->pf_show_dialog )
812 p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
815 void Interface::OnContextMenu(wxMouseEvent& event)
817 if( p_intf->p_sys->pf_show_dialog )
818 p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
821 void Interface::OnExit( wxCommandEvent& WXUNUSED(event) )
823 /* TRUE is to force the frame to close. */
827 void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) )
830 msg.Printf( wxString(wxT("VLC media player " VERSION)) +
831 wxU(_(" (wxWindows interface)\n\n")) +
832 wxU(_("(c) 1996-2004 - the VideoLAN Team\n\n")) +
833 wxU( vlc_wraptext(INTF_ABOUT_MSG,WRAPCOUNT,ISUTF8) ) + wxT("\n\n") +
834 wxU(_("The VideoLAN team <videolan@videolan.org>\n"
835 "http://www.videolan.org/\n\n")) );
837 wxMessageBox( msg, wxString::Format(wxU(_("About %s")),
838 wxT("VLC media player")), wxOK | wxICON_INFORMATION, this );
841 void Interface::OnShowDialog( wxCommandEvent& event )
843 if( p_intf->p_sys->pf_show_dialog )
847 switch( event.GetId() )
849 case OpenFileSimple_Event:
850 i_id = INTF_DIALOG_FILE_SIMPLE;
853 i_id = INTF_DIALOG_FILE;
855 i_id = INTF_DIALOG_FILE;
858 i_id = INTF_DIALOG_DISC;
861 i_id = INTF_DIALOG_NET;
864 i_id = INTF_DIALOG_SAT;
867 i_id = INTF_DIALOG_PLAYLIST;
870 i_id = INTF_DIALOG_MESSAGES;
873 i_id = INTF_DIALOG_FILEINFO;
876 i_id = INTF_DIALOG_PREFS;
878 case StreamWizard_Event:
879 i_id = INTF_DIALOG_STREAMWIZARD;
882 i_id = INTF_DIALOG_WIZARD;
884 case Bookmarks_Event:
885 i_id = INTF_DIALOG_BOOKMARKS;
888 i_id = INTF_DIALOG_FILE;
892 p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
896 void Interface::OnExtended(wxCommandEvent& event)
898 if( b_extra == VLC_FALSE)
901 frame_sizer->Show( extra_frame );
907 frame_sizer->Hide( extra_frame );
910 frame_sizer->Layout();
911 frame_sizer->Fit(this);
914 void Interface::OnEnableAdjust(wxCommandEvent& event)
916 char *psz_filters=config_GetPsz( p_intf, "filter");
917 char *psz_new = NULL;
918 if( event.IsChecked() )
920 if(psz_filters == NULL)
922 psz_new = strdup( "adjust" );
926 psz_new= (char *) malloc(strlen(psz_filters) + 8 );
927 sprintf( psz_new, "%s:adjust", psz_filters);
929 config_PutPsz( p_intf, "filter", psz_new );
931 vout_thread_t *p_vout =
932 (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
936 val.psz_string = strdup( psz_new );
937 var_Set( p_vout, "filter", val);
938 vlc_object_release( p_vout );
940 if( val.psz_string ) free( val.psz_string );
941 brightness_slider->Enable();
942 saturation_slider->Enable();
943 contrast_slider->Enable();
944 hue_slider->Enable();
945 gamma_slider->Enable();
949 if( psz_filters != NULL )
954 for( i = 0; i< strlen(psz_filters ); i++)
956 if ( !strncasecmp( &psz_filters[i],"adjust",6 ))
959 if( psz_filters[i-1] == ':' ) i--;
960 psz_current = strchr( &psz_filters[i+1] , ':' );
962 psz_filters[i] = '\0';
965 memmove( &psz_filters[i] , psz_current,
966 &psz_filters[strlen(psz_filters)]-psz_current
971 config_PutPsz( p_intf, "filter", psz_filters);
973 val.psz_string = strdup( psz_filters );
974 vout_thread_t *p_vout =
975 (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
979 var_Set( p_vout, "filter", val);
980 vlc_object_release( p_vout );
982 if( val.psz_string ) free( val.psz_string );
984 brightness_slider->Disable();
985 saturation_slider->Disable();
986 contrast_slider->Disable();
987 hue_slider->Disable();
988 gamma_slider->Disable();
990 if(psz_filters) free(psz_filters);
991 if(psz_new) free(psz_new);
994 void Interface::OnHueUpdate( wxScrollEvent& event)
996 config_PutInt( p_intf , "hue" , event.GetPosition() );
999 void Interface::OnSaturationUpdate( wxScrollEvent& event)
1001 config_PutFloat( p_intf , "saturation" , (float)event.GetPosition()/100 );
1004 void Interface::OnBrightnessUpdate( wxScrollEvent& event)
1006 config_PutFloat( p_intf , "brightness", (float)event.GetPosition()/100 );
1009 void Interface::OnContrastUpdate(wxScrollEvent& event)
1011 config_PutFloat( p_intf , "contrast" , (float)event.GetPosition()/100 );
1014 void Interface::OnGammaUpdate(wxScrollEvent& event)
1016 config_PutFloat( p_intf , "gamma" , (float)event.GetPosition()/10 );
1019 void Interface::OnRatio( wxCommandEvent& event )
1021 config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
1024 void Interface::OnEnableVisual(wxCommandEvent& event)
1026 if( event.IsChecked() )
1028 config_PutPsz( p_intf, "audio-filter", "visual" );
1032 config_PutPsz( p_intf, "audio-filter", "" );
1036 void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) )
1038 wxCommandEvent dummy;
1039 playlist_t *p_playlist =
1040 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1042 if( p_playlist == NULL ) return;
1044 if( p_playlist->i_size && p_playlist->i_enabled )
1048 input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf,
1051 if( p_input == NULL )
1053 /* No stream was playing, start one */
1054 playlist_Play( p_playlist );
1055 TogglePlayButton( PLAYING_S );
1056 vlc_object_release( p_playlist );
1060 var_Get( p_input, "state", &state );
1062 if( state.i_int != PAUSE_S )
1064 /* A stream is being played, pause it */
1065 state.i_int = PAUSE_S;
1069 /* Stream is paused, resume it */
1070 state.i_int = PLAYING_S;
1072 var_Set( p_input, "state", state );
1074 TogglePlayButton( state.i_int );
1075 vlc_object_release( p_input );
1076 vlc_object_release( p_playlist );
1080 /* If the playlist is empty, open a file requester instead */
1081 vlc_object_release( p_playlist );
1082 OnShowDialog( dummy );
1086 void Interface::OnStopStream( wxCommandEvent& WXUNUSED(event) )
1088 playlist_t * p_playlist =
1089 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1091 if( p_playlist == NULL )
1096 playlist_Stop( p_playlist );
1097 TogglePlayButton( PAUSE_S );
1098 vlc_object_release( p_playlist );
1101 void Interface::OnSliderUpdate( wxScrollEvent& event )
1103 vlc_mutex_lock( &p_intf->change_lock );
1106 if( event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
1107 || event.GetEventType() == wxEVT_SCROLL_ENDSCROLL )
1110 if( p_intf->p_sys->i_slider_pos != event.GetPosition()
1111 && p_intf->p_sys->p_input )
1114 pos.f_float = (float)event.GetPosition() / (float)SLIDER_MAX_POS;
1116 var_Set( p_intf->p_sys->p_input, "position", pos );
1120 p_intf->p_sys->b_slider_free = VLC_TRUE;
1124 p_intf->p_sys->b_slider_free = VLC_FALSE;
1126 if( p_intf->p_sys->p_input )
1128 /* Update stream date */
1129 #define p_area p_intf->p_sys->p_input->stream.p_selected_area
1130 char psz_time[ MSTRTIME_MAX_SIZE ], psz_total[ MSTRTIME_MAX_SIZE ];
1134 var_Get( p_intf->p_sys->p_input, "length", &val );
1135 i_seconds = val.i_time / 1000000;
1136 secstotimestr ( psz_total, i_seconds );
1138 statusbar->SetStatusText(
1139 wxU(input_OffsetToTime( p_intf->p_sys->p_input,
1140 psz_time, p_area->i_size * event.GetPosition()
1141 / SLIDER_MAX_POS )) + wxString(wxT(" / ")) +
1142 wxU(psz_total), 0 );
1149 vlc_mutex_unlock( &p_intf->change_lock );
1152 void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) )
1154 playlist_t * p_playlist =
1155 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1157 if( p_playlist == NULL )
1162 vlc_mutex_lock( &p_playlist->object_lock );
1163 if( p_playlist->p_input != NULL )
1165 vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1166 if( p_playlist->p_input->stream.p_selected_area->i_id > 1 )
1168 vlc_value_t val; val.b_bool = VLC_TRUE;
1169 vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1170 var_Set( p_playlist->p_input, "prev-title", val );
1172 vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1174 vlc_mutex_unlock( &p_playlist->object_lock );
1176 playlist_Prev( p_playlist );
1177 vlc_object_release( p_playlist );
1180 void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) )
1182 playlist_t * p_playlist =
1183 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1185 if( p_playlist == NULL )
1190 vlc_mutex_lock( &p_playlist->object_lock );
1191 if( p_playlist->p_input != NULL )
1193 vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1194 if( p_playlist->p_input->stream.i_area_nb > 1 &&
1195 p_playlist->p_input->stream.p_selected_area->i_id <
1196 p_playlist->p_input->stream.i_area_nb - 1 )
1198 vlc_value_t val; val.b_bool = VLC_TRUE;
1199 vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1200 var_Set( p_playlist->p_input, "next-title", val );
1202 vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1204 vlc_mutex_unlock( &p_playlist->object_lock );
1206 playlist_Next( p_playlist );
1207 vlc_object_release( p_playlist );
1210 void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) )
1212 input_thread_t *p_input =
1213 (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1217 vlc_value_t val; val.b_bool = VLC_TRUE;
1219 var_Set( p_input, "rate-slower", val );
1220 vlc_object_release( p_input );
1224 void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) )
1226 input_thread_t *p_input =
1227 (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1231 vlc_value_t val; val.b_bool = VLC_TRUE;
1233 var_Set( p_input, "rate-faster", val );
1234 vlc_object_release( p_input );
1238 void Interface::TogglePlayButton( int i_playing_status )
1240 if( i_playing_status == i_old_playing_status )
1243 GetToolBar()->DeleteTool( PlayStream_Event );
1245 if( i_playing_status == PLAYING_S )
1247 GetToolBar()->InsertTool( 0, PlayStream_Event, wxU(_("Pause")),
1248 wxBitmap( pause_xpm ), wxNullBitmap,
1249 wxITEM_NORMAL, wxU(_(HELP_PAUSE)) );
1253 GetToolBar()->InsertTool( 0, PlayStream_Event, wxU(_("Play")),
1254 wxBitmap( play_xpm ), wxNullBitmap,
1255 wxITEM_NORMAL, wxU(_(HELP_PLAY)) );
1258 GetToolBar()->Realize();
1260 i_old_playing_status = i_playing_status;
1263 #if !defined(__WXX11__)
1264 /*****************************************************************************
1265 * Definition of DragAndDrop class.
1266 *****************************************************************************/
1267 DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, vlc_bool_t _b_enqueue )
1270 b_enqueue = _b_enqueue;
1273 bool DragAndDrop::OnDropFiles( wxCoord, wxCoord,
1274 const wxArrayString& filenames )
1276 /* Add dropped files to the playlist */
1278 playlist_t *p_playlist =
1279 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1281 if( p_playlist == NULL )
1286 for( size_t i = 0; i < filenames.GetCount(); i++ )
1287 playlist_Add( p_playlist, (const char *)filenames[i].mb_str(),
1288 (const char *)filenames[i].mb_str(),
1289 PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO),
1292 vlc_object_release( p_playlist );
1298 /*****************************************************************************
1299 * Definition of wxVolCtrl class.
1300 *****************************************************************************/
1301 wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id,
1302 wxPoint point, wxSize size )
1303 : wxGauge( parent, id, 200, point, size, wxGA_HORIZONTAL | wxGA_SMOOTH )
1307 audio_volume_t i_volume;
1308 aout_VolumeGet( p_intf, &i_volume );
1309 i_volume = i_volume * 200 * 2 / AOUT_VOLUME_MAX;
1310 SetValue( i_volume );
1311 SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
1315 void wxVolCtrl::OnChange( wxMouseEvent& event )
1317 if( !event.LeftDown() && !event.LeftIsDown() ) return;
1319 int i_volume = event.GetX() * 200 / GetClientSize().GetWidth();
1323 void wxVolCtrl::Change( int i_volume )
1325 aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
1326 SetValue( i_volume );
1327 SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),