]> git.sesse.net Git - vlc/blob - modules/gui/wxwindows/interface.cpp
1dbf3b0f6bd8aad55f58b1e2b7f1b79144e825e4
[vlc] / modules / gui / wxwindows / interface.cpp
1 /*****************************************************************************
2  * interface.cpp : wxWindows plugin for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001, 2003 VideoLAN
5  * $Id: interface.cpp,v 1.81 2003/12/31 10:30:44 zorglub Exp $
6  *
7  * Authors: Gildas Bazin <gbazin@netcourrier.com>
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
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  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <vlc/vlc.h>
28 #include <vlc/aout.h>
29 #include <vlc/vout.h>
30 #include <vlc/intf.h>
31 #include "stream_control.h"
32
33 #include "wxwindows.h"
34
35 /* include the toolbar graphics */
36 #include "bitmaps/file.xpm"
37
38 #include "bitmaps/disc.xpm"
39 #include "bitmaps/net.xpm"
40 #if 0
41  #include "bitmaps/sat.xpm"
42 #endif
43 #include "bitmaps/play.xpm"
44 #include "bitmaps/pause.xpm"
45 #include "bitmaps/stop.xpm"
46 #include "bitmaps/previous.xpm"
47 #include "bitmaps/next.xpm"
48 #include "bitmaps/playlist.xpm"
49 #include "bitmaps/fast.xpm"
50 #include "bitmaps/slow.xpm"
51
52 #include <wx/listctrl.h>
53
54 #define TOOLBAR_BMP_WIDTH 36
55 #define TOOLBAR_BMP_HEIGHT 36
56
57 /* include the icon graphic */
58 #include "../../../share/vlc32x32.xpm"
59
60 /*****************************************************************************
61  * Local class declarations.
62  *****************************************************************************/
63 class wxMenuExt: public wxMenu
64 {
65 public:
66     /* Constructor */
67     wxMenuExt( wxMenu* parentMenu, int id, const wxString& text,
68                    const wxString& helpString, wxItemKind kind,
69                    char *_psz_var, int _i_object_id, vlc_value_t _val,
70                    int _i_val_type );
71
72     virtual ~wxMenuExt() {};
73
74     char *psz_var;
75     int  i_val_type;
76     int  i_object_id;
77     vlc_value_t val;
78
79 private:
80
81 };
82
83 class wxVolCtrl: public wxGauge
84 {
85 public:
86     /* Constructor */
87     wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id );
88     virtual ~wxVolCtrl() {};
89
90     void Change( int i_volume );
91
92     void OnChange( wxMouseEvent& event );
93
94 private:
95     intf_thread_t *p_intf;
96
97     DECLARE_EVENT_TABLE();
98 };
99
100 BEGIN_EVENT_TABLE(wxVolCtrl, wxWindow)
101     /* Mouse events */
102     EVT_LEFT_DOWN(wxVolCtrl::OnChange)
103     EVT_MOTION(wxVolCtrl::OnChange)
104 END_EVENT_TABLE()
105
106 /*****************************************************************************
107  * Event Table.
108  *****************************************************************************/
109
110 /* IDs for the controls and the menu commands */
111 enum
112 {
113     /* menu items */
114     MenuDummy_Event = wxID_HIGHEST + 1000,
115     Exit_Event = wxID_HIGHEST,
116     OpenFileSimple_Event,
117     OpenAdv_Event,
118     OpenFile_Event,
119     OpenDisc_Event,
120     OpenNet_Event,
121     OpenSat_Event,
122     OpenOther_Event,
123     EjectDisc_Event,
124
125     Stream_Event,
126
127     Playlist_Event,
128     Logs_Event,
129     FileInfo_Event,
130
131     Prefs_Event,
132     Extra_Event,
133     Skins_Event,
134
135     SliderScroll_Event,
136     StopStream_Event,
137     PlayStream_Event,
138     PrevStream_Event,
139     NextStream_Event,
140     SlowStream_Event,
141     FastStream_Event,
142
143     Adjust_Event,
144     Hue_Event,
145     Contrast_Event,
146     Brightness_Event,
147     Saturation_Event,
148
149     Ratio_Event,
150     Visual_Event,
151
152     /* it is important for the id corresponding to the "About" command to have
153      * this standard value as otherwise it won't be handled properly under Mac
154      * (where it is special and put into the "Apple" menu) */
155     About_Event = wxID_ABOUT
156 };
157
158 BEGIN_EVENT_TABLE(Interface, wxFrame)
159     /* Menu events */
160     EVT_MENU(Exit_Event, Interface::OnExit)
161     EVT_MENU(About_Event, Interface::OnAbout)
162
163     EVT_MENU(Playlist_Event, Interface::OnShowDialog)
164     EVT_MENU(Logs_Event, Interface::OnShowDialog)
165     EVT_MENU(FileInfo_Event, Interface::OnShowDialog)
166     EVT_MENU(Prefs_Event, Interface::OnShowDialog)
167
168     EVT_MENU_OPEN(Interface::OnMenuOpen)
169
170     EVT_MENU( Extra_Event, Interface::OnExtra)
171     EVT_CHECKBOX( Adjust_Event, Interface::OnEnableAdjust)
172
173     EVT_COMBOBOX( Ratio_Event, Interface::OnRatio)
174     EVT_CHECKBOX( Visual_Event, Interface::OnEnableVisual)
175
176 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
177     EVT_CONTEXT_MENU(Interface::OnContextMenu2)
178 #endif
179     EVT_RIGHT_UP(Interface::OnContextMenu)
180
181     /* Toolbar events */
182     EVT_MENU(OpenFileSimple_Event, Interface::OnShowDialog)
183     EVT_MENU(OpenAdv_Event, Interface::OnShowDialog)
184     EVT_MENU(OpenFile_Event, Interface::OnShowDialog)
185     EVT_MENU(OpenDisc_Event, Interface::OnShowDialog)
186     EVT_MENU(OpenNet_Event, Interface::OnShowDialog)
187     EVT_MENU(OpenSat_Event, Interface::OnShowDialog)
188     EVT_MENU(Stream_Event, Interface::OnStream)
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)
195
196     /* Slider events */
197     EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate)
198
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
204 END_EVENT_TABLE()
205
206 /*****************************************************************************
207  * Constructor.
208  *****************************************************************************/
209 Interface::Interface( intf_thread_t *_p_intf ):
210     wxFrame( NULL, -1, wxT("VLC media player"),
211              wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
212 {
213     /* Initializations */
214     p_intf = _p_intf;
215     i_old_playing_status = PAUSE_S;
216     b_extra = VLC_FALSE;
217
218     /* Give our interface a nice little icon */
219     SetIcon( wxIcon( vlc_xpm ) );
220
221     /* Create a sizer for the main frame */
222     frame_sizer = new wxBoxSizer( wxVERTICAL );
223     SetSizer( frame_sizer );
224
225     /* Create a dummy widget that can get the keyboard focus */
226     wxWindow *p_dummy = new wxWindow( this, 0, wxDefaultPosition,
227                                       wxSize(0,0) );
228     p_dummy->SetFocus();
229     frame_sizer->Add( p_dummy, 0, wxEXPAND );
230
231     /* Creation of the menu bar */
232     CreateOurMenuBar();
233
234     /* Creation of the tool bar */
235     CreateOurToolBar();
236
237     /* Creation of the slider sub-window */
238     CreateOurSlider();
239     frame_sizer->Add( slider_frame, 0, wxEXPAND , 0 );
240     frame_sizer->Hide( slider_frame );
241
242     /* Create the extra panel */
243     CreateOurExtraPanel();
244     frame_sizer->Add( extra_frame, 0, wxEXPAND , 0 );
245     frame_sizer->Hide( extra_frame );
246
247     /* Creation of the status bar
248      * Helptext for menu items and toolbar tools will automatically get
249      * displayed here. */
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 );
254
255     /* Make sure we've got the right background colour */
256     SetBackgroundColour( slider_frame->GetBackgroundColour() );
257
258     /* Layout everything */
259     frame_sizer->Layout();
260     frame_sizer->Fit(this);
261
262 #if !defined(__WXX11__)
263     /* Associate drop targets with the main interface */
264     SetDropTarget( new DragAndDrop( p_intf ) );
265 #endif
266
267     UpdateAcceleratorTable();
268
269     /* Start timer */
270     timer = new Timer( p_intf, this );
271 }
272
273 Interface::~Interface()
274 {
275     if( p_intf->p_sys->p_wxwindow )
276     {
277         delete p_intf->p_sys->p_wxwindow;
278     }
279
280     /* Clean up */
281     delete timer;
282 }
283
284 /*****************************************************************************
285  * Private methods.
286  *****************************************************************************/
287 void Interface::CreateOurMenuBar()
288 {
289 #define HELP_SIMPLE N_("Quick file open")
290 #define HELP_ADV N_("Advanced open")
291 #define HELP_FILE  N_("Open a file")
292 #define HELP_DISC  N_("Open Disc Media")
293 #define HELP_NET   N_("Open a network stream")
294 #define HELP_SAT   N_("Open a satellite stream")
295 #define HELP_EJECT N_("Eject the DVD/CD")
296 #define HELP_EXIT  N_("Exit this program")
297
298 #define HELP_STREAMWIZARD N_("Open the streaming wizard")
299 #define HELP_OTHER N_("Open other types of inputs")
300
301 #define HELP_PLAYLIST   N_("Open the playlist")
302 #define HELP_LOGS       N_("Show the program logs")
303 #define HELP_FILEINFO       N_("Show information about the file being played")
304
305 #define HELP_PREFS N_("Go to the preferences menu")
306 #define EXTRA_PREFS N_("Shows the extended GUI")
307
308 #define HELP_ABOUT N_("About this program")
309
310     /* Create the "File" menu */
311     wxMenu *file_menu = new wxMenu;
312     file_menu->Append( OpenFileSimple_Event, wxU(_("Quick &Open ...")),
313                        wxU(_(HELP_SIMPLE)) );
314
315     file_menu->AppendSeparator();
316     file_menu->Append( OpenFile_Event, wxU(_("Open &File...")),
317                       wxU(_(HELP_FILE)));
318     file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...")),
319                       wxU(_(HELP_DISC)));
320     file_menu->Append( OpenNet_Event, wxU(_("Open &Network Stream...")),
321                       wxU(_(HELP_NET)));
322
323 #if 0
324     file_menu->Append( OpenSat_Event, wxU(_("Open &Satellite Stream...")),
325                        wxU(_(HELP_NET)) );
326 #endif
327     file_menu->AppendSeparator();
328     file_menu->Append( Stream_Event, wxU(_("Streaming Wizard...")),
329                        wxU(_(HELP_STREAMWIZARD)) );
330     file_menu->AppendSeparator();
331     file_menu->Append( Exit_Event, wxU(_("E&xit")), wxU(_(HELP_EXIT)) );
332
333     /* Create the "View" menu */
334     wxMenu *view_menu = new wxMenu;
335     view_menu->Append( Playlist_Event, wxU(_("&Playlist...")),
336                        wxU(_(HELP_PLAYLIST)) );
337     view_menu->Append( Logs_Event, wxU(_("&Messages...")), wxU(_(HELP_LOGS)) );
338     view_menu->Append( FileInfo_Event, wxU(_("&Stream and Media info...")),
339                        wxU(_(HELP_FILEINFO)) );
340
341     /* Create the "Settings" menu */
342     p_settings_menu = new wxMenu;
343     b_settings_menu = 1;
344
345     /* Create the "Audio" menu */
346     p_audio_menu = new wxMenu;
347     b_audio_menu = 1;
348
349     /* Create the "Video" menu */
350     p_video_menu = new wxMenu;
351     b_video_menu = 1;
352
353     /* Create the "Navigation" menu */
354     p_navig_menu = new wxMenu;
355     b_navig_menu = 1;
356
357     /* Create the "Help" menu */
358     wxMenu *help_menu = new wxMenu;
359     help_menu->Append( About_Event, wxU(_("&About...")), wxU(_(HELP_ABOUT)) );
360
361     /* Append the freshly created menus to the menu bar... */
362     wxMenuBar *menubar = new wxMenuBar( wxMB_DOCKABLE );
363     menubar->Append( file_menu, wxU(_("&File")) );
364     menubar->Append( view_menu, wxU(_("&View")) );
365     menubar->Append( p_settings_menu, wxU(_("&Settings")) );
366     menubar->Append( p_audio_menu, wxU(_("&Audio")) );
367     menubar->Append( p_video_menu, wxU(_("&Video")) );
368     menubar->Append( p_navig_menu, wxU(_("&Navigation")) );
369     menubar->Append( help_menu, wxU(_("&Help")) );
370
371     /* Attach the menu bar to the frame */
372     SetMenuBar( menubar );
373
374     /* Intercept all menu events in our custom event handler */
375     PushEventHandler( new MenuEvtHandler( p_intf, this ) );
376
377 #if !defined(__WXX11__)
378     /* Associate drop targets with the menubar */
379     menubar->SetDropTarget( new DragAndDrop( p_intf ) );
380 #endif
381 }
382
383 void Interface::CreateOurToolBar()
384 {
385 #define HELP_STOP N_("Stop current playlist item")
386
387 #define HELP_PLAY N_("Play current playlist item")
388 #define HELP_PAUSE N_("Pause current playlist item")
389 #define HELP_PLO N_("Open playlist")
390 #define HELP_PLP N_("Previous playlist item")
391 #define HELP_PLN N_("Next playlist item")
392 #define HELP_SLOW N_("Play slower")
393 #define HELP_FAST N_("Play faster")
394
395     wxLogNull LogDummy; /* Hack to suppress annoying log message on the win32
396                          * version because we don't include wx.rc */
397
398     wxToolBar *toolbar =
399         CreateToolBar( wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE );
400
401     toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) );
402
403     toolbar->AddTool( OpenFileSimple_Event, wxU(_("Quick")),
404                       wxBitmap( file_xpm ), wxU(_(HELP_SIMPLE)) );
405
406     toolbar->AddSeparator();
407     toolbar->AddTool( OpenFile_Event, wxU(_("File")), wxBitmap( file_xpm ),
408                       wxU(_(HELP_FILE)) );
409     toolbar->AddTool( OpenDisc_Event, wxU(_("Disc")), wxBitmap( disc_xpm ),
410                       wxU(_(HELP_DISC)) );
411     toolbar->AddTool( OpenNet_Event, wxU(_("Net")), wxBitmap( net_xpm ),
412                       wxU(_(HELP_NET)) );
413     toolbar->AddSeparator();
414
415     toolbar->AddTool( StopStream_Event, wxU(_("Stop")), wxBitmap( stop_xpm ),
416                       wxU(_(HELP_STOP)) );
417     toolbar->AddTool( PlayStream_Event, wxU(_("Play")), wxBitmap( play_xpm ),
418                       wxU(_(HELP_PLAY)) );
419
420     toolbar->AddSeparator();
421     toolbar->AddTool( Playlist_Event, wxU(_("Playlist")),
422                       wxBitmap( playlist_xpm ), wxU(_(HELP_PLO)) );
423     toolbar->AddTool( PrevStream_Event, wxU(_("Prev")),
424                       wxBitmap( previous_xpm ), wxU(_(HELP_PLP)) );
425     toolbar->AddTool( NextStream_Event, wxU(_("Next")), wxBitmap( next_xpm ),
426                       wxU(_(HELP_PLN)) );
427     toolbar->AddTool( SlowStream_Event, wxU(_("Slower")), wxBitmap( slow_xpm ),
428                       wxU(_(HELP_SLOW)) );
429     toolbar->AddTool( FastStream_Event, wxU(_("Faster")), wxBitmap( fast_xpm ),
430                       wxU(_(HELP_FAST)) );
431
432     toolbar->Realize();
433
434     /* Place the toolbar in a sizer, so we can calculate the width of the
435      * toolbar and set this as the minimum for the main frame size. */
436     wxBoxSizer *toolbar_sizer = new wxBoxSizer( wxHORIZONTAL );
437     toolbar_sizer->Add( toolbar, 1, 0, 0 );
438     toolbar_sizer->Layout();
439
440 #ifndef WIN32
441     frame_sizer->SetMinSize( toolbar_sizer->GetMinSize().GetWidth(), -1 );
442 #else /* That sucks but for some reason it works better */
443     frame_sizer->SetMinSize( toolbar_sizer->GetMinSize().GetWidth()*2/3, -1 );
444 #endif
445
446 #if !defined(__WXX11__)
447     /* Associate drop targets with the toolbar */
448     toolbar->SetDropTarget( new DragAndDrop( p_intf ) );
449 #endif
450 }
451
452 void Interface::CreateOurSlider()
453 {
454     /* Create a new frame and sizer containing the slider */
455     slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
456     slider_frame->SetAutoLayout( TRUE );
457     wxBoxSizer *frame_sizer =
458         new wxBoxSizer( wxHORIZONTAL );
459
460     /* Create static box to surround the slider */
461     slider_box = new wxStaticBox( slider_frame, -1, wxT("") );
462
463     /* Create sizer for slider frame */
464     wxStaticBoxSizer *slider_sizer =
465         new wxStaticBoxSizer( slider_box, wxHORIZONTAL );
466     slider_sizer->SetMinSize( -1, 50 );
467
468     /* Create slider */
469     slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0,
470                            SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize );
471     slider_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 );
472
473
474     volctrl = new wxVolCtrl( p_intf, slider_frame, -1 );
475
476     /* Add everything to the frame */
477     frame_sizer->Add( slider_sizer, 1, wxEXPAND | wxBOTTOM, 5 );
478     frame_sizer->Add( volctrl, 0, wxEXPAND | wxALL, 5 );
479     slider_frame->SetSizer( frame_sizer );
480     frame_sizer->Layout();
481     frame_sizer->SetSizeHints(slider_frame);
482
483     /* Hide the slider by default */
484     slider_frame->Hide();
485 }
486
487
488 void Interface::CreateOurExtraPanel()
489 {
490     char *psz_filters;
491
492     extra_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
493     extra_frame->SetAutoLayout( TRUE );
494     wxBoxSizer *extra_sizer = new wxBoxSizer( wxHORIZONTAL );
495
496     /* Create static box to surround the adjust controls */
497     wxStaticBox *adjust_box =
498            new wxStaticBox( extra_frame, -1, wxU(_("Image adjust")) );
499
500     /* Create the size for the frame */
501     wxStaticBoxSizer *adjust_sizer =
502         new wxStaticBoxSizer( adjust_box, wxVERTICAL );
503     adjust_sizer->SetMinSize( -1, 50 );
504
505     /* Create every controls */
506
507     /* Create the adjust button */
508     wxCheckBox * adjust_check = new wxCheckBox( extra_frame, Adjust_Event,
509                                                  wxU(_("Enable")));
510
511
512     wxBoxSizer *hue_sizer = new wxBoxSizer( wxHORIZONTAL );
513     wxStaticText *hue_text = new wxStaticText( extra_frame, -1,
514                                        wxU(_("Hue")) );
515     hue_slider = new wxSlider ( extra_frame, Hue_Event, 0, 0,
516                                 360, wxDefaultPosition, wxDefaultSize );
517
518     hue_sizer->Add(hue_text,1, 0 ,0);
519     hue_sizer->Add(hue_slider,1, 0 ,0);
520     hue_sizer->Layout();
521
522     wxBoxSizer *contrast_sizer = new wxBoxSizer( wxHORIZONTAL );
523     wxStaticText *contrast_text = new wxStaticText( extra_frame, -1,
524                                        wxU(_("Contrast")) );
525     contrast_slider = new wxSlider ( extra_frame, Contrast_Event, 0, 0,
526                                 200, wxDefaultPosition, wxDefaultSize);
527     contrast_sizer->Add(contrast_text,1, 0 ,0);
528     contrast_sizer->Add(contrast_slider,1, 0 ,0);
529     contrast_sizer->Layout();
530
531     wxBoxSizer *brightness_sizer = new wxBoxSizer( wxHORIZONTAL );
532     wxStaticText *brightness_text = new wxStaticText( extra_frame, -1,
533                                        wxU(_("Brightness")) );
534     brightness_slider = new wxSlider ( extra_frame, Brightness_Event, 0, 0,
535                            200, wxDefaultPosition, wxDefaultSize) ;
536     brightness_sizer->Add(brightness_text,1,0,0);
537     brightness_sizer->Add(brightness_slider,1,0,0);
538     brightness_sizer->Layout();
539
540     wxBoxSizer *saturation_sizer = new wxBoxSizer( wxHORIZONTAL );
541     wxStaticText *saturation_text = new wxStaticText( extra_frame, -1,
542                                           wxU(_("Saturation")) );
543     saturation_slider = new wxSlider ( extra_frame, Saturation_Event, 0, 0,
544                            300, wxDefaultPosition, wxDefaultSize );
545     saturation_sizer->Add(saturation_text,1,0,0);
546     saturation_sizer->Add(saturation_slider,1,0,0);
547     saturation_sizer->Layout();
548
549     adjust_sizer->Add(adjust_check, 1, wxEXPAND, 0);
550     adjust_sizer->Add(hue_sizer, 1, wxEXPAND, 0);
551     adjust_sizer->Add(contrast_sizer, 1, wxEXPAND, 0);
552     adjust_sizer->Add(brightness_sizer, 1, wxEXPAND, 0);
553     adjust_sizer->Add(saturation_sizer, 1, wxEXPAND, 0);
554
555     extra_sizer->Add(adjust_sizer,1,wxBOTTOM,5);
556
557 #if 0
558     /* Create sizer to surround the other controls */
559     wxBoxSizer *other_sizer = new wxBoxSizer( wxVERTICAL );
560
561
562     wxStaticBox *video_box =
563             new wxStaticBox( extra_frame, -1, wxU(_("Video Options")) );
564     /* Create the sizer for the frame */
565     wxStaticBoxSizer *video_sizer =
566        new wxStaticBoxSizer( video_box, wxVERTICAL );
567     video_sizer->SetMinSize( -1, 50 );
568
569     static const wxString ratio_array[] =
570     {
571         wxT("4:3"),
572         wxT("16:9"),
573     };
574
575     wxBoxSizer *ratio_sizer = new wxBoxSizer( wxHORIZONTAL );
576     wxStaticText *ratio_text = new wxStaticText( extra_frame, -1,
577                                           wxU(_("Ratio")) );
578
579     ratio_combo = new wxComboBox( extra_frame, Ratio_Event, wxT(""),
580                                   wxDefaultPosition, wxSize(120,-1),
581                                   WXSIZEOF(ratio_array), ratio_array,
582                                   0 );
583
584     ratio_sizer->Add( ratio_text, 0, wxALL, 2 );
585     ratio_sizer->Add( ratio_combo, 0, wxALL, 2 );
586     ratio_sizer->Layout();
587
588     video_sizer->Add( ratio_sizer  , 0 , wxALL , 0 );
589     video_sizer->Layout();
590
591     wxBoxSizer *visual_sizer = new wxBoxSizer( wxHORIZONTAL );
592
593     wxCheckBox *visual_checkbox = new wxCheckBox( extra_frame, Visual_Event,
594                                             wxU(_("Visualisation")) );
595
596     visual_sizer->Add( visual_checkbox, 0, wxEXPAND, 0);
597     visual_sizer->Layout();
598
599     wxStaticBox *audio_box =
600               new wxStaticBox( extra_frame, -1, wxU(_("Audio Options")) );
601     /* Create the sizer for the frame */
602     wxStaticBoxSizer *audio_sizer =
603         new wxStaticBoxSizer( audio_box, wxVERTICAL );
604     audio_sizer->SetMinSize( -1, 50 );
605
606     audio_sizer->Add( visual_sizer, 0, wxALL, 0);
607     audio_sizer->Layout();
608
609     other_sizer->Add( video_sizer, 0, wxALL | wxEXPAND , 0);
610     other_sizer->Add( audio_sizer , 0 , wxALL | wxEXPAND , 0 );
611     other_sizer->Layout();
612
613     extra_sizer->Add(other_sizer,0,wxBOTTOM,5);
614 #endif
615
616     extra_frame->SetSizer( extra_sizer );
617
618     /* Layout the whole panel */
619     extra_sizer->Layout();
620
621     extra_sizer->SetSizeHints(extra_frame);
622
623     /* Write down initial values */
624 #if 0
625     psz_filters = config_GetPsz( p_intf, "audio-filter" );
626     if( psz_filters && strstr( psz_filters, "visual" ) )
627     {
628         visual_checkbox->SetValue(1);
629     }
630     if( psz_filters ) free( psz_filters );
631 #endif
632     psz_filters = config_GetPsz( p_intf, "filter" );
633     if( psz_filters && strstr( psz_filters, "adjust" ) )
634     {
635         adjust_check->SetValue( 1 );
636         saturation_slider->Enable();
637         contrast_slider->Enable();
638         brightness_slider->Enable();
639         hue_slider->Enable();
640     }
641     else
642     {
643         adjust_check->SetValue( 0 );
644         saturation_slider->Disable();
645         contrast_slider->Disable();
646         brightness_slider->Disable();
647         hue_slider->Disable();
648     }
649     if( psz_filters ) free( psz_filters );
650
651     int i_value = config_GetInt( p_intf, "hue" );
652     if( i_value > 0 && i_value < 360 )
653         hue_slider->SetValue( i_value );
654
655     float f_value;
656     f_value = config_GetFloat( p_intf, "saturation" );
657     if( f_value > 0 && f_value < 5 )
658         saturation_slider->SetValue( (int)(100 * f_value) );
659     f_value = config_GetFloat( p_intf, "contrast" );
660     if( f_value > 0 && f_value < 4 )
661         contrast_slider->SetValue( (int)(100 * f_value) );
662     f_value = config_GetFloat( p_intf, "brightness" );
663     if( f_value > 0 && f_value < 2 )
664         brightness_slider->SetValue( (int)(100 * f_value) );
665
666     extra_frame->Hide();
667 }
668
669 void Interface::UpdateAcceleratorTable()
670 {
671     /* Set some hotkeys */
672     wxAcceleratorEntry entries[7];
673     vlc_value_t val;
674     int i = 0;
675
676     var_Get( p_intf->p_vlc, "key-quit", &val );
677     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
678                       ConvertHotkey( val.i_int ), Exit_Event );
679     var_Get( p_intf->p_vlc, "key-stop", &val );
680     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
681                       ConvertHotkey( val.i_int ), StopStream_Event );
682     var_Get( p_intf->p_vlc, "key-play-pause", &val );
683     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
684                       ConvertHotkey( val.i_int ), PlayStream_Event );
685     var_Get( p_intf->p_vlc, "key-next", &val );
686     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
687                       ConvertHotkey( val.i_int ), NextStream_Event );
688     var_Get( p_intf->p_vlc, "key-prev", &val );
689     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
690                       ConvertHotkey( val.i_int ), PrevStream_Event );
691     var_Get( p_intf->p_vlc, "key-faster", &val );
692     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
693                       ConvertHotkey( val.i_int ), FastStream_Event );
694     var_Get( p_intf->p_vlc, "key-slower", &val );
695     entries[i++].Set( ConvertHotkeyModifiers( val.i_int ),
696                       ConvertHotkey( val.i_int ), SlowStream_Event );
697
698     wxAcceleratorTable accel( 7, entries );
699
700     if( !accel.Ok() )
701         msg_Err( p_intf, "invalid accelerator table" );
702
703     SetAcceleratorTable( accel );
704     msg_Dbg( p_intf, "accelerator table loaded" );
705
706 }
707
708 /*****************************************************************************
709  * Event Handlers.
710  *****************************************************************************/
711 /* Work-around helper for buggy wxGTK */
712 void RecursiveDestroy( wxMenu *menu )
713 {
714     wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
715     for( ; node; )
716     {
717         wxMenuItem *item = node->GetData();
718         node = node->GetNext();
719
720         /* Delete the submenus */
721         wxMenu *submenu = item->GetSubMenu();
722         if( submenu )
723         {
724             RecursiveDestroy( submenu );
725         }
726         menu->Delete( item );
727     }
728 }
729
730 void Interface::OnMenuOpen(wxMenuEvent& event)
731 {
732 #if !defined( __WXMSW__ )
733     if( event.GetEventObject() == p_settings_menu )
734     {
735         if( b_settings_menu )
736         {
737             p_settings_menu = SettingsMenu( p_intf, this );
738
739             /* Add static items */
740             p_settings_menu->AppendCheckItem( Extra_Event,
741                              wxU(_("&Extended GUI") ), wxU(_(EXTRA_PREFS)) );
742             p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
743                                      wxU(_(HELP_PREFS)) );
744
745             /* Work-around for buggy wxGTK */
746             wxMenu *menu = GetMenuBar()->GetMenu( 2 );
747             RecursiveDestroy( menu );
748             /* End work-around */
749
750             menu = GetMenuBar()->Replace( 2, p_settings_menu,
751                                           wxU(_("&Settings")));
752             if( menu ) delete menu;
753
754             b_settings_menu = 0;
755         }
756         else b_settings_menu = 1;
757     }
758     else if( event.GetEventObject() == p_audio_menu )
759     {
760         if( b_audio_menu )
761         {
762             p_audio_menu = AudioMenu( p_intf, this );
763
764             /* Work-around for buggy wxGTK */
765             wxMenu *menu = GetMenuBar()->GetMenu( 3 );
766             RecursiveDestroy( menu );
767             /* End work-around */
768
769             menu =
770                 GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) );
771             if( menu ) delete menu;
772
773             b_audio_menu = 0;
774         }
775         else b_audio_menu = 1;
776     }
777     else if( event.GetEventObject() == p_video_menu )
778     {
779         if( b_video_menu )
780         {
781             p_video_menu = VideoMenu( p_intf, this );
782
783             /* Work-around for buggy wxGTK */
784             wxMenu *menu = GetMenuBar()->GetMenu( 4 );
785             RecursiveDestroy( menu );
786             /* End work-around */
787
788             menu =
789                 GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) );
790             if( menu ) delete menu;
791
792             b_video_menu = 0;
793         }
794         else b_video_menu = 1;
795     }
796     else if( event.GetEventObject() == p_navig_menu )
797     {
798         if( b_navig_menu )
799         {
800             p_navig_menu = NavigMenu( p_intf, this );
801
802             /* Work-around for buggy wxGTK */
803             wxMenu *menu = GetMenuBar()->GetMenu( 5 );
804             RecursiveDestroy( menu );
805             /* End work-around */
806
807             menu =
808                 GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")));
809             if( menu ) delete menu;
810
811             b_navig_menu = 0;
812         }
813         else b_navig_menu = 1;
814     }
815
816 #else
817     p_settings_menu = SettingsMenu( p_intf, this );
818     /* Add static items */
819     p_settings_menu->AppendCheckItem( Extra_Event, wxU(_("&Extended GUI") ),
820                                       wxU(_(EXTRA_PREFS)) );
821     p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
822                              wxU(_(HELP_PREFS)) );
823     wxMenu *menu =
824         GetMenuBar()->Replace( 2, p_settings_menu, wxU(_("&Settings")) );
825     if( menu ) delete menu;
826
827     p_audio_menu = AudioMenu( p_intf, this );
828     menu = GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) );
829     if( menu ) delete menu;
830
831     p_video_menu = VideoMenu( p_intf, this );
832     menu = GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) );
833     if( menu ) delete menu;
834
835     p_navig_menu = NavigMenu( p_intf, this );
836     menu = GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")) );
837     if( menu ) delete menu;
838 #endif
839
840 }
841
842 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
843 void Interface::OnContextMenu2(wxContextMenuEvent& event)
844 {
845     /* Only show the context menu for the main interface */
846     if( GetId() != event.GetId() )
847     {
848         event.Skip();
849         return;
850     }
851
852     if( p_intf->p_sys->pf_show_dialog )
853         p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
854 }
855 #endif
856 void Interface::OnContextMenu(wxMouseEvent& event)
857 {
858     if( p_intf->p_sys->pf_show_dialog )
859         p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 1, 0 );
860 }
861
862 void Interface::OnExit( wxCommandEvent& WXUNUSED(event) )
863 {
864     /* TRUE is to force the frame to close. */
865     Close(TRUE);
866 }
867
868 void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) )
869 {
870     wxString msg;
871     msg.Printf( wxString(wxT("VLC media player " VERSION)) +
872         wxU(_(" (wxWindows interface)\n\n")) +
873         wxU(_("(c) 1996-2003 - the VideoLAN Team\n\n")) +
874         wxU( vlc_wraptext(INTF_ABOUT_MSG,WRAPCOUNT,ISUTF8) ) + wxT("\n\n") +
875         wxU(_("The VideoLAN team <videolan@videolan.org>\n"
876               "http://www.videolan.org/\n\n")) );
877
878     wxMessageBox( msg, wxString::Format(wxU(_("About %s")),
879                   wxT("VLC media player")), wxOK | wxICON_INFORMATION, this );
880 }
881
882 void Interface::OnShowDialog( wxCommandEvent& event )
883 {
884     if( p_intf->p_sys->pf_show_dialog )
885     {
886         int i_id;
887
888         switch( event.GetId() )
889         {
890         case OpenFileSimple_Event:
891             i_id = INTF_DIALOG_FILE_SIMPLE;
892             break;
893         case OpenAdv_Event:
894             i_id = INTF_DIALOG_FILE;
895         case OpenFile_Event:
896             i_id = INTF_DIALOG_FILE;
897             break;
898         case OpenDisc_Event:
899             i_id = INTF_DIALOG_DISC;
900             break;
901         case OpenNet_Event:
902             i_id = INTF_DIALOG_NET;
903             break;
904         case OpenSat_Event:
905             i_id = INTF_DIALOG_SAT;
906             break;
907         case Playlist_Event:
908             i_id = INTF_DIALOG_PLAYLIST;
909             break;
910         case Logs_Event:
911             i_id = INTF_DIALOG_MESSAGES;
912             break;
913         case FileInfo_Event:
914             i_id = INTF_DIALOG_FILEINFO;
915             break;
916         case Prefs_Event:
917             i_id = INTF_DIALOG_PREFS;
918             break;
919         default:
920             i_id = INTF_DIALOG_FILE;
921             break;
922
923         }
924
925         p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1, 0 );
926     }
927 }
928
929
930 void Interface::OnStream( wxCommandEvent& event )
931 {
932     StreamDialog *p_stream_dialog = new StreamDialog(p_intf,this);
933     p_stream_dialog->Show();
934 }
935
936
937 void Interface::OnExtra(wxCommandEvent& event)
938 {
939     if( b_extra == VLC_FALSE)
940     {
941         extra_frame->Show();
942         frame_sizer->Show( extra_frame );
943         b_extra = VLC_TRUE;
944     }
945     else
946     {
947         extra_frame->Hide();
948         frame_sizer->Hide( extra_frame );
949         b_extra = VLC_FALSE;
950     }
951     frame_sizer->Layout();
952     frame_sizer->Fit(this);
953 }
954
955 void Interface::OnEnableAdjust(wxCommandEvent& event)
956 {
957     char *psz_filters=config_GetPsz( p_intf, "filter");
958     char *psz_new = NULL;
959     if( event.IsChecked() )
960     {
961         if(psz_filters == NULL)
962         {
963             psz_new = strdup( "adjust" );
964         }
965         else
966         {
967             psz_new= (char *) malloc(strlen(psz_filters) + 8 );
968             sprintf( psz_new, "%s:adjust", psz_filters);
969         }
970         config_PutPsz( p_intf, "filter", psz_new );
971         vlc_value_t val;
972         vout_thread_t *p_vout =
973            (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
974                                        FIND_ANYWHERE );
975         if( p_vout != NULL )
976         {
977             val.psz_string = strdup( psz_new );
978             var_Set( p_vout, "filter", val);
979             vlc_object_release( p_vout );
980         }
981         if( val.psz_string ) free( val.psz_string );
982         brightness_slider->Enable();
983         saturation_slider->Enable();
984         contrast_slider->Enable();
985         hue_slider->Enable();
986     }
987     else
988     {
989         if( psz_filters != NULL )
990         {
991
992             char *psz_current;
993             unsigned int i=0;
994             for( i = 0; i< strlen(psz_filters ); i++)
995             {
996                 if ( !strncasecmp( &psz_filters[i],"adjust",6 ))
997                 {
998                     if(i > 0)
999                         if( psz_filters[i-1] == ':' ) i--;
1000                     psz_current = strchr( &psz_filters[i+1] , ':' );
1001                     if( !psz_current )
1002                         psz_filters[i] = '\0';
1003                     else
1004                     {
1005                        memmove( &psz_filters[i] , psz_current,
1006                                 &psz_filters[strlen(psz_filters)]-psz_current
1007                                 +1);
1008                     }
1009                 }
1010             }
1011             config_PutPsz( p_intf, "filter", psz_filters);
1012             vlc_value_t val;
1013             val.psz_string = strdup( psz_filters );
1014             vout_thread_t *p_vout =
1015                (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
1016                                        FIND_ANYWHERE );
1017             if( p_vout != NULL )
1018             {
1019                 var_Set( p_vout, "filter", val);
1020                 vlc_object_release( p_vout );
1021             }
1022             if( val.psz_string ) free( val.psz_string );
1023         }
1024         brightness_slider->Disable();
1025         saturation_slider->Disable();
1026         contrast_slider->Disable();
1027         hue_slider->Disable();
1028     }
1029     if(psz_filters) free(psz_filters);
1030     if(psz_new) free(psz_new);
1031 }
1032
1033 void Interface::OnHueUpdate( wxScrollEvent& event)
1034 {
1035    config_PutInt( p_intf , "hue" , event.GetPosition() );
1036 }
1037
1038 void Interface::OnSaturationUpdate( wxScrollEvent& event)
1039 {
1040    config_PutFloat( p_intf , "saturation" , (float)event.GetPosition()/100 );
1041 }
1042
1043 void Interface::OnBrightnessUpdate( wxScrollEvent& event)
1044 {
1045    config_PutFloat( p_intf , "brightness", (float)event.GetPosition()/100 );
1046 }
1047
1048 void Interface::OnContrastUpdate(wxScrollEvent& event)
1049 {
1050    config_PutFloat( p_intf , "contrast" , (float)event.GetPosition()/100 );
1051
1052 }
1053
1054 void Interface::OnRatio( wxCommandEvent& event )
1055 {
1056    config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
1057 }
1058
1059 void Interface::OnEnableVisual(wxCommandEvent& event)
1060 {
1061     if( event.IsChecked() )
1062     {
1063         config_PutPsz( p_intf, "audio-filter", "visual" );
1064     }
1065     else
1066     {
1067         config_PutPsz( p_intf, "audio-filter", "" );
1068     }
1069 }
1070
1071 void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) )
1072 {
1073     wxCommandEvent dummy;
1074     playlist_t *p_playlist =
1075         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1076                                        FIND_ANYWHERE );
1077     if( p_playlist == NULL ) return;
1078
1079     if( p_playlist->i_size && p_playlist->i_enabled )
1080     {
1081         vlc_value_t state;
1082
1083         input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf,
1084                                                        VLC_OBJECT_INPUT,
1085                                                        FIND_ANYWHERE );
1086         if( p_input == NULL )
1087         {
1088             /* No stream was playing, start one */
1089             playlist_Play( p_playlist );
1090             TogglePlayButton( PLAYING_S );
1091             vlc_object_release( p_playlist );
1092             return;
1093         }
1094
1095         var_Get( p_input, "state", &state );
1096
1097         if( state.i_int != PAUSE_S )
1098         {
1099             /* A stream is being played, pause it */
1100             state.i_int = PAUSE_S;
1101         }
1102         else
1103         {
1104             /* Stream is paused, resume it */
1105             state.i_int = PLAYING_S;
1106         }
1107         var_Set( p_input, "state", state );
1108
1109         TogglePlayButton( state.i_int );
1110         vlc_object_release( p_input );
1111         vlc_object_release( p_playlist );
1112     }
1113     else
1114     {
1115         /* If the playlist is empty, open a file requester instead */
1116         vlc_object_release( p_playlist );
1117         OnShowDialog( dummy );
1118     }
1119 }
1120
1121 void Interface::OnStopStream( wxCommandEvent& WXUNUSED(event) )
1122 {
1123     playlist_t * p_playlist =
1124         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1125                                        FIND_ANYWHERE );
1126     if( p_playlist == NULL )
1127     {
1128         return;
1129     }
1130
1131     playlist_Stop( p_playlist );
1132     TogglePlayButton( PAUSE_S );
1133     vlc_object_release( p_playlist );
1134 }
1135
1136 void Interface::OnSliderUpdate( wxScrollEvent& event )
1137 {
1138     vlc_mutex_lock( &p_intf->change_lock );
1139
1140 #ifdef WIN32
1141     if( event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
1142         || event.GetEventType() == wxEVT_SCROLL_ENDSCROLL )
1143     {
1144 #endif
1145         if( p_intf->p_sys->i_slider_pos != event.GetPosition()
1146             && p_intf->p_sys->p_input )
1147         {
1148             vlc_value_t pos;
1149             pos.f_float = (float)event.GetPosition() / (float)SLIDER_MAX_POS;
1150
1151             var_Set( p_intf->p_sys->p_input, "position", pos );
1152         }
1153
1154 #ifdef WIN32
1155         p_intf->p_sys->b_slider_free = VLC_TRUE;
1156     }
1157     else
1158     {
1159         p_intf->p_sys->b_slider_free = VLC_FALSE;
1160
1161         if( p_intf->p_sys->p_input )
1162         {
1163             /* Update stream date */
1164 #define p_area p_intf->p_sys->p_input->stream.p_selected_area
1165             char psz_time[ MSTRTIME_MAX_SIZE ];
1166
1167             slider_box->SetLabel(
1168                 wxU(input_OffsetToTime( p_intf->p_sys->p_input,
1169                                         psz_time,
1170                                         p_area->i_size * event.GetPosition()
1171                                         / SLIDER_MAX_POS )) );
1172 #undef p_area
1173         }
1174     }
1175 #endif
1176
1177     vlc_mutex_unlock( &p_intf->change_lock );
1178 }
1179
1180 void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) )
1181 {
1182     playlist_t * p_playlist =
1183         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1184                                        FIND_ANYWHERE );
1185     if( p_playlist == NULL )
1186     {
1187         return;
1188     }
1189
1190     vlc_mutex_lock( &p_playlist->object_lock );
1191     if( p_playlist->p_input != NULL )
1192     {
1193         vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1194         if( p_playlist->p_input->stream.p_selected_area->i_id > 1 )
1195         {
1196             vlc_value_t val; val.b_bool = VLC_TRUE;
1197             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1198             var_Set( p_playlist->p_input, "prev-title", val );
1199         } else
1200             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1201     }
1202     vlc_mutex_unlock( &p_playlist->object_lock );
1203
1204     playlist_Prev( p_playlist );
1205     vlc_object_release( p_playlist );
1206 }
1207
1208 void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) )
1209 {
1210     playlist_t * p_playlist =
1211         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1212                                        FIND_ANYWHERE );
1213     if( p_playlist == NULL )
1214     {
1215         return;
1216     }
1217
1218     vlc_mutex_lock( &p_playlist->object_lock );
1219     if( p_playlist->p_input != NULL )
1220     {
1221         vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock );
1222         if( p_playlist->p_input->stream.i_area_nb > 1 &&
1223             p_playlist->p_input->stream.p_selected_area->i_id <
1224               p_playlist->p_input->stream.i_area_nb - 1 )
1225         {
1226             vlc_value_t val; val.b_bool = VLC_TRUE;
1227             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1228             var_Set( p_playlist->p_input, "next-title", val );
1229         } else
1230             vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock );
1231     }
1232     vlc_mutex_unlock( &p_playlist->object_lock );
1233
1234     playlist_Next( p_playlist );
1235     vlc_object_release( p_playlist );
1236 }
1237
1238 void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) )
1239 {
1240     input_thread_t *p_input =
1241         (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1242                                            FIND_ANYWHERE );
1243     if( p_input )
1244     {
1245         vlc_value_t val; val.b_bool = VLC_TRUE;
1246
1247         var_Set( p_input, "rate-slower", val );
1248         vlc_object_release( p_input );
1249     }
1250 }
1251
1252 void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) )
1253 {
1254     input_thread_t *p_input =
1255         (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
1256                                            FIND_ANYWHERE );
1257     if( p_input )
1258     {
1259         vlc_value_t val; val.b_bool = VLC_TRUE;
1260
1261         var_Set( p_input, "rate-faster", val );
1262         vlc_object_release( p_input );
1263     }
1264 }
1265
1266 void Interface::TogglePlayButton( int i_playing_status )
1267 {
1268     if( i_playing_status == i_old_playing_status )
1269         return;
1270
1271     GetToolBar()->DeleteTool( PlayStream_Event );
1272
1273     if( i_playing_status == PLAYING_S )
1274     {
1275         GetToolBar()->InsertTool( 8, PlayStream_Event, wxU(_("Pause")),
1276                                   wxBitmap( pause_xpm ), wxNullBitmap,
1277                                   wxITEM_NORMAL, wxU(_(HELP_PAUSE)) );
1278     }
1279     else
1280     {
1281         GetToolBar()->InsertTool( 8, PlayStream_Event, wxU(_("Play")),
1282                                   wxBitmap( play_xpm ), wxNullBitmap,
1283                                   wxITEM_NORMAL, wxU(_(HELP_PLAY)) );
1284     }
1285
1286     GetToolBar()->Realize();
1287
1288     i_old_playing_status = i_playing_status;
1289 }
1290
1291 #if !defined(__WXX11__)
1292 /*****************************************************************************
1293  * Definition of DragAndDrop class.
1294  *****************************************************************************/
1295 DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, vlc_bool_t _b_enqueue )
1296 {
1297     p_intf = _p_intf;
1298     b_enqueue = _b_enqueue;
1299 }
1300
1301 bool DragAndDrop::OnDropFiles( wxCoord, wxCoord,
1302                                const wxArrayString& filenames )
1303 {
1304     /* Add dropped files to the playlist */
1305
1306     playlist_t *p_playlist =
1307         (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
1308                                        FIND_ANYWHERE );
1309     if( p_playlist == NULL )
1310     {
1311         return FALSE;
1312     }
1313
1314     for( size_t i = 0; i < filenames.GetCount(); i++ )
1315         playlist_Add( p_playlist, (const char *)filenames[i].mb_str(), 0, 0,
1316                       PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO),
1317                       PLAYLIST_END );
1318
1319     vlc_object_release( p_playlist );
1320
1321     return TRUE;
1322 }
1323 #endif
1324
1325 /*****************************************************************************
1326  * Definition of wxVolCtrl class.
1327  *****************************************************************************/
1328 wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id )
1329   : wxGauge( parent, id, 200, wxDefaultPosition, wxSize( 20, -1 ),
1330              wxGA_VERTICAL | wxGA_SMOOTH )
1331 {
1332     p_intf = _p_intf;
1333 }
1334
1335 void wxVolCtrl::OnChange( wxMouseEvent& event )
1336 {
1337     if( !event.LeftDown() && !event.LeftIsDown() ) return;
1338
1339     int i_volume = (GetClientSize().GetHeight() - event.GetY()) * 200 /
1340                     GetClientSize().GetHeight();
1341     Change( i_volume );
1342 }
1343
1344 void wxVolCtrl::Change( int i_volume )
1345 {
1346     aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 );
1347     SetValue( i_volume );
1348     SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
1349                 i_volume ) );
1350 }